diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..3aef2a4 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,18 @@ +root = true + +[*] +charset = utf-8 +end_of_line = lf +insert_final_newline = true +trim_trailing_whitespace = true +indent_style = space +indent_size = 3 + +[*.md] +trim_trailing_whitespace = false + +[*.{yml,yaml}] +indent_size = 2 + +[*.{cmd,bat}] +end_of_line = crlf diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..700d31a --- /dev/null +++ b/.gitattributes @@ -0,0 +1,5 @@ +* text=auto eol=lf +*.bat text eol=crlf +*.cmd text eol=crlf +*.jar binary +*.png binary diff --git a/.gitea/workflows/build.yaml b/.gitea/workflows/build.yaml new file mode 100644 index 0000000..a103517 --- /dev/null +++ b/.gitea/workflows/build.yaml @@ -0,0 +1,19 @@ +name: build +on: + push: + branches: ['**'] + tags: ['v*'] +jobs: + android: + uses: self:KofTwentyTwo/ci-workflows/.gitea/workflows/android.yaml@v1 + secrets: inherit + with: + node-version: '24.11.1' + commands: | + node scripts/ci/check-source-standards.mjs + node --test scripts/ci/scanner-echo-guards.test.mjs + tasks: | + testDebugUnitTest :scanner-host:lintDebug :scanner-host:assembleDebug + -PscannerTestBuildType=qa :scanner-host:assembleQa :scanner-host:assembleQaAndroidTest + emulator-tasks: connectedDebugAndroidTest + publish-tasks: :qqq:android:core:publishAllPublicationsToGiteaRepository :qqq:android:mobileapp:publishAllPublicationsToGiteaRepository diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS new file mode 100644 index 0000000..e7d84f9 --- /dev/null +++ b/.github/CODEOWNERS @@ -0,0 +1 @@ +* @KofTwentyTwo diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 0000000..02914d8 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,25 @@ +--- +name: Bug report +about: Report an Android client or scanner problem +labels: bug +--- + +## What happened? + +Describe expected and actual behavior. + +## Reproduction + +1. +2. + +## Environment + +- APK version/build: +- QQQ server/qbit version: +- Android version and device model: +- DataWedge version/profile settings, if applicable: + +## Evidence + +Use synthetic barcodes. Remove credentials, device tokens, session cookies, and personal/business data from screenshots and logs. Report security vulnerabilities privately using SECURITY.md. diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 0000000..94d57c4 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,8 @@ +blank_issues_enabled: true +contact_links: + - name: Questions and discussion + url: https://github.com/orgs/QRun-IO/discussions + about: Ask the QQQ community about application development. + - name: Security reporting + url: https://github.com/QRun-IO/qqq-android/blob/main/SECURITY.md + about: Report vulnerabilities privately rather than opening a public issue. diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 0000000..5dde7d2 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,17 @@ +--- +name: Feature request +about: Describe a mobile workflow or Android capability +labels: enhancement +--- + +## User workflow + +Who needs this, and what are they trying to do? + +## Proposed behavior + +Describe the screens, scanner interaction, or QQQ process behavior. + +## Scope and acceptance + +List target devices and concrete examples of success. Use synthetic data. diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000..02d12da --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,14 @@ +## Summary + +Describe the user-visible change and link related issues. + +## Validation + +- [ ] Shared-library and scanner JVM tests passed +- [ ] Scanner lint and debug APK build passed +- [ ] Native emulator tests or manual UI verification completed when relevant +- [ ] TC22/DataWedge behavior verified when relevant, or the remaining hardware check is stated + +## Compatibility and rollout + +Describe API/metadata changes, credential or enrollment changes, and any required server upgrade. Include screenshots for UI changes. Never include passwords, session cookies, device tokens, or real barcode data. diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000..cccd359 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,14 @@ +version: 2 +updates: + - package-ecosystem: gradle + directory: / + schedule: + interval: weekly + open-pull-requests-limit: 3 + - package-ecosystem: github-actions + directory: / + schedule: + interval: weekly + groups: + actions: + patterns: ['*'] diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..bc58c62 --- /dev/null +++ b/.gitignore @@ -0,0 +1,19 @@ +*.iml +.gradle +/local.properties +/.idea/caches +/.idea/libraries +/.idea/modules.xml +/.idea/workspace.xml +/.idea/navEditor.xml +/.idea/assetWizardSettings.xml +.DS_Store +/build +/captures +.externalNativeBuild +.cxx +local.properties +/.e2e-server/ +/.e2e-core/ +*.jks +*.keystore diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..26d3352 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/.idea/.name b/.idea/.name new file mode 100644 index 0000000..918f8d0 --- /dev/null +++ b/.idea/.name @@ -0,0 +1 @@ +QQQ Android \ No newline at end of file diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml new file mode 100644 index 0000000..1f2f20d --- /dev/null +++ b/.idea/codeStyles/Project.xml @@ -0,0 +1,15 @@ + + + diff --git a/.idea/codeStyles/codeStyleConfig.xml b/.idea/codeStyles/codeStyleConfig.xml new file mode 100644 index 0000000..31c7460 --- /dev/null +++ b/.idea/codeStyles/codeStyleConfig.xml @@ -0,0 +1,5 @@ + + + + diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..b589d56 --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/copyright/Kingsrook.xml b/.idea/copyright/Kingsrook.xml new file mode 100644 index 0000000..3063d5f --- /dev/null +++ b/.idea/copyright/Kingsrook.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/.idea/copyright/profiles_settings.xml b/.idea/copyright/profiles_settings.xml new file mode 100644 index 0000000..bd0d3df --- /dev/null +++ b/.idea/copyright/profiles_settings.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/.idea/deploymentTargetSelector.xml b/.idea/deploymentTargetSelector.xml new file mode 100644 index 0000000..6f892eb --- /dev/null +++ b/.idea/deploymentTargetSelector.xml @@ -0,0 +1,10 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml new file mode 100644 index 0000000..c31db7f --- /dev/null +++ b/.idea/gradle.xml @@ -0,0 +1,22 @@ + + + + + + \ No newline at end of file diff --git a/.idea/kotlinc.xml b/.idea/kotlinc.xml new file mode 100644 index 0000000..fdf8d99 --- /dev/null +++ b/.idea/kotlinc.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/.idea/migrations.xml b/.idea/migrations.xml new file mode 100644 index 0000000..f8051a6 --- /dev/null +++ b/.idea/migrations.xml @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..0ad17cb --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,10 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..35eb1dd --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000..5d6c01c --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,27 @@ +# Repository guidance + +Read `README.md`, `docs/SESSION-STATE.md`, and `docs/TODO.md` for current scope; `docs/history/` is historical only. Preserve unrelated changes and follow the user's current authorization for commits, publication, and deployment. + +## Build and tests + +Use the included Gradle wrapper, Java21, and Android SDK35. `local.properties`, build outputs, SDK paths, and credentials are local-only. + +```text +./gradlew :qqq:android:core:testDebugUnitTest :qqq:android:mobileapp:testDebugUnitTest :scanner-host:testDebugUnitTest :scanner-host:lintDebug :scanner-host:assembleDebug +``` + +Run `:qqqsampleandroidmobileapp:connectedDebugAndroidTest` on an emulator for changes to native authentication/navigation/process rendering. `scripts/ci/emulator-smoke.sh` deliberately refuses physical devices and clears only the disposable emulator's scanner application data. Physical TC22 tests remain necessary for EMDK trigger capture, lifecycle and scanner-ownership release. Use the separate production-path QA variant and separately signed ordinary-UID probe documented in `docs/ZEBRA-SCANNING.md`; E2E synthetic broadcasts do not qualify production scanner security or hardware behavior. Never replace the operator's application or persistently modify DataWedge profiles for these tests. + +All mobile processes require end-to-end coverage. For scanner flow changes, build `:scanner-host:assembleE2e :scanner-host:assembleE2eAndroidTest` and run `node scripts/ci/scanner-e2e.mjs ../qbit-mobile-scanners` against an emulator after building the companion demo/classpath as documented in `docs/EMULATOR.md`. This drives the real host and real server in the separate `io.qrun.mobile.scanner.e2e` application with a temporary database; never clear the operator's normal scanner application to run it. Server record actions must also be covered through both single-record and selected-bulk UI paths in the companion qbit's browser suite. + +## Design and safety + +Reuse the existing `core` and `mobileapp` libraries and native QQQ metadata/process contracts. The scanner host adds enrollment and scanner widgets; do not introduce a competing screen engine. Preserve raw barcode strings, event identity across retries, server acknowledgments, and server-side device authorization. + +All client/server operations must use the versioned semantic UI API or a registered, documented semantic extension. Discover version, required features, client channel and extension compatibility before credentials. Follow server process state and field metadata; never infer business actions from a process name or a generic field name. New required controls need native support and E2E coverage; unknown controls must stop submission explicitly. Keep the real-server OpenAPI request audit in CI. + +Never log or place passwords, session cookies, or device tokens in process values, test fixtures, or documentation. Keep enrollment credentials and sessions isolated by server. Keep HTTP support limited to debug builds. Test resources under `mobile-contract` are sanitized real demo responses. + +## Repository automation + +The primary forge is Gitea (`git.kof22.com/QRun-IO`); GitHub is a shadow/archive, so make no ordinary GitHub writes. `.gitea/workflows/build.yaml` calls the shared `KofTwentyTwo/ci-workflows` Android workflow (`android.yaml@v1`) on every push: source checks, JVM unit tests, scanner lint, debug and QA APK assembly, and connected tests on an emulator (android-build runners). A `vX.Y.Z` tag also publishes the SDK AARs (`qqq-android-core`, `qqq-android-mobileapp`) to the QRun-IO Gitea Maven registry. It is not a scanner-APK signing pipeline, and no automatic signing CI is configured. The owner has authorized production signing with the QRun-owned key `qqq-mobile-release` (details and fingerprint in `docs/RELEASING.md`) for signed-APK/MDM distribution. Do not create replacement or additional signing keys, or put key material, passwords or vault item details in the repository; create no tags or releases without current authorization. diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..5f9f49f --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,17 @@ +# Changelog + +## 1.0.2 (versionCode 4), candidate + +Not yet built, signed, tagged or published (prepared 2026-11-06). Supersedes the unpublished signed 1.0.1 (versionCode 3) candidate and updates it in place with the same permanent signer. + +- Company sign-out now completes: the provider logout request runs before the scanner host ends its device session, so the browser end-session page opens. Previously the device-session end ran first, removed the QQQ session server-side, and `nativeLogoutData` was never returned; observed on the MC9400 with the production APK against the real Authentik server. (PR 17) +- The signed-in user's name is shown after browser (OAuth) sign-in instead of a blank current user. (PR 17) +- The scanner host reports the installed app and OS version on every session heartbeat, so scan receipts show the new version after an in-place update. Effective with mobile-scanners server 1.6.0; older servers ignore the keys. (PR 18) + +## Unreleased + +- Add the QQQ Mobile scanner host for metadata-defined native apps and processes. +- Add administrator-approved device enrollment and Zebra DataWedge single-barcode capture. +- Add table-backed login, current QQQ HttpOnly session handling, and server-side logout. +- Preserve pending scan identity for explicit retry and require a matching server acknowledgment. +- Add scanner APK/test/lint CI and an optional emulator workflow alongside managed library CI. diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..23641f7 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,13 @@ +# qqq-android + +## Knowledge base + +Deep-review dossiers for this repo live in the second-brain vault +(`$SECOND_BRAIN_VAULT`, R:/Git.Local/KofTwentyTwo/second-brain): + +- Hub / platform map: `knowledge/qqq/qqq-hub.md` +- This repo's dossier: `knowledge/qqq/repos/qqq-android.md` + (reviewed at commit `4f36aabc1abe` on branch `main`, 2026-07-04) + +Read the dossier before substantive work here instead of re-deriving the +architecture from source. diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..c1b2a88 --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,3 @@ +# Code of conduct + +This project follows the [QRun-IO Contributor Covenant Code of Conduct](https://github.com/QRun-IO/.github/blob/main/CODE_OF_CONDUCT.md), including its reporting and enforcement process. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..6b4ab06 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,34 @@ +# Contributing to QQQ Android + +Follow the [QRun-IO contribution guidelines](https://github.com/QRun-IO/.github/blob/main/CONTRIBUTING.md) and this repository's existing Kotlin conventions. Use a `feature/`, `fix/`, `docs/`, or `chore/` branch from `main`, and open a pull request to `main`. Use Conventional Commits and include tests and documentation for changed behavior. + +## Local verification + +Install Java21 and Android SDK35, then use the included Gradle wrapper: + +```text +./gradlew :qqq:android:core:testDebugUnitTest :qqq:android:mobileapp:testDebugUnitTest :scanner-host:testDebugUnitTest :scanner-host:lintDebug :scanner-host:assembleDebug +``` + +On Windows use `gradlew.bat`. Keep SDK locations in ignored `local.properties` or environment variables. Do not commit APKs, signing keys, passwords, session cookies, device tokens, or real barcode data. + +For authentication/navigation/process UI changes, run the native emulator suite: + +```text +./gradlew :qqqsampleandroidmobileapp:connectedDebugAndroidTest +bash scripts/ci/emulator-smoke.sh +``` + +The smoke script clears application data only after verifying the target is an emulator. See [emulator testing](docs/EMULATOR.md). DataWedge trigger behavior still needs a physical Zebra handheld. + +## CI and delivery + +`.gitea/workflows/build.yaml` calls the shared `KofTwentyTwo/ci-workflows` Android workflow (`android.yaml@v1`) on every push: source checks, JVM unit tests, scanner lint, debug and QA APK assembly, and connected tests on an emulator (android-build runners). A `vX.Y.Z` tag also publishes the SDK AARs (`qqq-android-core`, `qqq-android-mobileapp`) to the QRun-IO Gitea Maven registry. Feature branches never publish. + +The emulator scanner end-to-end suite against a real QQQ server (`scripts/ci/scanner-e2e.mjs`) is not part of CI; run it locally as described in [emulator testing](docs/EMULATOR.md). + +Production signing and distribution require a separately configured release procedure. Do not treat the development APK as a production release. + +## Review and security + +Request review from the repository code owner. Explain compatibility changes between Android metadata/process contracts and the companion qbit. Use synthetic fixtures and preserve raw barcode values and retry identities. See [SECURITY.md](SECURITY.md) for private reporting and [CODE_OF_CONDUCT.md](CODE_OF_CONDUCT.md) for community expectations. diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..5c34936 --- /dev/null +++ b/LICENSE @@ -0,0 +1,202 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to the Licensor for inclusion in the Work by the copyright + owner or by an individual or Legal Entity authorized to submit on + behalf of the copyright owner. For the purposes of this definition, + "submitted" means any form of electronic, verbal, or written + communication sent to the Licensor or its representatives, including + but not limited to communication on electronic mailing lists, source + code control systems, and issue tracking systems that are managed by, + or on behalf of, the Licensor for the purpose of discussing and + improving the Work, but excluding communication that is conspicuously + marked or otherwise designated in writing by the copyright owner as + "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2022-2025 QRunIO, LLC + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/NOTICE b/NOTICE new file mode 100644 index 0000000..066d4ea --- /dev/null +++ b/NOTICE @@ -0,0 +1,41 @@ +QQQ Android +Copyright 2022-2025 QRunIO, LLC + +This product includes software developed at QRunIO, LLC (https://qrun.io/). + +Licensed under the Apache License, Version 2.0. + +================================================================================ + +Material Design icons by Google + +The 2,142 vector resources in qqq/android/mobileapp/src/main/res/drawable +use Material Design icon artwork from Google, licensed under Apache-2.0: +https://github.com/google/material-design-icons +Pinned upstream revision: d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b + +QQQ Android integration modifications include Android resource names, dimensions, +and fill/tint presentation. Each resource's drawing path data matches its pinned +upstream source. The loading and unavailable-network illustrations use the +upstream hourglass_empty and wifi_off icons, respectively. + +See docs/material-icons-provenance.json for the complete resource-to-source +mapping, SHA-256 hashes, and final styling. The upstream license is retained in +docs/third-party/material-design-icons-LICENSE.txt. + +Project copyright statements cover project integration/modifications and do not +replace Google's original artwork attribution. Dependency and embedded-data +notices are included in the application's Open-source licenses settings and its +matching generated distribution report. This repository notice supplements that +report; it is not a complete dependency inventory by itself. + +================================================================================ + +Trademarks: + +QQQ, qBits, qRun, qStudio, and the QRunIO logo are trademarks of QRunIO, LLC. +Use of these trademarks must comply with QRunIO's Trademark Guidelines. + +================================================================================ + +Query mascot artwork: QRun's existing Query puppy asset, sourced from marketing-website/assets/Puppy Mark/exports/PNG/qqq-puppy.png. Bundled for the About screen; the original artwork is unchanged. diff --git a/README.md b/README.md new file mode 100644 index 0000000..4018ede --- /dev/null +++ b/README.md @@ -0,0 +1,96 @@ +# QQQ Android + +Native Kotlin/Compose clients for QQQ. The `scanner-host` application ("QQQ Mobile", `io.qrun.mobile.scanner`) runs server-defined QQQ apps and processes on Android handhelds, currently Zebra TC22 and MC9400 class devices. It is online only. + +Current progress and open items: [status](docs/SESSION-STATE.md), [checklist](docs/TODO.md), [1.0 finish ledger](docs/FINISH-1.0.md). Superseded status notes are kept under [docs/history](docs/history/README.md). + +## Modules + +| Module | Purpose | +| --- | --- | +| `qqq/android/core` | Metadata and process HTTP client (`QQQRepository` / `NetworkQQQRepository`). | +| `qqq/android/mobileapp` | Native app picker, authentication, process runner and widget renderer. | +| `scanner-host` | The scanner application: server configuration, device registration/approval gate, Zebra EMDK barcode capture, branding, diagnostics, settings. | +| `qqqsampleandroidmobileapp` | Historical example application and the shared native test host. | + +The libraries support metadata and process execution. They do not implement a record CRUD/fluent API. + +## What the scanner host does + +- **Semantic API only.** All operations use the versioned UI API plus the registered `mobile-scanners` extension (device enrollment, branding, status, sessions). The host requires extension 1.1 or later within major 1 and checks `/qqq/v1/version` compatibility before sending credentials. Optional capabilities (for example raw scan bytes, mobile 1.5) are used only when the same server advertises them. See [UI API contract and supported components](docs/UI-API.md); web-client parity is not implied. +- **Server-defined screens.** The server supplies the app, native process steps and the `SCANNER` widget; the APK hard-codes no process name. Unknown required controls stop submission explicitly. +- **Device approval.** Each installation enrolls a device that a QQQ administrator must approve; the server enforces approval on every scan. +- **Zebra scanning.** Uses the device's EMDK service, acquired only while a scanner widget is visible and resumed, and released on leave. No DataWedge profile setup is needed and DataWedge settings are not persistently modified. Other Android devices use explicit manual entry. See [Zebra scanning](docs/ZEBRA-SCANNING.md). +- **Runtime branding.** The shared launcher stays "QQQ Mobile"; after connecting, the host reads public `GET /qqq/v1/qbit/mobile-scanners/branding` (`displayName` up to 80 printable characters, `primaryColor` as `#RRGGBB`, optional HTTPS `logoUrl`). Malformed values fall back to QQQ defaults; logos are fetched without session/device headers; branding resets when the server changes. No per-customer build. +- **Connection footer and diagnostics.** The footer shows Checking, Connected or Disconnected from `GET /qqq/v1/qbit/mobile-scanners/status` (reachability only, not sign-in or approval). Tap it, or use the menu, for a full-screen view of the latest 100 sanitized events with All/Problems filters, pause, copy/share/clear. The log holds fixed event codes, HTTP status and latency, never credentials, scan values, paths or response text. +- **Echo (local print workflow).** Echo is a server-side semantic process (printer, label size, document and optional copies per scan 1–100, chosen once per run). The client uses only generic native controls; printing happens on the server side and nothing printer-specific is installed on the scanner. +- **Settings.** Orientation (portrait by default), foreground location reporting (default on, Android permission required, scanning works without it), optional status wallpaper chooser, and About QQQ Mobile (version, public links, bundled open-source licenses). +- **Managed configuration and wallpaper.** The app declares Android app restrictions (`qqq_server_url`, `qqq_orientation`) and an optional live status wallpaper. See [device provisioning](docs/DEVICE-PROVISIONING.md); no company profile or MDM rollout has been verified. + +### Online-only behavior + +There is no offline queue. One submitted scan is held in memory until a complete receipt returns the matching `acknowledgedEventId`, `scanSaved: true` and a nonblank `scanId`. After an uncertain response, **Retry same request** keeps the event ID and original timestamp and the server deduplicates; further scans wait for confirmation or explicit abandonment. Leaving then warns that the scan may already be saved and attempts server cancellation, with **Leave anyway** as the explicit fallback. Sign-out clears the pending request; app termination loses in-memory state. + +Administrators can inspect sessions, end them and request live viewing of the QQQ app. Viewing shows an informational indicator on the handheld; password screens and background apps cannot be mirrored; whole-device sharing needs Android consent. See [session behavior and limits](docs/UI-API.md#session-activity-and-screen-viewing). + +Enrollment credentials are encrypted with the Android Keystore under `noBackupFilesDir`, scoped to the server, and backup is disabled. Redirects are disabled. **Release builds reject HTTP; only development builds allow it for local testing.** + +## Prerequisites + +- Java 21, Android SDK platform 35 with build tools 34/35, and the included Gradle 8.7 wrapper. Set `ANDROID_HOME` or an ignored `local.properties`. +- A QQQ server exposing the semantic UI API (core 1.8 or later within major 1; OAuth2 sign-in needs 1.10) and the `mobile-scanners` extension. The companion server/demo is `qbit-mobile-scanners` (its POM pins the QQQ source default, currently `4.1.0-RC.21`; a local server may run an older qualified core, which the host checks before login). Local demo authentication is TABLE_BASED username/password, exchanged through the native QQQ session endpoint; the password is not stored. + +## Installing on a device + +Two distinct paths. Do not mix their APKs or assumptions. + +### Local demo (development-signed debug APK, HTTP, same workstation) + +For trying the scanner against a local server. The debug APK uses the development certificate and is not a release. + +1. Start the companion demo server and build the debug APK (below). +2. Install it with `adb install -r`, naming the device with `-s`. +3. Forward the device port to the server: `adb -s reverse tcp:8080 tcp:`. This works over USB or paired wireless ADB and must be repeated after the connection drops; it is a workstation-attached demo, not autonomous LAN rollout. +4. Open QQQ Mobile, connect to `http://127.0.0.1:8080/`, and sign in. +5. An administrator approves the displayed device in QQQ (the mobile device approval process); tap **Check approval**, choose the server's mobile app, and open **Scan capture** or Echo. +6. Wait for **Saved scan** (or Echo's acknowledgment) before scanning again. + +See [emulator testing](docs/EMULATOR.md) for an emulator demo, synthetic scans and the disposable E2E variant. + +### Signed APK (direct install / MDM) + +Requires an **HTTPS** server URL and the production-signed APK built with the QRun-owned key. Follow the [installation guide](docs/INSTALLATION.md) and [release readiness](docs/RELEASING.md). The published download remains the [signed 1.0.0 preview](https://git.kof22.com/QRun-IO/qqq-android/releases/tag/scanner-v1.0.0) (prerelease, forge sign-in required). The signed 1.0.1 candidate has passed trusted-HTTPS enrollment, physical scanning, navigation and an in-place update on the MC9400, preserving login and enrollment. Its publication, native Authentik qualification and final dependency-cohort checks remain open; a 1.0.2 (versionCode 4) candidate with company sign-out, user-name and heartbeat-version fixes is prepared but not yet built (see [CHANGELOG](CHANGELOG.md)). Development-signed installations require an explicit migration to the production signer. + +## Build and test + +```powershell +.\gradlew.bat :qqq:android:core:testDebugUnitTest :qqq:android:mobileapp:testDebugUnitTest :scanner-host:testDebugUnitTest :scanner-host:lintDebug :scanner-host:assembleDebug +``` + +Debug APK: `scanner-host/build/outputs/apk/debug/scanner-host-debug.apk`. `connectedDebugAndroidTest` needs a device or emulator. Scanner flow changes also use the separate E2E variant (`:scanner-host:assembleE2e :scanner-host:assembleE2eAndroidTest`, then `node scripts/ci/scanner-e2e.mjs ../qbit-mobile-scanners`) as described in [AGENTS.md](AGENTS.md) and [emulator testing](docs/EMULATOR.md). Device-level acceptance evidence is described in [device testing](docs/DEVICE-TESTING.md). + +Limits: JVM, emulator and synthetic-scan tests do not prove physical trigger, lifecycle, label printing or provider behavior; those need hardware. Version-one scope excludes offline queueing and background synchronization. + +## CI and automation + +The primary forge is Gitea (`git.kof22.com/QRun-IO`); GitHub is a shadow/archive and receives no ordinary writes. `.gitea/workflows/build.yaml` calls the shared `KofTwentyTwo/ci-workflows` Android workflow (`android.yaml@v1`) on every push: source checks, JVM unit tests, scanner lint, debug and QA APK assembly, and connected tests on an emulator (android-build runners). A `vX.Y.Z` tag also publishes the SDK AARs (`qqq-android-core`, `qqq-android-mobileapp`) to the QRun-IO Gitea Maven registry. It is not a scanner-APK signing or release pipeline. Shared CI design is out of scope for this repository's local use: the demo above needs none of it. + +## Extension points + +`LocalAuthenticatedContent` lets a host gate authenticated QQQ content. `LocalCustomWidgetRenderer` lets the host render additional metadata-defined widgets without replacing the standard renderer. `NetworkQQQRepository` accepts a server-scoped header provider; credentials never enter process values. + +The scanner host supports TABLE_BASED authentication and server-advertised OAuth2 browser sign-in, including Authentik. OAuth2 needs UI API 1.10 native-session login and nonce-validation capabilities, the REQUIRED nonce policy and callback registration, and never infers support from the provider name; unsupported servers cannot downgrade. Real desktop Authentik acceptance has passed; native on-device provider acceptance is still open. See [authentication setup and verification](docs/AUTHENTICATION.md). Existing shared-library Auth0 support remains intact. + +## Source map + +- Managed configuration: [`ManagedConfiguration.kt`](scanner-host/src/main/java/io/qrun/mobile/scanner/ManagedConfiguration.kt), [`app_restrictions.xml`](scanner-host/src/main/res/xml/app_restrictions.xml) +- Status wallpaper: [`QqqStatusWallpaperService.kt`](scanner-host/src/main/java/io/qrun/mobile/scanner/QqqStatusWallpaperService.kt) +- Orientation policy: [`OrientationPolicy.kt`](scanner-host/src/main/java/io/qrun/mobile/scanner/OrientationPolicy.kt) +- Manifest: [`AndroidManifest.xml`](scanner-host/src/main/AndroidManifest.xml) +- Company profile generator: [`deployment/company-profile`](deployment/company-profile/), [COMPANY-PROFILE.md](docs/COMPANY-PROFILE.md) + +See also [Contributing](CONTRIBUTING.md), [Security](SECURITY.md) and [Changelog](CHANGELOG.md). + +## License + +Licensed under Apache-2.0; see [LICENSE](LICENSE) and [NOTICE](NOTICE). Existing copyright ownership and third-party notices are preserved. diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 0000000..9cf9485 --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,9 @@ +# Security policy + +Do not open public issues containing vulnerabilities, credentials, device tokens, session cookies, or real scan data. + +Report vulnerabilities privately through [GitHub security reporting](https://github.com/QRun-IO/qqq-android/security/advisories/new) when available, or email **security@qrun.io**. Include the affected commit/APK version, Android and QQQ versions, a synthetic reproduction, and the impact. + +The scanner host is experimental. Report issues against the current development version; there is not yet a stable scanner APK support schedule. The broader [QQQ security policy](https://github.com/QRun-IO/qqq/blob/develop/SECURITY.md) applies to the framework. + +Release installations must use HTTPS, authenticated users, and approved device credentials. The debug APK permits HTTP for local development only. Device enrollment secrets and sessions must not be included in backup, transfer, logs, or process values. Scanner-provided metadata is client input rather than proof of hardware identity. diff --git a/build.gradle.kts b/build.gradle.kts new file mode 100644 index 0000000..955e2aa --- /dev/null +++ b/build.gradle.kts @@ -0,0 +1,40 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2004-2026. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// Top-level build file where you can add configuration options common to all sub-projects/modules. +plugins { + alias(libs.plugins.android.application) apply false + alias(libs.plugins.kotlin.android) apply false + alias(libs.plugins.android.library) apply false + alias(libs.plugins.aboutlibraries) apply false + id("org.jetbrains.kotlin.plugin.serialization") version "1.9.0" apply false +} + + +/******************************************************************************* + ** Keep every owned Kotlin variant and test compiler under the same warning + ** policy; compatibility suppressions belong on the specific affected source. + *******************************************************************************/ +subprojects { + tasks.withType().configureEach { + kotlinOptions.allWarningsAsErrors = true + } +} diff --git a/deployment/company-profile/DEVICE-OWNER-ENROLLMENT.md b/deployment/company-profile/DEVICE-OWNER-ENROLLMENT.md new file mode 100644 index 0000000..33bafb0 --- /dev/null +++ b/deployment/company-profile/DEVICE-OWNER-ENROLLMENT.md @@ -0,0 +1,12 @@ +# Device Owner enrollment (destructive, separate from the safe profile) + +Not generated and not part of `generate-company-profile.mjs`. Fully managed (Device Owner) provisioning is intended for a new or factory-reset handheld (`docs/DEVICE-PROVISIONING.md`, Android device management). Doing it wipes the device's data and settings, including the current scanner and printing setup. + +Do not start unless all of these are recorded and approved by the owner of the device fleet: + +1. The customer EMM/MDM, its enrollment method and Zebra OEMConfig package (`com.zebra.oemconfig.release` on Android 13+). +2. A spare device, not the development TC22, with the ordinary safe profile already reviewed. +3. The recovery route if the EMM or EHS locks the device out, and the factory-reset authority. +4. Confirmation that the QQQ device approval and Android management states stay separate. + +Enrollment credentials, tokens and QR payloads belong in the EMM, never in this repository. diff --git a/deployment/company-profile/generate-company-profile.mjs b/deployment/company-profile/generate-company-profile.mjs new file mode 100644 index 0000000..de94225 --- /dev/null +++ b/deployment/company-profile/generate-company-profile.mjs @@ -0,0 +1,230 @@ +#!/usr/bin/env node +/* Copyright (c) 2026 QRunIO. SPDX-License-Identifier: Apache-2.0 */ +// Renders a reviewable Zebra Enterprise Home Screen (EHS) config and, when the device is measured, a StageNow/MX +// AppMgr document from one non-secret JSON profile. Only elements documented by Zebra are emitted; see +// docs/COMPANY-PROFILE.md for the page citations. Nothing here installs, pushes or changes a device. +// +// Usage: node generate-company-profile.mjs [--require-ready] + +import { mkdirSync, readFileSync, writeFileSync } from "node:fs" +import { join } from "node:path" +import { pathToFileURL } from "node:url" + +export const EHS_PACKAGE = "com.zebra.mdna.enterprisehomescreen" +export const EHS_ACTIVITY = "com.zebra.mdna.enterprisehomescreen.HomeScreenActivity" +const PACKAGE = /^[A-Za-z][A-Za-z0-9_]*(\.[A-Za-z][A-Za-z0-9_]*)+$/ +const TITLE_TOKENS = new Set(["bluetooth_address", "bluetooth_name", "imei_number", "mac_address", "network_host_name", "serial_number", "device_name"]) +const LOGO_EXTENSIONS = [".bmp", ".gif", ".jpg", ".png", ".webp"] +const APP_ICON_EXTENSIONS = [".bmp", ".jpg", ".png"] +const COLOR_NAMES = new Set(["red", "blue", "green", "black", "white", "gray", "cyan", "magenta", "yellow", "lightgray", "darkgray"]) +// Keys and values consumed by the app's RestrictionsManager reader (scanner-host res/xml/app_restrictions.xml). +export const MANAGED_SERVER_KEY = "qqq_server_url" +export const MANAGED_ORIENTATION_KEY = "qqq_orientation" +export const MANAGED_ORIENTATIONS = ["SYSTEM", "PORTRAIT", "LANDSCAPE", "REVERSE_PORTRAIT", "REVERSE_LANDSCAPE"] +const BLOCKED_WILDCARDS =/^com\.(a|an|and|andr|andro|androi|android)\*?$/ + +/******************************************************************************* + ** Mirror the app's normalizeServerUrl for managed values: HTTPS origin only. Returns the normalized origin or null. + *******************************************************************************/ +export function managedServerUrl(value) { + if (typeof value !== "string" || value.length > 2048) return null + try { + const url = new URL(value.trim()) + if (url.protocol !== "https:" || !url.hostname || url.username || url.password || url.search || url.hash || url.pathname !== "/") return null + return `https://${url.host}/` + } catch { return null } +} + +/******************************************************************************* + ** Escape the five characters EHS's XML parser requires to be escaped. + *******************************************************************************/ +export function xml(value) { + return String(value).replace(/&/g, "&").replace(//g, ">").replace(/"/g, """).replace(/'/g, "'") +} + +function devicePath(value, extensions, label, errors) { + if (value == null) return null + if (typeof value !== "string" || !value.startsWith("/enterprise/usr/") || value.split("/").includes("..") || !extensions.some((e) => value.toLowerCase().endsWith(e))) { + errors.push(`${label} must be an absolute /enterprise/usr/ path (persists across Enterprise Reset) ending in ${extensions.join(", ")}`) + return null + } + return value +} + +function color(value, label, errors) { + if (value == null) return null + if (typeof value !== "string" || !(/^#([0-9A-Fa-f]{6}|[0-9A-Fa-f]{8})$/.test(value) || COLOR_NAMES.has(value))) errors.push(`${label} must be #RRGGBB, #AARRGGBB or a documented color name`) + return value +} + +function validateTitle(title, errors) { + if (typeof title !== "string" || title.trim() === "") { errors.push("launcher.title is required"); return { text: "", dynamic: false } } + const tokens = [...title.matchAll(/\[([^\]]*)\]/g)].map((m) => m[1]) + for (const token of tokens) if (!TITLE_TOKENS.has(token)) errors.push(`launcher.title token [${token}] is not a documented device ID`) + if (new Set(tokens).size > 1 || tokens.length > 1) errors.push("launcher.title may contain at most one device ID token") + if (title.replace(/\[[^\]]*\]/g, "").match(/[\[\]]/)) errors.push("launcher.title square brackets are only allowed around a documented device ID") + return { text: title, dynamic: tokens.length === 1 } +} + +function validateApp(app, index, list, errors, { icons }) { + const where = `${list}[${index}]` + if (!app || typeof app !== "object") { errors.push(`${where} must be an object`); return null } + const pkg = app.package + if (typeof pkg !== "string" || !PACKAGE.test(pkg)) { + errors.push(`${where}.package must be an exact package name (wildcards are rejected: least privilege)`) + if (typeof pkg === "string" && (pkg.includes("*") && BLOCKED_WILDCARDS.test(pkg))) errors.push(`${where}.package wildcard is blocked by EHS`) + return null + } + if (pkg === EHS_PACKAGE) errors.push(`${where} must not list EHS itself`) + if (typeof app.label !== "string" || app.label.trim() === "") errors.push(`${where}.label is required`) + else if (app.label.length > 18) errors.push(`${where}.label is longer than 18 characters; EHS truncates it`) + if (app.activity != null && (typeof app.activity !== "string" || !PACKAGE.test(app.activity))) errors.push(`${where}.activity must be a class name`) + const icon = icons ? devicePath(app.icon, APP_ICON_EXTENSIONS, `${where}.icon`, errors) : null + return { label: app.label, package: pkg, activity: app.activity ?? "", icon } +} + +function applicationTag(app, indent) { + const icon = app.icon ? ` icon="${xml(app.icon)}"` : "" + return `${indent}` +} + +/******************************************************************************* + ** Validate a profile. Returns normalized values plus the inputs that are still missing before it can be installed. + *******************************************************************************/ +export function validate(profile) { + const errors = [] + const missing = [] + const warnings = [] + const p = profile ?? {} + if (typeof p.profileId !== "string" || !/^[a-z0-9][a-z0-9-]{1,62}$/.test(p.profileId)) errors.push("profileId must be lowercase letters, digits and hyphens") + if (!Number.isInteger(p.revision) || p.revision < 1) errors.push("revision must be a positive integer") + + const device = p.device ?? {} + for (const key of ["androidVersion", "mxVersion", "osBuild"]) if (!device[key]) missing.push(`device.${key}: measure on the target device before generating installable MX output`) + if (!p.ehs?.installedVersion) missing.push("ehs.installedVersion: select an EHS build supported on the measured firmware (docs checked: 8.0)") + + const q = p.qqq ?? {} + if (typeof q.package !== "string" || !PACKAGE.test(q.package)) errors.push("qqq.package must be the existing QQQ package name") + if (typeof q.activity !== "string" || !PACKAGE.test(q.activity)) errors.push("qqq.activity must be a fully qualified activity class") + if (typeof q.label !== "string" || q.label === "" || q.label.length > 18) errors.push("qqq.label is required (18 characters or fewer)") + const endpoint = managedServerUrl(q.endpoint) + if (endpoint === null) errors.push("qqq.endpoint must be an https origin with no credentials, path, query or fragment (the app rejects anything else)") + else if (new URL(endpoint).hostname.endsWith(".invalid")) missing.push("qqq.endpoint: replace the placeholder with the company QQQ server URL") + if (q.orientation != null && !MANAGED_ORIENTATIONS.includes(q.orientation)) errors.push(`qqq.orientation must be one of ${MANAGED_ORIENTATIONS.join(", ")} or omitted`) + + const l = p.launcher ?? {} + const title = validateTitle(l.title, errors) + const logo = devicePath(l.titleBarLogo, LOGO_EXTENSIONS, "launcher.titleBarLogo", errors) + const wallpaper = devicePath(l.wallpaper, LOGO_EXTENSIONS, "launcher.wallpaper", errors) + if (!logo) missing.push("launcher.titleBarLogo: company logo file and its /enterprise/usr path") + if (!wallpaper) missing.push("launcher.wallpaper: company wallpaper file and its /enterprise/usr path") + const textColor = color(l.iconLabelTextColor ?? "#FFFFFFFF", "launcher.iconLabelTextColor", errors) + const backgroundColor = color(l.iconLabelBackgroundColor ?? "#00FFFFFF", "launcher.iconLabelBackgroundColor", errors) + if (l.iconSize != null) errors.push("launcher.iconSize is unsupported: Zebra's snippet does not show where user_options sits in the config file") + + const apps = [] + if (!Array.isArray(p.permittedApps) || p.permittedApps.length === 0) errors.push("permittedApps must list at least the QQQ application") + else p.permittedApps.forEach((a, i) => { const v = validateApp(a, i, "permittedApps", errors, { icons: true }); if (v) apps.push(v) }) + if (!apps.some((a) => a.package === q.package)) errors.push("permittedApps must include the qqq.package application") + if (new Set(apps.map((a) => a.package)).size !== apps.length) errors.push("permittedApps contains a duplicate package") + if (apps.length === 1) missing.push("permittedApps: administrator list of required Android companion apps (camera/photo picker, printing); only QQQ is listed") + + const tools = [] + ;(p.tools ?? []).forEach((a, i) => { const v = validateApp(a, i, "tools", errors, { icons: false }); if (v) tools.push(v) }) + + const r = p.restrictions ?? {} + for (const [key, allowed] of [["systemSettingsRestricted", [0, 1, 3]], ["recentAppsAccessDisabled", [0, 1]], ["recentAppsButtonDisabled", [0, 1, 2, 3]]]) { + if (!allowed.includes(r[key])) errors.push(`restrictions.${key} must be one of ${allowed.join(", ")} (explicit decision required)`) + } + if (r.systemSettingsRestricted === 3) warnings.push("systemSettingsRestricted 3 requires MX 11.7+ and OSx 11.5.21+ on the device") + if (r.systemSettingsRestricted === 1) warnings.push("systemSettingsRestricted 1 (EHS default) hides most Settings panels; confirm Bluetooth printer pairing and Wi-Fi workflows on a spare device") + + const deploy = [] + ;(p.deploy ?? []).forEach((d, i) => { + const where = `deploy[${i}]` + const known = [EHS_PACKAGE, q.package] + if (!d || !known.includes(d.package)) errors.push(`${where}.package must be EHS or the QQQ package`) + else if (!["Install", "Upgrade"].includes(d.action)) errors.push(`${where}.action must be Install or Upgrade`) + else if (typeof d.apk !== "string" || !d.apk.startsWith("/") || d.apk.split("/").includes("..") || !d.apk.endsWith(".apk")) errors.push(`${where}.apk must be an absolute on-device .apk path already staged`) + else deploy.push({ package: d.package, action: d.action, apk: d.apk }) + }) + if (!deploy.some((d) => d.package === EHS_PACKAGE)) missing.push("deploy: EHS APK on-device path (artifact delivery method and checksum are an administrator decision)") + + return { errors, missing, warnings, normalized: { title, logo, wallpaper, textColor, backgroundColor, apps, tools, deploy, qqq: q, launcher: l, restrictions: r } } +} + +/******************************************************************************* + ** Render enterprisehomescreen.xml. Tags not parameterized keep the values of Zebra's documented default file. + *******************************************************************************/ +export function renderEhs(profile, n) { + const qqqApp = n.apps.find((a) => a.package === n.qqq.package) + const lines = ["", ``, ""] + lines.push(" ", applicationTag(qqqApp, " "), " ") + lines.push(" ", ...n.apps.map((a) => applicationTag(a, " ")), " ") + if (n.tools.length > 0) lines.push(" ", ...n.tools.map((a) => applicationTag(a, " ")), " ") + // EHS stores a hash here when an administrator sets the password in Admin Mode; it must never be authored. + lines.push(" ", " ", " ") + lines.push(" ") + lines.push(n.title.dynamic ? ` <value>${xml(n.title.text)}</value>` : ` ${xml(n.title.text)}`) + if (n.logo) { + lines.push(" ", " 0", ` ${xml(n.logo)}`) + lines.push(` ${n.launcher.reuseLogoOnEhsScreens ? 1 : 0}`, " ") + } + lines.push(` ${xml(n.backgroundColor)}`, ` ${xml(n.textColor)}`) + lines.push(" ", " 0", " 0") + lines.push(` ${xml(n.wallpaper ?? "")}`) + if (n.wallpaper) lines.push(` ${n.launcher.wallpaperStretch ? 1 : 0}`) + lines.push(" 0", " 1", " 1") + lines.push(" 1", ` ${n.restrictions.systemSettingsRestricted}`) + lines.push(` ${n.restrictions.recentAppsButtonDisabled}`, ` ${n.restrictions.recentAppsAccessDisabled}`) + lines.push(" ", ` ${profile.launcher?.showIpAddress ? 1 : 0}`, " 0", " 0", " 0", " 0", " ") + lines.push(" ", " 0", " 10", " 1", " ") + lines.push(" ") + lines.push("", "") + return lines.join("\n") +} + +/******************************************************************************* + ** Render the StageNow/MX AppMgr document: optional APK installs, then EHS as the default launcher. + *******************************************************************************/ +export function renderMx(profile, n) { + const lines = ["", ``, ""] + for (const d of n.deploy) lines.push(" ", ` `, ` `, " ") + lines.push(" ", " ", ` `, " ") + lines.push("", "") + return lines.join("\n") +} + +/******************************************************************************* + ** Validate then write outputs. MX output is withheld until the device is measured. + *******************************************************************************/ +export function generate(profile, outDir) { + const { errors, missing, warnings, normalized } = validate(profile) + const report = { profileId: profile?.profileId, revision: profile?.revision, ready: false, errors, missing, warnings, files: [] } + if (errors.length > 0) return report + mkdirSync(outDir, { recursive: true }) + const emit = (name, text) => { writeFileSync(join(outDir, name), text, "utf8"); report.files.push(name) } + emit("enterprisehomescreen.xml", renderEhs(profile, normalized)) + // Android managed configuration for the EMM; withheld while the endpoint is still a placeholder. + if (!missing.some((m) => m.startsWith("qqq.endpoint"))) { + const managed = { [MANAGED_SERVER_KEY]: managedServerUrl(profile.qqq.endpoint) } + if (profile.qqq.orientation != null) managed[MANAGED_ORIENTATION_KEY] = profile.qqq.orientation + emit("managed-configuration.json", JSON.stringify(managed, null, 2) + "\n") + } else report.warnings.push("managed-configuration.json withheld: qqq.endpoint is still a placeholder") + const mxReady =!missing.some((m) => m.startsWith("device.") || m.startsWith("deploy:")) + if (mxReady) emit("stagenow-mx-appmgr.xml", renderMx(profile, normalized)) + else report.warnings.push("stagenow-mx-appmgr.xml withheld: device measurements and EHS APK path are missing") + report.ready = missing.length === 0 + writeFileSync(join(outDir, "profile-report.json"), JSON.stringify(report, null, 2) + "\n", "utf8") + report.files.push("profile-report.json") + return report +} + +if (import.meta.url === pathToFileURL(process.argv[1] ?? "").href) { + const [input, outDir, ...flags] = process.argv.slice(2) + if (!input || !outDir) { console.error("usage: generate-company-profile.mjs [--require-ready]"); process.exit(64) } + const report = generate(JSON.parse(readFileSync(input, "utf8")), outDir) + console.log(JSON.stringify(report, null, 2)) + if (report.errors.length > 0) process.exit(1) + if (flags.includes("--require-ready") && !report.ready) process.exit(2) +} diff --git a/deployment/company-profile/generate-company-profile.test.mjs b/deployment/company-profile/generate-company-profile.test.mjs new file mode 100644 index 0000000..a5bb913 --- /dev/null +++ b/deployment/company-profile/generate-company-profile.test.mjs @@ -0,0 +1,125 @@ +/* Copyright (c) 2026 QRunIO. SPDX-License-Identifier: Apache-2.0 */ +import assert from "node:assert/strict" +import { mkdtempSync, readFileSync, readdirSync } from "node:fs" +import { tmpdir } from "node:os" +import { join } from "node:path" +import test from "node:test" +import { EHS_PACKAGE, MANAGED_ORIENTATIONS, generate, managedServerUrl, validate, xml } from "./generate-company-profile.mjs" + +const example = () => JSON.parse(readFileSync(new URL("./profile.example.json", import.meta.url), "utf8")) +const measured = () => { + const p = example() + Object.assign(p.device, { androidVersion: "14", mxVersion: "14.0.0.0", osBuild: "measured-build" }) + p.ehs.installedVersion = "8.0" + p.qqq.endpoint = "https://qqq.company.test" + p.permittedApps.push({ label: "Camera", package: "com.example.camera", activity: null, icon: null }) + p.deploy = [{ package: EHS_PACKAGE, action: "Install", apk: "/enterprise/usr/persist/EHS.apk" }] + return p +} +const out = () => mkdtempSync(join(tmpdir(), "company-profile-")) + +test("example is valid but reports every unmeasured input and withholds MX output", () => { + const dir = out() + const report = generate(example(), dir) + assert.deepEqual(report.errors, []) + assert.equal(report.ready, false) + assert.ok(report.missing.some((m) => m.startsWith("device.mxVersion"))) + assert.ok(report.missing.some((m) => m.startsWith("permittedApps"))) + assert.ok(report.missing.some((m) => m.startsWith("qqq.endpoint"))) + assert.deepEqual(readdirSync(dir).sort(), ["enterprisehomescreen.xml", "profile-report.json"]) +}) + +test("measured profile is ready and emits documented EHS and MX elements only", () => { + const dir = out() + const report = generate(measured(), dir) + assert.deepEqual(report.errors, []) + assert.equal(report.ready, true) + const ehs = readFileSync(join(dir, "enterprisehomescreen.xml"), "utf8") + assert.match(ehs, /<value>Company \[serial_number\]<\/value><\/title>/) + assert.match(ehs, /<wallpaper>\/enterprise\/usr\/company\/wallpaper\.png<\/wallpaper>/) + assert.match(ehs, /<usb_debugging_disabled>1<\/usb_debugging_disabled>/) + assert.match(ehs, /<kiosk_mode_enabled>0<\/kiosk_mode_enabled>/) + assert.match(ehs, /<admin><\/admin>/) + const mx = readFileSync(join(dir, "stagenow-mx-appmgr.xml"), "utf8") + assert.match(mx, /value="SetDefaultLauncher"/) + assert.match(mx, new RegExp(`name="Package" value="${EHS_PACKAGE.replace(/\./g, "\\.")}"`)) + assert.doesNotMatch(ehs, /<admin>[^<]+<\/admin>/) + assert.doesNotMatch(mx + ehs, /token|secret/i) +}) + +test("security-weakening or undocumented inputs are rejected", () => { + const cases = [ + (p) => { p.permittedApps.push({ label: "All", package: "com.android.*" }) }, + (p) => { p.permittedApps.push({ label: "Wild", package: "com.mobility.*" }) }, + (p) => { p.launcher.wallpaper = "/sdcard/wallpaper.png" }, + (p) => { p.launcher.wallpaper = "/enterprise/usr/../x.png" }, + (p) => { p.qqq.endpoint = "http://qqq.company.test" }, + (p) => { p.qqq.endpoint = "https://user:pw@qqq.company.test" }, + (p) => { p.launcher.title = "Dynamic [username]" }, + (p) => { p.restrictions.systemSettingsRestricted = 2 }, + (p) => { delete p.restrictions.recentAppsAccessDisabled }, + (p) => { p.launcher.iconSize = "XL" }, + (p) => { p.permittedApps.push({ label: "A very long label over limit", package: "com.example.long" }) }, + (p) => { p.permittedApps = [{ label: "Other", package: "com.example.other" }] }, + (p) => { p.deploy = [{ package: "com.evil.app", action: "Install", apk: "/enterprise/usr/persist/x.apk" }] }, + ] + for (const mutate of cases) { + const p = measured() + mutate(p) + assert.ok(validate(p).errors.length > 0, mutate.toString()) + } +}) + +test("managed configuration uses the app's exact keys and is withheld for a placeholder endpoint", () => { + const withheld = out() + const placeholder = generate(example(), withheld) + assert.ok(!readdirSync(withheld).includes("managed-configuration.json")) + assert.ok(placeholder.warnings.some((w) => w.startsWith("managed-configuration.json withheld"))) + + const dir = out() + const p = measured() + p.qqq.endpoint = " https://QQQ.Company.test " + p.qqq.orientation = "REVERSE_LANDSCAPE" + assert.deepEqual(generate(p, dir).errors, []) + assert.deepEqual(JSON.parse(readFileSync(join(dir, "managed-configuration.json"), "utf8")), { + qqq_server_url: "https://qqq.company.test/", + qqq_orientation: "REVERSE_LANDSCAPE", + }) + + const noOrientation = out() + generate(measured(), noOrientation) + assert.deepEqual(Object.keys(JSON.parse(readFileSync(join(noOrientation, "managed-configuration.json"), "utf8"))), ["qqq_server_url"]) +}) + +test("managed server URL accepts only an https origin, mirroring the app", () => { + assert.equal(managedServerUrl("https://qqq.company.test"), "https://qqq.company.test/") + assert.equal(managedServerUrl("https://qqq.company.test:8443/"), "https://qqq.company.test:8443/") + for (const bad of ["http://qqq.company.test", "https://u:p@qqq.company.test", "https://qqq.company.test/app", "https://qqq.company.test/?x=1", "https://qqq.company.test/#f", "ftp://qqq.company.test", "nonsense", "", null, 7, `https://${"a".repeat(2100)}`]) { + assert.equal(managedServerUrl(bad), null, String(bad)) + const p = measured() + p.qqq.endpoint = bad + assert.ok(validate(p).errors.length > 0, String(bad)) + } +}) + +test("orientation must be an exact app value", () => { + for (const good of MANAGED_ORIENTATIONS) { + const p = measured() + p.qqq.orientation = good + assert.deepEqual(validate(p).errors, []) + } + for (const bad of ["portrait", "Landscape", "AUTO", "SENSOR", "", 90]) { + const p = measured() + p.qqq.orientation = bad + assert.ok(validate(p).errors.length > 0, String(bad)) + } +}) + +test("XML special characters in labels are escaped", () => { + assert.equal(xml(`a&b<c>"d"'e'`), "a&b<c>"d"'e'") + const p = measured() + p.permittedApps[1].label = "Pick & <Scan>" + const dir = out() + assert.deepEqual(generate(p, dir).errors, []) + assert.match(readFileSync(join(dir, "enterprisehomescreen.xml"), "utf8"), /label="Pick & <Scan>"/) +}) diff --git a/deployment/company-profile/profile.example.json b/deployment/company-profile/profile.example.json new file mode 100644 index 0000000..8cef516 --- /dev/null +++ b/deployment/company-profile/profile.example.json @@ -0,0 +1,41 @@ +{ + "profileId": "example-company", + "revision": 1, + "device": { + "model": "TC22", + "androidVersion": null, + "mxVersion": null, + "osBuild": null + }, + "ehs": { + "docsVersion": "8.0", + "installedVersion": null + }, + "qqq": { + "package": "io.qrun.mobile.scanner", + "activity": "io.qrun.mobile.scanner.ScannerActivity", + "label": "QQQ Mobile", + "endpoint": "https://qqq.example.invalid", + "orientation": null + }, + "launcher": { + "title": "Company [serial_number]", + "titleBarLogo": "/enterprise/usr/company/logo.png", + "reuseLogoOnEhsScreens": true, + "wallpaper": "/enterprise/usr/company/wallpaper.png", + "wallpaperStretch": false, + "iconLabelTextColor": "#FFFFFFFF", + "iconLabelBackgroundColor": "#00FFFFFF", + "iconSize": null + }, + "permittedApps": [ + { "label": "QQQ Mobile", "package": "io.qrun.mobile.scanner", "activity": "io.qrun.mobile.scanner.ScannerActivity", "icon": null } + ], + "tools": [], + "restrictions": { + "systemSettingsRestricted": 1, + "recentAppsAccessDisabled": 1, + "recentAppsButtonDisabled": 1 + }, + "deploy": [] +} diff --git a/docs/ADR-DEVICE-SCREEN-VIEWING.md b/docs/ADR-DEVICE-SCREEN-VIEWING.md new file mode 100644 index 0000000..4886d9f --- /dev/null +++ b/docs/ADR-DEVICE-SCREEN-VIEWING.md @@ -0,0 +1,17 @@ +# Optional whole-device screen viewing + +Status: accepted implementation scope; validation pending. + +The existing mobile-scanners 1.1 transport captures only eligible QQQ app content. Its foreground/focus checks and PixelCopy implementation remain the default. Whole-device viewing needs an explicit semantic mode because the old server deliberately rejects background capture and its schemas prohibit other-app/OS pixels. + +The additive 1.2 contract advertises supported capture modes in the session heartbeat. Missing capabilities and missing mode fields mean `APP_CONTENT`. `DEVICE_SCREEN` is selected only by an authenticated, approved device operator using Android's own consent dialog. An administrator cannot grant that consent. The existing admin-only viewer and current device/session authorization remain mandatory; a mode change invalidates old leases and pixels. Each new lease and frame carries its mode, preventing a full-display frame from being accepted as app-content capture. The session record exposes the current mode to the administrator. + +Android uses a nonexported `mediaProjection` foreground service, an ongoing informational notification, one in-memory consent result, one virtual display and a bounded ImageReader. No audio, remote control, screen recording or saved screenshots are added. Frame size/rate/byte limits and ephemeral latest-only server retention stay unchanged. A single MobileSessionController owns heartbeats/uploads; device mode changes its capture source and allows background heartbeats while consent and the current authenticated session remain valid. Location telemetry retains its existing foreground-only rules. + +Starting requires an explicit operator action and system approval for this sharing session, plus an enabled sharing notification. While waiting for an administrator's bounded lease, no frame is uploaded; absence of a lease times out after 30 seconds. Once viewing has begun, lease loss/expiry, network failure, system Stop, device lock, approval loss, logout, server change or controller disposal invalidates capture immediately and releases projection/display/images/service. A service watchdog independently enforces the lease deadline even during encoding or an outstanding request. There is no automatic restart or remembered consent. Activity recreation may end sharing and require fresh consent; it must never silently broaden or revive a grant. System Stop suspends viewing until a fresh sharing grant is started. The app has no Stop viewing, Allow viewing, or custom notification stop action. Android system consent and stop controls remain available. + +Implementation files: Android SessionScreen/MobileSessionApi/MobileSessionController, new DeviceScreenCaptureService and operator control, ScannerActivity wiring and manifest; server MobileSessionService/MobileScreenService/MobileSessionSchemas/ScreenSpec, session metadata/H2 additive migration and extension version. Existing standard rendering and authenticated session APIs are reused; no parallel media server or business-screen framework is added. + +Required tests cover old1.1 fallback, mode mismatch/lease rotation, revoked/ended sessions, bounded no-viewer timeout, late consent/capture after logout, denial/cancel/duplicate result, stale frame disposal, system Stop. Actual Android consent, background display capture, rotation/lock and protected-window behavior require a separate approved native test; synthetic tests do not establish physical capture acceptance. + +Android's [official MediaProjection guide](https://developer.android.com/media/grow/media-projection) requires new consent for each projection session, one-use projection tokens and callback cleanup. Android14+ requires the mediaProjection foreground-service type/permission and supports display or app selection. The device-screen control requests the default display where supported and keeps the system confirmation visible. Protected windows remain protected by Android; we do not attempt to bypass them. A consenting user may expose other apps and notifications, which the control must explain before starting. diff --git a/docs/AUTHENTICATION.md b/docs/AUTHENTICATION.md new file mode 100644 index 0000000..460d581 --- /dev/null +++ b/docs/AUTHENTICATION.md @@ -0,0 +1,98 @@ +# Scanner authentication + +The server selects the login provider through the versioned QQQ UI API. `TABLE_BASED` uses the native username/password form. `OAUTH2` uses the organization's external browser only when the server explicitly advertises the supported native session flow. This supports Authentik without embedding an Authentik URL or client secret in a customer-specific APK. Unknown providers and unsupported flows show a configuration message; OAuth cancellation never falls back to a local password form. + +The shared scanner APK accepts only `TABLE_BASED` and the API 1.10 `OAUTH2` flow described here. Legacy `AUTH0` support belongs to the shared library and sample host; the scanner rejects that metadata before opening a browser. Its unused Auth0 manifest placeholders do not configure a customer login. Legacy callback lifecycle tests do not establish a live Auth0 provider round trip. This matches the [README's scanner support scope](../README.md). + +## Native browser contract + +Before opening a browser, the updated client requires UI API `>=1.10.0 <2.0.0`, both `nativeSessionLogin` and `nativeSessionNonceValidation` features, and this typed descriptor in `/qqq/v1/metaData/authentication`. Missing or unknown nonce policy is unsupported; there is no legacy browser-login downgrade. TABLE sign-in is unchanged: + +```json +{ + "type": "OAUTH2", + "name": "organization", + "values": { + "clientId": "server-exchanged-client", + "scopes": "openid profile email", + "nativeSessionLogin": { + "flow": "AUTHORIZATION_CODE_PKCE_SESSION", + "codeChallengeMethod": "S256", + "prompt": "login", + "nonceValidation": "REQUIRED", + "issuer": "https://identity.example/application/o/company/", + "discoveryUrl": "https://identity.example/application/o/company/.well-known/openid-configuration", + "redirectUris": ["io.qrun.mobile.scanner.oauth://callback/oauth2redirect"] + } + } +} +``` + +Values above are illustrative. The actual server advertises its issuer, discovery URL, client and scopes. In Authentik global issuer mode, `issuer` may be the host root while `discoveryUrl` remains under the application path. The client does not guess either value. Server, issuer, discovery and discovered authorization/token endpoints require HTTPS for this flow, including on debug builds. Existing local TABLE_BASED testing may still use its debug HTTP policy. + +AppAuth 0.11.1 opens an external browser with authorization code, query response mode, random state and nonce, S256 PKCE, and the advertised `prompt=login` policy. Missing or other prompt policies are unsupported. This asks the provider to authenticate the operator again; provider behavior must be qualified rather than assuming the request prevents silent SSO reuse. The client validates the discovery issuer and exact callback, then submits `authenticationFlow`, `code`, `codeVerifier`, `redirectUri` and `expectedNonce` to the existing `/qqq/v1/manageSession`. QQQ exchanges the code using its server-held secret and establishes its normal session only after the configured token/nonce checks. The optional `nativeClientId` metadata describes a separate public-client bearer flow and is never substituted in this stored-session exchange. + +The nonce comes only from the original in-memory pending attempt, never from callback input. It must be 16–512 unpadded base64url characters (`A–Z`, `a–z`, `0–9`, `_`, `-`). The captured nonce policy is part of the attempt binding. A missing/mismatched callback request nonce consumes and rejects that attempt; server rejection never triggers a retry without `expectedNonce`. Other authentication DTO uses omit this optional field. The client does not receive an ID token during login and does not validate its claims itself: the advertised server policy must validate the authenticated token-endpoint response and expected nonce before creating a principal/session. Actual server/provider nonce enforcement remains a separate acceptance gate; earlier fixture evidence with `nonceValidationTested:false` is not upgraded by these client changes. + +## Deployment setup + +An administrator must configure the native session descriptor in QQQ and register the exact corresponding callback in the existing identity provider's allowed redirect list: + +| Installed package | Callback | +| --- | --- | +| Normal scanner | `io.qrun.mobile.scanner.oauth://callback/oauth2redirect` | +| Isolated E2E scanner | `io.qrun.mobile.scanner.e2e.oauth://callback/oauth2redirect` | + +Each customer uses the shared normal callback; branding remains server-driven. Register only packages actually deployed. Do not use wildcards or Authentik's first-use redirect registration. The provider must permit authorization code with S256 PKCE for the configured server-exchanged client. Keep its secret in existing server secret management, never in APK resources, client metadata or documentation. Do not register the E2E callback on production merely to run tests. + +## Lifecycle and privacy + +The pending attempt is kept in memory and bound to server, provider metadata, client, scopes, prompt and callback. Rotation preserves it; process death requires starting again. Attempts expire after five minutes and are consumed once. Server change, logout, cancellation and reset invalidate the attempt. A late exchange cookie is never automatically adopted by the HTTP interceptor. If an abandoned response provides a new session identifier, the client attempts a bounded logout at its original server without replacing the current session. If a network failure prevents receiving that identifier, server expiry remains the recovery boundary. + +Provider callback URLs, authorization codes, verifiers and raw errors are not shown in diagnostics. App sign-out ends the QQQ session. The browser's identity-provider SSO session may remain; global provider logout is not implied by this contract. + +Password and legacy Auth0 flows also bind each attempt and provisional cookie to +its initiating server, metadata and generation. A response cannot restore a +signed-out operator or replace a later operator after a server change. The +repository returns provisional session results: custom callers must validate +their pending attempt before explicitly adopting the session. Repeated logout +effects share one logical sign-out; local credentials are cleared independently +of bounded server revocation and the browser provider's outcome. + +The fresh-login prompt is a request to the provider, not cryptographic proof of a newly validated `auth_time`. Before shared-handheld deployment, test with the prior operator still signed into the browser: the next login must require authentication, allow the next operator to identify themselves, and attribute subsequent scans to that operator. Custom provider flows or upstream SSO may affect this behavior and require provider configuration; this client change does not modify them. + +## Optional company sign-out (implementation awaiting qualification) + +Ordinary **Sign out** continues to end only the QQQ session. The scanner also exposes a separate **Sign out of company** action in Account when the server advertises API1.10 or later within major1, feature `nativeSessionLogout`, and OAuth2 metadata `nativeSessionLogout` with flow `OIDC_RP_INITIATED_LOGOUT` and `postLogoutRedirectUris`. Other library hosts opt into that separate action with `LocalCompanySignOutEnabled`; it is disabled by default. No automatic provider-logout policy is selected. The confirmation explains that company sign-out may affect other applications in the browser. + +Register the installed package's exact callback separately as a provider **post-logout** redirect, even when it matches the existing login callback. The client sends `{"nativeLogout":{"postLogoutRedirectUri":"<registered callback>"}}` to the existing `POST /qqq/v1/logout`. Its optional `nativeLogoutData` contains `issuer`, `endSessionEndpoint`, `postLogoutRedirectUri` and sensitive `idTokenHint`. Old sessions or unsupported servers may legitimately omit this data. The ordinary logout request remains unchanged. + +**Ordering (fix prepared 2026-11-05, not released):** for company sign-out the client sends the provider logout request *before* running the host's `beforeLogout` hook, then clears local state, then opens the browser. The scanner host's hook ends the device session (`POST /qbit/mobile-scanners/sessions/current/end`), which on the server runs the core logout and removes the QQQ session; running it first left no session for `POST /qqq/v1/logout` to describe, so `nativeLogoutData` was never returned and the browser never opened (observed on an MC9400 against a real Authentik fixture). The device-session end may now answer 401 because the login already ended; the client tolerates that and still clears local authentication. Ordinary sign-out is unchanged: host hook first, then the core logout. + +The client clears QQQ session/private process state before opening AppAuth's end-session browser. It independently fetches discovery from the original login binding and checks the issuer, HTTPS end-session endpoint (without user information, query or fragment), and exact callback. A distinct in-memory, single-use state attempt binds completion to server, provider and endpoint. Login cannot start during company logout; cancellation, wrong state, reset or a late callback cannot restore a QQQ session. Browser cancellation or unavailable data explicitly reports incomplete company sign-out. Returning from the provider is protocol completion, not an independent claim about every upstream SSO session. + +The hint is deliberately held in transient ordinary classes with no generated value `toString`, never application preferences, ViewModel state, diagnostics, process values or application saved state. Parsing failures and HTTP diagnostics do not expose response bodies. AppAuth0.11.1 necessarily serializes its end-session request into Android Intents/saved Activity state, and the browser receives the hint in a URL query. This is not a zero-persistence guarantee. Do not enable URI/body logging, browser traces or proxy access logs containing query strings. AppAuth's warning on a state mismatch can contain state values; do not treat SDK debug output as a safe diagnostics feed. Native synthetic tests include a hint logcat/preferences canary; real-provider and hardware qualification are separate gates. + +The real Authentik2026.8.5 desktop test established A's principal and QQQ logout invalidation, but a subsequent `prompt=login` request silently reused A's retained provider SSO. That failed freshness assertion remains valid evidence; the optional RP logout flow must pass its own actual A → company sign-out → fresh B acceptance before shared-handheld deployment. It does not patch provider internals or clear browser cookies in a test. + +## Host storage and transport + +Applications embedding the shared libraries must keep reusable session storage under +Android's `noBackupFilesDir` and exclude it from both cloud backup and device transfer. +Ordinary preference storage can carry session authority to a restored installation. +The scanner and sample hosts disable backup and define explicit transfer exclusions. +The sample now uses a no-backup store; it deliberately does not migrate its previous +backup-eligible settings, so an upgraded sample requires a fresh login. + +The sample permits HTTP development environments and cleartext traffic only in debug +builds. Its release manifest rejects cleartext even for an old restored HTTP address. +Embedding applications must enforce the same release transport policy before allowing +authentication. The scanner's existing release HTTPS requirement remains in force. + +## Verification status + +The latest security qualification passes 109 JVM tests, scanner lint and APK assembly. All 32 selected native navigation/input/account/authentication/storage cases pass on TC22, including seven synthetic AppAuth request/result scenarios and ten additional authentication lifecycle regressions. See [the scoped security evidence](SECURITY-REVIEW-2026-10-31.md) and [native OAuth evidence](NATIVE-AUTH-ACCEPTANCE.md) for their boundaries. Earlier generated AppAuth notices were verified in debug/E2E APKs. A real configured Authentik sign-in remains a separate acceptance gate: it requires a reachable HTTPS QQQ server advertising the descriptor, an explicitly registered callback and an authorized test account. No live provider configuration was changed as part of implementation. + +Primary references: [AppAuth Android 0.11.1](https://github.com/openid/AppAuth-Android/tree/0.11.1) documents external-browser authorization, PKCE and server-side exchange when a confidential secret is needed. [Authentik OAuth2 provider documentation](https://docs.goauthentik.io/add-secure-apps/providers/oauth2/) documents PKCE, exact redirect registration and global issuer mode. + +Authentik's [version 2026.8.3 authorization implementation](https://github.com/goauthentik/authentik/blob/version/2026.8.3/authentik/providers/oauth2/views/authorize.py#L550-L560) handles `prompt=login` by requiring a new login event. Its [current ForceAuthn documentation](https://docs.goauthentik.io/add-secure-apps/providers/saml/#forceauthn) describes the analogous authentication-flow behavior. Actual configured-provider acceptance remains required. diff --git a/docs/CI-FIXTURE.md b/docs/CI-FIXTURE.md new file mode 100644 index 0000000..8cd23a6 --- /dev/null +++ b/docs/CI-FIXTURE.md @@ -0,0 +1,15 @@ +# Hosted scanner fixture + +The source pins and complete Maven commands live in [Scanner Android](../.github/workflows/scanner.yml). The fixture uses core commit `ecf0f550a0357cec6387c2b54efca128a405a629` and scanner server commit `10416938724c9663d66f7848ff2b1a63fe635794`. The core includes the UI API 1.9 native authentication contract, credential log redaction, explicit JSON null handling, the Guava 33.7.2-jre security update, portable SPA filesystem paths, and automatically allocated spec-test ports. The scanner includes the canonical UTC H2 migration, the demo BOM import that aligns all transitive QQQ dependencies with the selected version, and the additive mobile-scanners1.2 capture-mode contract. The normal operator server remains a separately qualified runtime; a CI source pin does not replace it. + +Each job creates a fresh Maven repository under the runner's temporary directory. Core is built as `4.1.0-ci.<full-core-SHA>`; the scanner and demo receive that exact version through `qqq.version`. This 49-character value retains the full commit identity and fits the core's 50-character help-bundle version limit. Nothing installs into the runner's shared Maven repository, substitutes a published artifact, or restores a cached QQQ snapshot. The scanner's own fixture snapshot is built from its checked source in that same fresh repository. This is an isolated CI source qualification, not publication of a production release or adoption by an operator server. The optional Record Files integration has its own dependency qualification. + +The core reactor includes the BOM and middleware API with their required upstream modules. It runs every test in that dependency closure, Checkstyle, JaCoCo coverage checks, SpotBugs and PMD through the full `clean install` lifecycle. The scanner and demo then run their full verification suites before Maven writes the demo's runtime classpath, dependency tree and effective POM. The standard `jar` tool and Node SHA-256 implementation inspect that resolved classpath: every runtime JAR must belong to the private repository, every backend QQQ module must use the unique core version, required modules must exist, exactly H2 2.2.224 and Guava 33.7.2-jre must occur, and QQQ-owned JARs must not duplicate backend classes. The pinned frontend distribution keeps its independent version. + +`fixture-provenance.json` records all resolved runtime JAR hashes, both source commits, the core revision and the unique QQQ class count. The dependency tree, effective POM and test evidence accompany the emulator artifacts. These checks inspect the selected runtime closure; they do not promise reproducible byte-for-byte Java builds or validate a published release. + +For a local reproduction, check out both exact commits into disposable source directories and run the workflow's Maven commands with a new empty private repository path. Use Java 21, the checked-in wrappers, two active processors and a 768 MiB heap. Windows PowerShell uses `mvnw.cmd` and quoted `-D` arguments. Never point `maven.repo.local` at the shared `.m2` repository or reuse an operator database. Run `verify-fixture-provenance.mjs` with the server directory, private repository path, core SHA and server SHA, then run the emulator entry point as described in [EMULATOR.md](EMULATOR.md). + +The local Windows qualification adds `-Dexec.skip=true` only to the core command because Maven's inline `sh -c` coverage-summary formatting fails Windows argument quoting. The inspected dependency closure has only that cosmetic exec-plugin execution. This exception retains all tests, coverage checks and static analyses; the hosted Ubuntu command keeps the summary enabled. Do not use a focused test selector with the full lifecycle: its coverage thresholds apply to the complete module suites. + +Preserve the full native runner. In particular, `admin-forms` submits an actual optional null reason through the native session-ending form and guards the prior HTTP 500 failure. `session-monitor` separately verifies screen viewing, remote termination and fresh login; its administrative helper alone does not exercise that nullable form. TABLE_BASED fixture metadata must not advertise OAuth2-only native login support. Actual configured identity-provider acceptance remains a separate gate. diff --git a/docs/CLAUDE-NATIVE-HANDOFF.md b/docs/CLAUDE-NATIVE-HANDOFF.md new file mode 100644 index 0000000..3cc032e --- /dev/null +++ b/docs/CLAUDE-NATIVE-HANDOFF.md @@ -0,0 +1,43 @@ +# Claude native handoff: Echo setup named possible values + +## Source-verified contract (core `qqq-wt-native-provider-logout`) +- operationId `searchProcessPossibleValues`: `POST /qqq/v1/processes/{processName}/possibleValues/{fieldName}` (`UiApiOperationIds`, `ProcessPossibleValuesSpecV1`, openapi.yaml ~12440). Server advertises feature `possibleValues` on `GET /version`. +- Request: `application/json` `{ "values": {other form values}, "processValues": {...}, "useCase": "form", "searchTerm"?, "ids"? }` (`PossibleValuesSpecUtils`). Not multipart. Same session cookie, `X-QQQ-Client` and device headers as other native calls (shared Retrofit client). +- Response `PossibleValuesResponseV1`: `{ "options": [{ "id", "label", ... }], "hasMore"? }`; `options` is omitted when empty. +- Field metadata (FieldMetaData v1): `possibleValueSourceName`, and for contingent fields `possibleValueSourceDependsOn: [names]` and `possibleValueSourceDependencyBehavior: DISABLE_UNTIL_SET | SHOW_ALL_UNTIL_SET` (docs/CONTINGENT-POSSIBLE-VALUES.md). +- Frontend rules (same doc): re-query when a dependency changes, clear a selection that no longer fits (transitively), disable with a hint until dependencies are set (default), ignore stale responses. + +A previous revision of this work invented the multipart shape from memory; it has been replaced entirely by the above. The route path happened to match; the body did not. + +## Root cause (unchanged, source inference) +Echo `setup` declares `printerId`/`mediaId` with named PVS (media `dependsOn printerId`); fixture uses ENUM PVS. The client rendered only inline choices, so Printer became a free-text "Printer *" field and submission was blocked as unsupported. That init is a synchronous COMPLETE (not ASYNC) is inferred from sources and the operations log; the native E2E remains the authority. The fixture is NOT changed to inline choices. + +## Implementation +- core: `QQQApiService.processPossibleValues`; `QQQRepository.processPossibleValues(process, field, values, processValues)` (default throws Unsupported so other fakes compile); `NetworkQQQRepository` builds the JSON body and decodes options (scalar ids kept); `QFieldMetaData` gains `possibleValueSourceDependsOn` / `possibleValueSourceDependencyBehavior`. +- mobileapp `ProcessViewModel`: `loadRemoteOptions`, `remoteOptionsBlockedReason` (DISABLE_UNTIL_SET -> "Choose Printer first." and no request), `fieldChanged` (dependents drop selection immediately, transitively, and re-query), per-field generation token so only the newest request publishes (a late reply for an old parent cannot restore options or a selection), post-load prune of a choice no longer offered, `fieldResets` so the control follows a VM-cleared value. Load failures are shown with "Retry choices", cancel the superseded job, never set client-work, so Cancel/Leave stay available. `reset()` clears all of it. +- `ProcessComponentEditForm`: select for named PVS (label text unchanged: "Printer", "Paper or label size", button "Choose a value"), disabled with a hint while blocked. +- `SemanticProcess.unsupported` accepts named PVS in EDIT_FORM only (widget INPUT_FIELD remains unsupported). +- E2E test: literal `waitFor("Printer")` unchanged (diagnostic text dump retained on timeout); added a readiness wait for the enabled media control before clicking it, since media is contingent. No assertion weakened. +- docs/UI-API.md updated. + +## Tests added/updated +- `NetworkQQQRepositoryTest.processPossibleValuesUsesThePublishedJsonOperation`: method/path/JSON body/use case, response with options, and the omitted-`options` empty response. +- `ProcessSubmissionTest.namedPossibleValueSourcesLoadWithDependentValuesAndReportFailures`: blocked dependent not searched; parent value sent; dependent selection cleared on parent change; late old-parent reply ignored; failure reported, no client-work block, retry succeeds. +- `SemanticProcessTest`: named PVS in EDIT_FORM supported; UNKNOWN type and widget PVS still unsupported. +Note: server response bodies in tests are minimal shapes taken from `PossibleValuesResponseV1`/`ProcessPossibleValuesSpecV1Test` (`options[].id/label`), not captured from a live server. + +## Commands for root (Java 21, wrapper) +``` +./gradlew :qqq:android:core:testDebugUnitTest :qqq:android:mobileapp:testDebugUnitTest :scanner-host:testDebugUnitTest :scanner-host:lintDebug :scanner-host:assembleE2e :scanner-host:assembleE2eAndroidTest +node --test scripts/ci/scanner-echo-guards.test.mjs +``` +Then re-approve rebuilt APK hashes and run the root native Echo helper. + +## Known gaps / risks +- Nothing compiled or run (no shell). Expect possible small compile fixes (Compose state/`mutableIntStateOf` delegate, imports). +- `possibleValues` is not added to the client's REQUIRED_FEATURES (all existing fixtures advertise only six features); a server lacking it fails the search with a visible error + Retry rather than at startup. +- Pre-existing and untested: decoding inline `inlinePossibleValueSource` ids typed `java.io.Serializable` via kotlinx. +- Whether the real Echo metadata publishes `possibleValueSourceDependsOn` for media is inferred from `withPossibleValueSourceDependsOn(List.of("printerId"))` in the producer; unverified against a live `/metaData/process/echoPrint` response. +- Untracked `native.md` at the repo root is an obsolete earlier handoff (a pointer to this file); delete it. + +Coordinator verification:169JVMtests pass; lint0errors/0warnings; E2EAPKs assemble; all8guards/sourcegate236pass. RealTC22 Echo native scenario completes all5stages with86/86documented semanticrequests,2accepted synthetic scans andsuccessfulcleanup. Printing remains simulated. diff --git a/docs/CODING-STANDARDS-REVIEW-2026-11-01.md b/docs/CODING-STANDARDS-REVIEW-2026-11-01.md new file mode 100644 index 0000000..2e1fe15 --- /dev/null +++ b/docs/CODING-STANDARDS-REVIEW-2026-11-01.md @@ -0,0 +1,48 @@ +# Coding standards review — November 1, 2026 + +The scanner client received source-wide mechanical corrections and an explicit native Kotlin formatting pass. Compiler warnings now fail Kotlin compilation. The combined strict build passed with 163 JVM tests and no Kotlin warning/error diagnostics. Android lint reported zero errors, one bitmap-density warning and two informational findings; the density correction and its verification remain pending. These checks do not establish runtime acceptance or complete standards compliance. + +## Scope and ownership + +The review inventoried the original 2,524 tracked paths and all maintained working-tree source. The final mechanical gate covers 234 source/build/tooling files: 216 Kotlin sources, seven Gradle Kotlin files, nine JavaScript modules, one Java security probe and one Bash script. This includes shared core/mobileapp libraries, scanner host, sample application, source-set drivers, unit/native tests and CI scripts. The new About screen is included; its literal text and the Dogfooding/Query destinations are preserved by the formatter verification. + +The 2,142 Material Design drawable resources retain their upstream attribution and provenance in NOTICE and the material-icons manifest. Binary art, upstream wrapper implementation, third-party license data and generated/ignored build output were excluded from ownership rewrites. Existing Kingsrook and QRunIO copyright dates/notices were preserved. New comments do not replace third-party ownership. + +Static checks cover the entire maintained executable-source inventory. Named declaration-header correction covers all 216 Kotlin files and the Java probe. The declaration scanner excludes implicit property accessors, secondary constructors and anonymous objects; its counts are not a claim that every Kotlin syntax form was parsed. Manual semantic inspection concentrated on authentication/session boundaries, scanner ownership and release, capture consent/leases, transport/resource handling, widget conversion and callback registration. This is not an exhaustive semantic audit of every unchanged statement or every test assertion. + +## Implemented corrections + +- Added missing copyright/SPDX headers without replacing existing notices; corrected LF/final newlines and trailing whitespace. +- Replaced all 46 original wildcard imports with explicit symbols, including Compose delegation and coroutine-test extensions. +- Added useful ownership, cancellation, transport and contract comments to missing production declarations. Descriptive tests also receive the visual headers explicitly permitted by K22-CODE-09 and the QQQ code-style guidance. +- Added the [source standards gate](../scripts/ci/check-source-standards.mjs) to the existing Scanner Android verification job. It checks copyright/SPDX, UTF-8, LF/final newlines, trailing whitespace/tabs, Kotlin/Java wildcard imports and JavaScript syntax. The inventory includes tracked and nonignored untracked source, so the gate checks its own new file locally as well as in CI. +- Enabled `allWarningsAsErrors` for every `KotlinCompile` task across modules, variants and tests. No global warning suppression was added. +- Replaced unchecked widget-map casts with validated string-key copies into owned mutable state. Added regressions for immutable/shared-input ownership and malformed keys. +- Replaced the unchecked callback-function cast with checked zero-argument function registration and a return-discarding wrapper. Added regressions for malformed registration and once-per-step execution. Removed two proven redundant non-null assertions. +- Migrated the host to the already available lifecycle-compose lifecycle owner, removed a shadowed projection-listener name and retained deprecated accessibility-node recycling only on Android 26–32 with an expression-level compatibility explanation. +- Routed previously unused modifiers to the corresponding existing UI/error nodes. Five intentionally unused published renderer/dialog parameters retain their compatible signatures with parameter-level suppressions and specific explanations. These suppressions do not disable diagnostics elsewhere. +- Implemented the sample repository's previously unimplemented URI resolver with the existing production HTTP(S)/host/no-userinfo validation, and removed obsolete commented implementations. Unfinished metadata/renderer questions remain explicitly tracked in [legacy source follow-ups](LEGACY-SOURCE-FOLLOWUPS.md) and the [task list](TODO.md); deleting inline work markers does not implement those features. + +## Applicable formatter and precise limitation + +The existing repository sets `kotlin.code.style=official` in [gradle.properties](../gradle.properties), while [.editorconfig](../.editorconfig) requires three spaces. The shared personal style entry point and K22 standard give repository formatter configuration precedence. Kotlin therefore uses the native official structural layout with three-space indentation, rather than imposing incompatible generic Allman/control-parenthesis rules. The shared K22 no-line-length-limit rule is retained. The equivalent choice is now recorded in the [project IDE profile](../.idea/codeStyles/Project.xml) and its per-project selector. + +The installed Android Studio Rabbit 2 / 2026.2.2 formatter processed isolated copies of all 223 Kotlin/KTS files. Literal-aware comparison, including nested string templates and raw literals, found identical executable tokens and literal contents for all 223. The stable output changed 202 active files. A second native dry run reported 222 files well formed and **`scanner-host/build.gradle.kts` still needing reformatting**. Its original active content was retained instead of chasing repeated formatter churn. The tool returned exit code zero even when reporting files that needed reformatting, so exit status alone is insufficient for a formatter gate. + +The current GitHub workflow installs the Android SDK but does not declare an Android Studio IDE formatter installation. The existing mechanical CI gate is active; a complete native formatter CI gate requires a runner/image supplying the same existing IDE formatter and a wrapper that treats `Needs reformatting` as failure. No optional check is silently reported as a passing full formatter gate, and no alternate formatter framework was introduced. + +Relevant shared requirements: K22-CODE-01/02 (gates/warnings), 03–09 (layout and headers), 11/12 (inactive code and tracked work), 14 (imports), 20–22 (errors/private data/input validation), 24/25 (license headers/generated exclusions) and 26 (published API documentation). The remaining formatter file/CI provisioning and parser/semantic-review boundaries prevent claiming every standard is fully proven. + +## Verification for the current cohort + +- Source standards gate: **234 files passed**, including the new About screen and gate itself. +- JavaScript syntax: all nine maintained modules passed without executing their device/server operations. +- Native formatter comparison: **223/223 executable-token and literal checks passed**; 222/223 dry-run reports well formed, with the exact retained script exception above. +- Combined strict build: **passed** in 1 minute 11 seconds. Actual JVM reports contain **39 core + 53 mobileapp + 71 scanner-host = 163 tests**, with zero failures or skips. All four new warning-fix regressions are included. No Kotlin `w:`/`e:` diagnostics were emitted under warnings-as-errors. +- Scanner debug Android lint: **zero errors, one warning, two informational findings**. `IconLocation` identifies the new `query_mascot.png` in `res/drawable`; moving the unchanged image to `drawable-nodpi` and rerunning lint/debug assembly are pending. The informational findings recommend specialized integer state holders. +- Existing environment/toolchain advisories remain: SDK XML version mismatch, Java 21 warnings about source/target 8 configuration, and deprecated Gradle features. They are distinct from Kotlin source warnings and are not represented as a wholly warning-free build. +- QA/native-device verification is a separate coordinating run and remains pending in this report. JVM/build success must not be substituted for its result. + +No provider, physical scanner, projection, GPS or release acceptance gate is closed by this standards work. Those results remain in their existing readiness/acceptance records. + +Final follow-up: the unchanged Query bitmap now lives in drawable-nodpi; debug APK rebuild and lint pass with zero errors and zero warnings (two informational findings remain). All46 sample native tests pass on TC22 with no failures/errors/skips, and QA instrumentation compiles. Toolchain advisories and the formatter CI limitation above remain explicit. diff --git a/docs/COMPANY-PROFILE.md b/docs/COMPANY-PROFILE.md new file mode 100644 index 0000000..190ede5 --- /dev/null +++ b/docs/COMPANY-PROFILE.md @@ -0,0 +1,85 @@ +# Company scanner profile package + +Status 2026-11-02: **prepared, not applied.** Nothing here has been installed on, pushed to or tested against a device. No device, setting, credential or server was changed. The target device's Android build, MX version and installed EHS version have **not been measured**; Zebra documentation versions below are the documentation reviewed, not device facts. Context and layering: `docs/DEVICE-PROVISIONING.md`. + +Files: `deployment/company-profile/` + +| File | Purpose | +| --- | --- | +| `profile.example.json` | Non-secret parameters. Unmeasured or unknown values are `null` or placeholders on purpose. | +| `generate-company-profile.mjs` | Validates the profile and renders `enterprisehomescreen.xml`, `managed-configuration.json` (once the endpoint is real) and `stagenow-mx-appmgr.xml` (only when the device is measured). No dependencies. | +| `generate-company-profile.test.mjs` | `node:test` cases for rendering, withholding and rejection. | +| `DEVICE-OWNER-ENROLLMENT.md` | The separate, destructive enrollment path. Not generated. | + +```text +node deployment/company-profile/generate-company-profile.mjs my-profile.json out/ [--require-ready] +node --test deployment/company-profile/ +``` + +Exit 1 on validation errors; 2 with `--require-ready` while any input is still missing. `out/profile-report.json` lists `missing` and `warnings`. One shared APK serves every customer: customer differences are only profile values (title, logo, wallpaper, app list), never a build. + +## What the generated EHS file contains + +Only tags from Zebra's EHS 8.0 Advanced Settings (`techdocs.zebra.com/ehs/latest/guide/settings/`): `kiosk`, `applications`, `tools`, `passwords`, and in `preferences` the `title` (static, or `<value>` with one documented device-ID token), `title_bar_icon` (`title_bar_icon_disabled`, `title_bar_icon_file`, `reuse_custom_icon`), icon label colours, `orientation`, `wallpaper`, `wallpaper_stretching_enabled`, the keyguard/USB/settings/recent-apps tags, `wireless_info` and `screen_blanking`. Tags not parameterised keep the values of Zebra's documented default file. Constraints enforced from that page: images only under `/enterprise/usr` (the persistent location), documented image formats, app labels of at most 18 characters, XML escaping, no wildcard packages (rejected for least privilege), no EHS self-listing. + +Layout: EHS shows apps in listed order (links first when both exist). Arbitrary pixel placement is not a documented feature; folders are not in the pages reviewed and are not generated. + +Explicit non-goals, enforced by the generator: `usb_debugging_disabled` is always `1`, `kiosk_mode_enabled` is always `0`, no `bypass keyguard`, `<passwords>` is always empty, `launcher.iconSize` is rejected (the Zebra snippet does not show where `user_options` sits). + +## What the generated MX file contains + +`AppMgr` characteristics only (`techdocs.zebra.com/mx/appmgr/`): optional `Install`/`Upgrade` of an APK already on the device, then `SetDefaultLauncher` for `com.zebra.mdna.enterprisehomescreen` (EHS setup page, `.../ehs/latest/guide/setup/`). Characteristic version `4.2` is the version used in Zebra's examples; `SetDefaultLauncher` is listed as MX 4.1+. **Not generated:** AccessMgr (allowlist and permission grants can lock out settings or break the scanner; Zebra's schema needs a device-specific review) and file delivery of the EHS XML and images to `/enterprise/usr` (Zebra recommends StageNow, DNA Cloud or an EMM for moving files; the StageNow file-delivery parameters were not in the cached pages, so they are not guessed). + +## Hazards to review before any device + +1. **EHS defaults disable USB debugging.** Zebra: `usb_debugging_disabled` 1 "or if left unspecified will prevent user access to the file system and all ADB functionality". Installing EHS on the current development TC22 will cut ADB. Use a spare device; Zebra advises restoring USB debugging before uninstalling EHS. +2. **Pushing the XML overwrites the existing file**, including the stored admin password hash. Set the EHS admin password in Admin Mode on a reference device; never author it. Decide whether to deploy that device's exported file. +3. **`system_settings_restricted` 1 (default) hides most Settings panels** and Zebra warns it might prevent some MX features. Confirm Bluetooth printer pairing and Wi-Fi workflows. The profile requires this value explicitly. +4. **Default launcher:** EHS must be re-designated after any reinstall. Test Home/Back/recovery before relying on it. +5. **MediaProjection consent is still per session** on Android 14; nothing here grants it. +6. **Managed bootstrap is consumed by the app, but only through an EMM.** `managed-configuration.json` is a reviewable key/value payload for the EMM's Android managed-configuration (app restrictions) field; StageNow/MX and the EHS XML do not deliver it, and no Zebra schema is claimed for it. See "Managed configuration" below. + +## Inputs still required (also in `profile-report.json`) + +- Measured on the target TC22: `device.androidVersion`, `device.mxVersion`, `device.osBuild`; choose and record `ehs.installedVersion` for that firmware (docs reviewed: EHS 8.0). +- Company logo and wallpaper image files, delivered to `/enterprise/usr/...`, and their paths. +- Real company `qqq.endpoint` (HTTPS origin) and optional `qqq.orientation`; the EMM to push them as app restrictions. +- Administrator list of permitted Android companion apps (camera/photo picker, printing) with exact package and activity names from the device. +- On-device EHS APK path and the artifact delivery/checksum method; the QQQ APK path if the profile should also deploy it. +- Decisions: `systemSettingsRestricted`, recent-apps values, `show IP` visibility, who sets the EHS admin password, EMM versus StageNow, and whether a device-owner fleet is wanted. + +## Managed configuration (implemented in the shared APK) + +The app declares `res/xml/app_restrictions.xml` (manifest `android.content.APP_RESTRICTIONS`) and reads it with `RestrictionsManager` (`ManagedConfiguration.kt`). Two keys, both optional; unmanaged installs behave exactly as before. + +| Key | Values | Behaviour | +| --- | --- | --- | +| `qqq_server_url` | HTTPS origin only: no credentials, path, query or fragment; HTTP is rejected even in debug builds | No saved server: the connect form is prefilled with it and says the administrator configured it; the person still taps Connect. Different saved server: never switched silently. Settings shows a notice with "Use administrator's server", which runs the existing confirmed Change-server path (ends the session, logs out) and then shows the prefilled form. | +| `qqq_orientation` | exactly `SYSTEM`, `PORTRAIT`, `LANDSCAPE`, `REVERSE_PORTRAIT`, `REVERSE_LANDSCAPE` | A bootstrap default applied when the managed value changes (last applied value is remembered); a later local choice stands until the administrator changes it again. Unknown values are rejected, not defaulted. | + +Changes are re-read when the host resumes and while it is resumed (system `ACTION_APPLICATION_RESTRICTIONS_CHANGED`, not exported). Rejected keys are tracked by name only; values are never logged. No credentials, business metadata or branding are accepted this way. In the profile: `qqq.endpoint` and optional `qqq.orientation` produce `managed-configuration.json` (withheld while the endpoint is a placeholder). The EMM must be told to push those two keys as app restrictions for `io.qrun.mobile.scanner`. + +## Dynamic status wallpaper (implemented, optional) + +EHS has no QQQ-user or IP field (title tokens are device IDs only; Wireless Info shows the IP when `show_ip_address` is 1, exposed as `launcher.showIpAddress`), so the shared APK carries an optional native live wallpaper: `QqqStatusWallpaperService`, declared with the system-only `BIND_WALLPAPER` guard. It is inactive until a person picks it: Settings → "Status wallpaper…" opens Android's standard live-wallpaper chooser preselected to it. Nothing is applied silently; no new permission and no second app. + +- **What it shows:** company brand name always (the server's public brand name/colour already used by the host, or the default). On the unlocked home screen only, also: signed-in display name, server host and the default network's IP (address and interface, via a network callback, no polling). Preview, lock screen, a locked keyguard, a missing keyguard service and lock-only wallpaper show the brand alone. Identity is withdrawn when the screen turns off or the wallpaper stops being visible. +- **Freshness is not overstated.** The existing heartbeat runs only while the app is foreground. Shown while foreground: "Signed in: NAME". After the app leaves the screen: the name with "Last confirmed HH:mm (app in background)". After 15 minutes in the background the name is replaced by "Session unverified". States are UNKNOWN (new process, destroyed host), SIGNED_OUT and SIGNED_IN; the snapshot lives only in memory, so process death and server change return it to UNKNOWN, and logout, revocation and unauthorized responses clear the name. It holds no token, cookie, credential or session id and logs nothing. +- **Limit:** a wallpaper is visible only where the launcher or a transparent window shows it. Whether EHS reveals it is unproven; EHS draws its own `<wallpaper>` image, so leave that empty when testing. + +## Status of the implementation + +| Item | Status | +| --- | --- | +| Wallpaper service, manifest/resources, managed configuration, settings entry, activity wiring | Compiled into the debug and E2E APKs built after the last source edit (2026-11-02 15:34). Not installed; not run on a device. | +| JVM unit tests `WallpaperStatusTest` (13), `ManagedConfigurationTest` (8) | Pass in the host unit-test run after the last source edit. | +| Generator tests for managed keys, URL and orientation | Seven generator tests pass (root run). | +| Visibility behind EHS, lock-screen behaviour, keyguard/wake timing, Android 14 wallpaper flags on a TC22, EMM delivery of restrictions | **Untested on hardware.** | + +APIs used that should be confirmed by the build and a device, because the SDK jar was not readable in this session: `WallpaperService.Engine.getWallpaperFlags()` (API 34, guarded), `KeyguardManager.isKeyguardLocked`, `ConnectivityManager.registerDefaultNetworkCallback` (API 24), `RestrictionsManager.getApplicationRestrictions`, `WallpaperManager.ACTION_CHANGE_LIVE_WALLPAPER` / `EXTRA_LIVE_WALLPAPER_COMPONENT`, `ContextCompat.registerReceiver` with `RECEIVER_NOT_EXPORTED` (core 1.13.1). + +## Validation status + +- Authored against the cached Zebra pages `qqq-zebra-docs-ehs-settings.md`, `-ehs-setup.md`, `-mx-appmgr.md` and `-mx-accessmgr.md` (untrusted reference content; facts above cite their official page). +- Seven generator tests pass (`node --test deployment/company-profile/`), including managed keys, URL and orientation. +- Nothing has been validated against Zebra's StageNow importer or a device. diff --git a/docs/DEPENDENCY-DECISIONS.md b/docs/DEPENDENCY-DECISIONS.md new file mode 100644 index 0000000..721971c --- /dev/null +++ b/docs/DEPENDENCY-DECISIONS.md @@ -0,0 +1,32 @@ +# Stable authentication and image dependencies + +Reviewed October 31, 2026. This decision replaces Auth0 Android `3.0.0-beta.0` with `3.0.0` and all three Coil `3.0.0-rc01` version aliases with `3.0.4`. It preserves the current Kotlin, Compose compiler, AGP, Java and Android SDK configuration. These are bounded stable replacements, not a claim that every dependency is the latest release or has ongoing maintenance guaranteed by its publisher. + +## Auth0 Android + +Auth0 `3.0.0` is the last stable 3.x release before passkey dependencies were introduced in `3.1.0`. An Auth0 maintainer explicitly recommends it for applications avoiding the added Play Services dependency in [upstream issue 871](https://github.com/auth0/Auth0.Android/issues/871). Its [published POM](https://repo.maven.apache.org/maven2/com/auth0/android/auth0/3.0.0/auth0-3.0.0.pom) declares the same direct dependency coordinates and versions as the current beta. It retains Kotlin stdlib 1.8.22, OkHttp 4.12.0 and Gson 2.8.9. Its source targets Java 8 and supports Android API 21; this application uses API 26 or later. + +The current host uses `Auth0.getInstance`, `WebAuthProvider.login/logout`, audience/scheme configuration, and browser callbacks. Native semantic OAuth login uses AppAuth separately. The application does not use Auth0's credential managers, passkey provider, DPoP, PAR or native-to-web credentials. + +The stable release adds AuthenticationActivity null handling and changes the fallback for an empty authentication error description. Later 3.x changes include browser process-death restoration in 3.4, configurable authorization/logout URLs, optional DPoP and its replay/process-restoration fixes, partial browser tabs and PAR. Later RSA-padding, biometric and session-expiry fixes concern Auth0 credential managers that this client does not use. See the [tagged changelog](https://github.com/auth0/Auth0.Android/blob/3.21.3/CHANGELOG.md) and [3.0.0 to 3.21.3 source comparison](https://github.com/auth0/Auth0.Android/compare/3.0.0...3.21.3). + +The bounded comparison found no later security fix applicable to the current WebAuth usage; the public repository advisory endpoint returned no published advisories at review time. Neither observation is a complete security audit or a maintenance guarantee. Full process-death recovery through Auth0's later application callback APIs is not provided by choosing 3.0.0. Existing late-callback, rotation, logout and origin-isolation protections still require regression testing. + +Auth0 3.21.3 is a stable alternative, but its [POM](https://repo.maven.apache.org/maven2/com/auth0/android/auth0/3.21.3/auth0-3.21.3.pom) adds Credential Manager and its Play Services provider. The [provider POM](https://dl.google.com/dl/android/maven2/androidx/credentials/credentials-play-services-auth/1.3.0/credentials-play-services-auth-1.3.0.pom) introduces Google authentication, FIDO and Google ID artifacts. Upstream publishes them as regular dependencies; no supported exclusion recipe was found. This change does not exclude required classes or waive notice checks. Version 3.9.0 is not a dependency-free alternative: its missing transitive declarations were a publication defect repaired in 3.9.1. + +## Coil + +Coil 3.0.4 is a stable patch in the existing major/minor line. Its [release notes](https://coil-kt.github.io/coil/changelog/#304---november-25-2024) include image rendering and cache corrections. The intervening RC removed the `AsyncImage` equality-delegate parameter, which this repository does not use. Both image consumers use supported `ImageLoader`, `SvgDecoder.Factory`, `ImageRequest` and `AsyncImage` APIs. + +Published POM comparison predicts Kotlin runtime 2.0.20 to 2.0.21, lifecycle runtime 2.8.6 to 2.8.7 and annotations 1.8.2 to 1.9.1. Compose foundation 1.7.0, coroutines 1.9.0, OkHttp 4.12.0, Okio 3.9.1 and AndroidSVG 1.4 remain unchanged. These are requested dependency versions, not a substitute for inspecting Gradle's final selected graph. See [Compose](https://repo.maven.apache.org/maven2/io/coil-kt/coil3/coil-compose-core-android/3.0.4/coil-compose-core-android-3.0.4.pom), [core](https://repo.maven.apache.org/maven2/io/coil-kt/coil3/coil-core-android/3.0.4/coil-core-android-3.0.4.pom), and [SVG](https://repo.maven.apache.org/maven2/io/coil-kt/coil3/coil-svg-android/3.0.4/coil-svg-android-3.0.4.pom) metadata. No toolchain upgrade or forced transitive downgrade is included. + +## Qualification required after these edits + +- Compare debug, release, E2E and QA runtime graphs; verify the stable versions, aligned Coil modules, Kotlin/Compose selections, absence of newly introduced Google Play dependencies and continued compile-only EMDK isolation. +- Run core/mobile/scanner JVM suites, lint and scanner/sample APK and instrumentation compilation. Inspect release manifests and bundled native-library hashes again if their resolved dependencies change. +- Regenerate and validate each variant's complete AboutLibraries report and packaged texts. New graph size must be measured; preserve exact coverage and license gates. +- Repeat native authentication/navigation regressions, including legacy Auth0 callbacks and provider-failure logout. Configured-provider browser acceptance remains a separate deployment check. +- Verify raster and SVG branding/widget rendering, loading/error states, image-loader disposal, and offline license viewing. Existing upload and screen-mirror tests alone do not prove Coil image rendering. +- Requalify the TC22 scanner flow on the resulting APK before delivery. Do not treat earlier APK evidence as validation of these new pins. + +The candidate now passes127 JVM tests, all34 selected TC22 shared native cases (including actual PNG/SVG/error rendering), the scanner overlay regression, package/lint gates and four-APK inspection. Actual packaged reports contain131 entries/nine complete texts and the expected stable Auth0/Coil versions with no new Google identity dependencies. Selected Kotlin stdlib is2.0.21 and reflect2.0.20; historical JDK7/8 compatibility wrappers remain1.9.0. These observed selections are not a claim of a broader toolchain upgrade. See [exact package evidence and remaining gates](TRUSTED-SCANNER-ACCEPTANCE.md). No production release has been signed or published. diff --git a/docs/DEVICE-PROVISIONING.md b/docs/DEVICE-PROVISIONING.md new file mode 100644 index 0000000..ed6a6de --- /dev/null +++ b/docs/DEVICE-PROVISIONING.md @@ -0,0 +1,110 @@ +# Company provisioning for Zebra handhelds + +Research checked 2026-10-31. Target: Zebra TC22, Android 14, DataWedge 13.0.325, QQQ Mobile package `io.qrun.mobile.scanner`. This is a design recommendation, not an installed profile or a completed hardware qualification. No device configuration, enrollment, reset or runtime changes were made for this research. No company profile, EHS, OEMConfig or MDM configuration has been applied to or verified on any device, and no fleet rollout is claimed. The scanner application itself is current source; see [Implemented in the app](#implemented-in-the-app). The signed-APK/MDM channel is chosen but not rolled out ([RELEASING](RELEASING.md)). + +## Recommended approach + +Use Zebra StageNow/MX for repeatable initial setup, Enterprise Home Screen (EHS) for the company launcher, and the customer's existing Android Enterprise EMM/MDM with Zebra OEMConfig for ongoing fleet management. Keep QQQ responsible for its own device approval, users, sessions, business apps and semantic process UI. A QQQ-approved device and an Android-managed device are separate states. + +Start with a static company-branded EHS home screen and QQQ's own live status view. Showing the QQQ user and IP continuously on the Android background is feasible as additional development, but is not a documented EHS configuration-only feature. Validate a small proof of concept before making dynamic wallpaper part of the release requirement. + +| Layer | Handles | Important boundary | +| --- | --- | --- | +| StageNow and MX | Initial network/certificate setup, app/file deployment, supported OS settings and permission controls | A staging profile is not a persistent fleet-management service. Features depend on installed MX, Android and device support. | +| EMM plus current Zebra OEMConfig | Ongoing policy, application distribution and Zebra-specific managed configuration | Requires a management system and appropriate enrollment. Its licensing is separate from QQQ. | +| Enterprise Home Screen | Allowed Android apps, labels, icons, ordering/folders, launcher branding, launcher restrictions and optional kiosk mode | Does not alone provide complete device lockdown. Its orientation setting controls EHS screens only. | +| QQQ Mobile | Customer branding inside the shared APK, sign-in, device approval, sessions, mobile apps and semantic actions | An ordinary app cannot silently administer every Android setting or permission. | + +These are supported product roles, not a proposal to build an MDM into QQQ. [StageNow overview](https://techdocs.zebra.com/stagenow/latest/about/), [OEMConfig overview](https://techdocs.zebra.com/oemconfig/latest/about/), [EHS overview](https://techdocs.zebra.com/ehs/latest/guide/about/). + +## Versions, provisioning and privileges + +The documentation reviewed identifies StageNow 5.22, OEMConfig 15.3 and EHS 8.0. EHS added explicit TC22/TC27 Android 14 support in 7.0. Select a supported EHS build for the actual TC22 firmware; a current documentation version does not establish the installed MX version. Check the device's Android build, MX version and relevant feature matrix before generating executable profiles. [EHS release history](https://techdocs.zebra.com/ehs/latest/guide/about/), [StageNow release history](https://techdocs.zebra.com/stagenow/latest/about/), [MX documentation](https://techdocs.zebra.com/mx/). + +StageNow creates XML-based profiles on Windows and packages staging instructions as barcodes or binary files for its device client. Configuration can be staged offline, but referenced APKs, certificates and images must already be available or downloadable. Do not describe a barcode that points to a network-hosted APK as a completely offline installation. StageNow's workstation tool includes an FTP server; use an appropriate protected artifact-delivery method in production rather than assuming the workstation server is a production distribution service. StageNow Dynamic Staging substitutes deployment values when generating staging artifacts; it does not create a live wallpaper connected to QQQ sessions. [Getting started](https://techdocs.zebra.com/stagenow/latest/gettingstarted/), [Staging profiles](https://techdocs.zebra.com/stagenow/latest/stagingprofiles/), [Dynamic Staging](https://techdocs.zebra.com/stagenow/latest/dynamicstaging/). + +For Android 14 use **Zebra OEMConfig Powered by MX**, package `com.zebra.oemconfig.release`. The legacy `com.zebra.oemconfig.common` package is not compatible with Android 13 and later. OEMConfig exposes Zebra's managed-configuration schema to an EMM; it does not replace the EMM. Verify support for each selected MX setting on the installed firmware. [OEMConfig requirements and compatibility](https://techdocs.zebra.com/oemconfig/latest/about/). + +Applying supported Zebra configuration or installing EHS is distinct from Android Enterprise enrollment. Fully managed device-owner provisioning is intended for initial setup or a factory-reset device; a work profile controls a different scope and is not equivalent to owning the entire handheld. Decide the management approach before a production enrollment exercise. Do not reset the current development TC22 merely to try EHS. [Android device management](https://source.android.com/docs/devices/admin). + +MX AppMgr can install/manage apps and select the default launcher. MX AccessMgr can control supported permissions, settings access and application allowlists. Permission Access Action requires MX 10.0.5.1 or later, and individual capabilities have their own prerequisites. App removal or reset can invalidate grants. Grant only capabilities the installed app declares and needs; do not interpret these controls as a blanket bypass of Android security. In particular, Android MediaProjection screen capture has a per-session user-consent requirement for apps targeting Android 14+, separate from ordinary runtime-permission grants. [AppMgr](https://techdocs.zebra.com/mx/appmgr/), [AccessMgr](https://techdocs.zebra.com/mx/accessmgr/), [Android 14 capture consent](https://developer.android.com/about/versions/14/behavior-changes-14#media-projection-consent). + +EHS is described by Zebra as free. The TC22 is a Professional-series device; some additional DNA capabilities require separate licensing. Zebra specifically identifies advanced DataWedge multibarcode and image/document-capture capabilities as requiring a Mobility DNA Enterprise license on Professional devices. That does not establish a license requirement for ordinary Android camera capture used by QQQ. Confirm the selected feature entitlement and EMM costs with the supplier; no license pricing or blanket entitlement is assumed here. [EHS overview](https://techdocs.zebra.com/ehs/latest/guide/about/), [Zebra licensing](https://techdocs.zebra.com/licensing/about/). + +## Company home screen and navigation + +EHS configuration can define permitted apps/shortcuts and their labels/icons, title/logo, wallpaper and orientation. Apps follow configured ordering, with a documented exception that links appear before apps when both are present. This provides an ordered managed launcher, not a promise of arbitrary pixel-positioned icons. Current EHS also documents folder support. [EHS settings](https://techdocs.zebra.com/ehs/latest/guide/settings/), [EHS release history](https://techdocs.zebra.com/ehs/latest/guide/about/). + +Use multi-app EHS initially: Android Home returns to the company launcher; QQQ's own home/menu navigates among QQQ business apps. Allow only the required Android companion apps, including any camera/photo-picker activities needed by the chosen capture flow. A single-app kiosk deliberately changes Home/Back escape behavior and needs a separate recovery and navigation test. EHS's portrait/landscape setting affects its own screens; the scanner's orientation preference remains an app setting. [EHS kiosk and orientation settings](https://techdocs.zebra.com/ehs/latest/guide/settings/). + +EHS supports static wallpaper files in common image formats, preferably under `/enterprise/usr`; Zebra says `/enterprise` content survives an Enterprise Reset. This is not a guarantee of factory-reset persistence. Use supported StageNow/EMM deployment and appropriate access controls. Do not introduce world-writable configuration files as a convenience. Protect EHS administrator access and test the recovery procedure before enabling launcher restrictions. [EHS configuration and storage](https://techdocs.zebra.com/ehs/latest/guide/settings/), [EHS setup](https://techdocs.zebra.com/ehs/latest/guide/setup/). + +## Live user and IP information + +EHS provides two relevant built-in facilities: + +- Its title can contain a device identifier such as Android device name, serial number, Wi-Fi host name or Bluetooth name. The documented substitutions do **not** include a QQQ user or IP address. +- Its Wireless Information screen can expose the currently assigned IP to users using `show_ip_address`. That is a diagnostic screen, not a documented live wallpaper field. Other network details can remain hidden. + +Both capabilities are documented in [EHS settings](https://techdocs.zebra.com/ehs/latest/guide/settings/). StageNow generation-time substitutions do not fill this runtime gap. + +| Option | Assessment | +| --- | --- | +| Static company wallpaper plus QQQ live status | Recommended first step. Reliable branding; current user, connection and IP can be presented by the app that owns the session. | +| QQQ status/dashboard activity reachable from EHS | Small additional surface if status must be easy to inspect outside a business process. It can be added to the EHS app list after implementation. | +| Event-updated wallpaper bitmap | Technically possible using Android WallpaperManager when policy permits. Must verify visibility under EHS and update/clearing behavior; periodically rewriting the EHS XML is not a recommended session transport. | +| Android live wallpaper | Requires a WallpaperService/Engine component and activation. EHS compatibility, policy, background lifecycle and resource use require a TC22 proof of concept. Not a documented EHS native feature. | +| Home-screen widget/custom launcher | A widget needs a launcher that hosts it. EHS third-party widget hosting was not established by the documentation reviewed; do not promise it. A custom launcher is a substantially larger maintenance commitment. | + +Android exposes wallpaper support/permission checks and bitmap setters; live wallpaper is a separate service contract. These APIs establish feasibility, not proof that EHS renders a chosen live wallpaper or that management policy allows it. [WallpaperManager](https://developer.android.com/reference/android/app/WallpaperManager), [WallpaperService](https://developer.android.com/reference/android/service/wallpaper/WallpaperService). + +The authoritative identity must come from QQQ's current session. EHS administrator mode, Android device owner and QQQ sign-in are different identities. Publish only an approved display name and state; never publish session tokens or credentials. Clear the name on logout, expiry, remote termination and server/customer change. Show an explicit stale/offline state if session validity cannot be confirmed. Avoid personal identity on the lock screen by default; any generated session image should be excluded from backup and replaced when its owner changes. + +For IP updates, use Android network callbacks and LinkProperties instead of polling or a single cached Wi-Fi address. Handle network loss, DHCP changes, IPv4/IPv6, VPNs and multiple transports; label the displayed interface/address. A local IP alone does not prove that the QQQ server is reachable. [Android network state and callbacks](https://developer.android.com/develop/connectivity/network-ops/reading-network-state). + +## Proposed profile parameter inventory + +These are design inputs, not a finalized XML schema or implemented managed-configuration contract. + +| Group | Non-secret parameters | +| --- | --- | +| Profile identity | Customer/profile ID, revision, target model/Android/MX range, rollout ring, rollback revision | +| Device identity | Assigned short name, description, asset ID; explicitly map Android device name and QQQ device record | +| Network/trust | Network-policy reference, certificate/credential delivery reference, proxy/DNS/time policy; no embedded passwords in repository fixtures | +| Apps | Package IDs, approved version/channel, artifact reference/checksum, signing certificate fingerprint (see [RELEASING](RELEASING.md)), required companion activities | +| Launcher | Title, logo/wallpaper asset references, ordered app list/folders, multi-app or kiosk policy, admin recovery reference | +| Scanner | DataWedge profile association, expected intent/output contract, required decoders; preserve the verified QQQ scan transport | +| App bootstrap | HTTPS QQQ server URL (`qqq_server_url`) and optional orientation policy (`qqq_orientation`) are implemented; tenant/branding hints and a configuration revision are not | +| Capabilities | Camera/location policy, diagnostics visibility, screen-sharing policy, required permission decisions; no blanket grants | +| Operations | Update window, reporting/retention policy, support contact, rollback and recovery procedure references | + +Managed settings supply bootstrap/policy only; business screens and processes remain on the versioned QQQ semantic API. Admin-managed values are reconciled with user preferences explicitly (see below). [Android managed configurations](https://developer.android.com/work/managed-configurations). + +## Implemented in the app + +The scanner host source now includes the pieces below. They are implemented and unit-tested; none has been delivered through an EMM/MDM or StageNow profile on a device. + +**Managed configuration** ([`app_restrictions.xml`](../scanner-host/src/main/res/xml/app_restrictions.xml), declared in the manifest through `android.content.APP_RESTRICTIONS`; logic in [`ManagedConfiguration.kt`](../scanner-host/src/main/java/io/qrun/mobile/scanner/ManagedConfiguration.kt)). Exactly two keys: + +| Key | Type | Behavior | +| --- | --- | --- | +| `qqq_server_url` | string | Must be an HTTPS origin with no credentials, path, query or fragment, at most 2048 characters; HTTP is never accepted, even in debug builds. With no saved server it prefills the connect form. A different saved server is never switched silently: Settings offers "Use administrator's server", which runs the existing confirm, end-session and sign-out path. | +| `qqq_orientation` | choice | One of `SYSTEM`, `PORTRAIT`, `LANDSCAPE`, `REVERSE_PORTRAIT`, `REVERSE_LANDSCAPE`. Applied as a default only when the managed value changes; a later local choice stands until the managed value changes again. | + +Invalid values are rejected, not defaulted, and only the key name is recorded. The keys must stay in step with the [company profile generator](../deployment/company-profile/) and [COMPANY-PROFILE](COMPANY-PROFILE.md). + +**Optional status wallpaper** ([`QqqStatusWallpaperService.kt`](../scanner-host/src/main/java/io/qrun/mobile/scanner/QqqStatusWallpaperService.kt), with a Settings entry and preview). A live wallpaper service bound only by the system (`BIND_WALLPAPER`). It is inactive until a person confirms it in Android's live-wallpaper chooser; nothing is applied silently and no wallpaper permission is requested. It paints the company name and, only on the unlocked home screen, the approved session display name, the current network addresses and a time; the lock screen, preview, screen-off and invisible states show brand only. The snapshot is in memory only and withdrawn when it ages out. EHS compatibility with this wallpaper is unproven. Verified on a TC22 only as the brand-only system preview; it was never applied there. + +## Current limits + +- Whether a given EMM/OEMConfig can deliver these two restriction keys, and the EHS/StageNow/MDM profiles themselves, are unverified. +- A static company wallpaper plus the in-app status remains the recommended first step; the live wallpaper is optional. +- Device-owner enrollment, kiosk mode and rollout remain explicit future actions. + +## Safe qualification and rollout + +1. Inventory firmware/MX/StageNow/EHS versions and selected feature entitlements. Choose existing customer EMM or staged-only pilot. Preserve current scanner configuration and a tested administrator recovery route. +2. Produce a versioned, customer-parameterized profile with no repository secrets. Review settings and exclusions before generating installable artifacts. Keep development debugging available on a development-only profile. +3. Test on a spare TC22 first: network/trust, installation, app approval, scan delivery, camera uploads, location behavior, Home/Back/menu/logout and orientation. Check reboot and network-change behavior, plus management connectivity loss. +4. Verify restrictions and recovery together: app allowlist, settings access, permission denial, policy update, rollback and retained data. Test the dynamic status option separately, including logout/remote revocation, stale state and lock-screen visibility. +5. With the signed-APK/MDM channel chosen, qualify signed upgrades and management deployment in a small pilot ring. Expand only after documented acceptance. Device-owner enrollment/reset and production kiosk activation remain explicit rollout actions, not part of this research. diff --git a/docs/DEVICE-SCREEN-ACCEPTANCE.md b/docs/DEVICE-SCREEN-ACCEPTANCE.md new file mode 100644 index 0000000..bdce74c --- /dev/null +++ b/docs/DEVICE-SCREEN-ACCEPTANCE.md @@ -0,0 +1,24 @@ +# Device-screen viewing acceptance + +Current status: this page retains its dated/source-specific checkpoint. Current installed C891/earlierF3AF EMDK Code128 proof is in [physical acceptance](PHYSICAL-TC22-ACCEPTANCE.md); QR and actual projection remain pending. Android7de passes all eleven hosted checks. Older statements about then-pending trigger/CI/scope or unchanged normal APK are historical, not the current release gate. Normal server remains mobile1.1; optional DEVICE_SCREEN requires qualified1.2 source and actual device consent acceptance. + +The optional `DEVICE_SCREEN` mode requires the additive mobile-scanners1.2 contract. `APP_CONTENT` remains the default for older servers. The device operator must explicitly enable notifications, accept the disclosure and approve Android's fresh screen-sharing dialog. No consent is persisted. The foreground notification and Android indicator allow stopping; sharing also stops on host disposal, lock, session loss or bounded lease/watchdog expiry. Remote revocation is learned through subsequent requests, rather than an instantaneous push. + +The initial source checkpoint passes135 JVM tests with no failures/errors/skips, scanner debug/release lint, and debug/unsigned-release/E2E/QA plus native-test package builds. Its paired server passes39 tests and six real-HTTP demo tests using qualified core `ecf0f550`, with no artifact installation and unchanged historical1.0/1.1 API baselines. The frozen client diff received parent and fresh independent static review: all nine inventoried changed files inspected, no reportable findings. The sealed security scan is `ea8a20a8-8a16-48d8-9c58-a9376387fb60`; its tool reports4,884,517 aggregate tokens across two threads. This is a changed-file static review, not a new full-repository audit or device acceptance. + +The refined candidate passes137 JVM tests, debug/release lint and all package builds. A separate independent review covered its four-file image-buffer/binding follow-up, with no concrete issue found; the original sealed scan remains unchanged and describes only its original bytes. The TC22 ordinary-UID/distinct-signer regression passes on the refined QA APK: eight forged broadcasts add zero mutations while one manual positive control saves. Physical trigger and projection consent remain unverified. + +All four refined APKs pass fresh SDK DEX/manifest/resource inspection:131 notice entries/nine full license texts, unchanged reviewed native binaries, zero bundled EMDK implementation classes, test-only ingress excluded from production variants, backup exclusions intact, and unsigned release cleartext/debugging disabled. The paired published server `10416938724c9663d66f7848ff2b1a63fe635794` also passes a fresh isolated consumer qualification:195 hashed runtime JARs,2,441 unique QQQ classes, zero duplicates,39 server/six demo tests and all15 record/bulk/admin browser tests, with no shared Maven replacement. Hosted client CI is pinned to that exact source. + +The refined candidate hashes are: + +| APK | SHA-256 | +| --- | --- | +| Debug | `F3AF638E34AA0B6FB44D789362BED2838202EDAF681DF775F2A5FAD3AB3E9FAA` | +| Unsigned release | `69FF9A2F1D7A0A766682994E393D1DE9E3B10CA28D1ECD7239D43E7FB8C57B8C` | +| QA | `8F44EFB9A025F0E9457057E25844852BC83B0823B87B5D830AB93BD7962B80EB` | +| E2E | `CCB447F8F4121E0FBCF6B8DD5A82784DACCBAF2AF839A10127B6E4CE517CDFBF` | + +Actual OS consent, notification visibility, fresh pixels on a static screen, other-app/background capture, lock, rotation/recreation, administrator disconnect and forced logout remain required device acceptance. A projection may exist locally for up to30seconds awaiting a viewer; uploads require a current matching-mode lease. Binding stays disabled through service startup; continuous draining retains only one latest image, released on replacement/resize/stop. These APKs are not a production release. + +November1 operator update: the debug APK above was installed in place into the normal TC22 app after matching its signing identity and backing up private data. Login and Apps/Scan Capture navigation succeeded; EMDK reports ready. Normal server remains API1.9/mobile1.1 and does not advertise whole-device mode. This update does not establish projection acceptance or qualify historical DataWedge scans as EMDK scans. diff --git a/docs/DEVICE-TESTING.md b/docs/DEVICE-TESTING.md new file mode 100644 index 0000000..d96d451 --- /dev/null +++ b/docs/DEVICE-TESTING.md @@ -0,0 +1,49 @@ +# Isolated TC22 acceptance + +The emulator-only CI entry point continues to refuse physical devices. The explicit physical entry point is limited to an attached Zebra TC22 and requires its serial and one named scenario: + +```powershell +$env:ANDROID_HOME = "$env:LOCALAPPDATA\Android\Sdk" +node scripts/ci/scanner-device-e2e.mjs --serial TC22_SERIAL --scenario session-monitor ../qbit-mobile-scanners +node scripts/ci/scanner-device-e2e.mjs --serial TC22_SERIAL --scenario navigation +node scripts/ci/scanner-device-e2e.mjs --serial TC22_SERIAL --scenario licenses +node scripts/ci/scanner-device-e2e.mjs --serial TC22_SERIAL --scenario orientation +``` + +Build the matching APKs first, using Java 21 and one bounded Gradle invocation (`--max-workers=2 --no-parallel`). Scanner scenarios need `:scanner-host:assembleE2e :scanner-host:assembleE2eAndroidTest` and the companion demo's installed artifact/classes/test classpath. The navigation scenario needs `:qqqsampleandroidmobileapp:assembleDebug :qqqsampleandroidmobileapp:assembleDebugAndroidTest`. + +The handheld must already be unlocked. This runner does not change power, lock, animation, developer, DataWedge or ordinary scanner settings. It refuses existing disposable test packages, installs only separate test applications, and removes only applications installed by that run. The ordinary `io.qrun.mobile.scanner` installation and its data are never cleared or replaced. Scanner scenarios use a temporary local server/database and one new non-rebinding USB reverse, which is removed on cleanup. Existing reverses, including the operator's ordinary server connection, remain in place. + +`session-monitor` exercises real login/enrollment/approval, process activity, recreation, actual PixelCopy upload, background/paused-frame clearing, administrator session termination and fresh login. `navigation` runs the shared native navigation, input and account suites with synthetic repository data and verifies request counts/draft preservation. It installs the sample app temporarily and refuses to replace any existing sample installation or retained app data. `licenses` opens the bundled notice list and renders the Google artwork license; `orientation` checks the app's orientation policy. These two scenarios use only the isolated scanner APK/test APK and need no demo server or USB reverse. Other scanner scenario names are the same as [EMULATOR.md](EMULATOR.md). + +Evidence is written under `scanner-host/build/native-device-e2e`. Request audits contain operation IDs/status/timing, not credentials or bodies. Do not capture the normal app's screens or customer data as test evidence. Automatic camera transport tests must use synthetic originals; a real camera shot requires the operator to aim at an agreed non-sensitive target. The current implementation and test outcomes are recorded separately in [SESSION-STATE.md](SESSION-STATE.md). + +The standalone `orientation` and `licenses` scenarios need only the isolated scanner APKs and no server. Orientation acceptance checks saved policy, actual portrait/landscape configuration, recreation, and a fresh Activity launch for each choice. The session and photo scenarios separately verify that a rotation retains process input and a pending original. + +Physical `session-monitor` now uses the disposable `io.qrun.mobile.scanner.qa` variant so a retained `.e2e` installation is preserved. Build it with `-PscannerTestBuildType=qa :scanner-host:assembleQa :scanner-host:assembleQaAndroidTest`; hosted/emulator sessions continue using E2E. Its rotation check waits for the requested landscape configuration and resumed lifecycle, verifies the draft, then explicitly recreates and verifies the draft again. Brief physical-test focus transitions wait up to five seconds within the existing stage deadline; actual resumed/unlocked/focused requirements remain enforced. Physical installs use ADB's non-streaming path. + +## Explicit operator-consented device-screen acceptance + +This manual-only test is excluded from hosted/default scenarios. Compile QA packages as above, then run: + +```text +node scripts/ci/scanner-screen-device.mjs --serial TC22_SERIAL --fixture PRIVATE_FIXTURE.json --operator-consent +``` + +The private file must identify `purpose: "device-screen-qa"`, a disposable loopback `baseUrl`, `username: "scanner"`, `adminUsername: "admin"` and fresh private `password`/`adminPassword` values. Use the qualified core/API1.9 and mobile-scanners1.2 runtime; the runner refuses the normal57832 and retained51631 ports. Keep this file owner-only and outside Git. It installs only absent QA/QA.test packages and owns only its new reverse/proxy resources. + +Named stages request notification permission, three fresh Android projection approvals, Home, Stop and a return through Recents. The operator handles every Android permission dialog; the test never grants them. It checks real app/Home pixels, Stop, viewer-lease expiry, administrator session end and fresh login without resumed projection. Each operator wait is bounded to120seconds. Server JPEGs are compared with the physical display in memory using bounded spatial RGB error and blank/wrong-layout negative controls. Neither screenshot source is retained as evidence or substituted for the application's uploaded frame. + +Compilation and runner guard checks pass; actual system consent/display acceptance remains unexecuted. A failed run records FAILED rather than leaving a successful-looking proof, preserves sanitized stage/operation evidence and removes only its disposable resources. Successful execution requires every completion stage and successful native semantic screen uploads; a decodable JPEG alone is insufficient. + +Photo acceptance requires the companion optional Record Files integration's successfully verified isolated fixture. Start `integrations/record-files/Start-ConsumerFixture.ps1` in that repository, keep its returned credential file private, and run: + +```powershell +node scripts/ci/scanner-device-photo-e2e.mjs --serial TC22_SERIAL --fixture PRIVATE_CREDENTIAL_FILE +``` + +This runner accepts only that loopback fixture's expected account/process/parent contract. It does not start, stop or delete the external fixture. Its test intercepts Android camera/picker activity results with a generated image, verifies automatic camera upload and retained server association/hash, then checks pending gallery-original retention across rotation and cleanup on administrator-forced logout. No surroundings are photographed. + +Device Settings includes **Orientation**: System default, Portrait, Landscape, Reverse portrait and Reverse landscape. **Portrait is the default** when no choice has been saved or the saved value is invalid. An existing explicit choice, including System default, is preserved. The choice is local to this installation and survives sign-out, server changes and restarts; it does not modify Android's global auto-rotate preference. Android can recreate the Activity when applying a choice. The host retains process ViewModels and saves unsubmitted manual scanner text across that recreation. Pending photo originals remain with the process's retained ViewModel. + +The TC22 test target runs Android 14. Android's [requested-orientation API](https://developer.android.com/reference/android/app/Activity#setRequestedOrientation(int)) permits manufacturer overrides; for apps targeting API36 or later, Android16 [ignores orientation restrictions on displays whose smallest width is at least 600dp](https://developer.android.com/about/versions/16/behavior-changes-16#adaptive-layouts). The setting requests the platform policy and does not force transforms or work around those system restrictions. diff --git a/docs/ECHO-NATIVE-E2E.md b/docs/ECHO-NATIVE-E2E.md new file mode 100644 index 0000000..13fed55 --- /dev/null +++ b/docs/ECHO-NATIVE-E2E.md @@ -0,0 +1,42 @@ +# Echo native UI acceptance fixture + +The explicit Echo scenario exercises the real Android host, TABLE login, enrollment/approval, semantic printer/media/document choices, real Echo process and H2 persistence. Its test-only backend accepts **simulated** jobs. Passing it does not qualify EMDK, barcode rendering, printer adapters or physical output. + +The backend owner supplies `com.kingsrook.examples.echo.fixture.EchoHttpFixture` from the isolated optional Echo test module, launched with a free loopback port, `ECHO_FIXTURE_TYPE=echo-ui-e2e` and private `ECHO_FIXTURE_SCANNER_PASSWORD`/`ECHO_FIXTURE_ADMIN_PASSWORD`. Readiness is `ECHO_UI_E2E_READY port=N simulatedPrinting=true`. It uses in-memory H2 and no real printing/generation adapter. Root owns launch, the exact private dependency tuple and approval of the concrete APK/fixture cohort. + +The credential file must stay private and contain these fields with newly generated passwords of at least 16 characters: + +```json +{ + "fixtureType": "echo-ui-e2e", + "simulatedPrinting": true, + "baseUrl": "http://127.0.0.1:PRIVATE_FREE_PORT/", + "username": "scanner", + "password": "PRIVATE_GENERATED_PASSWORD", + "adminUsername": "admin", + "adminPassword": "PRIVATE_GENERATED_PASSWORD" +} +``` + +The runner refuses normal scanner ports 57832/51631 and printing ports 18081/18086, non-loopback/decorated URLs, the wrong purpose, unsimulated fixtures, incompatible core/mobile contracts and branding other than `Echo UI E2E — simulated printing`. It requires UI API1.10.0/mobile-scanners1.4.0 and checks APK package identities. Only a selected physical Zebra TC22 and absent disposable `io.qrun.mobile.scanner.e2e`/`.test` packages are accepted. Normal and QA packages/data remain untouched. Location reporting is disabled only in the new disposable package, and no screenshots are taken. + +Preparation requires no device execution: + +```text +node --test scripts/ci/scanner-echo-guards.test.mjs +./gradlew :scanner-host:testDebugUnitTest :scanner-host:lintDebug :scanner-host:assembleE2e :scanner-host:assembleE2eAndroidTest +``` + +Only after root launches the private fixture and approves the exact cohort: + +```text +node scripts/ci/scanner-device-echo-e2e.mjs --serial TC22_SERIAL --fixture PRIVATE_ECHO_FIXTURE.json +``` + +The native test signs in, enrolls and approves through existing helpers; opens Apps → Echo; selects the printer, media and an INTEGER Document through semantic possible-value controls, reselects the printer to verify stale dependent selections are cleared and Next is refused until reselection, then retains all three choices; injects two public synthetic values with CODE128/QR types through the E2E-only driver; checks `Print queued` and absent manual controls; rotates/recreates without another acceptance; then uses Apps/Leave and verifies the run closes. Independent reads use standard QQQ `echoScan` and read-only `echoFixtureRun` queries as the scanner with approved-device headers, retaining the real actor/device locks. No custom business verification endpoint or administrator bypass is used. + +The existing OpenAPI proxy audits all observed requests and requires native cancellation. Fixed stage markers and operation IDs/counts, APK hashes and a simulation-labelled `echo-proof.json` are written under `scanner-host/build/native-device-e2e/`; credentials, serial and opaque identifiers are redacted from instrumentation output. No normal app data, global animation settings, DataWedge profile or existing forwarding is replaced. The runner removes only its own reverse and newly installed disposable packages; cleanup failures fail the run and its proof. + +The user-authorized TC22 invocation completed successfully after the bounded compilation/guards. This fixture remains simulated printing, not physical printing evidence. + +Current recorded acceptance: all7 stages passed on TC22, including Document selection and stale selection clearing. Root verified99 focused/host JVM tests,8 Node guards, zero lint errors/warnings, and112/112 documented native requests. Printing is simulated. The proof explicitly leaves physicalScannerQualified and physicalPrintingQualified false. diff --git a/docs/EMULATOR.md b/docs/EMULATOR.md new file mode 100644 index 0000000..80e60e5 --- /dev/null +++ b/docs/EMULATOR.md @@ -0,0 +1,68 @@ +# Emulator testing + +An Android emulator verifies login, enrollment, native navigation and manual barcode submission. The separate E2E variant also supports synthetic scan injection. An emulator does not reproduce Zebra's EMDK scan engine or physical trigger. + +## Prepared Windows workstation + +The `QQQ_Mobile_API35` virtual device is installed under `%LOCALAPPDATA%/Android/Avd`, with Android 15/API35 and WHPX acceleration. Local emulator testing is currently paused: the operator confirmed whole-workstation stuttering stopped when the emulator closed. Do not restart it as part of automatic local tests. The next deliberate diagnostic launch should compare software rendering while preserving the other settings: + +```powershell +$env:ANDROID_AVD_HOME = Join-Path $env:LOCALAPPDATA 'Android/Avd' +& "$env:LOCALAPPDATA/Android/Sdk/emulator/emulator.exe" -avd QQQ_Mobile_API35 -gpu software -no-snapshot -no-audio +``` + +The previous host-GPU run logged OpenGL context restoration and external-memory import failures. Sampled host resources had ample headroom and WHPX was operational; graphics interoperability is the leading hypothesis, not a proven cause. The saved AVD now has `hw.gpu.mode=software`, with the previous config backed up locally; that renderer has not yet been tested. Software graphics retains WHPX CPU acceleration. A cold start avoids restoring old graphics state; `-no-snapshot` preserves installed apps and their data. The [Android acceleration guide](https://developer.android.com/studio/run/emulator-acceleration) recommends software rendering when host/auto graphics have problems. Preserve other settings during the comparison, observe desktop responsiveness as well as guest frame times, and stop if workstation stalls recur. Use the physical TC22 or hosted emulator CI for acceptance while local testing is paused. + +The local demo uses port57832 on this workstation because other services occupy the conventional ports. Start it from the sibling `qbit-mobile-scanners` directory in another terminal, then forward the emulator port: + +```powershell +pwsh -File scripts/Start-Demo.ps1 -SkipBuild -Port 57832 +``` + +```powershell +& "$env:LOCALAPPDATA/Android/Sdk/platform-tools/adb.exe" -s emulator-5554 reverse tcp:8080 tcp:57832 +``` + +Keep the Android server URL `http://127.0.0.1:8080/`. The browser administration URL is <http://127.0.0.1:57832/>. The demo's [local guide](https://github.com/QRun-IO/qbit-mobile-scanners/blob/develop/docs/LOCAL-DEMO.md) explains the `scanner`/`admin` accounts and password-copy helper. Open **QQQ Mobile** in the emulator. Tap the connection footer to view or copy diagnostics; it distinguishes server reachability from login and approval. + +## Local interactive test + +1. Create/start an API35 Android emulator in Android Studio, or use the SDK emulator installed on the development machine. +2. Build/install `scanner-host/build/outputs/apk/debug/scanner-host-debug.apk` with `adb install -r` targeting the emulator's serial if multiple devices are connected. +3. Start the companion [mobile scanner demo](https://github.com/QRun-IO/qbit-mobile-scanners/tree/main/demo) on port8080. +4. Run `adb reverse tcp:8080 tcp:8080` and use `http://127.0.0.1:8080/` in QQQ Mobile. +5. Sign in with the demo operator account. Approve the displayed device from the administrator session, then tap **Check approval**. +6. Select the mobile app, open its scan process, and submit a synthetic barcode manually. Verify **Saved scan**, and verify the server's stored record. +7. Revoke the device on the server and verify subsequent submissions are denied. Sign out and verify a new login is required. + +Only the disposable E2E APK accepts synthetic broadcasts while its scanner screen is visible. Normal debug/release builds ignore this ingress and use EMDK or manual entry: + +```text +adb shell am broadcast -a io.qrun.mobile.scanner.SCAN -c android.intent.category.DEFAULT -p io.qrun.mobile.scanner.e2e --es com.symbol.datawedge.data_string DEMO-001 --es com.symbol.datawedge.label_type LABEL-TYPE-CODE128 +``` + +This validates intent parsing only; the server treats source/symbology as client-reported metadata. + +## Automated checks + +The GitHub **Scanner Android** workflow runs JVM tests, lint, APK assembly, the shared native UI suite, and the real-server scanner E2E on pushes and pull requests. The emulator job checks out exact core and companion qbit commits, verifies them in a fresh private Maven repository, and starts a fresh isolated demo database. [Fixture provenance](CI-FIXTURE.md) describes the source pins, runtime checks and distinction from published release dependencies. Sanitized instrumentation results are uploaded as workflow artifacts. Hosted execution is verified separately from a local run. + +The scanner E2E installs **QQQ Mobile E2E**, a separate application (`io.qrun.mobile.scanner.e2e`). It drives server selection, username/password login, pending enrollment, approval, app selection, Scan Capture, manual barcode submission, server acknowledgment, independent persisted-record verification, and revocation of an already-open scan process. Administrative setup uses the real QQQ process endpoints; the companion qbit's browser suite covers their single-record and selected-bulk UI entry points. No repository or server mocks are used. Random test credentials travel through standard input into the test application's private files, are removed after reading, and are redacted from reports. The runner preserves the normal scanner package and its port forwarding. + +The runner uses a test-only forwarding proxy that checks observed requests against the real server's published OpenAPI operations. It modifies only the version response for incompatible-major, missing-extension, missing-Android-channel and additive-future-version scenarios. Rejected servers must receive no credentials or requests beyond public discovery. The eight scenarios also cover the real scan flow, native administrative forms for approval/revocation/session termination/cancellation, session activity and actual screen mirroring with forced logout, and a PixelCopy pixel-content regression. Compatible scenarios use the real backend, processes and database. The audit report contains operation IDs and counts, never request headers or bodies. [SESSION-STATE.md](SESSION-STATE.md) records actual passing runs and revision boundaries. The runner wakes/unlocks the selected emulator, temporarily disables animation scales and restores their original values during cleanup. UI conditions have a 60-second deadline and instrumentation has a 300-second deadline. Set `E2E_SCENARIO=session-monitor` or `E2E_SCENARIO=pixel-copy` for focused verification. + +The default suite also runs bundled-license rendering, local orientation policy checks and the diagnostics filtering/pause/clear/return UI test. Set `E2E_SCENARIO=licenses`, `E2E_SCENARIO=orientation` or `E2E_SCENARIO=diagnostics` to run one independently; these scenarios need only the scanner E2E APKs and do not start a server or establish USB forwarding. After installation and ordinary scenarios' data resets, the runner grants coarse and fine location permission only to `io.qrun.mobile.scanner.e2e`, keeping the default-on reporting permission dialog from interrupting unrelated scanner/UI automation. The session-monitor scenario instead explicitly revokes both permissions and seeds only the already-requested marker, preserving default-on reporting and its real denied-location telemetry assertion without an OS dialog. This fixture setup does not exercise the real Android permission prompt or user denial interaction and does not change permissions for the normal scanner or separate QA package. + +To reproduce with Node 22+ and Java 21, first prepare the [source-pinned fixture](CI-FIXTURE.md). Use its qualified server directory below (the example assumes `.e2e-server`); an ordinary server build against the default RC.20 core does not include the nullable process fix: + +```powershell +./gradlew.bat :scanner-host:assembleE2e :scanner-host:assembleE2eAndroidTest +$env:ANDROID_SERIAL = 'emulator-5554' +node scripts/ci/scanner-e2e.mjs .e2e-server +``` + +Set `ANDROID_HOME` (or `ANDROID_SDK_ROOT`) if `adb` is not on PATH. Linux/macOS use `./mvnw`, `./gradlew`, and their shell's environment assignment syntax. The runner refuses physical devices, uses a free local port and temporary database, and cleans up its server, forwarding and both isolated test APKs. The older setup-only `scripts/ci/emulator-smoke.sh` is retained for disposable-emulator troubleshooting; it clears the normal scanner package and should not be used on your interactive demo emulator. + +## Physical acceptance still required + +Test the TC22 EMDK trigger, rotation/backgrounding, retry after a lost response, revoked approval, leading-zero barcodes and repeated physical scans. Confirm DataWedge scanning works again after QQQ releases ownership. An uncertain submission must retain its event ID; a repeated physical scan receives a new event ID. See [trusted scanner acceptance](ZEBRA-SCANNING.md). Never use sensitive production barcodes in test screenshots or CI artifacts. diff --git a/docs/FINISH-1.0.md b/docs/FINISH-1.0.md new file mode 100644 index 0000000..81a3e8e --- /dev/null +++ b/docs/FINISH-1.0.md @@ -0,0 +1,19 @@ +# Finish ledger for 1.0 + +As of 2026-11-04. A signed 1.0.0 preview is published (prerelease `scanner-v1.0.0`); there is no stable or fully qualified 1.0. Older ledgers are in [docs/history](history/README.md); the checklist is [TODO](TODO.md). + +| Area | State | Evidence / limit | +| --- | --- | --- | +| Source | Merged to protected `main` | Application source for the tested APKs; Gitea workflow present | +| Local demo | Accepted | Server on port 57832; TC22 development APK; operator-reported manual acceptance ALL PASS 2026-11-04 incl. label count/fidelity, camera, GPS, screen viewing (not instrumented, no per-case artifacts) | +| Echo | Local semantic flow qualified | Printing and inputs simulated in disposable runs; physical label count/fidelity operator-reported pass (not instrumented) | +| MC9400 | Demo-configured and approved | Physical trigger scan to backend not yet verified | +| Signed APK | Published as signed preview | [scanner-v1.0.0](https://git.kof22.com/QRun-IO/qqq-android/releases/tag/scanner-v1.0.0), 1.0.0 / versionCode 2; APK and `SHA256SUMS` only, download-verified; installed and launched once on an MC9400 before the demo switch; no end-to-end qualification | +| Release | Preview only, not stable | Needs HTTPS server and device qualification (enrollment, scanning, in-place update) before stable; no signing CI | +| Authentik | Desktop passes; on-device callback unverified | No separate native provider/callback evidence | +| Dependencies | Qualified inputs, not a public cohort | Generation, Record Files, Scripting owner inputs behind the local server | +| MDM / company profile | Prepared, unverified | Nothing applied on a device | + +## Pointers + +Release procedure and key custody (no secrets): [RELEASING](RELEASING.md). Installation: [INSTALLATION](INSTALLATION.md). Authentik: [REAL-AUTHENTIK-ACCEPTANCE](REAL-AUTHENTIK-ACCEPTANCE.md). Physical scanner evidence: [PHYSICAL-TC22-ACCEPTANCE](PHYSICAL-TC22-ACCEPTANCE.md). diff --git a/docs/INSTALLATION.md b/docs/INSTALLATION.md new file mode 100644 index 0000000..b9f7107 --- /dev/null +++ b/docs/INSTALLATION.md @@ -0,0 +1,84 @@ +# Installing QQQ Mobile directly + +Use this for the **production-signed** APK on a small number of devices. Move to MDM later (see [RELEASING](RELEASING.md)). Automated scanner-APK signing/publication is not configured; that is not a blocker to direct installation. + +This guide is not the local demo. The demo uses the development-signed debug APK, plain HTTP and `adb reverse` port forwarding to a workstation server; see [README](../README.md#installing-on-a-device). The two builds have different signers and cannot update each other. + +**Current release status (November 5, 2026):** the only published release is the signed preview 1.0.0 below. A signed **1.0.1 (versionCode 3) candidate** exists but is **not published and has no download link**; this guide does not point to one. Use the table below for what is actually hosted. It is superseded by the planned **1.0.2 (versionCode 4)** candidate (not yet built; see [RELEASING](RELEASING.md#next-candidate-102-versioncode-4)). When a newer version is published, use the file, checksum and link given by the release owner, and verify the same signer. + +| Candidate (not published) | Value | +| --- | --- | +| Version | 1.0.1, versionCode 3 | +| APK SHA-256 | `5124716B59CAD303717E7834FE64DDC1537E33A25C9AB75A6EA1ACF03AC2717F` (15015419 bytes) | +| Signing certificate SHA-256 | Same as below (`BDDB2D2F...5B17A9FF`) | + +Details and qualification status: [RELEASING](RELEASING.md). + +| Item | Value | +| --- | --- | +| Source | [Signed preview release scanner-v1.0.0](https://git.kof22.com/QRun-IO/qqq-android/releases/tag/scanner-v1.0.0) (prerelease; forge sign-in required) | +| File | `QQQ-Mobile-1.0.0.apk`, with `SHA256SUMS` on the same release page | +| Application ID | `io.qrun.mobile.scanner` | +| Version | 1.0.0, versionCode 2 | +| APK SHA-256 | `EE5AC896B8985AF6F11B2E883955925D6571A2913D74A4AACCDB564B79394D51` | +| Signing certificate SHA-256 | `BDDB2D2F45A5925C643A83ABAF616C1EAB2387DC5CDA7B645A6F4C0D5B17A9FF` | + +The same APK is used for every customer; branding comes from the server at runtime. Download the APK and `SHA256SUMS` from the release page and compare the SHA-256 before installing, then verify the signing certificate matches the value above. The checksum shows the file is intact, not who signed it. This is a preview, not a stable release. Only the APK and `SHA256SUMS` are hosted; there is no hosted install kit. + +**Device evidence.** *Historical (November 4):* this APK was installed and launched once on a fresh Zebra MC9400 (Android 13) and showed the Connect screen; it was not yet enrolled. *Current (November 5):* with the user's explicit authorization, the MC9400 was migrated: 1.0.0 enrollment over trusted HTTPS passed, then an in-place 1.0.1 update preserved login and enrollment. Apps/ScanCapture navigation and EMDK Scanner-ready were observed, and the operator confirmed a physical Saved scan that the backend verified. These checks are done and need not be repeated for this device. The 1.0.1 candidate is still unpublished, native Authentik login/logout/account switching is not yet qualified with the production APK, and the TC22 keeps its original development-signed installation. + +## Before you start + +- The device is connected to Wi-Fi. +- You have a customer **HTTPS** QQQ server URL with a trusted certificate that the device can reach. Release builds reject HTTP, and certificate checks must not be weakened. Use the address you are given (`https://<your-server>`); do not guess one. Local-network qualification used a temporary private network and is not a customer deployment. +- You have the QQQ credentials for the sign-in the server offers. None are in this guide. + +## Install: copy the file (recommended) + +1. Copy the verified `QQQ-Mobile-1.0.0.apk` to the device's **Downloads** folder. +2. Open **Files**, go to Downloads, and tap the APK. +3. If Android asks, allow that Files app to install apps, then continue. You can turn the permission off again afterward. + +## Install: USB debugging (alternative) + +Requires USB debugging enabled on the device, a computer the device has been asked to trust, and [Android Platform Tools](https://developer.android.com/tools/adb). + +```powershell +adb devices +adb -s DEVICE_SERIAL install -r QQQ-Mobile-1.0.0.apk +``` + +Replace `DEVICE_SERIAL` with the serial of the device you chose from `adb devices`. Always name the target with `-s`. Do not add `-d` (downgrade) or `-t`. + +## First launch and enrollment + +1. Open **QQQ Mobile** and enter the HTTPS server URL, then tap **Connect**. +2. Sign in with the method the server shows. +3. The device enrolls and shows a **Device ID** with status pending. +4. A QQQ administrator reviews the device, sets its name and approves it in QQQ. +5. On the device, tap **Check approval**, then open the server's apps (**Apps**). + +Grant location when Android asks; scanning works without it. Zebra devices with EMDK need no DataWedge profile set up by hand ([Zebra scanning](ZEBRA-SCANNING.md)). + +## Confirm the first new install + +On the first device of a new customer deployment, check each of these (already done for the MC9400 qualification above): + +- The footer shows **Connected**. +- One scan is captured and the server keeps it (**Saved scan**). +- Navigation to **Apps** and back works. +- Echo: choose the printer, document and copies once. The server does the printing. + +Printer clients belong on the server side. No printer driver goes on the scanner. + +## Updates + +For a later build signed by the same key with a higher versionCode, run the same `adb -s DEVICE_SERIAL install -r QQQ-Mobile-<version>.apk` command. Data is preserved. + +## Devices running the development-signed build + +Devices running the development-signed demo build (the TC22) cannot be updated by this APK, because the signer differs. Android is expected to refuse the install. This is not a fault: do not uninstall the app or reset the device to get around it. Moving that device needs an explicitly authorized, planned one-time migration that includes re-enrollment. + +## References + +- Android Debug Bridge, [installing and updating apps](https://developer.android.com/tools/adb#move) and [enabling USB debugging](https://developer.android.com/tools/adb#Enabling): <https://developer.android.com/tools/adb> diff --git a/docs/LEGACY-SOURCE-FOLLOWUPS.md b/docs/LEGACY-SOURCE-FOLLOWUPS.md new file mode 100644 index 0000000..02f0ebd --- /dev/null +++ b/docs/LEGACY-SOURCE-FOLLOWUPS.md @@ -0,0 +1,18 @@ +# Legacy source follow-ups + +The standards cleanup removes speculative inline work markers and obsolete commented-out implementations. This checklist preserves the unfinished questions in repository task tracking. None of the entries below is represented as an implemented feature or a newly reproduced defect. Changes to supported semantics require their own contract and acceptance coverage. + +- [ ] `QAppMetaData`: determine whether supported native consumers require `supplementalAppMetaData`; define a typed contract and fixtures before adding it. +- [ ] `QFieldMetaData`: inventory field behavior metadata actually needed by native controls; avoid an untyped `List<Any>` placeholder. +- [ ] `QInstance`: define native report support and a typed report contract before exposing report metadata. +- [ ] `QTableMetaData`: inventory omitted table fields against the supported semantic UI API and add required fields with sanitized real fixtures. +- [ ] `QWidgetMetaData`: inventory omitted widget fields against supported native widgets and add required fields with fixtures. +- [ ] `ProcessComponentHelpText`: decide whether preview/expand behavior is part of the supported contract; test it if introduced. +- [ ] `ProcessComponentWidget.buildProcessComponentWidgetState`: define metadata-driven header/body/footer placement before restoring any list-position heuristic. The deleted implementation was inactive. +- [ ] `ProcessComponentWidget.evaluateWidgetBlocks`: reconcile legacy `INPUT_FIELD` value propagation with the native input renderer; do not restore commented web-client code without contract coverage. +- [ ] `CompositeWidgetBlock.Modal.controlCallback`: confirm whether the semantic callback means toggle or an explicit target visibility; test repeated callbacks against that contract. +- [ ] `ProcessViewModel.closeProcessCallback`: review current guarded navigation and cancellation coverage before changing reverse-navigation notification. The old comment predates the guarded navigation implementation and does not establish a current failure. +- [ ] `ProcessViewModel` widget event handling: verify permitted action-code validation against server metadata; define a fail-closed native check if the supported contract requires it. +- [ ] `QViewModel.loadQInstance`: derive frontend name/version from the declared client build identity instead of the existing fixed identification strings, with compatibility request coverage. + +The removed alternate network return and speculative session-test wait snippet are obsolete inactive implementations, retained in Git history rather than executable source. Their deletion changes no runtime behavior. Runtime, provider and physical-device acceptance gates remain tracked in the main task list and readiness documents. diff --git a/docs/NATIVE-AUTH-ACCEPTANCE.md b/docs/NATIVE-AUTH-ACCEPTANCE.md new file mode 100644 index 0000000..8a373bd --- /dev/null +++ b/docs/NATIVE-AUTH-ACCEPTANCE.md @@ -0,0 +1,19 @@ +# Native navigation and OAuth2 acceptance + +On October 31, 2026, the separate sample application test package ran on the physical Zebra TC22. The latest terminal instrumentation summary was `OK (21 tests)`, elapsed 53.482 seconds, with `INSTRUMENTATION_CODE: -1` (the normal successful Android instrumentation result). No operator identifier, barcode, credential or raw device log is retained here. + +The selected classes were NavigationTests, SemanticInputTests, SessionTests and OAuth2LoginTests. They cover the signed-out drawer, Back and guarded app/process navigation, secondary Settings/Diagnostics, input/account behavior, and seven OAuth2 cases: + +- An advertised browser flow creates exactly one semantic exchange and opens the authorized app catalog. The actual AppAuth request uses S256 and exactly one `prompt=login` parameter. +- Browser cancellation does not exchange a code or offer a password fallback. +- A mismatched browser state never exchanges a code. +- A cancelled attempt cannot be revived by a late successful browser result. +- A cancelled exchange discards a known late session at its original server without adopting it. +- Missing native advertisement offers neither password nor browser login. +- A mismatched discovery issuer is rejected before browser launch. + +The initial run passed 19 cases and exposed Back during drawer-opening animation. The handler now consumes Back while the drawer is open or targeting Open; the test helper settles the UI before issuing hardware Back. The rebuilt suite passed all 20 cases. The follow-up bounded build also passed 102 JVM tests, scanner lint, host debug/E2E APK assembly and native-test compilation in 1m3s (266 tasks, 34 executed). + +The latest 21-case run adds the unconfirmed-scan regression: a lost response and malformed receipt retain the original event; Stay preserves it; failed cancellation leaves the operator a choice to retry or explicitly Leave anyway; the final local exit reaches the app and Apps catalog without an extra scan submission or cancellation. The bounded fix build passed all 46 mobile JVM tests, scanner lint/debug APK and sample/test APK assembly in 18 seconds. Pending-photo and active-request guards remain enforced by regression tests. The native fixture simulates response and cancellation failures; it does not claim a server rollback. + +This is actual handheld execution with a synthetic QQQ repository, injected HTTPS discovery metadata and an instrumentation monitor returning AppAuth activity results. It does not establish a live Authentik login, an actual browser redirect through the exported callback activity, browser-authorization rotation/process-death behavior or configured shared-operator reauthentication. Those remain deployment acceptance gates in [AUTHENTICATION.md](AUTHENTICATION.md). This run did not replace the normal operator scanner app or modify its data. No production signing or release delivery is implied. diff --git a/docs/NAVIGATION-UX.md b/docs/NAVIGATION-UX.md new file mode 100644 index 0000000..a7d2dd2 --- /dev/null +++ b/docs/NAVIGATION-UX.md @@ -0,0 +1,70 @@ +# Mobile navigation and operator experience + +Status: implementation and native acceptance in progress. This specifies the requested behavior; it does not claim the current APK already implements every row. + +## Information hierarchy + +The primary hierarchy is **Apps → selected app → running process**. The Apps catalog lists only server-authorized business apps. App pages list their server-defined processes. Client settings, troubleshooting and account actions are not business apps and do not belong in that catalog. + +Every screen provides one **hamburger navigation drawer**, a clear current app/process title, and a separate **Account** action. The drawer's primary section contains **All apps** and the server-authorized apps; Settings and Diagnostics remain fixed at its bottom while the app list scrolls. There is no separate Apps toolbar button or Switch app overflow action. The hamburger remains accessible alongside Back inside an app or process. Before login or device approval, the drawer exposes Settings and Diagnostics but hides business destinations. Use one authoritative navigation stack; toolbar Back and Android Back must call the same navigation policy. Do not maintain a second mutable title/history stack. App switching replaces the active app branch so Back cannot unexpectedly return to an abandoned process. + +| Layer | Contents and entry | +| --- | --- | +| Primary navigation | Apps catalog, chosen app, its processes. All apps and authorized app entries are reachable through the hamburger drawer from every approved authenticated screen. | +| Process actions | Server-defined submit/next/finish actions; contextual Cancel/Close. A previous business step exists only when supported by the server contract. | +| Account | Current user and Sign out. Explicit user sign-out is distinct from forced session expiry. | +| Settings | Current server/customer, device name/short name, device permissions, supported operator preferences. Changing server requires leaving work and signing out of the old server. | +| Diagnostics | Server reachability details, recent safe logs, retry/check connection and app/version information. Reachable from the connection footer and secondary menu. | +| Administration | Approval and fleet management remain in QQQ administration. A handheld pending approval shows its short name and administrator instructions. | + +The default-on foreground location reporting toggle, permission recovery and actual provider/fix status belong under device settings. Android location permission is requested once when an approved signed-in session first becomes foreground with reporting enabled; denial leaves scanning usable. Camera permission is requested when the operator chooses Take photo. A live viewing indicator remains visible while an administrator is viewing the app. The app provides no pause or stop viewing control, including in Settings; Android's system consent and stop controls remain available for optional whole-device sharing. + +The owner also requires a device-local Orientation preference in Settings: System default, Portrait, Landscape, Reverse portrait and Reverse landscape. Persist the selection across app restarts and apply it across login, menus and processes. Use Android's activity orientation policy without changing system-wide rotation settings. Rotation or a policy change must preserve drafts and pending upload identity. Licenses belong in the same secondary Settings layer and must remain readable offline. + +## Entry and exit states + +1. Initial setup accepts a server origin, validates compatibility before credentials and obtains customer branding. Errors provide Retry, server settings and diagnostics. Release builds require HTTPS. +2. Login clearly identifies the customer/server, labels username/password, supports keyboard Next/Done and a reachable Sign in action on TC22-sized screens. Submission shows progress and prevents duplicate requests. Errors preserve username, never log passwords and never expose protected screens. +3. Pending/revoked enrollment shows a friendly device name/short name, the approval state, Check approval, Sign out and secondary diagnostics/settings. It does not show the authorized app catalog until approved. +4. Successful login and approval land at Apps. Zero available apps has an explicit empty state, Retry and account/settings access. One available app still has a discoverable Apps destination. +5. Explicit Sign out asks for confirmation, with active-work consequences if applicable. Cancel leaves navigation/session unchanged. Confirm cancels or reconciles active work, ends the mobile session, clears sensitive client state and returns to login. Device enrollment and server selection survive ordinary logout. +6. Remote termination or expired authentication immediately blocks protected content/capture and returns to login with a clear reason. It must not wait for a user confirmation or leave stale screens reachable through Back. + +## Back and switching behavior + +| Current state | Toolbar Back / Android Back | Drawer All apps / selecting another app | +| --- | --- | --- | +| Apps catalog | No misleading disabled Home arrow; Android Back uses normal platform exit/background behavior without signing out. | Stay at Apps; repeated taps do not add duplicate routes. | +| App menu | Return to Apps. | Return to Apps or replace the app route. | +| Completed process | Close to the containing app; no cancellation request for completed work. | Close and go to requested destination. | +| Active process, including scanner | Ask to leave the process. Stay preserves work. Confirm uses native cancellation then navigates. Saved scans remain saved; never imply Cancel undoes committed records. | Same leave policy, remembering the requested destination. | +| Initializing process | Same policy; cancellation intent survives a late process UUID and cancels that process before navigation completes. | Same policy. | +| Submission/upload in flight or pending photo | Keep the operation identity and block leaving until the request settles or the pending photo is resolved. | Same policy; no hidden background second process. | +| Settled scan with missing acknowledgment | Warn that the scan may already be saved. Stay retains the original event for an explicit same-event retry; Leave process stops retrying and requests server cancellation. Retain the event if cancellation fails, and discard it only after confirmed cancellation. | Same explicit confirmation and cancellation policy. | +| Cancellation failed | Stay retains work; retry cancellation or explicitly choose Leave anyway. Warn that the server process may still run and the scan may already be saved. Leave anyway discards local retry state and applies the requested destination without another server request. In-flight and pending-photo guards still apply. | Same second-stage explicit choice; never an automatic fallback. | +| Settings/diagnostics/account surface | Dismiss the surface, preserving current app/process and draft. | Close secondary surface, then apply the normal primary navigation policy. | + +The top-level Back arrow means navigation out of the current process, not undoing a scan or automatically moving to a previous business step. Label the leave dialog accordingly, for example **Leave Scan Capture?** with **Stay** and **Leave process**. Completed scans stay saved. For multi-step forms, render a server-supported previous-step action within the process when available; never guess it from an arrow or step name. + +Opening the drawer preserves the current process and draft. Android Back or tapping its scrim closes the drawer without navigating or cancelling work. Selecting All apps or another app then applies the same guarded leave policy as toolbar Back. Keyboard Back first dismisses the keyboard where Android normally does so. Dialog Back dismisses the dialog as Stay. Repeated taps while cancellation/sign-out is in progress must not launch duplicate work. Failed cancellation remains visible with retry/reconciliation; it must not silently orphan a live process. Settings changes that affect identity or server use the same guard as app switching. + +## Small-screen and scanner usability + +Use labeled actions with accessible names, at least 48dp touch targets, readable status and visible focus. Do not disable keyboard focus on navigation controls. Keep primary submit actions reachable above the IME or after its Done action; long forms scroll without hiding the last field or action. Titles may truncate visually but retain meaningful accessibility text. Diagnostics should show the server connection, not just whether Android has internet access. The footer is persistent across login, approval, catalog and processes and opens connection details. + +## Required native acceptance + +- Login → approval → Apps → app → process; verify user-facing titles and selected navigation at each stage. +- Toolbar Back and Android Back both leave a process through the same confirmation; Stay preserves field values and makes no cancellation request; Leave cancels exactly once and returns to the app. +- The hamburger remains available beside Back inside processes; duplicate Apps and Switch app controls are absent. Drawer dismissal preserves drafts and makes no cancellation request. All apps and direct app switching use the same guard and land at the requested destination; Back never resurrects the old process. +- Signed-out and pending-approval drawers expose Settings and Diagnostics without business navigation. Secondary entries stay visible below the scrolling app list. +- Completed result closes without cancel; initializing process cancellation handles its late UUID; uncertain submission does not replay an ordinary mutation or discard retry identity. +- A lost scan response or malformed receipt offers an enabled Leave process action after the request settles. Stay preserves the event; confirmed leave cancels once without resubmitting. Failed cancellation retains the event and retry option. In-flight requests and pending photos still block leave. +- Failed cancellation exposes Leave anyway only after a real attempt. Stay retains the event; cancellation retry remains available; explicitly leaving anyway clears local state once without another mutation. Verify the fallback cannot bypass in-flight requests or pending photos. +- Settings, account and diagnostics open/close without navigating away from or submitting the process; server change uses the leave/sign-out guard. +- Explicit sign-out Cancel preserves work; Confirm clears protected content and returns to login; fresh login returns to Apps with enrollment retained. +- Remote session end bypasses confirmation and prevents stale Back navigation/capture. +- Empty catalog, single app, multiple apps, short viewport, large font, keyboard navigation, IME dismissal, rotation and Activity recreation retain coherent state. +- Photo capture/upload adds matching leave/cancel/reconciliation cases once its integration is available. Physical TC22 acceptance includes hardware Back and trigger behavior after app switching. + +Automated tests must exercise actual navigation and request counts/state, not only button visibility. Companion real-server tests verify cancellation/session changes and persisted scans. Physical tests qualify handheld ergonomics separately. diff --git a/docs/PHYSICAL-TC22-ACCEPTANCE.md b/docs/PHYSICAL-TC22-ACCEPTANCE.md new file mode 100644 index 0000000..d495596 --- /dev/null +++ b/docs/PHYSICAL-TC22-ACCEPTANCE.md @@ -0,0 +1,34 @@ +# Physical TC22 acceptance — November 1, 2026 + +This records development-package evidence, not production release acceptance. The normal application was updated in place after signer verification and private-data backup. The emulator remains off. + +## Current installed checkpoint + +Normal portrait-default APK `C89161C522AA7DFFE09C009ABDE769C1BADB7E6C64BFCE699857062A1CEC6340` is installed, backed by all eleven hosted checks at7de. One subsequent trusted EMDK Code128 event is verified after that update, in addition to the eight deliberate priorF3AF events below. Current leading-zero QR remains pending; publishing/decoding its QR fixture is not trigger-to-save acceptance. Normal server is still coreecf/serverb14 API1.9/mobile1.1 on57832; whole-device1.2 source is not a normal-runtime upgrade. + +## Earlier F3AF checkpoint + +| Component | Exact tested checkpoint | +| --- | --- | +| Development APK SHA-256 | `F3AF638E34AA0B6FB44D789362BED2838202EDAF681DF775F2A5FAD3AB3E9FAA` | +| Production source checkpoint | `e04fdb2d21d4f84253f12137af106bbcb0344a19` | +| Backend core | `ecf0f550a0357cec6387c2b54efca128a405a629` | +| Running scanner server | `b14d925b741e815d1cfa4f62301f19207f25b03f`, UI API1.9/mobile-scanners1.1 | + +Direct display inspection confirmed sign-in, the Apps menu, Scan Capture and “Scanner ready.” The operator then reported “Saved scan.” A direct, ownership-guarded backend query verified eight new `QQQ-TEST-123456` records with `scanSource=zebra-emdk`, `symbology=CODE128`, TC22 model attribution and eight distinct event identities. Their device capture times run from `2026-11-01T11:02:17.572512Z` through `2026-11-01T11:02:40.208343Z`. Device capture and server receipt times are separate clock observations. + +This proves a trusted hardware trigger-to-save positive control. The operator confirmed the captures came from multiple deliberate trigger pulls. Historical DataWedge records were excluded from this result. The normal database has eleven records at the observation, including its three preserved historical scans; no disposable instrumentation was run over this walkthrough. + +| Required behavior | Current proof | +| --- | --- | +| Code128 trigger to durable scan | Eight priorF3AF events plus one installedC891 event verified on EMDK, with operator Saved scan and matching backend records. | +| Leading-zero QR `001234567890` | Fixture independently decoded; current physical operator/backend confirmation pending. Historical DataWedge QR does not satisfy this gate. | +| Separate repeated trigger intent | Eight distinct events observed; operator confirmed multiple deliberate pulls. | +| Rotation/recreation, background/resume, scanner ownership restoration | Physical matrix pending; native synthetic/hosted evidence is separate. | +| Connection failure, uncertain receipt/retry, leave/cancel and switching apps | Operator walkthrough pending; automated regressions remain separately scoped. | +| Remote termination and fresh login | Current hosted verification passes; current physical operator checks remain pending. | +| Actual projection, camera/gallery and GPS | Separate consent/provider/runtime gates; not implied by barcode capture. | + +The reported disappearance before sign-in was inspected directly: the process remained alive/resumed/focused, the crash buffer was empty and the display showed connected sign-in. No app crash or product fix is established by that observation. The desktop mirror was black; direct local ADB screenshots provided the usable display evidence. + +The later portrait-default update produced development APK `C89161C522AA7DFFE09C009ABDE769C1BADB7E6C64BFCE699857062A1CEC6340`. Four focused policy tests, debug lint (zero errors/warnings) and debug assembly pass. It was installed in place with a matching signer and another private-data backup. Direct Android inspection confirms the normal scanner Activity resumed with `SCREEN_ORIENTATION_PORTRAIT`; the display shows its signed-in Apps menu. Missing/invalid settings now default to portrait; explicit saved choices remain intact. The eight-event observations in the earlier checkpoint belong toF3AF; the subsequentC891 Code128 positive control is summarized above. Current QR/lifecycle checks remain pending. diff --git a/docs/REAL-AUTHENTIK-ACCEPTANCE.md b/docs/REAL-AUTHENTIK-ACCEPTANCE.md new file mode 100644 index 0000000..c575fa5 --- /dev/null +++ b/docs/REAL-AUTHENTIK-ACCEPTANCE.md @@ -0,0 +1,68 @@ +# Real Authentik native acceptance (opt-in, physical TC22) + +This is the only test that runs the Android OAuth2 callback against a real provider. It is skipped by default +(`RealAuthentikAcceptanceTest` needs `-e realAuthentik true`) and is never part of the synthetic E2E scenarios. +Until it passes on the device, [AUTHENTICATION.md](AUTHENTICATION.md) makes no claim of an Android Authentik round trip. + +## What it exercises + +The unmodified flow: `oauth2.signIn` -> real AppAuth external browser -> the real provider -> the exported +`OAuth2RedirectActivity` (`io.qrun.mobile.scanner.e2e.oauth://callback/oauth2redirect`) -> the real QQQ code exchange -> +device pending -> real administrator approval (`mobileDeviceApprove`) -> catalog; then operator A's **Sign out of company** +(RP-initiated, through the browser) and a fresh login of operator B without clearing any browser state. It asserts the +principal QQQ shows (`Current User: ...`), exactly one ACTIVE session for the device, A's session no longer ACTIVE, B's +different, an optional exact server actor, and that no password form is ever offered. It injects no callback, ActivityResult, +token or discovery document. + +## Trust and transport + +- `scanner-host/src/e2e/res/xml/network_security_config.xml` (E2E package only) keeps system trust and the existing cleartext + `127.0.0.1` fixture traffic, and additionally lets the literal host `localhost` trust a **user-installed** CA over HTTPS only. + Nothing is pinned or bypassed; debug, qa and release builds are unchanged. +- The temporary fixture CA must be installed by the person holding the device, through Android settings (a screen lock/PIN is + required), and removed afterwards. Neither this test nor the launcher installs, probes or changes trust. The browser must + also trust that CA, otherwise it shows a certificate warning: do not continue past it. + +## Prerequisites + +The provider fixture and QQQ are running (QQQ `https://localhost:18443`, Authentik `https://localhost:19443`) with the exact E2E +callback registered for login and post-logout; a physical TC22 with `ANDROID_SERIAL` set only in the environment, unlocked and +awake; the disposable packages absent; and a private config file **outside the repository** (it holds a live administrator +session cookie): + +```json +{ + "fixtureType": "real-authentik-android", + "qqqOrigin": "https://localhost:18443", + "adminCookie": "<Cookie header value of an admin QQQ session; never printed>", + "operators": { + "A": { "display": "<exact Current User text for the first operator>", "actor": "<optional server actor value>" }, + "B": { "display": "<exact Current User text for the second operator>", "actor": "<optional server actor value>" } + }, + "sessionActorField": "<optional mobileSession column holding the actor; omit to skip>" +} +``` + +## Run + +```text +./gradlew :scanner-host:assembleE2e :scanner-host:assembleE2eAndroidTest +node scripts/ci/real-authentik-android.mjs --config <private-config.json> --confirm-temporary-ca-installed +node --test scripts/ci/real-authentik-android.test.mjs # guard tests, no device needed +``` + +The launcher refuses emulators and any device that is not a Zebra TC22, refuses a config inside the checkout or with a different +origin, and refuses if `io.qrun.mobile.scanner.e2e` or its `.test` package already exists (it never uses `install -r`). It adds +`adb reverse` for `tcp:18443` and `tcp:19443` only when absent (never rebinding; a differing existing mapping is an error), +never touches `tcp:8080` or any other mapping, never reads or changes the normal `io.qrun.mobile.scanner` package or its data, +pushes the config through `run-as` stdin (never to shared storage), and afterwards removes only the pushed file, the two +disposable packages and the reverse mappings it created. Output is fixed stage text and a PASS/failure sentence: no serial, URL, +cookie, token or credential. The operator types provider credentials in the browser when an `ACTION:` line appears (bounds: 45 s +for the browser to appear, 600 s per login, 300 s for company logout, 40 min total). + +## Limits + +No browser automation is included, so the operator enters credentials. The test cannot verify CA installation; a missing CA +shows up as the browser never opening within the bound. Process death during the browser step loses the in-memory attempt by +design; rerun. A pass proves this provider/server/package combination only; it is not production-provider, release-build or +EMDK trigger qualification. diff --git a/docs/RECORD-UX-2026-11-05.md b/docs/RECORD-UX-2026-11-05.md new file mode 100644 index 0000000..9a0073a --- /dev/null +++ b/docs/RECORD-UX-2026-11-05.md @@ -0,0 +1,46 @@ +# Record browsing and photo UX — November 5 + +The existing scanner application now supports permitted tables, grouped record details, related records and record-linked photo capture through standard semantic APIs. The companion Echo demo supplies 1,000 synthetic orders, 12,000 items and 3,000 history entries. + +Source review: [Android PR 15](https://git.kof22.com/QRun-IO/qqq-android/pulls/15), paired with [scanner/server PR 19](https://git.kof22.com/QRun-IO/qbit-mobile-scanners/pulls/19). + +## User flow + +Open **Test Data → Test Orders**, search or filter, and select a record. Back preserves page/search/filter context. A fixed identity heading sits above Details, Items, History and Photos. Groups collapse and can be selected from Sections. Related items show concise reference/quantity/SKU labels; timestamps include timezone context and server currency/units are preserved. + +Use **Actions → Add photo → Take photo / Choose photo**. The selected record remains visible in the chooser. Saved attachments appear under Photos with review status. Available images have thumbnails and previews; quarantined originals remain unavailable. The client follows the server's receipt: a host that admits approved-device captures immediately returns `AVAILABLE`, so the app shows "Saved photo."; hosts that retain quarantine return `QUARANTINED` ("Awaiting server review."). The maintained Echo host now uses Record Files' scoped `quarantineCapturedFiles` setting. The app has no admission policy of its own and no client change was needed. Photos already uploaded stay quarantined until the server releases them; the three earlier demo captures were released through the normal audited admin process. Photo transfer remains online-only, idempotent and protected by parent permissions and device/session authorization. + +The signed MC9400 app's gallery upload returned "Saved photo." for a new synthetic PNG; server readback verified `AVAILABLE`, the intended parent, media type, byte count and SHA256. Updated native acceptance on the TC22 also passed synthetic camera/gallery uploads, the newly captured photo's thumbnail and full preview, parent scoping, rotation and forced-logout cleanup. All requests passed semantic API checks; the disposable app was removed afterward. This is not a camera-hardware qualification. The captured-photo policy still needs its public dependency release. + +## Verification + +- 232 unit tests: core 52, mobileapp 57, host 123; zero failures/errors/skips. Scanner lint: zero errors/warnings. Debug, E2E and instrumentation APK builds passed; eight runner guard tests passed. +- Isolated MC9400 rich-record native acceptance passed paging, groups, related queries/navigation, search/filter/Back preservation, camera/gallery persistence, approved preview, parent-scoped gallery, rotation, pending-photo navigation protection and forced-logout cleanup. All HTTP requests matched the semantic API. Existing process-photo acceptance also passed. +- The final date fallback handles default `%s` metadata and differing raw/display JSON values; its unit/lint/debug-build gate passed. Actual TC22 inspection confirmed localized dates/timezones, currency, Actions/capture chooser, direct tabs and order 26 → Android Back → page two. The full native suite preceded this date-only follow-up. +- Updated the ordinary TC22 app in place with matching signer and installed bytes verified: SHA-256 `F71033C835AC3EB361A04D78C842947C5A04C85CE1AB1B999AA8CEFBFC9D7A95`. No app-data reset, replacement login or separate manual QA app was needed. + +Native camera/gallery inputs in automated acceptance were synthetic. This visual pass did not capture an operator photo, print a label or qualify physical GS1 reproduction. The November 4 operator report remains accepted separately. + +## Actual TC22 screenshots + +All displayed records are synthetic. These are screenshots of the installed app, not mockups. + +| Record and actions | Capture chooser | +| --- | --- | +| ![Record Actions menu](images/record-ux-2026-11-05/tc22-ux-actions.png) | ![Take or choose a record photo](images/record-ux-2026-11-05/tc22-ux-add-photo.png) | + +| Related items | Related history | +| --- | --- | +| ![Items with quantity, SKU and currency](images/record-ux-2026-11-05/tc22-ux-items.png) | ![History with formatted timestamps](images/record-ux-2026-11-05/tc22-ux-history.png) | + +| Saved-photo empty state | Table after Android Back | +| --- | --- | +| ![Photos tab with Add photo guidance](images/record-ux-2026-11-05/tc22-ux-photos.png) | ![Page two retained after returning from a record](images/record-ux-2026-11-05/tc22-ux-back-preserved.png) | + +## Implementation boundaries + +Record Files intentionally denies aggregate counts; photo pages use bounded queries with one lookahead row. Downloads use the owner's authenticated tracked-delivery endpoint, exact size/hash verification, same-origin credentials, no redirects, bounded bitmap decoding and no image disk cache. Hidden fields stay out of native summaries/search. + +Pending-upload Back handling is registered inside the record destination, after NavHost's callback. Configuration disposal does not clear retained upload guards; authentication teardown does. Tests use a disposable application ID, fresh temporary database and isolated accounts, preserving normal device/demo data. + +No new business routes, generic screen framework, offline queue, raw record editing, production signing or artifact publication is introduced. Remaining qualification is tracked in [TODO](TODO.md). diff --git a/docs/RELEASE-AUTOMATION-REVIEW.md b/docs/RELEASE-AUTOMATION-REVIEW.md new file mode 100644 index 0000000..bbfbd5d --- /dev/null +++ b/docs/RELEASE-AUTOMATION-REVIEW.md @@ -0,0 +1,17 @@ +# Release automation review — November 1, 2026 + +Independent read-only review of Android revision `5ba87f49d2fc5ab7f52566727d0d2d147d9b0c9f` found no actionable correctness or security finding in these three files. The review did not execute a production release or inspect GitHub environment settings. + +| File | SHA-256 | +| --- | --- | +| `.github/workflows/release-scanner.yml` | `61D581A452D00E53D83F9A61AE1702C2BA349833481B9B23CDE955B2C204426A` | +| `.github/workflows/scanner.yml` | `E6F792B4C1CDDFD3621E1CFD2009EF7F610C3C546357F83428DE5703B0C289F0` | +| `scanner-host/build.gradle.kts` | `AAF0DEAE4B653E3455B83D2CAE190F7F06D100721CBB9A471F23586F0DB5EFC6` | + +The reviewer checked reusable verification, native testing on tag pushes, read-only tokens until publication, environment-scoped signing inputs, main ancestry, monotonically increasing Android version codes, temporary keystore cleanup and complete Gradle signing configuration with no debug-signing fallback. Signed APK inspection checks certificate, package, version and non-debuggable status. Publication verifies asset hashes and resolves the remote tag to the verified source commit. + +The tag check is point-in-time. Protected tags, authorized maintainers, environment reviewers and immutable-release settings require separate inspection/configuration; workflow YAML does not establish them. The signed release is rebuilt separately from the tested debug/E2E variants. Its lint and signature/manifest checks do not replace testing the actual signed APK, including preserving upgrades and device behavior. + +Read-only GitHub inspection on November1 confirmed strict required checks on `main`, enforced for administrators, and disabled force pushes/deletions. Required pull-request reviews were absent. The visible ruleset list contained the main code-scanning rule and no tag ruleset; the `scanner-release` environment lookup returned404 to the current connection. Release-environment/protected-tag readiness therefore remains unproven and must be resolved before loading signing secrets. + +Signing and distribution remain the owner's final decision. No key, secret, tag, GitHub protection, production release or handheld state changed during this review. See [release prerequisites](RELEASING.md). diff --git a/docs/RELEASING.md b/docs/RELEASING.md new file mode 100644 index 0000000..9c64374 --- /dev/null +++ b/docs/RELEASING.md @@ -0,0 +1,99 @@ +# Scanner APK release readiness + +## Current status (November 5, 2026) + +- **Published:** the only published release is still [scanner-v1.0.0](https://git.kof22.com/QRun-IO/qqq-android/releases/tag/scanner-v1.0.0), a **signed preview** (Gitea prerelease, not a stable release). It is unchanged. +- **Candidate, not published:** QQQ Mobile **1.0.1 (versionCode 3)** is a signed candidate. Its release qualification is incomplete, and no tag or download link is available yet. +- **Signer:** the candidate is signed with the existing permanent QRun key (certificate SHA-256 `BDDB2D2F45A5925C643A83ABAF616C1EAB2387DC5CDA7B645A6F4C0D5B17A9FF`). No new or replacement key was created; the existing recovery backup was verified earlier. +- **Candidate APK:** SHA-256 `5124716B59CAD303717E7834FE64DDC1537E33A25C9AB75A6EA1ACF03AC2717F`, 15015419 bytes. +- **Source:** Android PR 15 `ab6e44c`, merged as `c782aaaaba3f62422232436a9000af9d4b38fc82` with the same app-source tree. Installed APK bytes, signature, non-debuggable flag and 16 KiB alignment were verified. `lintRelease` reported 0 errors, 0 warnings and 5 informational findings; the release build passed. +- **Distribution:** maintainers use the existing manual signing path for direct APK/MDM distribution. Automated signing CI is optional. +- **Next candidate:** **1.0.2 (versionCode 4)** is prepared but not built; see [Next candidate](#next-candidate-102-versioncode-4). +- **Open:** see [Qualification status](#qualification-status) and [TODO](TODO.md). + +## Next candidate: 1.0.2 (versionCode 4) + +Prepared on 2026-11-06 on branch `release/scanner-1.0.2` (Android PRs 17 and 18 merged locally plus these notes). **Nothing is built, signed, tagged, installed or published for 1.0.2.** The signed 1.0.1 candidate stays unpublished and is superseded; 1.0.2 updates it in place with the same signer and a higher `versionCode`. + +Changes since 1.0.1 (details in [CHANGELOG](../CHANGELOG.md#102-versioncode-4-candidate)): company sign-out now completes (the device-session end ran before the provider logout, so no `nativeLogoutData` came back and the browser never opened on the MC9400); the user name is shown after browser sign-in; app/OS version are reported on every heartbeat (effective with mobile-scanners server 1.6.0). + +Build only after PRs 17 and 18 are merged to `main` and this branch has been rebased onto that `main`, from the exact merged commit, with no `SCANNER_*` signing variables set: + +``` +./gradlew --no-daemon --console=plain :scanner-host:lintRelease :scanner-host:assembleRelease -PscannerVersionName=1.0.2 -PscannerVersionCode=4 +``` + +Then sign `scanner-host/build/outputs/apk/release/scanner-host-release-unsigned.apk` in isolation with `apksigner` using the existing permanent key (certificate SHA-256 `BDDB2D2F...5B17A9FF`), verify v2+v3 with exactly one signer, 16 KiB alignment, `versionCode='4' versionName='1.0.2'` and non-debuggable, and write `QQQ-Mobile-1.0.2.apk`, `SHA256SUMS`, `signature-verification.txt`, `apk-metadata.txt` and `release-receipt.json` next to each other as for 1.0.1. Record the resulting hashes here, in [INSTALLATION](INSTALLATION.md) and in [SESSION-STATE](SESSION-STATE.md) before any tag or release. + +## Historical status (November 4, 2026, superseded where noted) + +Dated evidence below is preserved. As of November 4: a QRun-owned production signing key existed with a verified backup, and the signed 1.0.0 (versionCode 2) APK was published as a signed preview: [scanner-v1.0.0](https://git.kof22.com/QRun-IO/qqq-android/releases/tag/scanner-v1.0.0), release ID 1361, tag on protected `main` `3eef6431ca39b6450cf764424d921a02b2afb9ab`. It had been installed and launched once on a fresh MC9400; at that time enrollment, scanning and update were unqualified. *(Superseded November 5: the MC9400 was migrated to the signed build; see below. The statement that the MC9400 ran the development-signed debug APK is no longer current. The TC22 still runs its original development-signed installation.)* Manual TC22 acceptance was reported all-pass by the operator on November 4 (operator report, no per-case artifacts) for the development-signed build; it does not qualify the production signer and is not rerun. + +## Decisions (made) + +- **Channel:** signed APK distributed directly / through MDM. Google Play is not part of this channel, and no purchased or public-CA certificate is required. +- **Key:** a new QRun-owned Android signing key, organization identity QRunIO, application ID `io.qrun.mobile.scanner`. Alias `qqq-mobile-release`, PKCS12, RSA 4096, valid through 2056-10-27. +- **Certificate SHA-256:** `BDDB2D2F45A5925C643A83ABAF616C1EAB2387DC5CDA7B645A6F4C0D5B17A9FF`. This is the fingerprint every distributed APK must show. +- **Storage and backup:** the keystore and its credentials are stored as a keystore Document (QQQ Mobile Android release keystore) and a Password item (QQQ Mobile Android release signing credentials) in the owner's Personal 1Password account, vault `QRun`. Recovery was verified on 2026-11-04: both items were recovered from the vault, the recovered file's SHA-256 matched, and the recovered keystore opened with a certificate matching the one above. Keys, passwords, item IDs and local private paths never belong in this repository. +- **Signing path:** build an unsigned APK, then sign it in isolation with `apksigner`, so the key is not passed to the application build. The Gradle environment-variable signing below remains supported but is not the selected local path. +- **CI:** no signing secrets or CI signing activation exist. Shared CI/CD redesign is owned elsewhere; no scanner-APK Gitea release workflow exists and none is being added here. Automated scanner-APK signing/publication is not configured and is not needed for direct installation or the local demo. +- **Direct install:** see the [installation guide](INSTALLATION.md). Local signing and manual distribution do not depend on the shared CI work. + +## What exists today + +- **Gitea CI (actual).** `.gitea/workflows/build.yaml` calls the shared `KofTwentyTwo/ci-workflows` Android workflow (`android.yaml@v1`) on every push: source checks, JVM unit tests, scanner lint, debug and QA APK assembly, and connected tests on an emulator (android-build runners). A `vX.Y.Z` tag also publishes the SDK AARs (`qqq-android-core`, `qqq-android-mobileapp`) to the QRun-IO Gitea Maven registry. It is **not** a scanner-APK signing or release pipeline: it uses no scanner signing secrets and produces no production-signed scanner APK. +- **Gradle signing (supported, not selected).** `scanner-host/build.gradle.kts` reads four environment variables: `SCANNER_KEYSTORE`, `SCANNER_STORE_PASSWORD`, `SCANNER_KEY_ALIAS`, `SCANNER_KEY_PASSWORD`. + - All four set: the `release` build type is signed with them. + - None set: `assembleRelease` produces an **unsigned** APK, which is what the isolated signing step consumes. + - Some but not all set: the build fails immediately. + - Debug, `e2e` and `qa` builds keep the development debug signing. + - Version comes from `-PscannerVersionName` (semantic version, default `0.1.0`) and `-PscannerVersionCode` (1 to 2100000000, default `1`). +- **Identity.** One APK serves all customers; branding is applied at runtime from the selected server's metadata, so no per-customer key or build is needed. +- **Legacy GitHub workflows (removed).** `.github/workflows/release-scanner.yml` and `scanner.yml` predated Gitea as primary forge and were removed with the CircleCI configuration. The [November 1 review](RELEASE-AUTOMATION-REVIEW.md) covered those files only. + +## First release: 1.0.0 (versionCode 2) + +Version `1.0.0`, `versionCode` 2 was built unsigned (`lintRelease` and `assembleRelease`: 0 errors, 0 warnings, 2 information) from source matching protected `main` `0ae2101f082c241ca6a70462dc9ec3057aa6c906`; only documentation differs. It was then signed in isolation with `apksigner` on 2026-11-04 (16:22:05 UTC). + +**Signed artifact (local, complete):** `QQQ-Mobile-1.0.0.apk`, application ID `io.qrun.mobile.scanner`, SHA-256 `EE5AC896B8985AF6F11B2E883955925D6571A2913D74A4AACCDB564B79394D51`. Verification passed: signature schemes v2 and v3, exactly one signer whose certificate SHA-256 is `BDDB2D2F...5B17A9FF` (the fingerprint above), 16 KiB alignment, non-debuggable. The checksum shows integrity only, not signer correctness. + +**Published preview (2026-11-04):** release [scanner-v1.0.0](https://git.kof22.com/QRun-IO/qqq-android/releases/tag/scanner-v1.0.0) (Gitea ID 1361, prerelease, signed Git tag at `3eef6431`; the tag adds documentation only over app source `0ae2101f`) hosts exactly two assets: `QQQ-Mobile-1.0.0.apk` (14933499 bytes) and `SHA256SUMS` (88 bytes). Both were downloaded back and matched the same SHA-256. The forge requires sign-in to download. The local installation kit ZIP was **not** published and no bundle is hosted. Link the release page, not an individual asset URL. The APK is kept outside this repository. + +**Device evidence (MC9400, November 4):** the signed APK was installed on a fresh MC9400 (Android 13, EMDK present), launched without a startup crash, showed the Connect screen, and its installed bytes read back with the exact hash above. It was not enrolled: release builds require HTTPS and the only server available was the local HTTP demo. The same key and signer are unchanged. The user then chose to run the MC9400 in demo mode like the TC22, so that fresh, unenrolled production install was replaced with the development debug APK and port forwarding to the local server. No signed-build enrollment, scan or navigation was tested. The TC22 and its data were untouched throughout. + +*(The November 4 MC9400 paragraph above is historical: the fresh install was later replaced by the migration recorded below.)* + +## Qualification status + +Done (not to be repeated as unchecked work): + +- **MC9400 migration:** the user explicitly authorized it. Release 1.0.0 enrollment over trusted HTTPS passed, then an in-place 1.0.1 update preserved login and enrollment. Apps/ScanCapture navigation and EMDK Scanner-ready state were observed. +- **Physical scan:** the operator confirmed a physical Saved scan. The backend verified CODE128, AIM identifier, raw bytes, user and device. The actual barcode differed from the requested literal. +- **TC22:** the original development-signed installation and its data are retained. The accepted November 4 manual all-pass is not rerun. +- **Server discovery:** against the real shared Authentik-backed server, UI API 1.10 discovery with strict nonce passed for both scanner and printing channels, extensions and callbacks. +- **Photo policy (live):** a signed MC9400 gallery upload returned Saved photo with `AVAILABLE` status and exact parent, type, size and hash; the previous three photos were released normally. Updated native acceptance on the TC22 passed synthetic camera/gallery uploads, the captured photo's thumbnail and full preview, parent scoping, rotation and forced-logout cleanup. All requests passed the semantic API checks. The disposable app was removed and the normal app reopened. This does not establish camera-hardware or native-Authentik acceptance. +- **Local network:** the local QQQ server remains on a PC and was reached over trusted HTTPS temporarily through a user-approved private Tailscale network. This is local qualification, not a customer production deployment. Customer instructions still require a customer HTTPS URL with a trusted certificate. TLS must not be weakened, and workstation hostnames, IPs, ports, device IDs, vault IDs, private file paths and passwords are not published. + +Open: + +1. **Native Authentik** login, logout and account switching with the actual production APK remain open, awaiting the MC wireless-debug endpoint. No native-Authentik PASS is claimed. +2. **Printing:** the print nonce fix (PR 11, merged `abc3d0d`, 532 hosted tests passed) postdates the published print 1.1.1; the next installer remains with the active printing owner. +3. Public compatible Core/Collab/document/files/scripting/bridges, the final public cohort gate, GS1 physical print/rescan, and full release-asset publication and distribution. +4. Company profiles and wallpaper are tracked separately. +5. Build, sign and publish 1.0.2 (versionCode 4) in place of the unpublished 1.0.1 candidate after PRs 17 and 18 merge (see [Next candidate](#next-candidate-102-versioncode-4)), with its checksum and installation instructions after remaining qualification. The published download remains the 1.0.0 signed preview; automated signing CI is optional. + +## Release requirements + +- Keep this signer and a strictly increasing `versionCode` for every distributed build, including builds distributed outside CI. +- Never put passwords or keystores in Git, command lines, logs or committed Gradle properties. Recover them from the vault only for the signing step and remove temporary keystore copies afterward. +- Lint and build the release variant: `./gradlew :scanner-host:lintRelease :scanner-host:assembleRelease -PscannerVersionName=<semver> -PscannerVersionCode=<increasing integer>`, with no signing variables set for the isolated path. + +## Updates, compatibility and recovery + +Android updates in place only when the signer matches and `versionCode` does not decrease. Losing this key, or its backup, means installed copies can no longer be updated in place; they would have to be uninstalled and reinstalled, which removes enrollment and session state. Keep the vault backup recoverable and re-verify it (hash, open, certificate comparison) after any change to it. + +Development-signed demo installations (the TC22) cannot be upgraded by the production key. Moving one requires an explicit migration: preserve its test evidence, plan re-enrollment, and never uninstall or reset a device or application implicitly. The MC9400 was migrated under explicit user authorization (see above). No update or key-rotation policy beyond keeping this one permanent signer is defined here. + +## Not yet established + +Publication of the 1.0.1 candidate, native Authentik qualification with the production APK, a customer production HTTPS deployment, stable-release promotion, an automated scanner release workflow (optional) and its secret handling, and key-rotation planning. SDK publication by the central workflow is done and its completed audits are not reopened here. Other pending items are in [TODO](TODO.md). diff --git a/docs/SECURITY-REVIEW-2026-10-31.md b/docs/SECURITY-REVIEW-2026-10-31.md new file mode 100644 index 0000000..484285a --- /dev/null +++ b/docs/SECURITY-REVIEW-2026-10-31.md @@ -0,0 +1,36 @@ +# October 31 client security review + +The deep static review completed against published client revision `d1de0bf`. +It reported one medium and five low findings. Coverage is partial: external +server/provider/dependency implementations and some bundled binary implementation +review were outside the completed scope. This is not production release clearance. + +| Finding | Severity | Current verification | +| --- | --- | --- | +| Delayed password completion after logout/server change | Medium | Fixed origin/generation binding and deferred cookie adoption; HTTP and native delayed-response cases pass. | +| Sample release cleartext traffic | Low | Debug-only HTTP environments/manifest override; packaged release denies cleartext. | +| Auth0 provider failure preserving local QQQ login | Low | Local sign-out is independent, bounded and idempotent; failed-provider, restart and remount cases pass. | +| Unauthenticated external scan broadcasts | Low | Trusted optional EMDK adapter and production receiver removal verified by actual DEX inspection,51 scanner JVM tests and an ordinary-UID/distinct-signer TC22 case: eight forged broadcasts cause zero process/record mutations; manual positive control succeeds. Actual physical-trigger positive control remains required before closing the complete scanner acceptance; normal operator installation is unchanged. | +| Legacy Auth0 callback crossing server origins | Low | Origin-bound callback/exchange lifecycle, one-use exchange and discarded-session cleanup; HTTP/native cases pass. | +| Sample session backup | Low | No-backup storage, disabled backups and explicit cloud/transfer exclusions; native storage and packaged release checks pass. | + +The qualification batch passes 109 JVM tests (30 core, 46 mobile, 33 scanner), +scanner lint with no errors or warnings, debug/native-test APK assembly, and +unsigned sample release assembly. A physical TC22 run passes all 32 selected +navigation, input, account, synthetic OAuth/Auth0 lifecycle and host-storage cases +in 117.325 seconds. Ten new lifecycle cases cover delayed completion, duplicate +callbacks, failed provider logout, overlapping logout and logout-screen remounting. +These use synthetic repositories/browser callbacks; they do not prove a real +configured identity-provider round trip. + +Packaged release inspection confirms backup and cleartext disabled, plus all ten +cloud/device-transfer exclusions. The wrapper now matches the official Gradle 8.7 +checksum; see [provenance](WRAPPER-PROVENANCE.md). The new scanner debug APK hash is +`8c4d3886b4e994759f909677849dae26a333f476a036457c9ea76fe4566c512a`. +It has not replaced the operator's installed scanner app in this checkpoint. + +Separate live dependency review identified affected Guava in the server's tested +classpath. A patched source pin is undergoing isolated consumer qualification; +the client APK does not contain that Guava artifact. Actual Authentik, trusted +physical scanner input, immutable Record Files publication and final deployment +and signing gates remain open. See [TODO](TODO.md) and [release prerequisites](RELEASING.md). diff --git a/docs/SESSION-STATE.md b/docs/SESSION-STATE.md new file mode 100644 index 0000000..e8e7186 --- /dev/null +++ b/docs/SESSION-STATE.md @@ -0,0 +1,50 @@ +# Current status + +As of **2026-11-06**. Scope: scanner host and maintained local Echo workflow. [TODO](TODO.md) tracks remaining work; [history](history/README.md) preserves earlier evidence. This is not a final-release or full-qualification claim. See [Release facts](#release-facts-2026-11-05) below. + +## Release candidate 1.0.2 (versionCode 4), 2026-11-06 + +- Branch `release/scanner-1.0.2` carries Android PR 17 (company sign-out ordering, OAuth user name) and PR 18 (heartbeat app/OS version) plus the [1.0.2 changelog](../CHANGELOG.md#102-versioncode-4-candidate) and build instructions in [RELEASING](RELEASING.md#next-candidate-102-versioncode-4). It depends on both PRs merging first and must be rebased onto the resulting `main`. **Nothing is built, signed, tagged, installed or published for 1.0.2**; the signed 1.0.1 candidate stays unpublished. + +## Heartbeat version fix (2026-11-06, Android PR 18) + +- After the MC9400 in-place 1.0.0 to 1.0.1 update, scan receipts still reported `appVersion` 1.0.0: the host only sent `osVersion`/`appVersion` at enrollment and the server never refreshed them. `MobileSessionApi` now sends both on every heartbeat (`MobileSessionTest.networkPayloadUsesSemanticRoutesAndCarriesOnlyScreenMetadata` covers the payload); the matching server change is mobile-scanners 1.6.0 on the same-named server branch. Older servers ignore the keys; the installed 1.0.1 APK does not include this change (planned for 1.0.2). + +## Release facts (2026-11-05) + +- **Published:** still `scanner-v1.0.0`, a signed preview. Signed candidate **1.0.1 (versionCode 3)** is **not published**, has no tag and no download link, and is not production-complete. Signer: existing permanent QRun key (certificate SHA-256 `BDDB2D2F...5B17A9FF`); no new key. APK SHA-256 `5124716B59CAD303717E7834FE64DDC1537E33A25C9AB75A6EA1ACF03AC2717F`, 15015419 bytes. Details: [RELEASING](RELEASING.md). +- **Source:** Android PR 15 `ab6e44c`, merged `c782aaaaba3f62422232436a9000af9d4b38fc82`, same app-source tree. Root verified installed APK bytes/signature/non-debuggable/16 KiB alignment; `lintRelease` 0 errors, 0 warnings, 5 informational; release build passed. +- **Done:** MC9400 migration (user-authorized): 1.0.0 enrollment over trusted HTTPS, then in-place 1.0.1 update preserving login/enrollment; Apps/ScanCapture and EMDK Scanner-ready observed; operator-confirmed physical Saved scan verified in the backend (CODE128/AIM/raw bytes/user/device; actual barcode differed from the requested literal). Not repeat work. TC22 keeps its original development-signed installation and data; the accepted November 4 manual all-pass is not rerun. +- **Network:** the local QQQ server stays on a PC, reached over trusted HTTPS temporarily through a user-approved private Tailscale network. This is not a customer production deployment; customer instructions require a customer HTTPS URL with a trusted certificate. TLS is not weakened; no hostnames, IPs, ports, device/vault IDs, private paths or passwords are published. +- **Server/Authentik:** real shared Authentik server discovery verified (UI API 1.10, strict nonce, scanner and printing channels/extensions/callbacks). Production-APK native login/logout/account switching is **open**, awaiting the MC wireless-debug endpoint; no native-Authentik PASS is claimed. Print nonce fix PR 11 (merged `abc3d0d`, 532 hosted tests passed) postdates published print 1.1.1; the next installer remains with the active printing owner. +- **Photo policy:** live. A signed MC9400 gallery synthetic PNG became a Saved photo, `AVAILABLE`, with exact parent/type/size/hash; the previous three photos were released normally. The app has no admission policy; the server receipt controls the message. The root is running the updated disposable TC22 E2E; no full new-preview or native PASS is claimed until it completes. +- **Company sign-out bug (2026-11-05):** on the physical MC9400 with the production APK against the real Authentik fixture, **Sign out of company** never opened the browser and reported "Company sign-out did not complete". Cause: `QViewModel.performLogout` ran the host `beforeLogout` hook (scanner device-session end, which runs the core logout server-side) before the provider logout request, so `nativeLogoutData` was never returned. A fix reordering provider logout before the host hook, plus adoption of the server-reported user name after browser login (Account showed a blank "Current User"), is Android PR 17 (`cf82dd5`) with unit tests; it is **not released** and no new APK is built (planned for 1.0.2, versionCode 4). See [AUTHENTICATION](AUTHENTICATION.md#optional-company-sign-out-implementation-awaiting-qualification). +- **Open:** public compatible Core/Collab/document/files/scripting/bridges, final public cohort gate, GS1 physical print/rescan, full release-asset publication/distribution. Company profiles/wallpaper are tracked separately; signing CI is optional and not blocking a direct APK release. Release authorizations already exist. + +Statements below were written before these facts and are historical where they conflict (for example "debug update", MC9400 trigger check "outstanding", signed-build HTTPS qualification "open"). + +## Record browsing and photos + +The existing TC22 app now opens permitted tables and records through the standard semantic metadata/query/get API. Tables support search, exact text filters, counts and stable paging; Back restores page/search/filter context. Records retain identity above Details, related-record and Photos tabs, with collapsible groups and a section selector. Dates/timezones, currency and empty values are readable; identifiers keep leading zeros. + +**Record → Actions → Add photo** opens Take photo / Choose photo. Saved photos show parent-scoped lifecycle status and approved thumbnails/previews. Quarantined originals remain unavailable. Availability is decided only by the server receipt/lifecycle; focused tests cover both `AVAILABLE` and `QUARANTINED`, and the native E2E expects `AVAILABLE` for the configured Echo fixture while retaining quarantine assertions for the generic fixture. Thirteen focused photo/API tests passed. A fresh synthetic gallery upload through the signed MC9400 app returned "Saved photo."; server readback verified availability, parent, type, byte count and SHA256. The three earlier demo captures were released through the normal audited admin process. Updated TC22 native photo acceptance passed synthetic camera/gallery upload, the captured photo thumbnail/full preview, parent scoping, rotation and forced-logout cleanup, with all requests checked against the semantic API. The disposable test packages were removed and the normal app reopened. Public captured-photo dependency publication and native Authentik qualification remain open. Existing upload identity, retry handling, server authorization, pending-navigation guards and logout cleanup are preserved. + +The maintained companion demo supplies Test Data: 1,000 orders, 39 fields in six groups, 12,000 items and 3,000 history entries. See [screenshots and verification](RECORD-UX-2026-11-05.md). + +## Verification and installation + +- **232 unit tests** pass: core 52, mobileapp 57, host 123; lint reports **0 errors/0 warnings**. Debug, E2E and instrumentation builds pass. Eight runner guard tests pass. +- Isolated MC9400 native acceptance passes rich-record paging/groups/relations/search/filter/Back, camera/gallery persistence, parent-scoped saved photos, approved preview, rotation, pending-photo navigation protection and forced-logout cleanup. All requests match the semantic API. Process-photo regression passes separately. +- The final date fallback recognizes default `%s` server metadata. It received unit/lint/debug-build gates and actual TC22 checks; the full native suite preceded that date-only follow-up. +- Existing TC22 app updated in place with signer and installed bytes verified: SHA-256 `F71033C835AC3EB361A04D78C842947C5A04C85CE1AB1B999AA8CEFBFC9D7A95`. No uninstall/data clear or separate manual QA app. Existing login, enrollment and server configuration survived. +- Actual TC22 inspection confirms Actions and capture chooser, direct tabs, date/timezone and currency formatting, empty Photos state and order 26 → Android Back → page two. Automated camera/gallery inputs are synthetic; no new physical camera/print claim is made. + +## Source and runtime + +Protected `main` contains PRs 8/10, with signing/documentation through PR 14 (`464814f`). The user authorized commit, push and merge of the GS1/record/UX work through normal Gitea checks. No new artifact release was requested. The maintained server uses public QQQ RC.21 and Printing 1.0.0 plus qualified document/files/scripting owner inputs. Contract versions remain UI API 1.10, mobile-scanners 1.5, printing 2.3 and mobile-record-files 1.0. Device loopback 8080 forwards to the existing host port 57832. + +The QRun-owned signing key and [signed preview `scanner-v1.0.0`](https://git.kof22.com/QRun-IO/qqq-android/releases/tag/scanner-v1.0.0) remain unchanged. That preview predates the record UX update; candidate 1.0.1 is unpublished. The preview is not a stable release or an automatic signing/publication pipeline; see [RELEASING](RELEASING.md). + +## Accepted and outstanding hardware work + +The November 4 TC22 operator group pass remains accepted; do not request it again. MC9400's physical scan/backend check and signed-build trusted-HTTPS enrollment/update are done (see Release facts). Physical GS1 print/rescan, native provider callback, public owner-dependency adoption and fleet/MDM rollout remain open. Historical hashes, signed-preview provenance and older tests are preserved in [the prior checkpoint](history/SESSION-STATE-before-record-ux-2026-11-05.md). diff --git a/docs/TEST-BARCODES.md b/docs/TEST-BARCODES.md new file mode 100644 index 0000000..dbeaea0 --- /dev/null +++ b/docs/TEST-BARCODES.md @@ -0,0 +1,13 @@ +# Hardware test barcode + +Open this page on another screen or print the image at its original proportions. Scan it with the handheld's physical trigger while **Scan capture** is ready. + +![QR code containing the literal string 001234567890](test-barcodes/leading-zero-qr.png) + +[Open the full-size QR image](test-barcodes/leading-zero-qr.png). + +The exact expected value is **`001234567890`**. Preserve it as a raw string, including both leading zeros; do not convert it to a number. This image contains only that test value, with no enrollment URL, device token, or credentials. + +Wait for **Saved scan**, then verify the new backend scan record contains the exact value `001234567890`, QR symbology, `zebra-emdk` source, the expected device, and a new event ID. Match its capture time to the trigger pull. Seeing or decoding this image alone does not establish successful hardware capture or storage; record that acceptance separately. A deliberate second trigger pull should produce a distinct event ID. + +The 420 × 420 PNG was copied byte-for-byte from the verified local fixture and independently decoded with ZXing 3.5.4 after copying. SHA256: `81ADBEE44E4F3ACA8DE59845151134C433DFD76270A45D42872835F214BC0F8F`. diff --git a/docs/THIRD-PARTY-REVIEW.md b/docs/THIRD-PARTY-REVIEW.md new file mode 100644 index 0000000..3db41fa --- /dev/null +++ b/docs/THIRD-PARTY-REVIEW.md @@ -0,0 +1,125 @@ +# Third-party release review + +Review date: 2026-10-31. This is source, cached dependency metadata and APK evidence, followed by authorized vector provenance remediation. It is not license clearance or a final release SBOM. No Gradle build was run for this review. The source was changing during inspection; final release outputs must be reviewed again after dependency and asset remediation. + +The inventory below is historical checkpoint evidence. The current candidate replaces Auth0's beta with stable 3.0.0 and Coil's RC with 3.0.4; see [the dependency decision](DEPENDENCY-DECISIONS.md). Auth0's tagged stable LICENSE matches the bundled MIT text byte-for-byte, including its copyright. Post-change packaged graph/notice qualification is pending: an initial build correctly rejected stale generated Auth0 metadata, exposing a missing dependency-graph input in the pinned AboutLibraries collector. The build wiring now tracks resolved coordinates; a subsequent successful build and APK inspection must establish the new inventory rather than reusing these old counts or hashes. + +## Evidence boundary + +- Repository baseline: `6574ec4991dbb859b60c3a0be462af96918aee32`, plus the working changes. +- Cached debug package graph: `scanner-host/build/intermediates/lint_report_lint_model/debug/generateDebugLintReportModel/debug-artifact-dependencies.xml`, written 2026-10-31 03:44:28 workstation local time. SHA-256: `4C482AE3C0D20DF83D9780A924C58AC23B4B311A56439F6F059FED6CE532F870`. +- That graph has 123 package entries: two project modules and **121 external coordinates**. Compile-only and test graphs are different; this count comes from its `package` section. +- Inspected cached debug APK: `scanner-host/build/outputs/apk/debug/scanner-host-debug.apk`, 17,852,539 bytes, written 03:13:23. SHA-256: `36FFA7C5F405433A2EBE49BDEB3909A1D12E6998B77F1BDA0E1326118E709382`. +- The graph is newer than the APK. They are separate observations, not proof that the exact graph generated that APK. There was no cached signed release APK qualified by this review. +- All 121 coordinates had cached Maven POMs. Their declarations were inspected with XML tooling; this was an inspection, not a replacement license-report generator. + +## Runtime inventory and declared licenses + +The cached POMs directly declare Apache-2.0 variants for 119 coordinates and MIT for Auth0. `com.google.guava:listenablefuture:1.0` inherits its license from the cached `com.google.guava:guava-parent:26.0-android` POM, which declares Apache-2.0. Thus all 121 top-level artifact declarations were accounted for. This does **not** cover embedded data, native subdependencies, copied resources, missing upstream copyright notices or every transitive source file inside an artifact. + +| Component family | Observed packaged versions | Primary local evidence / declared license | +| --- | --- | --- | +| AndroidX UI and Compose | UI/runtime/foundation/animation 1.7.2; Material3 1.3.0; ripple 1.7.0; icons/tooling preview 1.6.6 | Resolved package graph and exact cached POMs; Apache-2.0 | +| AndroidX platform libraries | Lifecycle 2.8.6, Navigation 2.8.3, Activity 1.9.2, Core 1.13.1, AppCompat 1.7.0, DataStore 1.1.1; other AndroidX support modules remain in the graph | Exact cached POMs; Apache-2.0 | +| Material Components | `com.google.android.material:material:1.12.0` | Exact cached POM; Apache-2.0 | +| Coil | Seven resolved Android/JVM artifacts at **3.0.0-rc01** | Exact cached POMs; Apache-2.0 | +| Auth0 | `com.auth0.android:auth0:3.0.0-beta.0` | Exact cached POM declares MIT and points to the upstream license; preserve actual copyright/license text, not just the label | +| Retrofit/converter | `com.squareup.retrofit2:retrofit:2.9.0`; `com.jakewharton.retrofit:retrofit2-kotlinx-serialization-converter:1.0.0` | Exact cached POMs; Apache-2.0 | +| OkHttp/Okio | OkHttp and logging-interceptor 4.12.0; okio-jvm 3.9.1 | Exact cached POMs; Apache-2.0; embedded Public Suffix List requires separate treatment below | +| Kotlin runtime | reflect and stdlib **2.0.20**; stdlib-jdk7/jdk8 1.9.0; parcelize and android-extensions runtime 1.9.22 | Exact cached POMs; Apache-2.0 | +| kotlinx | Serialization core/json JVM **1.6.3**; coroutines core JVM/Android 1.9.0 | Exact cached POMs; Apache-2.0 | +| Other resolved artifacts | accompanist-drawablepainter 0.36.0; androidbrowserhelper 2.4.0; AndroidSVG AAR 1.4; Gson 2.8.9; annotations 23.0.0; error_prone_annotations 2.15.0; listenablefuture 1.0 | Exact cached POMs, including inherited Guava declaration; Apache-2.0 | + +Do not derive the release inventory solely from `libs.versions.toml`: declared serialization 1.5.1 resolves to 1.6.3; declared Lifecycle values resolve to 2.8.6; Compose resolves a mixture of versions. The current catalog and explicit dependencies explain inputs, not the final selected graph. + +### Additional content inside the APK + +The inspected APK preserves `okhttp3/internal/publicsuffix/NOTICE`. It identifies `publicsuffixes.gz` as compiled from the Public Suffix List and names **MPL-2.0**, with source and license URLs. Treat that embedded data separately from OkHttp's Apache POM declaration. Keep its notice and verify the relevant source/license delivery for the exact packaged version; do not summarize the complete app as containing only Apache/MIT material. + +The APK also contains `libandroidx.graphics.path.so` and `libdatastore_shared_counter.so` for four ABIs. The corresponding AAR declarations are known, but native embedded notices/subdependencies have not been independently inventoried. That is an explicit remaining review item, not a claim of an additional license or incompatibility. + +## Notice delivery gap + +`NOTICE` now describes QRunIO, its trademarks and the pinned Google Material resources. It is not a complete dependency inventory. `scanner-host/build.gradle.kts` excludes `/META-INF/{AL2.0,LGPL2.1}`. This exclusion is not evidence that the graph includes LGPL code, but removing generic license resources requires a reviewed replacement notice-delivery path. + +The inspected APK has no named app-wide license/NOTICE/report payload or OSS-license resources; only the Public Suffix List notice was found by archive entry inspection. No AboutLibraries/OssLicenses integration or user-accessible licenses screen was found in the inspected source. Repository-root LICENSE/NOTICE files alone do not establish that the distributed APK carries the needed third-party notices. + +Release work must generate a reviewable report from the **release variant**, package the reviewed notices, expose them from the app's About/licenses entry, and retain the same report alongside release assets. Verify this offline on the final signed bytes. Check exact copyright/NOTICE content as well as SPDX labels. + +## Vector resource provenance + +Git commit `4cb65dc1d1d1f681c268513dc1c6c8d7b2f0d89c` introduced the drawable set on 2024-10-30 with the message “Initial checkin - of all material icons ... and some default sound effects.” The sampled files already had project boilerplate at introduction; that boilerplate is not evidence of exclusive project ownership. + +The review pinned Google's last repository revision before that commit's timestamp: [`google/material-design-icons` at `d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b`](https://github.com/google/material-design-icons/tree/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b). Its complete `src` tree contains 2,170 filled 24px icon definitions. All corresponding Android XML vectors were downloaded read-only into the workstation cache from that fixed revision. + +For each local drawable, the ordered `android:pathData` strings were joined with a newline and hashed with SHA-256, then compared against all pinned upstream vectors. This compares drawing instructions only: it does not claim whole-file identity, identical tint/fill, or a mathematical proof of equivalent paths for nonmatching representations. + +- Before remediation, **2,094 of 2,142** local drawables exactly matched a pinned upstream path-data hash. +- This includes 31 renamed/alias resources, such as `__ft_apart` → `6_ft_apart`, `_d_rotation` → `3d_rotation`, `ic_broken_image` → `broken_image`, and `resource_public` → `public`. +- Local files commonly remove Google's theme tint and replace the fill with black. Record these as modifications while retaining the appropriate upstream provenance. +- **46 named Google icons** had nonmatching path-data representations. Samples showed absolute/relative command changes and circle/arc transformations; the review did not infer an exact match from visual similarity or a filename. +- `loading_img` and `qqq_no_network` were the other two unmatched resources. They needed provenance or replacement. + +The comparison manifest is in `C:/Users/james/.cache/qqq-material-icons-pinned-20241030/all-geometry-comparison.json`, SHA-256 `2B36EBE19CABF189370A1EBF9A1D8946EF04A467AC177108D1B61CA60D150125`. The same directory contains the 2,170 pinned upstream XMLs and download URLs; the cache is review evidence, not shipped attribution. Google's repository supplies an [Apache-2.0 license](https://github.com/google/material-design-icons/blob/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/LICENSE). Preserve the pinned upstream license and modification/provenance record when adopting these assets. + +The 46 nonmatching named resources are: + +```text +account_circle assignment_add barcode_reader bed bedtime_off bedtime cached +check_circle construction conveyor_belt desktop_mac desktop_windows dew_point +directions_off directions emoji_symbols forklift format_list_bulleted_add +front_loader gavel hotel_class keyboard_hide kitchen live_help local_gas_station +local_offer movie_edit new_releases nights_stay pallet percent person_pin_circle +rebase_edit recycling school screen_search_desktop shelves shopping_bag snowing +sports_cricket star sunny_snowing trolley tungsten wb_twilight window +``` + +### Completed source remediation + +The 46 named vectors were replaced with pinned upstream counterparts, using the application's black-fill/no-theme-tint convention. The existing `loading_img` resource now uses pinned `hourglass_empty` artwork, keeping the Coil placeholder resource ID without changing UI code. `qqq_no_network` now uses pinned `wifi_off`, keeping its resource ID and blue fill. Every resource retains its original dp width and height; a comparison against Git HEAD found zero dimension differences across all 2,142 resources. Viewports for replacement geometry come from the corresponding upstream vector. + +All 2,142 resources now have Google original-artwork attribution, the exact pinned source URL and project integration/modification attribution. Their final drawing path-data hashes all match the selected pinned originals. [The checked-in manifest](material-icons-provenance.json) records each resource, upstream path, upstream file SHA-256, final local file SHA-256, ordered path-data SHA-256 and final styling. Every local file hash was verified against that manifest. [The exact upstream license](third-party/material-design-icons-LICENSE.txt) and the updated repository NOTICE are retained. + +`loading_img` remains used by `ImageWidgetBlock.kt`; `qqq_no_network` remains used by `NoNetworkDialog.kt`. No UI code or caller names were changed by this resource remediation. This adopts known upstream artwork with its existing license and identifies modifications; it does not relicense Google artwork as exclusively project-owned. The authorized asset update is complete and ready for the serial Android build. Final APK packaging and visual acceptance remain separate gates. + +## Recorded audio + +The same introduction commit added three recordings. Their metadata has no author/source/license attribution; encoder/container metadata is not provenance. + +| File | Use observed before remediation | SHA-256 | +| --- | --- | --- | +| `boop1.mp3` | Submit feedback in `QProcessHome.kt`; approximately 1.485 seconds | `990D784B32369B6A67CAC1A11AF8AEBD5483A0ADB2951D23A34FF5170FFCFED2` | +| `tick1b.mp3` | Loading-step tick in `ProcessStepLoading.kt`; approximately 0.131 seconds | `DEF0D5340E38E247699E70659BDAB66CF371B91E5C0206D10682794F2380CB79` | +| `tick1.mp3` | No source use found; approximately 1.485 seconds | `08672F3E764EC68A28E0130FDDB3E820F43F06E460D38766F3B59691258861FE` | + +All three remain in the inspected **older APK**. During this review, the implementation owner removed the source files and changed the two call sites to platform-generated `ToneGenerator` feedback through the existing `ProcessSound.Playback` lifecycle: submit acknowledgment for 80ms and loading beep for 25ms. This preserves feedback intent without distributing unknown recordings. A rebuild must prove the files are absent from the final APK; hardware audibility, system volume behavior and lifecycle disposal still need acceptance. This source change is not an artifact-level clearance. + +## Version stability and Kotlin alignment + +Coil 3.0.0-rc01 and Auth0 3.0.0-beta.0 are actual packaged prerelease dependencies, not merely unused catalog entries. The shared library still references Auth0 even though the first scanner server uses table-based authentication. Review supported stable replacements and test authentication, SVG/image loading and scanner/native flows before adopting changes; a version label alone is not proof of a vulnerability. + +The precise Kotlin mismatch is **compiler/plugin 1.9.0 versus runtime reflect/stdlib 2.0.20**, not reflect 2.0.20 against an older main stdlib. Compose compiler is 1.5.1; runtime helper artifacts also include 1.9.0 and 1.9.22. `qqq/android/core/build.gradle.kts` explicitly declares reflect 2.0.20, and `GenericSerializing.kt` imports reflection APIs. Do not blindly force every artifact down to 1.9.0 or call this a proven crash. Choose a supported compiler/Compose/runtime combination, inspect release `dependencyInsight`, then run the existing serializer and native suites. This review ran no compatibility build and makes no unsupported claim that the current mix is safe or broken. + +## Standard reporting approach + +The scanner now integrates **AboutLibraries 10.9.2** for standard variant-specific definitions and native Compose display. Source and configuration are in [the supplemental metadata directory](../scanner-host/third-party/README.md). The selected upstream source is pinned to `2ff232b9b40c24b8afa23494bc7077e6258b89fe`; it uses Kotlin 1.9.20/Compose 1.5.4/AGP 8.1.2 upstream. Local qualification against this project's toolchain is a separate recorded gate. This introduces no project-specific POM/license parser or HTML/JSON notice renderer. [Pinned upstream AboutLibraries documentation](https://github.com/mikepenz/AboutLibraries/tree/2ff232b9b40c24b8afa23494bc7077e6258b89fe). + +The integration supplies full local Apache/MIT/MPL text and distinct Google Material icon, QQQ project and Public Suffix List notices. The exact Auth0 MIT copyright is retained. The plugin's network license/funding lookups are disabled; the runtime viewer reads its packaged resource. AboutLibraries strict mode only checks recognized license IDs, so the build also validates its generated standard output against the actual Gradle runtime coordinates/versions and rejects absent license references or empty text. Every scanner variant runs this validation before resource merging. The distribution copy is `scanner-host/build/reports/third-party/<variant>/aboutlibraries.json`, with project LICENSE/NOTICE alongside it. The new viewer's isolated instrumentation opens the Google notice from the generated APK data and checks its actual rendered text. + +The implementation should: + +1. Generate the scanner **release** dependency/license report with the chosen tool, excluding test-only artifacts; preserve selected coordinates and exact output with the source/APK hashes. +2. Review full license/copyright/NOTICE text and inherited POM declarations. Add pinned Material icon provenance, Public Suffix List data and any native embedded notices through the tool's supported supplemental mechanism or a simple reviewed asset notice document. +3. Package and expose the reviewed report using the tool's native UI. Include project LICENSE/NOTICE separately as appropriate; do not replace third-party copyright with project boilerplate. +4. Make missing/unresolved notice metadata a release review failure, then verify the final signed APK contains the intended reports and that the licenses screen opens offline. +5. Regenerate after stable dependency selection, Kotlin alignment and resource replacement. A cached debug inventory cannot certify a later signed release. + +No legal clearance, final dependency security clearance, asset relicensing or production release approval is asserted by this document. + +## Qualification update — 2026-10-31 + +The AboutLibraries integration passed the current scanner build, 33 scanner JVM tests, scanner lint (zero errors/warnings), debug/E2E APK assembly and shared native-test compilation. The isolated TC22 `licenses` scenario subsequently passed: it opened generated entries and rendered the full Google notice using packaged resources without a server. Release signing remains deferred by the owner. + +Negative generated-report checks independently removed a real runtime entry and blanked Apache license text; each failed with its intended error. The generated report was restored byte for byte after each test, then all three variants passed positive verification. The device-tested E2E APK remained unchanged throughout those checks. + +[The native binary review](third-party/NATIVE-NOTICES.md) closes the earlier `.so` inventory gap with exact published AAR/source pins, per-ABI hashes, embedded NDK identity and full startup/runtime/header notices. It adds two distinct NDK entries and merges the native copyright notices into the two existing AndroidX dependency entries. Current debug, release and E2E reports each verify **125 external runtime dependencies and 130 notice entries**. Final bounded packaging passed for debug, E2E/test and unsigned release APKs, with zero release lint errors/warnings. Every final host APK contains the exact validated 130-entry report, all nine complete license texts and the eight unchanged upstream native binaries; the unknown recordings are absent. SDK tools verified release non-debuggability, disabled cleartext/backups and the expected unsigned state. The provenance manifest records the final APK/report hashes separately from historical device-test evidence. This update does not resolve the separately documented prerelease dependency/toolchain alignment or production signing/distribution gates. diff --git a/docs/TODO.md b/docs/TODO.md new file mode 100644 index 0000000..4ded376 --- /dev/null +++ b/docs/TODO.md @@ -0,0 +1,25 @@ +# Checklist + +Open work only, as of **2026-11-05**. Current evidence: [SESSION-STATE](SESSION-STATE.md). Completed and superseded items: [history](history/README.md). + +## Hardware and release qualification + +- [ ] Qualify actual GS1 label media and physical printed-label rescan. Synthetic capture/render evidence does not close this check. +- [ ] Verify actual production-APK native Authentik login, logout and account switching; awaiting the MC wireless-debug endpoint. Real-server discovery (UI API 1.10, strict nonce, scanner and printing channels) is already verified; no native-Authentik PASS is claimed. +- [ ] After Android PRs 17 and 18 merge, rebase `release/scanner-1.0.2`, then build, sign (same permanent signer) and publish 1.0.2 (versionCode 4) with checksum and installation instructions after remaining qualification; see [RELEASING](RELEASING.md#next-candidate-102-versioncode-4). The signed 1.0.1 (versionCode 3) candidate is superseded and stays unpublished. The published release is still the 1.0.0 signed preview. +- [ ] Publish and distribute full release assets to remaining devices; validate MDM/company profile and wallpaper separately. A customer deployment needs a customer HTTPS URL with a trusted certificate. +- [ ] Printing: the next installer remains with the active printing owner (print nonce fix PR 11 postdates published print 1.1.1). +- [ ] Optional, non-blocking: automatic APK signing CI. Direct APK release does not depend on it. + +Done (November 5, do not repeat): MC9400 migration with release 1.0.0 trusted-HTTPS enrollment then in-place 1.0.1 update preserving login/enrollment; Apps/ScanCapture navigation and EMDK Scanner-ready observed; operator-confirmed physical Saved scan verified in the backend (CODE128, AIM, raw bytes, user, device; actual barcode differed from the requested literal). Live photo policy verified with a signed MC9400 synthetic gallery photo (`AVAILABLE`, exact parent/type/size/hash). + +Updated TC22 native photo acceptance passed: synthetic camera/gallery uploads, the newly captured photo's thumbnail/full preview, parent scoping, rotation and forced-logout cleanup, with semantic API checks. The disposable test packages were removed and the normal app reopened. Native Authentik remains a separate open check. + +## Dependencies and broader coverage + +- [ ] Adopt public compatible Core/Collab/document/files/scripting/bridges inputs through a reviewed companion-server change, and pass the final public cohort gate. +- [ ] Verify company profile / EHS / OEMConfig / MDM deployment ([DEVICE-PROVISIONING](DEVICE-PROVISIONING.md), [COMPANY-PROFILE](COMPANY-PROFILE.md)). +- [ ] Resolve applicable [legacy source follow-ups](LEGACY-SOURCE-FOLLOWUPS.md). +- [ ] Extend specialized forms, reports and other unsupported [native components](UI-API.md) with conformance and E2E coverage as needed. Read-only table/record browsing and record photo attachment are implemented. + +Offline queueing and background synchronization remain outside version one. The November 4 TC22 operator pass is accepted and should not be requested again. diff --git a/docs/TRUSTED-SCANNER-ACCEPTANCE.md b/docs/TRUSTED-SCANNER-ACCEPTANCE.md new file mode 100644 index 0000000..ad0808e --- /dev/null +++ b/docs/TRUSTED-SCANNER-ACCEPTANCE.md @@ -0,0 +1,36 @@ +# Trusted scanner candidate acceptance + +Current status: this page retains its dated/source-specific checkpoint. Current installed C891/earlierF3AF EMDK Code128 proof is in [physical acceptance](PHYSICAL-TC22-ACCEPTANCE.md); QR and actual projection remain pending. Android7de passes all eleven hosted checks. Older statements about then-pending trigger/CI/scope or unchanged normal APK are historical, not the current release gate. Normal server remains mobile1.1; optional DEVICE_SCREEN requires qualified1.2 source and actual device consent acceptance. + +Verified October 31, 2026. This is a source-review and development-package checkpoint, not a production release or actual physical-trigger acceptance. + +## Executed checks + +- **127 JVM tests** pass: core30, mobile46, scanner51. Debug/release lint and debug, unsigned release, E2E, QA and instrumentation package gates pass. +- **34 native TC22 cases** pass in115.717 seconds, covering navigation, input, authentication lifecycle, host storage, and real PNG/SVG/error rendering. +- **One additional TC22 overlay case** passes in17.948 seconds through the actual Main and scanner widget. Drawer Back, Settings, Diagnostics, Account, Leave, Sign out, a separate window and a parent host gate reject hidden input; dismissal preserves the current draft and permits exactly one new event. The hardware driver in this case is synthetic. One real Android Back closes the drawer without opening Leave, changing the process or cancelling it. +- **A separate ordinary-UID injection case** passes against the production-path QA APK. A distinct-signer application with no permissions sends eight forged broadcasts. A temporary observer proves the actual scan action/payload route; after that observer is removed, no forged scan creates a process step or record. One explicit manual positive control receives a real server receipt. The EMDK driver reaches ready; no physical trigger is inferred. +- Every native request in that server acceptance matches the documented semantic API. The isolated fixture uses core `ecf0f550a0357cec6387c2b54efca128a405a629`, server `b14d925b741e815d1cfa4f62301f19207f25b03f`, UI API1.9 and mobile-scanners1.1. Its separate server37/demo5/browser15 and runtime-provenance gates pass. + +Independent review of the final SDK/navigation source found no concrete defects requiring changes. The earlier deep audit remains a scoped historical report for `d1de0bf`; it does not certify every later change or external implementation. + +## Inspected artifacts + +| Artifact | SHA-256 | +| --- | --- | +| Debug APK | `89e74b7af682f199996322fd271115db1ffaa99e12c2b153a53815025b616e9a` | +| Unsigned release APK | `0e412ea62a8cbbb5f867b70eeff6a1ffb3b5bdab5199576e387684cb517f365b` | +| E2E APK | `80ef10d1109a355fba82f99b48a92d6b1b04907247adc093e0664b5e59f5b694` | +| Production-path QA APK | `cfff47b5a03d578a21fa69583111b23c225a4998f0cf795502d379dcb93ab017` | + +All four actual APKs contain131 notice entries, nine complete license texts and the eight reviewed native libraries with unchanged hashes. Auth0 resolves to3.0.0 and all seven Coil modules to3.0.4; no Google identity or Credential Manager dependencies were introduced. Each packaged notice resource equals its generated report byte-for-byte. + +Standard SDK DEX inspection finds no defined EMDK SDK implementation classes. Debug, release and QA exclude the synthetic scan action, source label and receiver definitions; E2E contains the expected positive control. All variants disable backup with ten cloud/transfer exclusions. Release also disables debugging and cleartext traffic. The vendor library remains optional and device-provided. + +The notice collector now declares its resolved dependency coordinates as an incremental input. Changed versions regenerate standard notices; a subsequent unchanged QA build reuses collection/preparation while the strict runtime/version/license verifier still executes. No license allowlist or runtime-absence check was weakened. + +## Remaining acceptance + +Actual Code128/QR trigger-to-save, leading zeros, distinct repeated trigger events, recreation/background/resume and scanner-ownership restoration remain physical checks. Ordinary-UID rejection alone could not establish that the hardware feature works. + +Configured Authentik, actual camera/GPS/customer assets, coherent optional Record Files deployment, final hosted-client checks and preserving operator upgrade remain separate gates. Current viewing captures QQQ Mobile; entire-handheld viewing scope is awaiting owner clarification. Production signing/distribution is deferred to the final step. Normal operator data and application were preserved during these disposable tests; the emulator remained off. diff --git a/docs/UI-API.md b/docs/UI-API.md new file mode 100644 index 0000000..6d1928a --- /dev/null +++ b/docs/UI-API.md @@ -0,0 +1,90 @@ +# Android semantic UI API contract + +QQQ Mobile uses QQQ's versioned semantic UI API to discover apps, render supported native process components and execute their actions. Device enrollment, branding and connectivity use the registered `mobile-scanners` extension of that API. The app has no process-specific scan endpoint or hard-coded Scan Capture process name. Android provides the native controls and scanner hardware adapter. + +This defines the client's protocol and rendering boundary. It does not mean that every feature of the QQQ web client is implemented on Android. Unsupported required screen components produce an explicit message and block process submission, rather than silently dropping required input. + +## Discovery and compatibility + +The host first requests `GET /qqq/v1/version` through a public client with no session cookie, authorization or device credentials. No branding, authentication or protected metadata request proceeds until the response passes these checks: + +| Contract | Required advertisement | +| --- | --- | +| Core semantic API | `apiVersion >=1.8.0 <2.0.0` | +| Core features | `version`, `metaData`, `processes`, `processCancel`, `extensions`, `widgets` | +| Client channel | `clientChannels` includes `android` | +| Mobile extension | `name: mobile-scanners`, `version >=1.1.0 <2.0.0` | +| Extension prefix | `pathPrefix: /qbit/mobile-scanners`, resolved under `/qqq/v1` | + +Compatibility is cached for the selected server's host lifetime and isolated between server origins. Missing features/extensions or Android channel, malformed discovery or unsupported versions stop startup with an explanation and retry option. Unknown optional properties and feature names are tolerated; supported enum models retain an unknown value so an added enum does not crash JSON decoding. Unknown authentication providers and required UI controls remain explicitly unsupported. + +The app sends `X-QQQ-Client: android/qqq-mobile`. The QQQ software release and semantic API version are distinct: clients use discovery rather than inferring compatibility from artifact versions. Current installed-runtime and source-qualification checkpoints are recorded in [session state](SESSION-STATE.md). + +## API operations + +Core authentication metadata, session exchange, application/process metadata, process initialization, step submission, asynchronous status polling and cancellation all use `/qqq/v1`. A `COMPLETE` response without `nextStep` means the process has finished; a named `nextStep` selects the next native screen. The client also honors an explicit legacy `values.noMoreSteps: true`, applies frontend-step replacements and field updates, and does not infer completion from the last declared screen. A false `noMoreSteps` value alone does not terminate a process. Closing a completed process does not send a cancellation request. + +The extension operations are: + +| Method | Path | Purpose | +| --- | --- | --- | +| GET | `/qqq/v1/qbit/mobile-scanners/branding` | Public customer appearance | +| GET | `/qqq/v1/qbit/mobile-scanners/status` | Public server reachability | +| POST | `/qqq/v1/qbit/mobile-scanners/devices/enroll` | Authenticated device enrollment | +| GET | `/qqq/v1/qbit/mobile-scanners/devices/current` | Authenticated device approval status | +| POST | `/qqq/v1/qbit/mobile-scanners/sessions/heartbeat` | Session activity, capture availability and optional foreground location | +| POST | `/qqq/v1/qbit/mobile-scanners/sessions/current/end` | End this authenticated mobile session | +| POST | `/qqq/v1/qbit/mobile-scanners/sessions/current/screen` | Upload a bounded JPEG while an administrator's viewing lease is active | + +The extension publishes its operation IDs, request/response schemas, errors and scanner vocabulary in the server's merged `/qqq/v1/openapi.json`. See the [server contract](https://github.com/QRun-IO/qbit-mobile-scanners/blob/fix/authentication-metadata-device-headers/docs/UI-API.md) for the authoritative extension details. The former `/mobile/v1` routes have been removed; there is no compatibility fallback. + +Core structured errors retain their code, message, field errors and trace ID. Field errors are shown against matching form inputs. Diagnostics retain bounded event codes, HTTP status and latency; they do not record raw error bodies, credentials or scan values. Metadata-provided media URLs are resolved as HTTP(S) resources. Public branding assets use a separate client without QQQ credentials. + +## Native rendering boundary + +| Area | Current behavior | +| --- | --- | +| App navigation | Server-defined apps and process links, including root processes and section app links | +| Process lifecycle | Init, step submission, asynchronous polling, server-directed completion and backend cancellation | +| `EDIT_FORM` | Metadata field subsets, labels, hidden/editable/required flags, text/password, Boolean, integer/long/decimal, inline possible values, named possible-value sources searched through the core operation `searchProcessPossibleValues` (`POST /qqq/v1/processes/{process}/possibleValues/{field}`, JSON `values`/`processValues`/`useCase: form`; contingent fields honor `possibleValueSourceDependsOn` and `possibleValueSourceDependencyBehavior`, re-query on parent change and drop stale selections) and validation errors; explicit null clearing is preserved | +| Date/time fields | ISO text inputs with format hints and validation; no native date/time picker | +| `VIEW_FORM` | Read-only values for the declared field subset | +| Dynamic metadata | Updated frontend steps and updated fields applied to the active process | +| `HELP_TEXT`, `HTML` | Plain semantic text, with text fallback for markup; no embedded web application | +| `PROCESS_SUMMARY_RESULTS` | Status, counts and messages; link destinations displayed as text, without assuming a web route is a native action | +| Composite/ad-hoc widgets | Existing text, button, input, image, audio, divider and nested composite controls | +| `SCANNER` extension block | Trusted Zebra EMDK/manual input; server title, instructions, labels and maximum length; standard process submission and acknowledgment | +| `RECORD_FILES_CAPTURE` extension block | Server-selected parent record; optional Record Files 1.x capability discovery; native camera/photo picker; checksummed resumable online upload and exact committed receipt | +| Unsupported required controls | Explicit unsupported message; Next and process widget submission blocked | + +Record/table browsing and CRUD, reports, app-home widgets, record-list process components, bulk edit/load mapping/review, downloads, remote possible-value lookup, blob input and other specialized components are not implemented by this host. Rich web layout, advanced field presentation and section collapse/role presentation also do not have full native parity. Host authentication supports TABLE_BASED and explicitly advertised native OAuth2 session login through UI API1.10 with required nonce validation; see [the contract and pending verification](AUTHENTICATION.md). Keep handheld processes within the supported component vocabulary until their native implementation and end-to-end tests are added. + +The scanner event preserves the barcode string, event UUID and capture timestamp. A retry sends the same event. Successful acknowledgment requires a matching `acknowledgedEventId`, `scanSaved: true`, and a nonblank string `scanId`. Missing or contradictory receipt fields leave the same event available to retry. After the request settles, the operator may explicitly leave with a warning that the scan may already be saved. Confirmed server cancellation clears local retry state; failed cancellation preserves it and offers a separate Leave anyway action to abandon local retry without claiming cancellation or undoing saved records. In-flight requests and pending photos still block leaving. An explicitly invalid SCANNER `maxLength` disables the control; only an absent value uses the default. Scanner retry context is explicit; a generic process field named `eventId` does not activate scanner acknowledgment behavior. Device approval and user permissions remain server decisions, including scans submitted through an already-open process. + +## Session activity and screen viewing + +The approved, authenticated host sends foreground activity through the registered extension. Heartbeats contain app/process/step names and availability, never form values, barcodes, passwords or credentials. Each heartbeat also carries the installed `osVersion` and `appVersion` (the values enrollment reported); a mobile-scanners 1.6 server refreshes the device record when they change so scan receipts after an in-place update show the new version, and older servers ignore the extra optional keys. The server derives identity from the verified QQQ session and device. Ending a session in QQQ causes the host to clear its local login when the next protected operation or heartbeat returns an authentication failure. Signing out or changing servers stops capture immediately and attempts to end the current server session before standard logout. + +An administrator viewing the ordinary QQQ session record renews a short screen-viewing lease through its standard widget. The host uses PixelCopy on its own app-content rectangle only, at most once per second, bounded to 640×1280 pixels and 256 KiB JPEG. No OS screen, other application or remote control is exposed. Capture requires the resumed, focused, approved authenticated screen, completed rendering and a live lease. Password screens, loading transitions, backgrounding and logout block capture and clear the server's displayed frame. Screen/session state is checked after capture and immediately before upload. Lease timing uses server-relative duration and Android's monotonic clock, not the handheld wall clock. Frames are not saved locally. + +The operator sees an informational screen-viewing indicator. The app provides no operator pause or stop controls; administrator viewing remains subject to server leases and authorization. Optional whole-device sharing still requires Android consent and honors system revocation. Foreground location reporting defaults on when no saved choice exists; an explicit saved off choice is preserved. Settings exposes the reporting toggle, precise/approximate Android permission, provider availability and fix status. The host requests coarse and fine Android permission together once, on the first approved signed-in foreground session with reporting enabled. Denial never prevents scans or triggers repeated automatic prompts; Settings links to Android permission settings for recovery. Precise permission permits GPS updates, while approximate permission uses available network location. Device location providers must also be enabled; the reporting preference cannot turn on Android GPS. No background location permission is requested or background tracking performed. Updates stop outside approved signed-in foreground sessions or when reporting is disabled. Heartbeats report coordinates, accuracy and capture time only when a foreground fix exists; QQQ shows the age of the last known observation separately. Earlier clients stored no reporting preference, so a previously missing Android grant is not treated as an explicit reporting opt-out. + +## Record photos + +The optional `record-files` extension must advertise a supported 1.x version at `/qbit/record-files`. The companion `mobile-record-files` 1.x extension at `/qbit/mobile-record-files` defines the native vocabulary through its public `/contract` descriptor; this is checked without credentials before record capability requests. A `RECORD_FILES_CAPTURE` block supplies `values.parent` with opaque string `tableName` and `recordId`, plus optional title/instructions. The client checks the record's capabilities before exposing photo actions; it never infers a target from process names or form values. This block is self-contained and does not silently advance a process step. + +Camera capture uses Android's external camera activity and a temporary URI grant restricted to the app's private photo cache. Successful camera staging automatically starts upload; gallery selection uses the system Photo Picker and an explicit Upload action. No broad media/storage permission or background upload queue is introduced. Original bytes are copied/hashed with fixed buffers, bounded by server limits and the 20 MiB client ceiling, and sent as checksummed binary chunks. Create/finalize retries preserve the original request and item UUIDs. A lost finalize response is recovered through status before displaying Saved; all item IDs, sizes, checksums and retained association identifiers must match the complete receipt. Saved does not imply released content or current download permission. + +The process cannot advance or navigate away while a photo is pending. Backgrounding stops transport and retains the in-memory intent for explicit foreground recovery; rotation preserves its ViewModel. Discard recovers an uncertain create before requesting server staging cancellation and never deletes committed originals. Process destruction or logout cancels active I/O and cleans only that model's private temporary files after its writer closes. It does not claim remote staging was deleted when authentication has ended. Recovery across operating-system process death is not an offline queue guarantee; server staging expiry/administrative reconciliation still applies. Native device acceptance of the integrated photo flow remains pending; see [SESSION-STATE.md](SESSION-STATE.md). + +## Verification and upgrades + +JVM checks cover compatibility rejection before credentials, origin isolation, additive metadata, structured errors, cancellation transport, native form rules and process-state decisions. The companion server checks generated OpenAPI against its committed contract baseline and validates real HTTP payloads. + +The native E2E runner in [EMULATOR.md](EMULATOR.md) forwards the real host's requests through a test-only OpenAPI audit. Scenarios cover incompatible core major, missing extension, missing Android channel, the real supported server scan flow, additive future metadata, native administrative forms, session activity/viewing/forced logout, and actual PixelCopy image contents. The audit records operation IDs and safe request metadata, never headers or bodies. Passing runs must prove that all observed requests match published operations and rejected servers receive no credentials. Precise revision boundaries and results are tracked in [SESSION-STATE.md](SESSION-STATE.md); implementation of a check is not evidence that its latest run passed. + +Server changes using existing supported components can reach the shared APK through metadata. New required native controls or an incompatible major contract require a shared client update and conformance tests. Customer name, theme and logo changes remain server configuration and do not require customer-specific builds. During this initial migration, update the companion server and APK together; preserve the demo database and install with `adb install -r` to retain local device enrollment. + +## Echo scanner presentation hints + +Mobile-scanners 1.4 adds optional SCANNER acknowledgmentLabel and manualEntryEnabled. Existing servers retain Saved scan and manual entry. Echo supplies Print queued and false, hiding manual controls because typed text has no decoder-provided symbology. Explicitly malformed labels or nonboolean flags disable the control. These presentation hints never change the matching event/scanSaved/scanId acknowledgment rules, and queue acceptance does not mean physical output completed. No application or process name selects this behavior. diff --git a/docs/WRAPPER-PROVENANCE.md b/docs/WRAPPER-PROVENANCE.md new file mode 100644 index 0000000..b40672c --- /dev/null +++ b/docs/WRAPPER-PROVENANCE.md @@ -0,0 +1,17 @@ +# Gradle wrapper provenance + +Verified October 31, 2026 against Gradle's [published checksums](https://gradle.org/release-checksums/). + +| Artifact | SHA-256 | +| --- | --- | +| Gradle 8.7 wrapper JAR | `cb0da6751c2b753a16ac168bb354870ebb1e162e9083f116729cec9c781156b8` | +| Gradle 8.7 binary distribution | `544c35d6bd849ae8a5ed0bcea39ba677dc40f49df7d1835561582da2009b961d` | + +The bundled wrapper now matches the [official 8.7 source artifact](https://github.com/gradle/gradle/blob/v8.7.0/gradle/wrapper/gradle-wrapper.jar). +The distribution URL and its enforced checksum are unchanged. The previous JAR +hash, `e996d452d2645e70c01c11143ca2d3742734a28da2bf61f25c82bdc288c9e637`, +matches Gradle's published 6.9/7.0 wrapper family; it was an older bootstrap rather +than evidence of a modified JAR. + +This establishes the bundled JAR's upstream identity. It is not an independent +audit of every Gradle class or current dependency vulnerability clearance. diff --git a/docs/ZEBRA-SCANNING.md b/docs/ZEBRA-SCANNING.md new file mode 100644 index 0000000..bb6c3f0 --- /dev/null +++ b/docs/ZEBRA-SCANNING.md @@ -0,0 +1,45 @@ +# Zebra scanner input + +Normal debug/release builds obtain scans through Zebra EMDK's device-provided service and private Binder callbacks. A package-targeted DataWedge broadcast is still forgeable by another installed application; destination signature checks do not establish sender identity. Production builds therefore contain no scan broadcast receiver. + +The app first requires the system's `com.symbol.emdk` shared library and enabled, preinstalled `com.symbol.emdk.emdkservice/.EMDKService`. Vendor classes are loaded only after these checks, through an isolated wrapper. The optional shared-library manifest allows the same APK to install on non-Zebra devices, where explicit manual barcode entry remains available. The EMDK permission is a normal vendor permission, not a claim of signature-based authentication. + +## Lifecycle and process contract + +When verified discovery for the current server advertises mobile-scanners 1.5 or newer within major 1, each capture can also send `rawDataBase64` and `aimIdentifier`. The EMDK callback encodes its exact `getRawData()` output once before returning; the immutable event survives HTTP retries unchanged. Older servers receive the legacy event fields. Raw input is bounded to 8192 bytes; null, empty or oversized raw input is omitted rather than truncated. These are SDK bytes, which may include framing, not a claim of original symbol codewords. Current hardware capture leaves AIM absent: no prefix inference or scanner configuration change is implemented. Decoder qualification and native raw-byte acceptance remain required for full Echo fidelity. + +The adapter acquires the default scanner only while the server-defined SCANNER widget is visible and its Activity is resumed. HARD trigger reads are armed after IDLE, with one outstanding read. A decoded string is passed unchanged to the existing ScanEvent and semantic process submission, with its EMDK symbology and adapter-owned `zebra-emdk` source. New reads wait until the prior event is confirmed or explicitly abandoned by the existing process flow. Manual events remain `manual`. Neither source label is server-side attestation. + +An IDLE callback with no pending read also rearms after a trigger release or timeout without a decode. If IDLE precedes the data callback, accepting that data blocks further input and cancels any read armed in between. A rapid pause/resume during an earlier asynchronous manager-open request can temporarily encounter the one-manager guard; **Reconnect scanner** retries explicitly after the prior manager has released. An unconfirmed release remains blocked until the app restarts. + +Null, empty or unsuccessful data collections do not submit a scan or tear down the hardware; subsequent IDLE and pending-read state control recovery. A cancellation collection after a successful decode cannot clear its acknowledgment gate. A successful collection with multiple barcodes rejects the whole batch, shows a one-barcode warning and permits a later single scan. SDK ERROR status, service loss and exceptions still release the hardware and expose recovery. This follows Zebra's [data/status callback example](https://techdocs.zebra.com/emdk-for-android/latest/tutorial/tutbasicscanningapi/); no payload or vendor error text is logged. + +Pausing, leaving, logging out or changing server disposes the widget and releases the scanner and EMDK manager. Released generations ignore late status/data callbacks, and a late asynchronous manager-open callback releases that manager immediately. Cleanup attempts every owned resource even if one operation fails; a failed release never reports scanner readiness. Errors show manual fallback without printing scan contents or SDK exception messages. + +Hardware input also requires the process surface to be interactive and its window focused. Drawer opening/partial swipes, Settings, Account, Diagnostics and leave/sign-out confirmation suspend input while preserving the active process and draft. Shared navigation and the host supply a nested live availability predicate; the widget observes it to cancel/rearm and checks it again with actual window focus before accepting a callback. This prevents callbacks arriving before recomposition from submitting behind an overlay. Closing the overlay rearms when the process has no pending request. Toolbar and Android Back share the host's live drawer priority, so Back closes the drawer without opening a process-leave confirmation behind it, even when authenticated content registers its handler later. Process Leave and explicit abandonment policy remain unchanged. + +Zebra documents that acquiring BarcodeManager disables DataWedge scanning and releasing it restores DataWedge. The app does not edit persistent profiles or disable DataWedge globally. Physical acceptance must verify that another DataWedge application can scan after QQQ leaves/backgrounds. See [Zebra scanner lifecycle](https://techdocs.zebra.com/emdk-for-android/latest/guide/barcode_scanning_guide/) and [runtime ownership/compatibility](https://techdocs.zebra.com/emdk-for-android/latest/guide/about/). + +## SDK provenance and terms + +The owner explicitly accepted Zebra's EMDK terms on October31,2026. The SDK is proprietary vendor software under the [Zebra EULA](https://techdocs.zebra.com/emdk-for-android/eula/), not an Apache/MIT dependency. This acceptance does not relicense vendor code or constitute a general license-clearance opinion. + +The build uses `compileOnly("com.symbol:emdk:11.0.134")` from [Zebra's documented Maven repository](https://techdocs.zebra.com/emdk-for-android/13-0/guide/setup/). Repository access is exclusive to that exact group/artifact. `verifyEmdkSdk` checks the selected SDK in each variant's actual compile classpath before compiler/preBuild tasks, requiring version11.0.134 and SHA256 `e0c6b481c25bf641333bf644de940f1ac7f3fc4f8d5c92ba4ae62ea2252c4e36`. There is no dynamic version or checksum bypass. + +The SDK implementation is not bundled. Zebra documents11/13 runtime compatibility; the inspected TC22 has runtime13.0.23.4723. Its system framework explicitly binds the named preinstalled service and registers scan callbacks through Binder. This observation is not an audit of all Zebra firmware. Final APK inspection must confirm vendor implementation classes are absent and the standard packaged runtime notices remain complete. The SDK is a build prerequisite, not a falsely labeled OSS runtime entry. + +AboutLibraries10.9.2 also collects compile classpaths, so its standard exclusion pattern matches only `com.symbol:emdk`. The checksum task first rejects that artifact in every resolvable runtime classpath, including tests; an accidental runtime dependency therefore fails before packaging and cannot be hidden by the notice exclusion. No permitted-license list was broadened. The separate SDK documentation records the proprietary terms and owner acceptance. + +## Test boundary + +Use the [leading-zero QR test image and verification steps](TEST-BARCODES.md) for the physical QR check. + +Debug, release and isolated QA builds share `src/production` and the trusted factory. QA uses the `.qa` application suffix, existing debug signing and a separate test manifest for local test HTTP. Build its instrumentation with `-PscannerTestBuildType=qa :scanner-host:assembleQa :scanner-host:assembleQaAndroidTest`. Only `e2e` (the default) and `qa` are accepted instrumentation variants. Neither option changes production signing. + +Only `src/e2e` supplies the exported synthetic broadcast adapter; its application ID has the `.e2e` suffix and its source label is `e2e-fixture`. It cannot be enabled in production through an intent or server setting. Existing synthetic payloads keep their fixture action for runner compatibility. The QA variant contains no synthetic ingress, so it exercises the same scanner trust boundary without installing over the operator's app. + +`ScannerInputSessionTest` covers duplicate reads, no-decode/empty/canceled completion, multiple-barcode rejection/retry, IDLE-before-data ordering, raw-string preservation, acknowledgment gating, pause/resume generations, late callbacks, reconnect after busy acquisition, vendor pending-read state, read/cancel failures and failed-release readiness. It does not exercise Zebra hardware. Required physical acceptance remains: Code128/QR with leading zeros, repeated triggers, rotation during initial acquisition as well as ready state, background/resume, logout/leave, uncertain acknowledgment retry and DataWedge ownership restoration. A separately signed ordinary application must also send forged scan broadcasts to the foreground production-path app while the backend confirms zero resulting scan records. Shell UID injection alone is not that test. + +Implementation/source tests and physical/packaged verification have separate evidence; do not claim the latter from a passing synthetic E2E fixture. + +The standalone QA instrumentation class `io.qrun.mobile.scanner.ScannerOverlayTest` exercises the production widget and shared navigation with a private in-process fake driver and synthetic repository. It needs no backend configuration, probe app or operator scan, and is restricted to the `.qa` target. It tests overlay/focus suppression, callbacks before recomposition, preserved manual draft and dismissal recovery; it is not EMDK hardware acceptance. Its empty instrumentation Activity is declared only in the QA manifest and is not exported. The production widget has no intent, server setting or runtime toggle for injecting this driver. diff --git a/docs/history/FINISH-1.0-through-2026-11-03.md b/docs/history/FINISH-1.0-through-2026-11-03.md new file mode 100644 index 0000000..95e32b4 --- /dev/null +++ b/docs/history/FINISH-1.0-through-2026-11-03.md @@ -0,0 +1,36 @@ +> Historical record, superseded by [current status](../SESSION-STATE.md). Do not treat as current. + +# Finish ledger for 1.0 (current: November 3, 2026) + +Nothing here is a 1.0 release. History is in SESSION-STATE.md. + +## Source published (not merged, not released) + +- Android `f72b90d08cf29d2785cef1d5c5e7eeaf75f9afd2`: signed application code published in PR 10 (read back over SSH before this documentation update). Gitea CI 3480 succeeded: unit-test, device-test, package, secrets, gate. A clean git merge-tree with `main` b75fdac was verified; nothing was merged. Pull requests #8 and #10 remain open. This documentation update leaves runtime code unchanged. +- Server `c0e27b36fd16c00eaca3451af3df43f4deedada1`: signed and published in Gitea PR 7, including the verified QQQ 4.1.0-RC.21 dependency update and Record Files test fix. +- Generation copies: signed `aac68907e67906aeef4e0cd687d28bc98b738f8c` on `feature/echo-generation-copies` (base PR 343 head `8f473fa`), 13 paths, 21/21 manifest match, real PostgreSQL 17 migration passes. Owner integration and publication are not acknowledged. + +## Implemented and installed (normal TC22 and local server 57832) + +- APK `4AAB6951D3B0ABDDD4F5A8DC6790DCD84233EE08179B68DB108BF77909AB850E`: same signer, no data clear. Connected, Apps/Settings, portrait, location on and the brand-only wallpaper preview were verified. No wallpaper or company profile was applied. The device shows Echo setup, Copies 1. +- Server on 57832: UI API 1.10, mobile-scanners 1.5, printing 2.3, mobile-record-files 1.0, with the original database, accounts, approval and printer. Echo Copies per scan (default 1, range 1-100, one job per scan). Its core is not upgraded to RC.21. + +## Tested + +- Android: 222 JVM tests, lint 0 errors/0 warnings (2 info), debug/E2E/test APK builds, 23 Node tests, 255-file standards. +- Disposable TC22 Echo ten stages, 109/109 semantic requests; inputs and printing are simulated. +- Server RC.21 gate PASS: 377 unique tests (Generation 179, Printing bridge 16, scanner 53, demo 8, mobile Record Files 18, Echo 68, Echo demo 35), zero failures/errors/skips, Checkstyle PASS, plus 15 real admin-browser E2E on public RC.21. Earlier MySQL timeouts did not recur. Evidence: `C:/Users/james/.cache/qqq-rc21-copies-gate-076d059d8d0641d9a85874ec64008def/verified-summary.json`. +- Honest scope: this is public core RC.21 plus qualified owner inputs. The Printing-bridge tests still resolve three private `pu507` libraries through the owner Printing POM, and other owner qbits are private inputs. It is not a fully public or released cohort. +- Real Authentik desktop acceptance passes with strict TLS (nonce, A, logout, fresh B). The native harness is compiled with 8 launcher guards passing. + +## Still open (none of these is claimed done) + +- Generation: canonical owner integration, then public reproducible inputs for the owner qbits and a coherent published cohort. +- Source: primary CI on the final source, merge, review completion and release. +- Manual on the TC22 (operator remote): physical trigger, scan value/type, AIM, label count, rescan, photo capture/upload, GPS, projection, company profile/wallpaper deployment. +- Native Authentik on the device: temporary CA installation, PIN interaction and the real callback. No trust bypass. +- Signing and distribution: explicitly last, by user decision. + +## Pointers + +Runtime `C:/Users/james/.cache/qqq-local-all-qbits-current.txt`; native proof `scanner-host/build/native-device-e2e/echo-proof.json`; Generation handoff `C:/Users/james/.cache/qqq-generation-copies-handoff.md`; Authentik `docs/REAL-AUTHENTIK-ACCEPTANCE.md`. diff --git a/docs/history/README.md b/docs/history/README.md new file mode 100644 index 0000000..fbf08e3 --- /dev/null +++ b/docs/history/README.md @@ -0,0 +1,9 @@ +# Historical status notes + +November 5 record UX evidence is in [the completion note](../RECORD-UX-2026-11-05.md). The preceding [session state](SESSION-STATE-before-record-ux-2026-11-05.md) and [checklist](TODO-before-record-ux-2026-11-05.md) preserve the earlier local-preview and signing details. + +These files are historical records, not current status. They preserve the rolling notes as they stood at the end of 2026-11-04, including statements that were later superseded (for example signing deferral, open pull requests, and a missing release workflow). For the current view see [status](../SESSION-STATE.md), [checklist](../TODO.md) and [finish ledger](../FINISH-1.0.md). + +- [SESSION-STATE-through-2026-11-04.md](SESSION-STATE-through-2026-11-04.md): rolling session log, newest first. +- [TODO-through-2026-11-04.md](TODO-through-2026-11-04.md): rolling checklist. +- [FINISH-1.0-through-2026-11-03.md](FINISH-1.0-through-2026-11-03.md): November 3 finish ledger. diff --git a/docs/history/SESSION-STATE-before-record-ux-2026-11-05.md b/docs/history/SESSION-STATE-before-record-ux-2026-11-05.md new file mode 100644 index 0000000..484ef04 --- /dev/null +++ b/docs/history/SESSION-STATE-before-record-ux-2026-11-05.md @@ -0,0 +1,50 @@ +Historical checkpoint before the November 5 record UX update. Current state is in [session state](../SESSION-STATE.md). + +## November 5 rich-record preview + +The same TC22 app now has grouped fields and direct related-record navigation through standard semantic metadata/query APIs. The maintained Echo demo supplies Test Data: 1,000 orders (39 fields, six sections), 12,000 items and 3,000 history entries. Android unit tests, lint and debug/E2E builds passed. Isolated MC9400 native acceptance passed paging, grouping, filtered child navigation, camera/gallery attachments to order 26, rotation and remote logout cleanup; all requests matched the semantic API. Installed TC22 APK SHA-256: `65FB631F0CFF9B68A0F3FC01D37D656FD69D690F1BA63F8A34FB314A2B03B97F`, matching signer and installed bytes verified. Existing app data, enrollment and server address were retained. These source changes remain local/uncommitted; no new release was published. This supersedes the earlier preview/server-selection status below. + +## November 5 TC22 preview update + +At the user's request, the existing TC22 app was updated in place to the local records/photo debug build, with matching signer verified before installation and installed APK SHA-256 `79E6CD0559419E059EC253DD0364C13BDDB3C27F566F0DA9A478FBB70D99A038` verified afterward. No uninstall, data clear, separate QA app or server change occurred. Server selection and hands-on record/photo acceptance are pending. The older acceptance evidence below applies to the prior development build. + +# Current status + +As of 2026-11-05. Scope: the scanner host and the local Echo workflow only. This is the authoritative current view; earlier rolling notes are historical and kept in [docs/history](README.md). Nothing here claims a stable or fully qualified 1.0; a signed preview is published. Checklist: [TODO](../TODO.md). Ledger: [FINISH-1.0](../FINISH-1.0.md). + +## Local feature verification + +Uncommitted GS1 and record-photo work adds permitted-table browsing, record details, and camera/gallery attachments using existing semantic APIs. Android unit tests, lint and debug/E2E builds passed. Disposable MC9400 tests passed synthetic GS1 capture with exact HRI and saved-record browsing, plus record-linked camera/gallery upload, rotation, navigation blocking and remote-logout cleanup. These tests used isolated apps/databases and simulated barcode input/printing. The companion composed server cohort passed 188 tests and Checkstyle; the existing photo-process regression and eight runner guard tests also passed. The ordinary scanner app is unchanged; physical GS1 print/rescan and deployment remain outstanding. + +## Source + +- Protected `main` contains all application work (PR 8 and PR 10 merged). Application source is unchanged by the documentation and signing work after that merge. +- The Gitea workflow `.gitea/workflows/qrun-android-release.yaml` exists on `main`; it calls the shared platform Android workflow and is not a scanner-APK release pipeline (see [RELEASING](../RELEASING.md)). +- Documentation is published separately (signing guide and this reconciliation). Shared CI/CD redesign is outside this repository's local use and does not gate the demo. + +## Local demo: accepted + +- Local server on the workstation (port 57832): public QQQ 4.1.0-RC.21 plus released Printing 1.0 and qualified document, files and scripting owner inputs. UI API 1.10, mobile-scanners 1.5, printing 2.3, mobile-record-files 1.0. +- TC22 runs the development-signed debug APK (version 0.1.0, versionCode 1, SHA-256 `38A11155BF6A9C089A1EE6D9E44401E8FF39497B7150B51A85F1F916148BE60D`), reaching the server through device port 8080 forwarded to the workstation. +- The operator reported the outstanding manual TC22 acceptance group ALL PASS on 2026-11-04, including label count/fidelity, camera and GPS, and screen viewing. This is operator-reported acceptance, not instrumented or per-case evidence; no per-case artifacts are recorded and the checks are not requested again. +- Desktop-browser Authentik acceptance passed with strict TLS (nonce rejection, login, company logout, fresh second operator). + +## MC9400 (second device) + +- A production-signed 1.0.0 (versionCode 2) APK was installed on a fresh MC9400 (Android 13, EMDK present) and launched; installed bytes matched the signed APK hash. No fatal crash at startup. +- At the user's request the MC9400 now runs the same development APK as the TC22 in demo mode, with device port 8080 forwarded to the workstation server over paired wireless ADB. It signed in and was approved through the ordinary mobile device approval process (status APPROVED). +- **Remaining check:** a physical MC9400 trigger scan confirmed in the backend. Not yet verified; no scan claim is made. + +## Signed release + +- Direct signed-APK / MDM distribution was chosen. A QRun-owned key exists (alias `qqq-mobile-release`, certificate SHA-256 `BDDB2D2F45A5925C643A83ABAF616C1EAB2387DC5CDA7B645A6F4C0D5B17A9FF`) with a verified backup. Key, passwords and vault details are not in this repository. +- Signed `QQQ-Mobile-1.0.0.apk` (versionCode 2, SHA-256 `EE5AC896B8985AF6F11B2E883955925D6571A2913D74A4AACCDB564B79394D51`) exists locally, built from `main` application source: lint 0 errors/0 warnings, v2/v3 signature with the exact certificate, alignment and non-debuggable verified. +- It is published as a **signed preview**: Gitea prerelease [scanner-v1.0.0](https://git.kof22.com/QRun-IO/qqq-android/releases/tag/scanner-v1.0.0) (ID 1361, signed tag on protected `main` `3eef6431ca39b6450cf764424d921a02b2afb9ab`; app source matches `0ae2101f`, the tag adds documentation only). Hosted assets are the APK (14933499 bytes) and `SHA256SUMS` (88 bytes), both downloaded back and matching the hash above. The local installation kit ZIP was not published. Forge sign-in is required. This is not a stable release. No automatic signing CI is configured, and SDK CI publication is a separate path. +- Production qualification (still pending) needs an HTTPS server and a full device pass of the signed build ([RELEASING](../RELEASING.md), [INSTALLATION](../INSTALLATION.md)). The local demo does not need HTTPS; release builds reject HTTP. + +## Open (not claimed) + +- Release qualification of the signed APK end to end (HTTPS server, enrollment, scan, navigation, update). +- Actual on-device Authentik callback: unverified; no separate evidence, remains production qualification. +- Dependency publication: the Generation, Record Files and Scripting owner inputs behind the local server are qualified inputs, not a fully public, reproducible or released cohort. +- Company profile / MDM rollout: nothing applied or verified on a device ([DEVICE-PROVISIONING](../DEVICE-PROVISIONING.md)). diff --git a/docs/history/SESSION-STATE-through-2026-11-04.md b/docs/history/SESSION-STATE-through-2026-11-04.md new file mode 100644 index 0000000..d5aa94c --- /dev/null +++ b/docs/history/SESSION-STATE-through-2026-11-04.md @@ -0,0 +1,319 @@ +> Historical record, superseded by [current status](../SESSION-STATE.md). Do not treat as current. + +## November 4 — production signing custody (current; supersedes the signing-deferral notes below) + +The owner decided on signed-APK/MDM distribution with a new QRun-owned Android key, stored in a QRun vault in the owner's Personal 1Password account. Key alias `qqq-mobile-release`, PKCS12 RSA 4096, certificate SHA-256 `BDDB2D2F45A5925C643A83ABAF616C1EAB2387DC5CDA7B645A6F4C0D5B17A9FF`, valid through 2056-10-27; app ID `io.qrun.mobile.scanner`. Backup recovery was verified 2026-11-04 (recovered file hash, keystore opened, certificate compared). Root built unsigned 1.0.0/versionCode 2 (`lintRelease` + `assembleRelease`: 0 errors, 0 warnings, 2 information) from source matching protected main `0ae2101f082c241ca6a70462dc9ec3057aa6c906` (only docs differ), then signed it in isolation with `apksigner` at 2026-11-04T16:22:05Z; the key was not passed to the application build. **Local signed artifact and verification are complete:** `QQQ-Mobile-1.0.0.apk`, SHA-256 `EE5AC896B8985AF6F11B2E883955925D6571A2913D74A4AACCDB564B79394D51`; v2+v3 verify, exactly one signer with the certificate above, 16 KiB alignment pass, non-debuggable, app ID `io.qrun.mobile.scanner`. It is not installed, published or production-qualified; the development-signed TC22 install and data are intact. Remaining: qualification of the actual production-signed APK on a migrated or different device (normal device untouched), first distribution (needs an HTTPS server), and paused CI wiring. No Infisical/CI activation, no scanner release workflow, no tags; the shared CI hold is unchanged. Runtime app code is unchanged from main `0ae2101`; Android guide PR 12 is still open. The November 4 manual all-pass was for the development-signed build and is not requested again; it does not qualify the new signer. See [RELEASING.md](../RELEASING.md). Entries below, including the deferral of signing, are historical. + +## November 4 — signing readiness documentation (historical) + +[RELEASING.md](../RELEASING.md) was rewritten as concise Gitea-first release readiness. This documentation update has been checked against the actual Gradle configuration and Gitea caller. No keys, secrets, tags, releases, CI, build or source were changed. Central main Android lifecycle 3634 passed and published SDK AARs but is not a scanner-APK signing pipeline. Local Gradle signing via `SCANNER_KEYSTORE`/`SCANNER_STORE_PASSWORD`/`SCANNER_KEY_ALIAS`/`SCANNER_KEY_PASSWORD` exists; release builds are unsigned without them. Production signing still needs the owner's channel decision (direct/MDM vs Play), an organization-owned key with secure storage and a backup owner, and signed-APK device acceptance. The operator reported manual acceptance all-pass on November 4; the last recorded installed build was development-signed. Signing/distribution remains last; older entries below are historical. + +## November 3 — verified widget-state reset fix + +`ProcessViewModel.reset()` now clears `widgetState` so last scanner feedback no longer carries into a new run. The regression proves ordinary step updates retain feedback and reset clears it. Root verified all 57 mobileapp JVM tests (zero failures/errors/skips), scanner lint (zero errors/warnings), debug APK assembly and the 255-file standards gate. Prior head `9cf789c` passed hosted CI3553 in 16m22s; this fix still needs its own hosted checks and normal PR10 → PR8 → main integration. The installed APK and manual acceptance are separate gates; signing/distribution remains deferred. + +## November 3 — current checkpoint (verified; supersedes all older entries below) + +- **Source:** `f72b90d08cf29d2785cef1d5c5e7eeaf75f9afd2` is the signed application-code commit published in PR 10, independently read back over SSH before this documentation update. Gitea CI 3480 **succeeded** on it (unit-test, device-test, package, secrets and gate; root read the UI). Root also verified a clean git merge-tree of `f72b90d` with actual `main` b75fdac and merged nothing. Pull requests #8 and #10 remain open; no 1.0 is released. This documentation update leaves runtime code unchanged from CI-passing `f72b90d`. +- **Installed:** the updated normal APK `4AAB6951D3B0ABDDD4F5A8DC6790DCD84233EE08179B68DB108BF77909AB850E` is installed with the same signer and no data clear. Connected, Apps/Settings, portrait, location on and the brand-only system wallpaper preview were verified. No wallpaper or company profile was applied. +- **Fresh verification:** 222 JVM tests, lint 0 errors/0 warnings (2 info), APK builds, 23 Node tests, 255-file source standards pass. A fresh disposable TC22 Echo ten-stage run passed 109/109 semantic requests (simulated inputs and printing). +- **Authentik:** fresh real desktop acceptance passes (nonce rejection, A login, logout with old-cookie replay rejected, fresh B without clearing cookies, logout) against the same isolated TLS fixture. The opt-in native harness is integrated and compiled, and its 8 launcher guards pass; the on-device run still needs the temporary CA and PIN interaction. No trust bypass. The normal server on 57832 is unchanged and ready. +- **Server side:** server `45f9cbd` is signed and pushed (Gitea PR 7); the public QQQ 4.1.0-RC.21 source update is prepared for the next signed commit. The final RC.21 gate passed: 377 unique tests (Generation 179, Printing bridge 16, scanner 53, demo 8, mobile Record Files 18, Echo 68, Echo demo 35), zero failures/errors/skips, Checkstyle PASS, plus 15 real admin-browser E2E on public RC.21; the earlier MySQL timeouts did not recur. This is public core RC.21 with qualified owner inputs (three private `pu507` libraries still resolve through the owner Printing POM), not a fully public or released cohort. The normal runtime core was not upgraded. +- **Still open (not claimed):** Generation canonical owner integration and public reproducible owner inputs; primary source CI, merge and release; manual TC22 trigger, value/type, AIM, label count, rescan, photo, GPS, projection and profile checks (operator remote); native Authentik CA, PIN and callback; signing/distribution, explicitly last. The normal TC22 shows Echo setup, Copies 1, Connected. + +## November 3 — final client installed; Authentik harness integrated (earlier; superseded by the checkpoint above) + +The verified debug APK 4AAB6951D3B0ABDDD4F5A8DC6790DCD84233EE08179B68DB108BF77909AB850E is installed on the normal TC22 with the same signer and install -r. Existing sign-in, device approval and Connected status survived. Navigation, portrait setting, foreground-location toggle and the brand-only system wallpaper preview were verified; wallpaper was not applied. Feedback, managed configuration and AIM code are now installed, with physical trigger/fidelity still unqualified. + +Fresh verification passes 222 JVM tests, lint zero errors/warnings, debug/E2E/test APK builds, 23 Node tests and the 255-file source standard check. The updated disposable TC22 Echo suite passed all ten stages with every request matching semantic operations; simulated input/printing only. The actual Authentik desktop test passed again on November 3 with strict TLS: nonce rejection, operator A, company logout, old-cookie rejection and fresh operator B. The opt-in real Authentik Android harness is now in the repository and compiles; native execution awaits temporary CA installation/device interaction. No normal app/server trust change was made. + +Echo server source is signed and published at 45f9cbd in Gitea PR7. Generation copies now has an isolated canonical Git integration, with additive PostgreSQL migration verified on real PostgreSQL17. Shared source/dependency publication and hosted CI remain separate gates; no production 1.0 release or physical print claim. Earlier installed-APK/uncompiled-harness notes below are historical. + +## November 2 — Echo copies live and native acceptance complete + +Echo setup now exposes optional **Copies per scan**, default 1, range 1–100. The server pins it for the run and submits one job with that copy count for each scan. The normal TC22 is connected and left on the fresh setup screen showing 1. Its installed APK remains D8109C61E71660D2195337DA988F7F692CC4A0DBE95F61230930D6549CAB4D9B; no client upgrade was needed for this generic semantic field. + +Disposable TC22 Echo acceptance passed ten stages and 116/116 documented requests, including default 1, rejecting 0/101, selected 3 across two scans, recreation and Apps/Leave. Inputs and printing are simulated; physical label count is unconfirmed. The combined source passes 222 JVM tests, lint with zero errors/warnings, APK compilation and 15 Node tests. New scan-feedback, managed-profile/wallpaper and AIM source is not installed on the normal app. + +The existing local server on port 57832 now advertises mobile-scanners 1.5 and mobile-record-files 1.0, retaining the original database, approval, accounts and printer settings. Server/owner gates passed 377 unique tests across the qualified module runs. Generation copies changes remain in the isolated owner handoff, awaiting canonical adoption/publication. Physical trigger/print/rescan, camera/GPS/projection and native Authentik remain open; the operator is remote and temporary CA installation is unconfirmed. Signing/distribution stays last. Older checkpoints below are historical; see FINISH-1.0.md for the current ledger. + +## November 2 — administrator viewing controls + +Removed app-authored Stop viewing / Allow viewing, Stop device screen sharing and the custom notification Stop sharing action. The visible indicator, Android consent/system revocation, password/lifecycle guards, server authorization and lease expiry remain unchanged. The existing native regression verifies an informational non-clickable indicator with no stop/allow buttons, continued JPEG frames after resume, background frame clearing, administrator session termination and fresh login. + +Verification: 185 JVM tests (44 core, 56 mobileapp, 85 host), eight Node guard tests, lint zero errors/warnings (two existing informational hints), debug/QA/test APK builds, and the real TC22 session-monitor scenario passed; all 112 native requests matched published semantic operations. The disposable QA packages were removed. Whole-device Android consent was not rerun for this UI removal. + +Installed the verified debug APK D8109C61E71660D2195337DA988F7F692CC4A0DBE95F61230930D6549CAB4D9B on the normal TC22 with install -r and no data clear. The process restart required sign-in; restored the existing scanner account and verified Connected, the Echo catalog entry and existing approval. Local server57832 remains HTTP200 and the print service remains Running. This APK also contains the previously verified optional raw-scan metadata client, gated off against the unchanged installed mobile1.4 server. Existing unrelated source/test changes are preserved. No commits, publication or broader release work resumed for this scoped request. + +## November 2 — current checkpoint + +Source candidate: immutable `ScannerCapture` retains SDK raw bytes as canonical Base64 before the callback returns and routes them through the ordinary semantic process payload. New optional fields are sent only after same-server discovery advertises mobile-scanners >=1.5,<2; older servers still receive the five legacy keys. Barcode text and symbology remain unchanged, scan/capture string representations are redacted, and a failed-submit regression proves the entire event is resent unchanged. Verification passes 185 JVM tests (44 core, 56 mobileapp, 85 host), lint with zero errors/warnings (two existing informational hints), debug/E2E APK builds and QA Android-test compilation. New native tests and operator installation have not run. The SDK configuration is unchanged and AIM extraction is not implemented by this transport slice. + +Completed and verified: + +- Android source `fb3cc5d` is signed and published as Gitea PR 10. It passes 174 JVM tests (44 core, 55 mobileapp, 75 host), lint with zero errors and zero warnings, and the debug APK build. +- The native `SameOriginInterceptor` fixes the cookie-bearing heartbeat that returned 403. The server's same-origin guard is not weakened. +- The normal TC22 installation was updated without clearing data. Existing login and device approval, heartbeat, the real print client's printer, fresh 4x1 media and published document selection, and Cancel then Leave all work against the one local server. +- That server is one QQQ demo on host port 57832. It runs Mobile Scanners/Echo, Collaboration/Record Files, Document Generation and Printing (API 1.10.0, mobile 1.4.0, printing 2.3.0). On this workstation, device port 8080 forwards to host port 57832. The original accounts, enrollment and approval are retained. +- The Printing owner has aligned the loaded 4x1 stock (101600 x 25400 microns at 300 dpi) and updated the real media revision. A real Echo 4x1 barcode document is published. The TC22 selected the actual printer, the fresh 4x1 media and that document, and Next succeeded and shows Scanner ready and Connected. +- The emulator is off because it stalls this workstation. Do not restart it automatically. + +Not yet done: + +- No physical Echo print or rescan has been proven. One separate synthetic HTTP Echo event reached the actual Windows spooler; physical paper and handheld print/rescan remain unconfirmed. One physical scan of QQQ-TEST-123456 has been requested from the user. +- Still open for 1.0: physical Code128 and leading-zero QR scan, print and rescan; full provider, camera, GPS, projection and device qualification; public coherent artifacts; primary Gitea CI; and final signing and distribution. Signing is deliberately last, by the user's decision. The first demo working does not collapse these requirements, and nothing here claims release readiness. +- Core native API merge continuation PR 1337 (a42f9e5) was reviewed with no actionable conflict regression and its 57 focused tests were verified. Normal CI and publication are not established, and default dependencies are not repinned. + +The entries below are historical. Where they describe the printer media report, the 4x1 document or the same-origin fix as pending, this checkpoint supersedes them. + +## November 2 — native cookie Origin compatibility verified on TC22 + +The combined Echo Demo on57832 (reached through device port8080) returned200 for login, then403 for the cookie-bearing session heartbeat POST, because Android's native QQQ requests omitted `Origin`. The server's same-origin guard remains enforced. Core now has a small `SameOriginInterceptor`: it sets `Origin` from the actual request URL's canonical scheme/host/port only (default ports omitted, IPv6 bracketed, never credentials/input/headers) and is installed last so additional headers cannot override it. It is used by `NetworkQQQRepository` and the `DeviceApi`, `MobileSessionApi` and `RecordFilesApi` clients. Version discovery, presentation/logo fetches, OIDC/browser/token requests and redirect refusal are unchanged. + +All174 JVM tests passed (44core/55mobileapp/75host), with zero failures/errors/skips. Lint has zero errors/warnings and two existing informational hints; debug APK build passed. MockWebServer tests cover exact Origin plus cookie on real POSTs, canonicalization, override resistance and redirect non-forwarding. Session and record-file host tests assert the header on their actual requests. + +The verified APK (SHA256 `0B872005B2FA84F693E73CC49133F5C1C02F732A034AA0635A2B50682A61A98E`) was installed on the normal TC22 without clearing its data. Existing scanner login and device approval work against the actual combined server; heartbeat remains connected. Echo opens its three required choices, the approved printer and its reported media load, and Cancel -> Leave returns to the app normally. This directly qualifies setup/session/cancel against the strict host, not a physical print. The earlier112-request/two-synthetic-scan acceptance remains separate. (Superseded: the printing owner has since reported the 4x1 media and the 4x1 document is published; see the current checkpoint above. Physical printing is still unproven.) Emulator stays off. + +## November 1 — required Document choice verified on the real TC22 + +Echo asks for printer, paper/label size and Document once; all subsequent scans use those server-pinned choices. Android production code is unchanged: the generic semantic INTEGER/PVS/dependency controls handle it. The updated separate E2E app passed all7 stages on the actual TC22 (select Document, clear stale choices on parent change, validate required fields, queue two scans, recreate without duplication, Apps/Leave/CLOSED). All112 requests matched published semantic operations. Disposable app/reverse/fixture cleanup passed, normal app/data preserved, emulator off. Printing and scanner inputs are simulated; physicalScannerQualified/physicalPrintingQualified remain false. + +Verification:99 focused/host JVM tests,8 Node guards, zero lint errors/warnings and both disposable APKs compiled; after a test-only fixed-footer click correction, the actual TC22 acceptance passed. Companion server source8da274e is signed/pushed with45 library and24 composed demo tests passing. Private live server53118 still has header fix101efc8 pending document-choice rollout; real printer pairing retry awaits the current Windows consent. Installed normal APK324227CC... remains sourcea2f0080, whose production code is identical to this test-only change. Full physical/provider/camera/GPS/projection/public artifact/signing gates remain open. +## November 1 — Echo native semantic choices verified on TC22 + +Claude implemented named process possible values using the actual published `searchProcessPossibleValues` JSON contract, dependent-field metadata, cancellation/error/retry and stale-response rejection. The unchanged Echo fixture now completes login, enrollment/approval, printer/media selection once, two accepted synthetic scans, rotation/recreation without duplicates, and Apps/Leave closing the run on the real TC22. All86observed requests matched published semantic operations. Disposable-package cleanup passed; normal package/data and real printers were preserved. + +Validation:169JVMtests,8Nodeguards,236-file source standards, zero lint errors/warnings and bothE2EAPKs pass. This is simulated printing, not EMDK or physical output qualification. The remaining immediate blocker is the real Generation/Printing adapter and template/host composition, followed by physical print/rescan. Normal installed APK remains625a275; normal server API1.9/mobile1.1. Production signing remains deferred. +# Session state + +## Echo semantic presentation source checkpoint + +The optional extension 1.4 acknowledgmentLabel and manualEntryEnabled hints are published on feature/echo-scanner-presentation (draft PR9). Existing defaults remain Saved scan/manual enabled; Echo uses Print queued/manual disabled. Strict compilation, 167 JVM cases, lint zero errors/warnings and debug assembly pass. Hardware, lifecycle and receipt predicates are unchanged. The server companion passes 69 consumer cases plus two contract cases; the optional Echo module passes 15 strict QQQ/H2 tests. + +The normal TC22 remains the separately installed 625a275 build (APK AF13778A…3E9216), preserving sign-in/data. Its About screen was opened and Query artwork, both public links and licenses verified through filtered accessibility data. New Echo-native UI/actual owner adapters/physical printing remain unqualified; printing and document/scripting owners have acknowledged their implementation lanes. The running normal server remains API1.9/mobile1.1. Production signing/distribution stays the owner's final step. + +## November 1 standards fixes and About update + +Applied the scoped standards review: copyright/SPDX, explicit imports, declaration headers, native official/three-space formatter profile, mechanical CI source gate and Kotlin warnings-as-errors. Strict compilation and163 JVM tests pass; all46 disposable sample native tests pass on TC22, and production QA instrumentation compiles. The native suite uses fixture providers; actual Android external-browser/provider acceptance remains separate. The existing formatter reports one unstable Gradle script and full formatter CI runner provisioning remains explicit in the review. + +Settings → About QQQ Mobile now shows bundled Query artwork, app version, Dogfooding/Query public links and open-source licenses. The normal APK rebuild uses drawable-nodpi for the artwork. No credential/device parameters are added to website links. The preceding diagnostics/default-on GPS update remains installed until the preserving update recorded below; actual GPS fix is still open. + +The real API1.10 Authentik desktop sequence now passes negative nonce rejection, A login, explicit company logout, old-cookie rejection, fresh B credentials/principal in the same retained browser context, and B local logout. Its provider-specific User Logout flow is required for company sign-out; default ordinary client logout stays local. Server0b53f34 is published and all8hosted checks pass. CorePR1369's exact architecture allow-list correction is being verified; full fresh core CI is not yet green. + +## November 1 diagnostics and location update + +Diagnostics now uses a full-screen, scrollable native view with a connection summary, local-time newest-first activity, All/Problems filters, pause/resume, copy/share/clear and Back. Existing footer and menu entry points still block process input while diagnostics is open. Location reporting defaults on for approved signed-in foreground sessions; Android grants remain required, explicit opt-out persists and automatic permission requests are not repeated after denial. Controls remain under Settings → Device permissions. + +The combined client passes 159 JVM tests, zero-error/zero-warning debug lint, normal/E2E APK builds and the focused diagnostics interaction test on TC22 using the separate E2E package. The new UI/default policy still needs normal-package field observation. This does not establish a physical GPS fix, background tracking, real provider sign-out or production release readiness. + +The preceding signed checkpoint1c766bf was installed in place as APK E34AC3C6…C1874EB with private backup, matching signer and no data clear. The operator and backend confirm one Code128 and one QR event on these bytes, including exact leading-zero value001234567890 from EMDK/QRCODE. Apps → menu → Scan Capture round trip was also confirmed. The normal server remains API1.9/mobile1.1; API1.10 core159 tests, current contract3 tests and coherent scanner/demo/files/browser78 cases pass separately while real Authentik acceptance continues. + +## November 1 native authentication checkpoint + +The optional company sign-out and original-nonce client changes pass 151 JVM tests, zero-error/zero-warning lint, debug assembly and native-test compilation. All 28 selected OAuth2 login/logout and authentication-lifecycle native tests also pass on the TC22 in the disposable sample application, with no failures or skips. The normal scanner package/data were preserved and its Activity is foreground again. These native tests use synthetic provider adapters; they do not establish real Authentik or external-browser acceptance. + +Independent review covered all 26 implementation/test/documentation files in the frozen patch and found no security candidates (completed scan c358cde3-b51d-4451-b07d-8d1afe6c4485). This is a patch review, not a fresh audit of every unchanged file. Native OAuth now requires API1.10, the advertised nonce-validation feature and REQUIRED policy; TABLE authentication remains compatible. Company sign-out is separately advertised and explicitly selected; the automatic sign-out policy remains undecided. + +The paired server changes and real A-to-company-logout-to-B acceptance remain in progress. Earlier real-provider testing established operator A and local QQQ invalidation, but retained browser SSO silently reused A; that failed handoff remains failed. This checkpoint is source publication, not a production release or installation of these bytes on the normal TC22 package. Signing/distribution remain the owner's final step. All historical entries below retain their original scope. + +## November 1 status and visible QR fixture + +All eleven hosted checks at portrait-default7de2b508 passed. Public QR fixture checkpoint2e0fd962 is signed and pushed; docs/TEST-BARCODES.md records independent ZXing decoding of001234567890. Physical QR acceptance is still pending. Normal TC22 APK C89161C…C6340 remains installed with portrait requested, and the backend now has nine trusted EMDK Code128 events (eight on prior F3AF and one after the portrait update). + +Release1.0 remains incomplete: actual Authentik acceptance remains pending; the local TLS proxy correction is verified, and provider configuration returned a validation error under diagnosis; physical QR, camera/gallery, navigation/failure, projection and GPS acceptance remain open. Filesystem portability passes142 discovered/138 passed/four existing skips, and the separate RF HTTP consumer now passes18 cases on a transitional custom-filesystem tuple. This supersedes its earlier fixture-compilation failure; it does not establish immutable/default dependency adoption or change the normal API1.9/mobile1.1 runtime on57832. Signing/distribution remain last by owner instruction. Current summaries supersede dated open-state statements below without changing their historical evidence or sealed review scopes. + +## November 1 portrait default installed; prior source fully green + +The user requested portrait lock by default. Missing/invalid preferences now choose Portrait; all explicit saved choices remain available. Four focused policy tests, debug lint (zero errors/warnings) and debug assembly pass. Development APK C89161C…C6340 was installed in place after signer verification and a new private-data backup; no app data was cleared. Android reports the normal Activity resumed with SCREEN_ORIENTATION_PORTRAIT, and a direct screenshot confirms the signed-in Apps menu. Barcode/lifecycle acceptance of these new APK bytes remains pending; earlier F3AF physical evidence is preserved. + +All eleven hosted checks at229fce3 passed, including both GitHub native runs (jobs124829276568/124828879619):35 shared cases, PixelCopy and all seven semantic scenarios. Logs show session-login-action-ready, session-fresh-login and the semantic request audit in both runs. Server documentation checkpoint2de8470 also passes all eight checks. Fresh checks will qualify the portrait-default source update. The operator confirmed the eight earlier Code128 events were deliberate trigger pulls. The QR was not visible in chat; a direct image link was supplied after unreliable browser automation, and current QR acceptance remains pending. + +## November 1 physical EMDK positive control verified + +The operator reported Saved scan on the normal F3AF development app. Direct ownership-guarded backend inspection verifies eight new Code128 records for QQQ-TEST-123456, source zebra-emdk, TC22 attribution and eight distinct event IDs. This closes the current trusted hardware positive-control gap for Code128 only. Operator confirmation of repeated trigger intent and the current leading-zero QR remain pending; [physical acceptance](../PHYSICAL-TC22-ACCEPTANCE.md) records exact APK/runtime and remaining lifecycle/retry/ownership gates. No normal app/data clear or QA run occurred. + +Strict Firefox profile-only CA trust now passes issuer/hostname checks using the supported PLAYWRIGHT_FIREFOX_POLICIES_JSON entry point. Windows trust is unchanged; the earlier Windows-root approval question is obsolete. Actual provider startup/exchange remains unexecuted while an independently reviewed known-listener guard is prepared for genuine TIME_WAIT rows. Independent architecture closure of Android229/server2de reports no additional concrete source blocker and maps A1-A11 controls/tests; runtime/deployment/dependency/signing limits remain. Record Files compatibility now has a concrete exact-revision filesystem dependency gate in a new private cache; no frozen0515/default/runtime adoption occurred. + +## November 1 native CI — rotation passes, fresh-login test readiness under correction + +Android5ba PR run41297344726 passed:35 shared native cases, PixelCopy and all seven semantic scenarios, including session-monitor. The duplicate push run41297340376 also passed rotation/recreation/mirroring/administrator termination, then timed out waiting for Username after clicking Log back in. Its request audit shows completed Android logout200 and no second Android manageSession. Static review confirms that the test awaited only the label, which also renders while the logout action is disabled. This supports a test-readiness race; the failure artifact does not record the button state at the click, so no production cause is asserted. The correction waits for a final signed-out message and enabled action, asserts enabled and clicks once; it retains all fresh-login/session assertions. The opt-in device-screen test uses the same readiness requirement. Fresh native execution remains required. + +Independent release automation review of three exact5ba files found no actionable source finding; [scope and hashes](../RELEASE-AUTOMATION-REVIEW.md) retain external-configuration limits. A separate API1.9/mobile1.2 backend-only smoke passed readiness and shutdown with private credentials removed. Its launcher initially failed closed on the Node shim PID; actual Node resolution corrected the helper, and the unsuccessful fixture also cleaned up. No TC22 QA test, ordinary-app cleanup or normal-server replacement occurred. + +## November 1 TC22 walkthrough — reported disappearance investigated + +After the operator reported that touching the handheld crashed or moved the app, direct ADB inspection found the normal scanner process alive and its Activity resumed/focused, with no crash-buffer entries. A direct screen capture showed the connected sign-in screen; the black desktop mirror was not reliable evidence of an app crash. Restored the existing scanner demo login using locally encrypted credentials, and a subsequent direct capture confirmed the Apps menu. Opened Scan Capture to resume the manual walkthrough. No production defect has been reproduced or fixed by this inspection; physical trigger/navigation acceptance remains pending. No QA instrumentation or app cleanup was launched over the operator's normal app. + +## November 1 morning — normal app updated; native test correction pending hosted verification + +The normal TC22 application is now updated in place to the reviewed development APK `F3AF638E…E9FAA`. Matching signing identity and a new owner-only private-data backup were verified; app data/enrollment were not cleared. Non-streaming installation completed and the normal process is running against the preserved API1.9/mobile1.1 demo. This supersedes older unchanged-normal-APK statements below. Operator login/navigation/scanning confirmation is pending; no production release is claimed. + +Published `e04fdb2` passed CircleCI and CodeQL, but both GitHub native runs failed the same session test: it requested rotation then another Activity recreation without waiting for configuration convergence, and the barcode draft was empty. The test now waits for landscape/resumed configuration and asserts the draft after rotation and again after explicit recreation. This is a test synchronization correction awaiting native execution, not a demonstrated production draft fix. Physical barcode attempts separately hit a wrong expected value (operator confirmed the old test code), a transient focus assertion and an ADB timeout; none is a full hardware pass. Focus preconditions now wait briefly within the120second stage deadline, and install timeouts identify the operation. + +The opt-in QA screen-consent harness, shared HTTP helpers and both QA/E2E test packages compile. Its early safety checks reject missing operator opt-in and both protected demo ports without device access. Actual consent/Home/Stop/expiry/end-session acceptance remains pending. The harness author stopped at the workspace agent-credit limit; root completed the compile corrections and continues directly. A real Authentik fixture is compiled with pinned images downloaded, but no services or OS trust changes have occurred; temporary Windows CA approval is still pending. + +## November 1 — refined device-screen client and published paired server + +The refined client passes137 JVM tests, all package/lint gates, fresh four-APK inspection and the TC22 ordinary-UID scan-ingress regression. Continuous image draining retains one latest buffer; repeated Share is blocked through service binding. Fresh independent follow-up review found no concrete issue. The source-pinned1.2 server `1041693` is published and passes39 server/six demo/all15 browser tests with strict195-JAR/2,441-class provenance in a cloned private Maven cache. Hosted client CI now targets that exact source. No actual projection consent/physical trigger is proved; the normal APK remains unchanged and its running demo remains qualified1.1. See [candidate scope and hashes](../DEVICE-SCREEN-ACCEPTANCE.md). + +## November 1 — initial consent-based device-screen checkpoint + +The optional device-screen client and paired1.2 server pass initial compilation and automated gates:135 Android JVM tests, lint/all package builds,39 server and six real-HTTP demo tests. Parent and fresh independent static review found no reportable client issue across the nine changed-file inventory; actual consent and projection behavior remain unverified. See [scope, hashes and remaining acceptance](../DEVICE-SCREEN-ACCEPTANCE.md). The normal operator APK and qualified1.1 demo remain separate. Frame freshness/binding refinements and final native acceptance are still required. + +## November 1 — hosted Back focus failure and physical-trigger checkpoint + +Published Android head `6845abc5289fa975e6f50b23b159c3131a82eee1` has a successful CodeQL check; not all CI is green. CircleCI android-test job 140 fails three NavigationTests before injecting Back: their Activity is resumed and the device is interactive/unlocked, but Activity/decor window focus stays false for five seconds. Both job attempts reproduce the failure. Retained JUnit contains no focused-window owner, so the cause is not yet established. Failure-only diagnostics now classify the focused window as own/system/other, report bounded own-window flags and the known network-dialog visibility; they retain the five-second focus requirement and actual Back injection. CircleCI unit job 141 passed. One GitHub native run failed and the other was still running at inspection; neither is claimed successful. + +The physical QA attempt using APK hash prefix `CFFF` reached its first hardware-ready stage but recorded no acknowledged operator scan. A final near-deadline HTTP poll timed out; this is not physical scanner acceptance. Evidence is preserved under `C:/Users/james/.cache/qqq-tc22-physical-attempt-20261101-0210`; `physicalTriggerVerified` remains false. A separate, unqualified test follow-up is prepared to avoid sub-second status polls and label deadline failures without extending the 120-second stage bound. Its compilation is deferred until the concurrent scanner changes are ready; it is not part of this diagnostic checkpoint. + +The earlier normal-server ownership hold is resolved. After correcting the CIM positive control, the owner completed the reviewed upgrade to the frozen `ecf`/`b14` API 1.9 / mobile-scanners 1.1 TABLE runtime. A fresh backup, original-column invariants, old-after-new recovery logins before and after stopping the predecessor, and live login/metadata/logout for both demo accounts passed. Two devices and three scans, including the leading-zero value, were preserved. Private evidence is retained in `C:/Users/james/.cache/qqq-normal-api19-002594902b1942bda2480c512ed644ab/normal-verification.json`. The normal operator APK remains unchanged. Further optional screen-capture source is under separate implementation; these diagnostic edits do not qualify it. + +## October 31 — published client checkpoint and probe target clarity + +Signed client checkpoint `d316567` is published to existing draftPR8 and the clean canonical feature checkout is fast-forwarded to it. Fresh hosted checks found two CodeQL intent-redirection annotations in the separate permissionless test probe. Inline static triage at that exact revision classified both as not actionable: the exact QA/E2E package allowlist dominates both fixed-action broadcast sends, no arbitrary activity/service is launched, and the probe adds no sender authority. No alert was dismissed or completed audit rewritten. The probe now maps accepted requests to explicit final package literals rather than forwarding even the validated caller string. Probe-only build/lint and repeated ordinary-UID eight-forgery/manual-positive acceptance pass; production APK hashes are unchanged. Publish this source clarity follow-up and inspect fresh CodeQL/client checks before release. Physical trigger and whole-handheld viewing scope questions remain pending. + +## October 31 — final SDK/navigation candidate verified for publication + +All three Android Back handlers and the toolbar arrow now use one live Main-owned drawer-first action, preserving standalone fallbacks. The native regression first proved a real process-level bypass opening Leave behind the drawer; the corrected case passes with one actual Android Back, preserved process/draft and zero cancellations. It also covers seven other overlay/focus gates. Current source passes127 JVM tests,34 TC22 shared cases in115.717s and the additional overlay case in17.948s. A distinct-signer ordinary-UID test passes against the exact current QA APK: eight forged broadcasts cause zero extra process steps/records, while a manual positive control saves through the real API. Actual physical trigger proof is still false/pending; the barcode-visibility question is unanswered. + +All four APKs pass fresh DEX, manifest, native-hash and packaged-notice inspection. Independent review of the final SDK/navigation patch found no concrete defects requiring changes. See [exact hashes and evidence boundaries](../TRUSTED-SCANNER-ACCEPTANCE.md). The final code is ready for an explicitly authorized signed source checkpoint; hosted client checks must run after publication. Coreecf has18 hosted successes and published serverbf174a6 has8. New whole-handheld viewing scope clarification is pending; current capture is QQQ Mobile only. Normal operator app/server and emulator remain unchanged by these tests. + +## October 31 — coherent backend accepted and published; final Android gate running + +The owner explicitly authorized signed commits and publication after automatic review required direct commit approval. Core `ecf0f550` is published to draftPR1334. Server code `b14d925` plus acceptance documentation `bf174a6` is published to draftPR6. Fresh37 server/five demo tests, strict runtime provenance (195 JARs/2,440 unique QQQ classes/zero duplicates, Guava33.7.2-jre/H2 2.2.224), actual API1.9/mobile1.1 discovery and all15 browser tests pass. The normal operator runtime remains unchanged. Hosted checks are running; one Windows job failed to download PSScriptAnalyzer before project analysis and received one scoped retry. + +The trusted scanner now also blocks physical input behind drawer/Settings/Diagnostics/Account/leave overlays and lost window focus, with a live callback guard. Two new coordinator tests and one production-widget QA native regression are added. Auth0 stable3.0.0 and Coil3.0.4 replace inherited prereleases; two native raster/SVG/error rendering cases are added. These source changes require the new combined build and device run. The first build correctly rejected stale notices: AboutLibraries10.9.2 did not declare its dependency graph as an incremental input. A lazy resolved-coordinate input now invalidates its standard generator; strict license/version gates remain enabled. The combined gate is running again. Earlier APK hashes and hardware evidence do not qualify these changes. + +## October 31 — trusted scanning packages verified; runtime provenance caught a mixed dependency + +The approved optional EMDK implementation passes all 49 scanner JVM tests, debug/release lint, debug/unsigned-release/E2E assembly, and production-path QA/probe assembly. The separately signed adversarial probe has a verified distinct test certificate; its temporary private key was deleted. These results do not establish physical trigger or injection resistance: disposable TC22 acceptance is next, and the normal operator APK remains unchanged. + +Exact-source core `ecf0f550a0357cec6387c2b54efca128a405a629` passes the full selected dependency closure: 4,507 tests discovered, zero failures/errors, 16 existing skips, plus the configured coverage/static gates. Scanner server `a8ed108` passes 37 tests and its demo passes five. Runtime provenance then correctly rejected an old RC.20 backend dependency in the demo classpath. Browser and QA fixture execution are held while the consumer dependency management is corrected; these test passes are not qualification of that mixed runtime. The verifier remains strict, and no shared artifact or normal server was replaced. + +## October 31 final client audit and isolated integration follow-up + +The owner explicitly accepted Zebra's EMDK terms and selected native trusted scanning. The optional adapter is now being implemented; the earlier 32-test result does not qualify that new hardware path. Wrapper checkpoint `7e0cbee` and the five verified client security fixes `df532ff` are signed local commits, not yet pushed. Core's local `331a99d` additionally pins patched Guava; its full selected dependency-closure suite and verification analyses are running in a fresh private repository. On Windows, only the inspected cosmetic shell coverage-summary execution is omitted because of quoting; actual coverage checks and static analyses remain enabled. Hosted Ubuntu retains that summary. + +The completed remediation batch passes 109 JVM tests, scanner lint with zero errors/warnings, debug/native-test and unsigned sample release assembly. All 32 selected TC22 native cases pass in 117.325 seconds, including ten new authentication lifecycle tests. Actual packaged sample release controls deny cleartext and backup and include all ten cloud/transfer exclusions. Five audit fixes have regression evidence; trusted scan ingress remains open pending the separate EMDK license decision. The new debug APK `8c4d3886...c512a` is not installed over the operator app. See [the scoped review checkpoint](../SECURITY-REVIEW-2026-10-31.md). + +The deep client audit completed and sealed against clean published `d1de0bf`, with one medium and five low findings. The medium finding is delayed password-session adoption after logout/server switch, including retained original-server models. Low findings cover sample release cleartext, failed Auth0 local sign-out, unauthenticated exported scan input, stale legacy Auth0 callbacks, and sample session backup. Source fixes are being prepared with delayed-response/provider and host regression tests; none is closed merely from editing source. Static coverage is partial, with external provider/server/dependency implementations and bundled binary implementation gaps excluded. Real configured Authentik and physical operator acceptance remain separate. + +An isolated `fix/hosted-native-ci` checkout keeps this work separate from the audited source and installed operator app. Core draft PR #1334 publishes reviewed native API 1.9, credential-safe logging and explicit-null parser fixes at `00f6c49ef4c21bedb7c62ccad535bd6de1008948`. Focused source gates passed 154 tests with two pre-existing disabled cases, plus a separate 17-test null/HTTP gate. Server `a8ed108` canonical UTC migration passes 37 root and five demo tests and every hosted check. + +A fresh private Maven repository and unique CI-only core version are qualifying the fixture from those exact commits; no shared artifacts or operator runtime are replaced. Hosted acceptance must include the nullable admin form and session-monitor scenarios. A failure-only focus diagnostic preserves the five-second guard and actual Back input; the cause of the hosted focus loss remains unproven. + +## October 31 unconfirmed scan exit correction + +The operator reported Leave process permanently disabled with “The last scan is not confirmed.” The existing JVM harness reproduced that settled missing receipts remained a hard navigation block. A new regression failed before the correction. Settled unconfirmed scans now show an explicit warning that they may already be saved; Stay retains the original retry event, while Leave process uses the existing server cancellation and clears the event after cancellation succeeds. Failed cancellation retains the event and exposes a separate, explicit Leave anyway choice that clears local state without another request; the dialog warns that the server process may still run and saved changes are not undone. Active requests and pending photos remain hard blockers, and receipt validation is unchanged. Added JVM guards/cancellation/fallback cases and a native lost-response/malformed-receipt/Stay/failed-cancellation/explicit-exit regression. Final bounded verification passed all 46 mobile JVM tests, scanner lint/debug APK and sample/test APK assembly in 18 seconds. The TC22 follow-up passed all 21 selected native cases in 53.482 seconds, including the new lost-response/failed-cancellation/explicit-exit case. The operator update is being coordinated separately; actual configured Authentik acceptance remains pending. + +## October 31 navigation/authentication review checkpoint + +The combined client checkpoint passed 102 JVM tests (26 core, 43 mobileapp, 33 scanner), scanner lint, debug/E2E APK assembly and native-test compilation. The final follow-up build passed in 1m3s (266 tasks, 34 executed). The TC22 rerun passed all 20 selected navigation/input/account/OAuth tests in 49.235 seconds, including all seven synthetic AppAuth cases. The first run exposed Back during drawer opening; the handler now also handles a drawer targeting Open, and the native helper waits for settled UI before hardware Back. [Native acceptance evidence](../NATIVE-AUTH-ACCEPTANCE.md) distinguishes real handheld execution from the simulated browser/provider. No actual Authentik sign-in is claimed. New hosted CI is required after publication. + +Independent source review found no concrete defect in the native authentication/navigation patch; this is not final security or deployment clearance. [AppAuth package evidence](../third-party/APPAUTH-VERIFICATION.md) confirms 131 bundled entries, 126 external runtime dependencies, nine complete texts and unchanged eight native libraries in the inspected debug/E2E APKs. OAuth2 depends on the companion core UI API1.9 native-session contract, still pending publication/host adoption. TABLE_BASED remains usable on compatible API1.8 servers. Production signing/distribution and actual shared-operator/provider acceptance remain separate gates. + +## October 31 semantic authentication — synthetic native acceptance passed + +The combined source passes 102 JVM tests (core26/mobile43/scanner33), scanner lint and debug/E2E/test APK assembly. All seven synthetic native OAuth cases and the navigation/input/account suite passed on TC22 as described above. Generated notices contain 131 entries including AppAuth. The initial sandbox run stopped at the existing debug-key lock; scoped rerun preserved the key and completed successfully. Testing used the separate sample package; no emulator or normal operator installation was started for this checkpoint. + +The native descriptor now requires an advertised `prompt: "login"` policy, applied through AppAuth and bound to each pending attempt. Missing/unsupported prompt policies fail closed. Focused tests cover policy changes and mismatched returned requests; the real shared-handheld acceptance gate includes switching operators with an existing browser SSO session. This requests fresh authentication; it is not global IdP logout or verified `auth_time` proof. + +The owner requires Authentik when configured by the server. Generic OAuth2 browser sign-in is implemented against an additive UI API1.9 `nativeSessionLogin` capability, with explicit issuer/discovery/callback metadata and an `authenticationFlow` marker on the existing session exchange. AppAuth performs authorization with S256; the secret and code exchange stay on QQQ. TABLE_BASED remains unchanged and native bearer metadata is kept distinct. Client gates, callback/lifecycle checks, deferred cookie adoption and focused tests are implemented; actual configured Authentik acceptance remains pending. See [AUTHENTICATION.md](../AUTHENTICATION.md). No live provider settings or operator data were changed. + +## October 31 navigation correction — native acceptance passed + +The primary navigation uses one hamburger drawer with All apps and server-authorized app entries, plus Settings and Diagnostics fixed at its bottom. The duplicate toolbar Apps button and Switch app overflow action are removed. Back remains beside the hamburger within apps/processes, Account stays separate, and prelogin/pending-approval drawers hide business destinations. Drawer dismissal and secondary surfaces preserve active work; selecting a primary destination retains the existing leave and pending-upload guards. Compilation and the selected native navigation suite passed, including the drawer-opening Back correction above. The successful checkpoint below describes earlier session/photo acceptance. No installed operator app, server or data was changed for this correction. + +## Current verified checkpoint — October 31 + +All 12 shared TC22 navigation/input/account tests pass. TC22 orientation (all five persisted policies), offline licenses, synthetic camera/gallery/rotation/remote-logout cleanup, and the full session-monitor scenario pass. Session monitoring includes real JPEG app pixels, background clearing, renewed viewing on resume, operator pause, administrator termination and fresh login. Photo/session request audits match published semantic operations. JVM reports total 91 tests (22 core, 36 mobileapp, 33 scanner), zero failures; scanner lint passes. Notice coverage gates and packaged APK inspection pass for debug/release/E2E (125 runtime dependencies, 130 entries and nine complete license texts), and negative omission/blank-text cases fail as required with generated metadata restored. + +The false-offline investigation was a test-clock issue, not a demonstrated timezone defect. The independent standalone file-backed JVM test in America/Chicago passed across 18 seconds. No timezone workaround or relaxed heartbeat/offline policy was added. Remaining work: publish the Android review checkpoint and verify fresh hosted CI, finish independent full audits/native attribution, qualify immutable optional dependencies/CI and real lens/operator acceptance, then return to signing/distribution as the owner requested. The normal installed app and operator demo remain on their earlier versions; isolated test acceptance is not deployment. Historical entries below preserve earlier failures and are superseded by this checkpoint. + +Viewing diagnosis resolved the apparent offline state: the test advanced only16ms of Compose coroutine time per250ms wall polling, so heartbeat LaunchedEffect timers did not run during125 widget polls. The standalone non-UTC file-JVM regression passed and audit ordering confirmed zero heartbeats during those polls. The helper now advances by elapsed monotonic wall time. The next TC22 run reached `session-mirror-frame`: actual app JPEG pixels were delivered/decoded and background clearing passed. It then failed the already-identified old resume assertion because no viewer demand was renewed. Resume now polls the admin widget again; rebuild/full scenario rerun is active in the current turn. No production heartbeat interval or offline threshold was relaxed. The standalone regression source is in the companion demo, added by the read-only diagnosis agent and verified separately. + +Latest viewing diagnostics: eligibility is available=true, but no indicator/frame upload occurs; 125 widget requests and 18 native heartbeats succeed. A real HTTP regression now explicitly requests the viewer widget as a browser (without the Android client header) before the native heartbeat; both demo tests PASS, ruling out the simple cross-channel lease-isolation hypothesis in that fixture. Actual core widget response fields are `layout`, `blocks`, `type`, `blockTypeName`; corrected the diagnostic extractor to read `blocks` (the earlier blank status was an incorrect `subBlocks` assumption). That diagnostic change needs rebuild/rerun to obtain the actual server widget status. All runs in this checkpoint are terminal. No production state-sharing change was made on an unproven hypothesis. + +The window-focus synchronization rerun advanced past capture eligibility: no APP_NOT_FOCUSED failure remains in that run. It now times out at the viewer indicator. Request audit shows 125 successful web widget renders and 18 successful Android heartbeats, with no screen-upload operation. Added bounded failure diagnostics for current server availability/reason and the widget's status text (never image data or credentials), to distinguish lease issuance from client rendering. This newest diagnostic needs rebuild/rerun. All native processes from that run are terminal. Android changes are staged as a review checkpoint, but later focus/diagnostic edits remain unstaged; re-stage and verify before committing. + +Screen-viewing follow-up reproduced a stale tracked-focus flag: server reported APP_NOT_FOCUSED while instrumentation confirmed interactive=true, no keyguard/device lock, both Activity/decor focus=true and lifecycle RESUMED. ScannerActivity now observes actual view-tree window-focus events, resynchronizes on resume, and removes the observer on destruction. Existing captureAppScreen independently checks actual decor focus, so capture protection remains enforced. Scanner unit/lint/E2E APK verification passed (build1m19s); the focused real-server TC22 scenario is rerunning in the active root turn. The operator demo remains on extension1.0; no normal-app update was made. + +TC22 photo acceptance PASSES against the verified guarded0352 fixture: synthetic external-camera result automatically uploads, exact hash/size/provenance/parent and collection association are inspected, gallery staging survives rotation/recreation, leaving is blocked while pending, and remote session termination clears the private copied original without deleting the selected gallery source. All recorded native requests match published semantic operations. The run exposed and fixed a real UI-thread defect: ScannerActivity now dispatches unauthorized-session navigation on the main thread and ignores callbacks for a superseded session. Scanner unit/lint/APK rebuild passed before the successful native rerun. Fixture owner metadata remains in the private task cache; do not infer a normal-app deployment or actual lens capture from this synthetic result. Real session-viewing acceptance is starting next in the active root turn. + +TC22 navigation/input/account acceptance now PASSES all 12 tests on rebuilt sample APKs. Orientation (all five policies) and offline licenses also pass. The guarded Record Files private launcher needed execution outside the sandbox for its process to survive; current private fixture PID111928 was started with a 900-second lifetime, with protected metadata path in the task cache. The first native photo run reached Saved and verified exact bytes/provenance/parent, then failed because the test assumed stored collection order was zero-based. Actual owner storage is one-based while manifest/receipt order is zero-based. Corrected that assertion and the duplicate Apps selector; photo rebuild exec64104 is active in the current turn, then rerun the synthetic camera/gallery/rotation/remote-logout scenario. Preserve fixture ownership and stop only that verified fixture when finished. Session mirroring acceptance and final audits remain open. + +Latest navigation rerun is terminal: 11 of 12 TC22 tests pass. Restored account/server assertions now pass. The remaining failure selected both the menu action and the closed drawer heading named Switch app; a stable menu-action identifier and matching test selector are added. Those last two changes need rebuild/rerun. No native test or fixture remains active from this run. + +TC22 follow-up: orientation and offline licenses each PASS their instrumentation scenario. Shared navigation ran 12 tests: 10 passed, with failures from duplicate visible/closed-drawer Apps selectors and an old account-dialog expectation that server selection still lived there. Added a stable toolbar Apps identifier, preserved the account user assertion, and verified restored server selection under Settings instead. Rebuilt sample/test APKs successfully; navigation rerun is starting in the current root turn. Guarded server changes and passing 18-test evidence are committed/pushed as84ffd7c on the existing draft PR; no merge or production release. + +Latest TC22 result: the rebuilt orientation acceptance PASSED (one instrumentation test covering all five policies, persisted selection, actual fixed screen axis, Activity recreation and a fresh Activity launch). The bounded configuration-convergence wait resolved the prior timing failure; the axis assertion remains enforced. Guarded Record Files integration now passes all 18 tests and runtime/Checkstyle verification, with evidence retained in the companion module. Root is running TC22 licenses followed by shared navigation acceptance as exec session85018; poll that handle before starting another device run. No operator-app update or production release is implied by isolated test acceptance. + +Latest verification follow-up: the notice-integrated APK build log ends BUILD SUCCESSFUL. Explicit TC22 orientation acceptance ran and failed because the observed screen axis was still portrait when landscape was requested. A bounded 15-second configuration convergence wait was added to the native test while retaining its final axis assertion; rebuild/rerun remains required. The disposable test runner cleaned its resources. Emulator remains closed. Record Files guarded-artifact verification has four unresolved intake-event concurrency test failures; see the companion integration session state. No production release is qualified. + +2026-10-31 Android acceptance follow-up: the bounded pre-notices build passed 89 JVM tests (core22/mobile36/scanner31), normal and isolated APK assembly, and scanner lint with zero errors/warnings; broader modules retain inherited vector/dependency warnings. The emulator remains off after confirmed workstation stutter. On TC22, session capture remained safely blocked with APP_NOT_FOCUSED after recreation; no mirror frame was uploaded. The 12 shared navigation/input/account tests then ran: six passed and six failed (stale account/server-confirmation assertions, duplicate catalog/drawer text selectors, and a hardware Back case). Assertion corrections and window-focus diagnostics are prepared; these failures are not counted as passes. Orientation Settings, retained manual draft state, synthetic photo E2E, explicit physical photo fixture support, and bundled-license Settings entry are now implemented but require the next compilation/native acceptance. The license owner is running the bounded integration qualification. Ordinary scanner app/data, DataWedge settings and existing USB reverses were preserved. + +## 2026-10-31 — Navigation hierarchy and release preparation + +Owner explicitly deferred signing/distribution to the final step until the channel is chosen. No signing key or production signing configuration has been created. Continue implementation, audits, native/physical acceptance, documentation and ordinary CI; do not create release tags or force a distribution decision early. + +Workstation interruption: user reports whole-desktop pauses whenever the emulator acts and explicitly confirmed the workstation is smooth after closing it. All local emulator/build runs were paused and emulator-5554 shut down gracefully without clearing application data. TC22 remains connected. Sampled host had 48 logical CPUs, CPU17%, about152GiB free RAM of256GiB, GPU10% with6.1GiB/30GiB used; these samples do not rule out brief spikes. WHPX is operational outside the sandbox. The running host-GPU emulator log includes OpenGL context preemption/restore failure and external-memory import errors; graphics interoperability is a hypothesis, not a proven root cause. Saved AVD config now uses software graphics, previous config backed up locally, but no comparison run has been made. Do not restart the emulator automatically. Continue acceptance on TC22/hosted CI or schedule a controlled software-renderer comparison later. + +Android checkpoint: primary Apps, an app-switching drawer, separate Account and Settings, host device/location settings and shared leave confirmation are implemented. A bounded build with the emulator closed passed 85 JVM tests (core22/mobile35/scanner28), scanner lint with zero errors/warnings, isolated scanner APK/test APK and shared native-test compilation. The focused native long-form test passed after waiting for actual IME dismissal; the earlier immediate assertion raced its animation. Expanded native navigation cases are compiled but not run. Photo capture/picker, registered Record Files transport, stable retry identity, exact receipts and lifecycle tests are implemented. Subsequent camera auto-upload/destruction cleanup, the public mobile-record-files vocabulary gate and associated tests await the next bounded build after concurrent asset/backend work finishes. No emulator restart is authorized; physical acceptance uses the separate explicit runner in [DEVICE-TESTING.md](../DEVICE-TESTING.md). + +The session native test now passes login/approval/catalog/process and recreation, including parent-app metadata and denied-location reporting, against the corrected file-H2 server. It still timed out before the administrator-viewing indicator. The test now waits for explicit screen eligibility and renews the widget viewer lease like the real admin poller; that change is unverified. Actual PixelCopy pixel-boundary instrumentation passed earlier, but full session/mirror/admin-end native acceptance is not complete. Ordinary synchronous process responses have no generic status endpoint: the host retains the process reference, prevents replay and describes uncertainty before explicit cancellation; it does not promise unsupported result checking. + +Current plan: finish native navigation/session acceptance; integrate camera/gallery with the actual Record Files runtime; freeze paired revisions for final independent reviews; qualify signed delivery and hosted CI before publication. Apps → app → process is primary navigation. Account/sign-out, Settings and diagnostics are secondary surfaces that preserve active work. Toolbar and Android Back share one guarded leave policy. See [NAVIGATION-UX.md](../NAVIGATION-UX.md); implementation and native acceptance are underway, not yet complete. + +Latest intermediate results: Android 76 JVM tests and lint with zero errors/warnings; shared native 11/12, with the remaining form/IME assertion under investigation. Companion server 37 tests, two real HTTP acceptance tests and all 15 browser E2E tests pass. The H2 last-connection close/compaction issue was reproduced and fixed with the demo database lifetime setting; the browser suite now completes in 59.4 seconds. These counts describe their tested intermediate source, not a final release. + +Record Files now has actual registered ingestion routes and a frozen 19-file consumer bundle (`retained-contract-20261031-0238`), all hashes verified by the optional integration owner. Camera/gallery implementation will use its existing storage and durable receipts. Atomic authorization across revocation and upload commit remains a shared contract issue; runtime compatibility and native acceptance are still being qualified. + +Release preparation adds optional environment-only signing, validated version properties and a separate scanner-tag workflow that calls the native verification lane before building/signing/publishing. Actionlint passes. The signing identity/secrets, actual signed build/upgrade and final publication have not been configured or verified. See [RELEASING.md](../RELEASING.md). Debug/E2E defaults and the operator's installed TC22 application are preserved. + +## 2026-10-30 — Sessions, screen viewing and audit corrections (uncommitted) + +The host now requires mobile-scanners `>=1.1.0 <2.0.0` and uses registered heartbeat/end/screen operations. Session telemetry contains screen metadata only. Administrator viewing leases enable bounded own-window PixelCopy JPEGs with a visible operator stop control. Capture blocks login/password screens, unrendered transitions, background/unfocused windows and ended sessions; checks repeat after capture and before upload. Foreground location is optional and permission denial leaves scanning usable. Device approval displays the server-generated short name and supports administrator renaming through QQQ. + +Audit fixes require complete scanner receipts and reject invalid explicit maxLength. Navigation now follows NavController's actual destination, including system Back and controller replacement. Shared renderer/authentication fixes are being completed by the parallel review agent. Current intermediate verification: 75 JVM tests passed, APK builds passed, lint zero errors/eight warnings before dependency catalog cleanup. Actual PixelCopy instrumentation passed after an emulator startup ANR was resolved by a cold restart preserving data. Shared native suite passed 11 of 12 tests; a new short-viewport login regression found the IME obscuring the button and its fix is awaiting rerun. Both new navigation tests passed. Real-server session/end/viewing scenarios are implemented but await the rebuilt companion server and final native run. These are work-in-progress results, not publication or production acceptance. + +At this October 30 checkpoint, Record Files camera/gallery routes were unavailable. The October 31 checkpoint above supersedes that dependency status. Version one remains online only. + +## 2026-10-30 — Semantic API migration in progress + +The current work makes the scanner host use the registered semantic UI API contract for every client operation. Public `/qqq/v1/version` discovery gates credentials, branding and metadata; the supported range is core `>=1.8.0 <2.0.0` and mobile-scanners `>=1.0.0 <2.0.0`, with `android` advertised in `clientChannels`. The four mobile extension operations now resolve under `/qqq/v1/qbit/mobile-scanners`. The native renderer applies server-directed completion, field/step updates, form submission and cancellation, and explicitly blocks unsupported required controls. Review fixes honor hidden fields and explicit null clearing, and keep generic fields named `eventId` separate from scanner retry context. See [UI-API.md](../UI-API.md) for the exact rendering boundary; this is not a claim of full web-client parity. + +The final combined JVM suites passed 53 tests: core 21, mobileapp 23 and scanner-host 9. Lint passed with zero errors and six warnings; normal debug and isolated E2E/test APKs assembled. A native administration regression exposed that core QQQ completes a process by omitting nextStep from its COMPLETE response. The renderer now honors that server signal, preserves the final display step until submitted, and closes completed processes without issuing cancellation; a ViewModel regression verifies the full sequence. The companion qbit passed root verification/install with 23 tests and demo HTTP verification; all six migrated browser E2E scenarios passed in 2.9 minutes. The first native run exposed HTTP400 because the server had not registered the Android client channel. The server now registers it while preserving existing channel policies, and the real HTTP regression sends the Android header on all requests and passes. All six native semantic scenarios passed across focused runs: incompatible core major, missing extension, missing Android channel, supported-server scan, additive-future metadata scan, and native administrative approve/revoke/cancel. The first five passed before the terminal-state correction; the final administration scenario passed afterward in 255.917 seconds. Its OpenAPI audit matched all 31 requests to 13 published operations, including backend cancellation. Safe stage markers show both processes reaching completion and Close, then a populated form being cancelled without changing persisted status. The emulator was CPU-bound with animations enabled; the runner now wakes/unlocks only the selected emulator, temporarily disables its animation scales and restores them during cleanup, allows 60 seconds for UI conditions and 300 seconds for instrumentation. The six shared native sample tests also passed. Hosted Android verification remains pending; earlier records below apply to their earlier revisions. + +Active plan: publish the Android branch and verify hosted results. The companion server is published at 7dd02b8874882ca2edcdcd89109b3dee6b4b0c88 with all server CI checks green, and the Android workflow pins that revision. The six shared native sample instrumentation tests passed on API35. The local server and emulator restarted after the workstation crash with data preserved. + +Physical acceptance now includes the Zebra TC22 on Android 14 with DataWedge 13.0.325. The latest normal APK was installed with login/enrollment preserved; browser record approval displayed one device approved. The native catalog and Scan Capture opened with Connected status. The DataWedge profile associates all scanner-app activities, enables barcode input, disables keystroke output, and sends the SCAN action/default category as a broadcast to the explicit package with signature checking enabled. The user performed two deliberate physical triggers and saw Saved scan. The matching persisted Code128 row was independently inspected in the backend: synthetic barcode QQQ-TEST-123456, symbology LABEL-TYPE-CODE128, source scanner, user scanner, TC22/Android14/app0.1.0, mobileScanApp/mobileScanCapture, and capture/receipt timestamps. The two deliberate Code128 triggers produced two records, one event per trigger. A subsequent physical QR scan also displayed Saved scan; the independently inspected row preserved the leading-zero barcode 001234567890, symbology LABEL-TYPE-QRCODE, scanner source and the same TC22/user/app/process attribution with capture/receipt timestamps. The table contained exactly three records for two Code128 triggers and one QR trigger. Connection-loss/retry and revoked-device behavior still need physical-device acceptance; emulator checks do not replace those cases. + +## Earlier verification records + +2026-10-30 process E2E follow-up: added a real scanner-host Compose instrumentation scenario against a fresh QQQ demo database. It drives server selection and login, confirms pending enrollment, approves through the real admin process, selects the native app/process, submits a leading-zero manual barcode, waits for the actual saved-scan acknowledgment, independently queries durable provenance, and verifies a revoked device cannot save through its already-open process. The final scenario passed on API35 (one end-to-end test, 50.932 seconds), including completion of administrative result screens. It uses the separate `io.qrun.mobile.scanner.e2e` application; the operator's app, accounts, data and existing forwarding are preserved. Random test credentials are passed through stdin to private app storage and redacted from reports. The runner removes both test APKs and cleans up its temporary server/database and dedicated forwarding; only the normal scanner package remained installed after verification. Added a pinned companion-server checkout and this E2E to the push/PR emulator lane; hosted execution remains unverified until publication. Final required Gradle verification passed: 28 JVM tests, lint zero errors/six existing warnings, normal debug APK and isolated E2E/test APKs assembled. Actionlint, Node syntax validation and diff whitespace checks passed. + +2026-10-30 follow-up: the scanner could show a blocking “No Network Connection” dialog while its server footer correctly said Connected. The shared legacy callback used one Boolean for multiple networks; losing either network incorrectly marked all connectivity unavailable. It now tracks network handles, with two regression tests that fail against the old logic. Scanner hosts opt out of the legacy internet-presence modal and use the existing server reachability footer; server authentication and device approval are unchanged. All 28 JVM tests and six native API35 instrumentation tests passed, lint has zero errors/six warnings, and the replacement APK was installed without clearing app data. Scanner activity and its existing session were restored after tests. + +The local AVD is configured for host NVIDIA graphics (`hw.gpu.enabled=yes`, `hw.gpu.mode=host`), with the previous config backed up under the user's cache. Reopening with `-gpu host -no-snapshot` and restoring adb reverse showed Home frame percentiles of 16/17/18 ms (50th/90th/99th) and scanner 19/22/48 ms. These are post-restart observations, not a controlled before/after benchmark; the original slow process had already exited. The actual previous renderer had used the GPU despite the saved AVD setting, so disabled GPU is not established as the root cause. The admin browser is open at the demo login on port57832. + +2026-10-29 verification: all 26 JVM tests passed, lint reported zero errors/six warnings, and the debug APK assembled successfully. Runtime diagnostics now include sanitized native API and device-request outcomes, in addition to branding and heartbeat events. Android 15 system-bar insets were corrected after emulator inspection. The shared mobile library now declares its connectivity permission for all consumers. Login copy uses a neutral title beneath the customer branding. CI APK artifacts include their own `SHA256SUMS`; local builds can be hashed with `Get-FileHash`. + +Repository implementation is published for review in [PR #8](https://github.com/QRun-IO/qqq-android/pull/8); it has not been merged or released. The branding/diagnostics commit `a5621c5` passed all hosted CircleCI, scanner build and CodeQL checks. The optional manually dispatched hosted emulator lane was skipped; local native emulator tests passed. The companion qbit is published at https://github.com/QRun-IO/qbit-mobile-scanners, with all hosted server/CodeQL/demo checks passing and protected branches/security settings enabled. + +Final-APK acceptance passed: six native UI tests, safe Android 15 header insets, customer branding, neutral login text, diagnostic panel and Connected → Disconnected → Connected recovery. APK SHA256: `A25451EA7A1360474428F1B806134DDFD059190FB99E81B4F69E720808C3209C`. The visible API35 emulator is left at login with `http://127.0.0.1:8080/` forwarded to host demo port57832. No credentials were entered or scans submitted through the emulator; the full operator/approval/capture walkthrough and physical TC22 remain pending. The server HTTP acceptance suite separately verifies the complete authorization/capture flow. + +Earlier implementation records follow; the publication and emulator statements above supersede their original pending status. + +Runtime branding and diagnostics added: public server metadata supplies display name, primary color, and an optional HTTPS logo; malformed/missing metadata uses QQQ defaults and server changes reset presentation. A persistent foreground connection footer checks the public status endpoint, with bounded credential-free diagnostics Copy/Clear. Shared top-bar colors now use the matching Material foreground role and its connectivity callback is disposed correctly. Branding/status protocol, isolation, malformed input, response redaction, and log bounds have JVM regression tests. Validation passed: full 23 JVM tests (core12, mobileapp4, scanner7), debug APK assembly, and lint with zero errors / six warnings. The new APK SHA256 is F388AF488688DE87811FE32C94D07601DC3DD61ADAC139069ADCFA627E21D01C. Updated emulator UI acceptance is pending. + +Follow-up: diagnostics now also collect fixed native QQQ/device request outcomes through an optional, exception-isolated observer (status and latency only). Added regression cases for HTTP errors, transport failure, observer exceptions, and category formatting. Emulator confirmed F388 branding/login/Connected footer/diagnostics; observed Android15 system-bar overlap corrected with safe-drawing insets. Final verification for these follow-ups is pending. + +2026-10-29: Implementing QQQ Mobile scanner host and native host extensions. First target is Zebra TC22, online only. Backend companion is `qbit-mobile-scanners`; metadata-defined apps/processes remain the native execution model. Device approval is mandatory. Local demo uses QQQ TABLE_BASED auth on QQQ4.1.0-RC.20. + +Implemented server selection, per-server enrollment credentials, approval gate, SCANNER widget DataWedge input, explicit same-event retry, native password login, host extension points, and removal of session/token logging from touched authentication paths. No commit or push. + +Validation passed: 19 JVM tests (core12, mobileapp4, scanner3), debug APK assembly, APK signature verification, and lint with zero errors. Five lint warnings remain: three inherited Navigation custom-check compatibility warnings and two dependency/catalog notices. Real sanitized demo HTTP metadata/process/init fixtures deserialize through the native DTOs. Server logout, HttpOnly-cookie login, and per-origin header isolation have regression tests. Physical TC22 acceptance remains required. + +Previous pre-branding debug APK SHA256: B3E160CE3279C369CEDB425AC6E777A2729CE8A2E430E7D6F46D35C6376F8214. + +Repository readiness added: pinned GitHub scanner tests/lint/APK artifacts and optional emulator workflow; CODEOWNERS, contribution/security/conduct guidance, issue/PR templates, Dependabot, changelog, editor/line-ending policy, and scoped agent instructions. `actionlint`, `shellcheck`, `shfmt`, and `git diff --check` passed. Upstream main `63fca89` was fast-forwarded and all implementation files restored without conflicts; the managed CircleCI Android profile and QRun-IO Maven registry updates are preserved. The full Gradle verification command passed again after reconciliation (16 executed tasks, remaining unchanged tasks up to date). Remote CI and emulator acceptance have not yet been recorded here. diff --git a/docs/history/TODO-before-record-ux-2026-11-05.md b/docs/history/TODO-before-record-ux-2026-11-05.md new file mode 100644 index 0000000..ca6e209 --- /dev/null +++ b/docs/history/TODO-before-record-ux-2026-11-05.md @@ -0,0 +1,44 @@ +Historical checkpoint before the November 5 record UX update. Current state is in [session state](../SESSION-STATE.md). + +# Checklist + +As of 2026-11-04, scanner host and local Echo scope only. Narrative: [SESSION-STATE](../SESSION-STATE.md). Completed and superseded items are kept in [docs/history](README.md). + +## Active feature delivery + +- [ ] Complete final review and deployment preparation for GS1 duplication and record photos; composed-server and native checks passed. +- [ ] Qualify actual GS1 label media, physical trigger and printed-label rescan. +- [ ] Deploy the reviewed app/server changes only with authorization, preserving ordinary app data and enrollment. + +## Local demo (accepted) + +- [x] Application work merged to protected `main`; `.gitea/workflows/qrun-android-release.yaml` present. +- [x] Local server on port 57832 (QQQ 4.1.0-RC.21, Printing 1.0, qualified owner inputs) running UI API 1.10, mobile 1.5, printing 2.3, record-files 1.0. +- [x] TC22 on the development APK against that server; operator reported the outstanding manual acceptance group ALL PASS (2026-11-04), including label count/fidelity, camera, GPS and screen viewing; operator-reported, not instrumented or per-case evidence. +- [x] Echo setup (printer, label size, document, copies 1–100) and semantic native flow qualified, with simulated inputs/printing in disposable runs. +- [x] Real desktop Authentik acceptance with strict TLS. + +## MC9400 remaining check + +- [x] Production-signed APK installed and launched on a fresh MC9400; hash read back. +- [x] Switched to the TC22 development APK demo configuration at the user's request; signed in and approved (APPROVED). +- [ ] Physical MC9400 trigger scan reaches the backend (Saved scan and a matching server record). + +## Release qualification + +- [x] Signed-APK/MDM channel chosen; QRun-owned key created with verified backup; signed 1.0.0 (versionCode 2) built and verified locally. +- [x] Direct-install guide written ([INSTALLATION](../INSTALLATION.md)). +- [ ] Qualify the production-signed APK on a device against an HTTPS server (enrollment, scanner path, navigation, update). +- [x] Signed preview published: Gitea prerelease `scanner-v1.0.0` (APK and `SHA256SUMS` only; local install kit not hosted). +- [ ] Distribution to the remaining devices after qualification; MDM later. Promotion to a stable release needs the qualification above. +- [ ] Automatic signing/publication pipeline: not configured; owned by the shared CI design, not needed for manual distribution. +- [ ] Actual on-device Authentik callback (unverified; no separate evidence). + +## Dependencies and provisioning + +- [ ] Public, reproducible publication of the Generation, Record Files and Scripting owner inputs (currently qualified inputs). +- [ ] Company profile / EHS / OEMConfig / MDM deployment verified on a device ([DEVICE-PROVISIONING](../DEVICE-PROVISIONING.md), [COMPANY-PROFILE](../COMPANY-PROFILE.md)). +- [ ] Legacy source follow-ups ([LEGACY-SOURCE-FOLLOWUPS](../LEGACY-SOURCE-FOLLOWUPS.md)). +- [ ] Extend the [native component boundary](../UI-API.md) (possible values, record lists, specialized forms, reports) with conformance and E2E coverage as needed. + +Offline queueing and background synchronization are outside version one. diff --git a/docs/history/TODO-through-2026-11-04.md b/docs/history/TODO-through-2026-11-04.md new file mode 100644 index 0000000..635d69e --- /dev/null +++ b/docs/history/TODO-through-2026-11-04.md @@ -0,0 +1,142 @@ +> Historical record, superseded by [current status](../SESSION-STATE.md). Do not treat as current. + +# TODO +Current status (November 4): + +- [x] Rewrite [RELEASING.md](../RELEASING.md) as concise Gitea-first signing/release readiness; legacy GitHub workflows marked historical. No keys, secrets, tags, releases, CI, build or source changed. +- [x] Production signing decisions made (November 4): signed APK/MDM; new QRun-owned key `qqq-mobile-release` (PKCS12 RSA 4096, certificate SHA-256 `BDDB2D2F...5B17A9FF`, valid through 2056-10-27); backup in the owner's Personal 1Password vault `QRun`, recovery verified 2026-11-04. No CI/Infisical activation; shared CI/CD redesign paused separately. +- [x] Local signed artifact and verification complete (November 4): 1.0.0/versionCode 2 from main `0ae2101` (lint/assemble 0 errors, 0 warnings), signed in isolation; `QQQ-Mobile-1.0.0.apk` SHA-256 `EE5AC896...79394D51`, v2+v3 verify, single signer with the fingerprint above, 16 KiB alignment, non-debuggable. Not installed, published or production-qualified; TC22 development-signed install/data intact. +- [x] Direct-install guide prepared ([INSTALLATION.md](../INSTALLATION.md)) for a couple of devices; not deployed, and no physical test of the production APK is claimed yet. MDM follows later. +- [ ] Qualify the actual production-signed APK on a planned migration or other device (install, enrollment, scanner path, navigation, update). The development-signed TC22 cannot upgrade in place to the new key; never uninstall/reset it implicitly. Requires an HTTPS server. +- [ ] First direct installation and device qualification, then distribution to the remaining devices; MDM can follow later. Automated signing/publication pipeline work remains paused with the shared CI hold, independently of authorized manual distribution. Details in [RELEASING.md](../RELEASING.md). + +Latest November 3 checkpoint (current; supersedes the older entries below): + +- [x] Android `f72b90d` the signed application-code commit published in PR 10 (SSH read-back verified); Gitea CI 3480 succeeded (unit-test, device-test, package, secrets, gate); clean merge-tree with `main` b75fdac, nothing merged. Pull requests #8 and #10 remain open; merge and release not done. This update changes documentation only. +- [x] Fresh disposable TC22 Echo ten-stage run: 109/109 semantic requests (simulated inputs/printing); installed APK `4AAB6951...AB850E` unchanged data. +- [x] Fresh real Authentik desktop acceptance passes; native harness compiled, 8 launcher guards pass. [ ] On-device run awaits the temporary CA and PIN; no trust bypass. +- [x] Server-side RC.21 gate PASS: 377 unique tests plus 15 real admin-browser E2E on public RC.21; the earlier MySQL timeouts did not recur. [ ] It is public core RC.21 with qualified private owner inputs, not a public/released cohort; the normal runtime core is not upgraded and Echo on RC.21 is not installed. + +- [x] Install final client over the normal TC22 with signature match/data preserved; existing sign-in/approval and Connected verified. Settings include portrait, location reporting and working wallpaper preview. +- [x] Fresh 222 JVM tests, lint zero errors/warnings, all APK builds, 23 Node tests and 255-file standards gate; updated ten-stage native Echo acceptance passes with simulated scans/printing. +- [x] Integrate and compile opt-in real Authentik Android acceptance; real-provider desktop acceptance rerun passes all six phases with strict TLS. +- [ ] Run real native Authentik after temporary CA installation/device interaction. Confirm physical scanner/label count/fidelity, camera/GPS/projection/profile behavior. Complete shared artifact publication/hosted CI; signing remains last. + +Current checkpoint (November 2, copies adoption; supersedes older source/runtime notes below): + +- [x] Verify optional Copies per scan through the actual generic native UI: default 1, range 1–100, selected 3 retained across two scans/recreation, and Apps/Leave; ten stages, 116 documented requests. Normal TC22 setup shows 1 against the updated local server. +- [x] Combined candidate gate: 222 JVM tests, lint zero errors/warnings, debug/E2E/test APK compilation and 15 Node tests. Normal installed APK remains D8109C61; newer feedback/profile/wallpaper/AIM code is not installed. +- [ ] Physically confirm label quantity and barcode fidelity. Native Authentik and camera/GPS/projection qualification remain open while the operator is remote; temporary CA installation is unconfirmed. +- [ ] Coordinate canonical Generation copies adoption and coherent publication/CI. Signing/distribution remains last. + +- [x] Implement negotiated mobile1.5 raw-byte transport with immutable capture, same-server capability gating and byte-identical failed-request retry;185 JVM tests, lint0errors/0warnings, debug/E2E builds and QA test compilation pass. +- [ ] Qualify new raw-byte delivery on TC22 and complete actual AIM extraction/decoder-profile checks. Current source leaves AIM absent and does not change hardware configuration; full Echo fidelity is still open. +- [x] Verify native `Origin` compatibility:174 JVM tests, lint0errors0warnings and APK build pass; normal TC22 login/approval/heartbeat/Echo setup/printer-media choices/Cancel-Leave pass against the strict local Echo host through8080->57832, preserving data. + +- [x] Verify generic INTEGER Document choice/dependency clearing on actual TC22:7 stages,112 semantic requests,99 focused/host tests and8 Node guards; simulated printing, normal data preserved. +- [x] Connect the installed print client to the single local server and publish the actual Echo4x1 document through native QQQ processes. +- [x] Resolve the printing agent's earlier 4x6 media report versus loaded 4x1 stock: the Printing owner aligned 101600 x 25400 micron/300 dpi media and the TC22 selected the real printer, fresh 4x1 media and published document; Next succeeded. +- [ ] Complete one physical Code128 (QQQ-TEST-123456) scan, print and rescan on the TC22, then leading-zero QR. One separate synthetic HTTP Echo event reached the actual Windows spooler; physical paper and handheld print/rescan remain unconfirmed. +- [ ] Qualify public coherent artifacts and primary Gitea CI; signing and distribution stay last by user decision. Core PR 1337 normal CI and publication are not established; do not repin default dependencies. + +- [x] Add metadata-driven Echo acknowledgment/manual-entry hints with old defaults; 167 JVM tests, strict compilation, lint zero errors/warnings and debug build pass. +- [ ] Qualify native Echo scan/print-acceptance with independently decoded physical output (setup and Leave against the real owner adapters are verified; source tests are not physical printing evidence). +- [x] Verify Query artwork, Dogfooding/Query links and licenses on the normal TC22 About screen using filtered accessibility data. + +- [x] Apply scoped copyright/import/header/formatter corrections, mechanical CI gate and Kotlin warnings-as-errors;163JVM plus46TC22 sample native cases pass. See [review](../CODING-STANDARDS-REVIEW-2026-11-01.md) for the remaining formatter CI limitation. +- [x] Add Query artwork, app version, Dogfooding/Query links and license access under Settings → About QQQ Mobile. +- [x] Qualify real Authentik desktop nonce rejection and retained-browser A → company logout → fresh B; actual Android callback acceptance remains separate. + +- [ ] Resolve the explicitly retained [legacy source follow-ups](../LEGACY-SOURCE-FOLLOWUPS.md): metadata typing, renderer contracts, navigation/action validation and build identity. Removing inline work markers does not implement these features. + +- [x] Replace the raw diagnostics popup with tested full-screen status/activity, filtering, pause, copy/share/clear and Back; 159 client JVM tests, zero-warning lint/build and the focused TC22 diagnostics UI test pass. +- [x] Default foreground location reporting on, preserving explicit opt-out and one-time Android permission behavior; settings/policy tests pass. +- [x] Verify current trusted EMDK Code128, QR leading zeros and menu/reopen on installed checkpoint1c766bf/E34AC3C6. +- [ ] Observe the diagnostics/location update on the normal package, grant/deny/restore location permission and verify an actual provider fix; keep physical lifecycle/outage/retry and provider acceptance gates open. + +- [x] Verify the API1.10 original-nonce and optional company-logout client patch: 151 JVM tests, zero-warning lint/build and 28 disposable TC22 native authentication/lifecycle tests pass; independent 26-file source review completed with no findings. +- [ ] Qualify the paired strict server policy and actual Authentik A-to-company-logout-to-B handoff, including the exported native callback and real SDK/browser logging boundary; synthetic native tests do not close this gate. + +- [x] Verify current TC22 Code128 hardware trigger-to-save on the trusted EMDK path with operator Saved scan, matching backend source/model and distinct event identities; see [physical evidence](../PHYSICAL-TC22-ACCEPTANCE.md). +- [ ] Finish current EMDK leading-zero QR, repeat-intent, lifecycle/ownership and retry/leave acceptance; historical DataWedge scans do not qualify these checks. + +- [x] Verify the synchronized rotation/recreation assertions in both5ba GitHub native runs; one entire run passed and the other reached a later fresh-login timeout. +- [x] Verify final fresh-login readiness at229fce3 and the later portrait-default7de checkpoint: all eleven hosted checks pass, including native navigation/input, PixelCopy and semantic scenarios with a new session. QR documentation2e0fd962 does not qualify physical QR acceptance. +- [x] Make portrait the default for missing/invalid preferences while preserving explicit choices; four focused tests, lint/debug assembly and preserving TC22 install pass, with actual requested portrait orientation confirmed. +- [ ] Finish the operator walkthrough on the newly updated normal TC22 app; private data/enrollment and the development signing identity were preserved. +- [x] Compile the opt-in screen-consent QA harness and ordinary E2E tests; verify early opt-in/protected-port safety gates. Actual permission/display acceptance remains open. +- [x] Compile/review additive consent-based device-screen client and paired1.2 server:137 JVM, package/lint/APK inspection, ordinary-UID TC22 scan-input rejection,39 server/six demo/all15 browser cases and strict provenance pass. Actual projection acceptance remains separate. +- [ ] Execute opt-in actual Android consent, notification, Home/background pixels, Stop, lease expiry, lock/rotation and forced-session-end acceptance on the refined device-screen candidate. +- [x] Supersede the historical hosted Back/focus failure gate with all eleven passing checks at7de; retain the failed-job diagnostics and actual Back/focus regression requirements in history. +- [x] Establish the current EMDK Code128 positive control after the historical failed attempt: eight priorF3AF events and oneC891 event are verified. Preserve the failed-attempt evidence and bounded operator stage; QR/lifecycle/retry acceptance remains open above. +- [x] Resolve normal backend ownership and perform the reviewed API 1.9 upgrade with fresh backup, original-column/data checks, recovery logins and live account validation; preserve the operator APK. Private verification confirms two devices and three scans retained. + +- [x] Verify five client audit fixes: password/legacy callback origin binding, independent local Auth0 sign-out, sample release HTTPS and no-backup session storage. The batch passes 109 JVM tests and all 32 selected TC22 native cases; packaged release controls are inspected. See [review scope and evidence](../SECURITY-REVIEW-2026-10-31.md). +- [x] Verify the trusted scanner-ingress replacement with production-path ordinary-UID rejection and actual installed EMDK Code128 positive controls. Preserve the historical security report scope; this does not close the remaining physical lifecycle/QR matrix. +- [x] Correct the demo's mixed RC.20 runtime and test-engine dependencies; qualify exact-source core `ecf0f550a0357cec6387c2b54efca128a405a629` with server `b14d925b741e815d1cfa4f62301f19207f25b03f`. Fresh37 server/five demo, strict provenance and all15 nullable-admin/session-monitor/browser cases pass. Core full closure:4,507 discovered/16 existing skips/zero failures/errors. +- [x] Reverify hosted Back/focus behavior at7de with real Back injection and the focus guard; historical failures remain documented in session state. +- [x] Qualify stable Auth03.0.0/Coil3.0.4, notice-generator incremental inputs and overlay/window-focus scan gating:127 JVM,34 shared TC22 cases, an additional eight-overlay native regression, ordinary-UID injection rejection and all package/lint/notice gates pass. See [candidate acceptance](../TRUSTED-SCANNER-ACCEPTANCE.md). +- [x] Resolve viewing scope through optional operator-consented DEVICE_SCREEN on mobile1.2 source, retaining default APP_CONTENT and old-server compatibility. Actual projection acceptance remains open; normal mobile1.1 runtime exposes app-content only. + +- [x] Verify the unconfirmed-scan exit correction: 46 mobile JVM tests and all 21 selected TC22 native cases pass, including failed cancellation and explicit Leave anyway with preserved receipt/retry identity and in-flight/photo guards. +- [ ] Finish the operator walkthrough of the unconfirmed-scan exit correction on the normal scanner installation. + +- [x] Qualify semantic OAuth2 client protocol/policy and generated notices; all seven synthetic browser-result cases and the selected native navigation suite passed on TC22. See [acceptance evidence](../NATIVE-AUTH-ACCEPTANCE.md). +- [ ] Complete actual configured Authentik acceptance: real browser/exported-callback round trip, authorization rotation/process death, and next-operator switching with prior browser SSO. See [authentication deployment](../AUTHENTICATION.md). +- [x] Verify the single hamburger drawer correction: no duplicate Apps/Switch app controls, fixed Settings/Diagnostics, signed-out gating, drawer Back preserving drafts, and guarded Home/app switching with exactly one cancellation. + +- [x] Verify persisted device Orientation choices on TC22, including process draft and pending-photo preservation across rotation. + +- [x] Implement and verify [navigation UX](../NAVIGATION-UX.md): primary Apps/app/process navigation, secondary Account/Settings/diagnostics, shared Back/leave policy, protected in-flight operations and sign-out lifecycle. +- [x] Prepare independent scanner release workflow and environment-only signing/version configuration; actionlint passes. +- [x] Independently review the exact release workflow, reusable verification and Gradle signing configuration; see [review scope and hashes](../RELEASE-AUTOMATION-REVIEW.md). No actionable source finding; external protection settings are not verified by this review. +- [ ] Configure reviewed GitHub release protections and the organization signing identity, verify the actual signed APK and upgrade/migration, and publish only after all [release prerequisites](../RELEASING.md) pass. Signing/distribution remains owner-deferred until the final step. + +- [x] Correct false legacy network blocking while the scanner's server is reachable; preserve multi-network connectivity for shared clients. +- [x] Persist workstation host-GPU configuration and document cold-start commands. + +- [x] Add runtime server branding and a foreground connection footer with bounded sanitized diagnostics. +- [x] Verify customer header/theme, diagnostics and connection loss/recovery on the emulator. +- [ ] Verify customer-specific logo assets and physical TC22 appearance. + +- [x] Complete Gradle unit tests, debug APK, signature, and lint verification (26 tests; zero lint errors). +- [ ] Complete the current EMDK physical matrix: QR, lifecycle/ownership, retry/revocation, bad credentials, sign-out and re-login. The completed DataWedge checks below are historical and do not qualify current EMDK behavior. +- [x] Verify TC22 physical Code128 and QR triggers through DataWedge intent output, visible Saved scan, preserved leading-zero QR data and independently inspected backend provenance; two Code128 triggers plus one QR trigger produced exactly three records. +- [ ] Verify release APK signing/distribution separately; current deliverable is a debug APK. +- [x] Reconcile exact historical project-owned source license boilerplate and the IDE template with the existing Apache-2.0 migration; preserve copyright ownership and other notices. +- [ ] Verify third-party asset/dependency attribution and signed release/upgrade delivery before production distribution. +- [ ] Configure and test production identity-provider integration; TABLE_BASED remains supported, and native OAuth2 requires explicit server advertisement and callback registration. +- [x] Implement public `/qqq/v1/version` compatibility checks before credentials or native screens, including required features and the registered mobile-scanners extension. +- [x] Implement semantic process completion, field/step updates, editable/view forms, backend cancellation and explicit unsupported-component blocking. +- [x] Verify semantic migration JVM suites: 53 tests passed (core 21/mobileapp 23/scanner 9), including hidden fields, explicit null clearing, generic event ID isolation and completion when the server omits `nextStep`. +- [x] Verify companion browser E2E after the semantic migration: six scenarios passed in 2.9 minutes. +- [x] Require Android client-channel discovery; companion real HTTP tests use the Android header on every request and pass. +- [x] Complete final JVM/lint/build verification of this semantic API migration: 53 tests, zero lint errors/six warnings, normal debug and isolated E2E/test APKs. +- [x] Verify all six native scenarios across focused runs and the OpenAPI request audit: incompatible core, missing extension, missing Android channel, baseline/additive scans and native administrative forms. +- [x] Identify the TC22 through ADB, authorize USB debugging, install the latest normal APK with login/enrollment preserved, approve its device record and open native Scan Capture with Connected status. Initial Code128 decoding passed; the remaining physical matrix is still pending. +- [ ] Extend the [documented native component boundary](../UI-API.md) with remote possible values, record lists, specialized forms and table/report/download screens as required; add conformance and rendered E2E coverage for each new capability. + +Offline queue/background synchronization is deliberately outside version one. +- [x] Implement semantic mobile session activity, server termination, demand-based own-app screen viewing and optional foreground location. +- [x] Add capture lifetime/lease/race tests, complete scanner receipt checks, strict maxLength and NavController regression coverage. +- [x] Verify short-viewport login and focused long-form submission after IME Done and dismissal handling. +- [x] Complete integrated session/native administrator termination E2E and all 12 shared TC22 navigation/input/account tests; local emulator remains closed. +- [x] Freeze and review session/whole-device source within the documented security scopes and independent architecture A1–A11 closure. Final release revision/scope and external-runtime gates remain in the release ledger. +- [x] Integrate camera/gallery with Record Files typed routes and guarded optional bridge fixture; synthetic native E2E verifies persisted receipt, rotation and forced-logout cleanup. +- [ ] Complete actual camera-lens/operator acceptance after final runtime installation; synthetic activity results do not prove the OEM camera application flow. +- [x] Supersede the October31 hosted checkpoint gate with all eleven passing hosted checks at7de; retain earlier revision-specific results as history. +- [x] Verify the published push/PR native E2E lanes through the current7de hosted checkpoint; physical operator acceptance remains separate. +- [x] Run the native sample instrumentation suite (six passed on API35). +- [x] Add and run real-server scanner-host E2E: login, pending enrollment, approval, native app/process selection, manual scan persistence and revoked-device denial. Use an isolated app ID and database. +- [x] Run and verify native real-server E2E on pushes and pull requests; current7de hosted checks pass. +- [ ] Complete the final operator walkthrough on TC22 after updating the preserved demo/runtime, including outage/reconnect and real camera capture. + +- [x] Implement named semantic process choices and qualify Echo native setup/two scans/rotation/Apps Leave onTC22 (169JVM,8guards,86documentedrequests; printing simulated). +- [x] Real Echo host and owner adapters are composed and running in the single local server (see the Origin item above). +- [ ] Print a physical label and rescan the exact value and type (tracked above). + +- [x] Clear scanner feedback on process reset; 57 mobileapp JVM tests, zero-warning scanner lint, debug build and 255-file standards pass. Hosted checks and PR10 → PR8 → main integration remain pending. + +# Scoped administrator viewing update — November 2 + +- [x] Remove app-authored viewing stop controls, verify the existing native session-monitor flow and install on TC22 with app data preserved. Retain the visible indicator, Android consent/system stop controls, server leases and authorization. diff --git a/docs/images/record-ux-2026-11-05/tc22-ux-actions.png b/docs/images/record-ux-2026-11-05/tc22-ux-actions.png new file mode 100644 index 0000000..3a980e6 Binary files /dev/null and b/docs/images/record-ux-2026-11-05/tc22-ux-actions.png differ diff --git a/docs/images/record-ux-2026-11-05/tc22-ux-add-photo.png b/docs/images/record-ux-2026-11-05/tc22-ux-add-photo.png new file mode 100644 index 0000000..91e0c6a Binary files /dev/null and b/docs/images/record-ux-2026-11-05/tc22-ux-add-photo.png differ diff --git a/docs/images/record-ux-2026-11-05/tc22-ux-back-preserved.png b/docs/images/record-ux-2026-11-05/tc22-ux-back-preserved.png new file mode 100644 index 0000000..d0cc50f Binary files /dev/null and b/docs/images/record-ux-2026-11-05/tc22-ux-back-preserved.png differ diff --git a/docs/images/record-ux-2026-11-05/tc22-ux-display-record.png b/docs/images/record-ux-2026-11-05/tc22-ux-display-record.png new file mode 100644 index 0000000..79267d8 Binary files /dev/null and b/docs/images/record-ux-2026-11-05/tc22-ux-display-record.png differ diff --git a/docs/images/record-ux-2026-11-05/tc22-ux-history.png b/docs/images/record-ux-2026-11-05/tc22-ux-history.png new file mode 100644 index 0000000..e406c14 Binary files /dev/null and b/docs/images/record-ux-2026-11-05/tc22-ux-history.png differ diff --git a/docs/images/record-ux-2026-11-05/tc22-ux-items.png b/docs/images/record-ux-2026-11-05/tc22-ux-items.png new file mode 100644 index 0000000..6abc45f Binary files /dev/null and b/docs/images/record-ux-2026-11-05/tc22-ux-items.png differ diff --git a/docs/images/record-ux-2026-11-05/tc22-ux-photos.png b/docs/images/record-ux-2026-11-05/tc22-ux-photos.png new file mode 100644 index 0000000..8b31e51 Binary files /dev/null and b/docs/images/record-ux-2026-11-05/tc22-ux-photos.png differ diff --git a/docs/material-icons-provenance.json b/docs/material-icons-provenance.json new file mode 100644 index 0000000..44f340a --- /dev/null +++ b/docs/material-icons-provenance.json @@ -0,0 +1,81060 @@ +{ + "upstreamRepository": "https://github.com/google/material-design-icons", + "upstreamRevision": "d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b", + "license": "Apache-2.0", + "comparison": "SHA-256 of ordered XML-decoded Android pathData strings joined with LF, no final newline", + "resources": [ + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/__ft_apart.xml", + "upstreamIcon": "6_ft_apart", + "upstreamPath": "android/social/6_ft_apart/materialicons/black/res/drawable/baseline_6_ft_apart_24.xml", + "upstreamSha256": "813de47aaa5eb488d77f3b99bcc197f7a180e94fd66d04cb0cc0a7043fe90f92", + "localSha256": "d8a82a176deae106112d003fdf3afb3dfc6d9db1bc2bb8f64c967b92785e8b69", + "orderedPathDataSha256": "4ec1446c3246dd7f50cea3fb13ec6f7f64b1d5e117784e295bb19de4483879d1", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/_0fps_select.xml", + "upstreamIcon": "30fps_select", + "upstreamPath": "android/image/30fps_select/materialicons/black/res/drawable/baseline_30fps_select_24.xml", + "upstreamSha256": "5bd2108c65d1802d1f956d7d2535a7ad1c2582a23e0bde3c95398232018e02bd", + "localSha256": "c58d5b2a774ba1fd7c454dfbbc758f4e1e575285ebe94f866be95312ff1c9ce9", + "orderedPathDataSha256": "99925c1d2784830fef1fd9474a9bae75449cae361eac4e801f85e38d17508e7e", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/_0fps.xml", + "upstreamIcon": "60fps", + "upstreamPath": "android/device/60fps/materialicons/black/res/drawable/baseline_60fps_24.xml", + "upstreamSha256": "07ee4832e9253c62356728b4113649b7f0d4e218b04a8a5cb10d5028a035be18", + "localSha256": "bf79c9f995ef9baf176dca9aa7246e1e28b03921d34e24fb19207c066b51fe13", + "orderedPathDataSha256": "5b6fd8f4f81a861e677c265c814bd521a86b9d942fc18d4fd7d4adcac68458e9", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/_0k.xml", + "upstreamIcon": "10k", + "upstreamPath": "android/av/10k/materialicons/black/res/drawable/baseline_10k_24.xml", + "upstreamSha256": "f0aad4fdf10b7a98705070a0384b5b7423dff7488a2a15ba09e5f804a89b30fd", + "localSha256": "0dda911d2a9af77cffd873f6ac71b221fd1c2e70d33adfc3e4f10973c082fa38", + "orderedPathDataSha256": "22167227f74b6a239940cb7a9182230623f33b504bd0bf14206bbc251920a004", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/_0mp.xml", + "upstreamIcon": "10mp", + "upstreamPath": "android/image/10mp/materialicons/black/res/drawable/baseline_10mp_24.xml", + "upstreamSha256": "3f3971d86c5bf47840f03aae2bc3f5af998c51f55dd30463b5df3779fcebfa19", + "localSha256": "afd0b648302e636d7d784dc00324cb18bc6c6d737fc1dd864acb5bfa8e1c7e5f", + "orderedPathDataSha256": "e34c80e1d5d12fd23c13a9addcd10b2dc83d4e31746145354280a480d2ec2acf", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/_1mp.xml", + "upstreamIcon": "11mp", + "upstreamPath": "android/image/11mp/materialicons/black/res/drawable/baseline_11mp_24.xml", + "upstreamSha256": "2160e609af5eed7cb5dcf9ea257cdbc4cb7e8fe382b655733379160312a915ba", + "localSha256": "900803cb064e73d49de76b1d0fc9de0a14c59142c1e9c748cf933fa1d6d7e0bf", + "orderedPathDataSha256": "eee6c120aa194a820c914294b63b3fe0c7f45994608e2d2c338c374eef734b9b", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/_23.xml", + "upstreamIcon": "123", + "upstreamPath": "android/action/123/materialicons/black/res/drawable/baseline_123_24.xml", + "upstreamSha256": "5bbb127cfe8f940ccca14e4e4587c7c3ab73bd91229d638be58f7992e054b21b", + "localSha256": "cc6fdd1b5f7e67d6b95cf13028ff8d6fe66167549b284160f9ce89a8b0705e72", + "orderedPathDataSha256": "66357b9711db8c2b6e9d344abdc7310ec4b5d3ea8a67a69d313e7bd8e51f9445", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/_2mp.xml", + "upstreamIcon": "22mp", + "upstreamPath": "android/image/22mp/materialicons/black/res/drawable/baseline_22mp_24.xml", + "upstreamSha256": "66cf0bdb88f7de9b486b0cae1633da8341082ac3695018d383c65a3653aac0b2", + "localSha256": "3d26d88cec07a62d871c9680a191ba232b69992c1083d8a90942eadada1db171", + "orderedPathDataSha256": "d6cb321018b677b15da47baee4fef4b301fc749f9de3b4166ec0849155c2552c", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/_3mp.xml", + "upstreamIcon": "23mp", + "upstreamPath": "android/image/23mp/materialicons/black/res/drawable/baseline_23mp_24.xml", + "upstreamSha256": "e82f1fdf7acbef7f9d8e2bb333bcb57c86ab5e13d5ca00e22b23d516751986bc", + "localSha256": "8634db7a0fa96738878b778896872f32a7da1f23d13bd99f77d5d5e80667cae5", + "orderedPathDataSha256": "0009e73c6e164ae6fdabbd8743639b0eb3905f4596bb57c76119ed583715e65c", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/_4mp.xml", + "upstreamIcon": "14mp", + "upstreamPath": "android/image/14mp/materialicons/black/res/drawable/baseline_14mp_24.xml", + "upstreamSha256": "e3f3a9200391b05f4fcee7f730a3d6f99b7d4ed4e2890e5b2e350f43cdb6b1e6", + "localSha256": "2bb67a453d73e94529c025551df6e95af0ab501d840dad6f8ac241740f217d6f", + "orderedPathDataSha256": "009545628f44a92a507ae5a295fe2cc59a185952632fd8ddecca6b26e551ef89", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/_5mp.xml", + "upstreamIcon": "15mp", + "upstreamPath": "android/image/15mp/materialicons/black/res/drawable/baseline_15mp_24.xml", + "upstreamSha256": "373a9eace3fc53051515bc2a9a3d97ca00a4452fd26604072517d40545f6675d", + "localSha256": "eb20031d3bd3cad281ffba91f165558e6df7728c25f538ed2ddbc3121c562018", + "orderedPathDataSha256": "aa5ce0bbabc8670d7d8bc43baebb613bfb0cb266a32e5ac9de47afbf5f21b055", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/_60.xml", + "upstreamIcon": "360", + "upstreamPath": "android/maps/360/materialicons/black/res/drawable/baseline_360_24.xml", + "upstreamSha256": "56294894345c5b94663dfc27b61046c3c6fc5d329d34e07b0b0311d823e9e9d7", + "localSha256": "cb3f833eb4c24d6bcc7c2a713426b2ad563fe703f20ec1fa2a1205cd0de6e4c4", + "orderedPathDataSha256": "329f8d5bce445dce6bf65e82300ffb178b157a5bebd3e80083921c7108f65d81", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/_6mp.xml", + "upstreamIcon": "16mp", + "upstreamPath": "android/image/16mp/materialicons/black/res/drawable/baseline_16mp_24.xml", + "upstreamSha256": "b79a54a1791dd9f669779343718b28a1b7be916302b65633ea2b0b539ba17b80", + "localSha256": "b447487cd87424c50fc4970c2dde0b8b651bf7d3a7c4522ef5c70a943c665b4d", + "orderedPathDataSha256": "806408df198251d3e042e067ec6e43404f6cf14782d024e468bd07f492072016", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/_7mp.xml", + "upstreamIcon": "17mp", + "upstreamPath": "android/image/17mp/materialicons/black/res/drawable/baseline_17mp_24.xml", + "upstreamSha256": "4023f6519a70450c1b9bbc71f29428cdf1cf79cfc4f90ed679700fd7feda9000", + "localSha256": "af4fc8f920ac28c00c78c926c9098848e692f18c29dd8dccbc88538875365741", + "orderedPathDataSha256": "4d97068f2c0663d7dc35a7785b3620d156fcd5129d6fac9694af0233a36e8d04", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/_8_up_rating.xml", + "upstreamIcon": "18_up_rating", + "upstreamPath": "android/social/18_up_rating/materialicons/black/res/drawable/baseline_18_up_rating_24.xml", + "upstreamSha256": "e1dde85e44212c5a17cb5b5c7d790b328e77ee3a9f45f8dc4c7e18565c9db748", + "localSha256": "80629c3d25529de48ce1aa5b0839a9fbc1a9c8b862e93bca32b7055571ef1cf2", + "orderedPathDataSha256": "bb84280c45c11c3ebd3bf8b075c216f5db3e0a0f9e3561e32464c89b6ee513cb", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/_8mp.xml", + "upstreamIcon": "18mp", + "upstreamPath": "android/image/18mp/materialicons/black/res/drawable/baseline_18mp_24.xml", + "upstreamSha256": "59f050b9d235596beba93d435afcd0f5d3db4a9fe6ff90717cc3069d8f02911b", + "localSha256": "6014e12a7185811e6c3e30099b58e1636a2a2f172312db7517fdd69f1df75639", + "orderedPathDataSha256": "734c592ebdb6491d8b344f216c82b5b005e32508739ee47fd79a2df4920dddcf", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/_9mp.xml", + "upstreamIcon": "19mp", + "upstreamPath": "android/image/19mp/materialicons/black/res/drawable/baseline_19mp_24.xml", + "upstreamSha256": "66f951afc2a439850cfeda483589aa41aab67481b1b8f8506deda71610b12faa", + "localSha256": "6aec5ac3607d2c4f51f3ae313dc31f6b0e428e6d322ae542b296e0d30a454ef4", + "orderedPathDataSha256": "2c2e3659d38f2f86a7291d013a54f27542c5e796c3fa17f14a45940673e13d5b", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/_d_rotation.xml", + "upstreamIcon": "3d_rotation", + "upstreamPath": "android/action/3d_rotation/materialicons/black/res/drawable/baseline_3d_rotation_24.xml", + "upstreamSha256": "91fa40b2989795b57f670f7d5119be319d304c80bed4e8f31f87d1767a358633", + "localSha256": "e7faaf908c37907ce1959f19c38200bfbf9ede7f567f55394c8fb75aed221763", + "orderedPathDataSha256": "45116cdf608284c032e86a34f3669c2dfbfab0ec113dc2994354d1d7687e9db7", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/_g_mobiledata.xml", + "upstreamIcon": "3g_mobiledata", + "upstreamPath": "android/device/3g_mobiledata/materialicons/black/res/drawable/baseline_3g_mobiledata_24.xml", + "upstreamSha256": "eba211fbb4b3604ef3aee81c3cb1b96209322f0ea139de11a767e9e6e94debfd", + "localSha256": "ddded1d0cc13e6256a5e3324859820dcf49bd97b46a81d063b34848ffde6ec9d", + "orderedPathDataSha256": "8449f9d1e010d8600abef1934260efa7bfc3e96a34315fc39f16c4abc08727d8", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/_g_plus_mobiledata.xml", + "upstreamIcon": "4g_plus_mobiledata", + "upstreamPath": "android/device/4g_plus_mobiledata/materialicons/black/res/drawable/baseline_4g_plus_mobiledata_24.xml", + "upstreamSha256": "e0495cacfe7edaec1ce4f026450d13acd4cd181e0d6c12ce6543da239e1a3fe7", + "localSha256": "4482472a68d290fd686e26d73c8e9d0681aae9c1b44be56f7649323a6e3f80c3", + "orderedPathDataSha256": "d41cae357b19f82bc2d800e337b8b6cbd3d55ad47920c70bb898d02ba0ff8c38", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/_g.xml", + "upstreamIcon": "5g", + "upstreamPath": "android/av/5g/materialicons/black/res/drawable/baseline_5g_24.xml", + "upstreamSha256": "7e1463ebc74d9133fecaa269ad8347595664dcd5a177e5398b0c4a0e8f1631ee", + "localSha256": "2e4734876ecd64eaa44616a8e734d065363988c629775cba306bf1b49eddeba1", + "orderedPathDataSha256": "05f5f1f1c939e14d71ee970ab83bb9519ad0c571b10d758e7243b7bdb47ba2f4", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/_k_plus.xml", + "upstreamIcon": "2k_plus", + "upstreamPath": "android/av/2k_plus/materialicons/black/res/drawable/baseline_2k_plus_24.xml", + "upstreamSha256": "b88631ea6622ed80fcd1b6c01f4b1b45a8b3ff9815d993b7ce8d5220c3f8b226", + "localSha256": "b5e159e6a78307c16067224fc9a3008297279998ed2d3f693ee9d5e19042c166", + "orderedPathDataSha256": "72d8ea8bd180ddfea63ccca945a720f3d7d215e77b903f1cd73a8579ea3aff7d", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/_k.xml", + "upstreamIcon": "2k", + "upstreamPath": "android/av/2k/materialicons/black/res/drawable/baseline_2k_24.xml", + "upstreamSha256": "252cc8f9c5d7fd8854c641eafbb95a01d23f9e53bc7159998221e9c73c2eb7d2", + "localSha256": "1342ac65a7bc13b1938be87276a15c4db1c34e94e4a8e09ecb7f8d48c9751e79", + "orderedPathDataSha256": "25b2ee3e248a917a07bcc8ca2eff976ea333aa58eb2bd4074b6b09142a85f9f2", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/_mp.xml", + "upstreamIcon": "4mp", + "upstreamPath": "android/image/4mp/materialicons/black/res/drawable/baseline_4mp_24.xml", + "upstreamSha256": "782f0d964684a5c41bc98f40b28fca614e50b9e5646e1860b3c0453ced519da7", + "localSha256": "3e3c7d73822b24deb4df3c4112941558c70cf2c92c0838d0ec84a66532945d69", + "orderedPathDataSha256": "afa5080d91efd8c71453dcc56fd60c5788de9dfe841c15e71ddd0ca4569bda46", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/_p.xml", + "upstreamIcon": "3p", + "upstreamPath": "android/communication/3p/materialicons/black/res/drawable/baseline_3p_24.xml", + "upstreamSha256": "3bc08bfd71d59922d3f54b608f0b5f2f54d778e2211ed591e02d68de88ada8ec", + "localSha256": "2a2a3876d1a2cc1704367617f6337bd0747657c0b9eec34040274abb38d3295a", + "orderedPathDataSha256": "412ab822647c9733d6dd8f6f4c0f96173ba37ffa79241e82faee866e7a23d88c", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/_x_mobiledata.xml", + "upstreamIcon": "1x_mobiledata", + "upstreamPath": "android/device/1x_mobiledata/materialicons/black/res/drawable/baseline_1x_mobiledata_24.xml", + "upstreamSha256": "efe9cc43f1ac7143795a6dd0426e46223188b07dea5697904a268a2b75969f71", + "localSha256": "f19c5c858ed95c5cb0e271cd3ea1549fb1dbd04433ff4ac3b30280aab491a3c9", + "orderedPathDataSha256": "4c0a2a7b846c43070d644b295c9dd11ca7b8ca72c6dac016ce19523646822314", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/abc.xml", + "upstreamIcon": "abc", + "upstreamPath": "android/action/abc/materialicons/black/res/drawable/baseline_abc_24.xml", + "upstreamSha256": "85b91238898031b037f964815fcc03adee4633d22ff6320125bf27078ea9a1f5", + "localSha256": "66069e50749c269a9ad7f310e6f817a3615978ae61be82434f79e15b47895e07", + "orderedPathDataSha256": "4ece03e8ae10f55cedfe98485a47006fc124327615cb5de415c6a71f1d8268c5", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/ac_unit.xml", + "upstreamIcon": "ac_unit", + "upstreamPath": "android/places/ac_unit/materialicons/black/res/drawable/baseline_ac_unit_24.xml", + "upstreamSha256": "2fc55b4c7f42f5e5438e1df94bd4969653c32800e08b10150f8aa7fa3b472d61", + "localSha256": "12d4b397230ae7ed982c6a1b9ba4e4d15e37886ef669df208ec7edbf9f009ba0", + "orderedPathDataSha256": "9d1ddbf4879eb90e86497a7942e53906ada0af4c0d698a7d5bb5f91b15742252", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/access_alarm.xml", + "upstreamIcon": "access_alarm", + "upstreamPath": "android/device/access_alarm/materialicons/black/res/drawable/baseline_access_alarm_24.xml", + "upstreamSha256": "c4883911cc9343bef46087798760cfc8bac56fec9ee973119738b18a3076c27e", + "localSha256": "ec2e8cbd4aeb45250e3fb171e7a53a0210f8d628b74264fff0a80191cc6ca7e1", + "orderedPathDataSha256": "61a8ddef82893d9beeacff084b17b017349b53a94d837ffef90364800d61179c", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/access_alarms.xml", + "upstreamIcon": "access_alarms", + "upstreamPath": "android/device/access_alarms/materialicons/black/res/drawable/baseline_access_alarms_24.xml", + "upstreamSha256": "1591e6524f35309d62236fb5994e9c96aad5cedebfa49fdba242028415c64fa5", + "localSha256": "d8ad9abc14fdf8bff79faab2b856c13e770d21361d56184a4d2976ffbca52e09", + "orderedPathDataSha256": "31d7faa678eb1d4c705eb65b9fb24e8ed1806da1a831f4e8ade29dea365eee9a", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/access_time_filled.xml", + "upstreamIcon": "access_time_filled", + "upstreamPath": "android/device/access_time_filled/materialicons/black/res/drawable/baseline_access_time_filled_24.xml", + "upstreamSha256": "f0aa70d773028a0509447f9380aa40374fb6cdb5d105b0f3dd2ecb923202ab38", + "localSha256": "6a9e146662be1214347f3d994d239420374778f6829f6e09c30171217ce56892", + "orderedPathDataSha256": "72f855c1c29c5afad20a07255f240cc9a4097b7a1baa3aedad2cddcbf7058478", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/access_time.xml", + "upstreamIcon": "access_time", + "upstreamPath": "android/device/access_time/materialicons/black/res/drawable/baseline_access_time_24.xml", + "upstreamSha256": "e4fe13ddb79b9673e2aacbf1493576b63664bb266e204afa24db83c6435f1ef8", + "localSha256": "b2cd165a3a4ed2cff25d044a2727c0b99748b5094c5fc4cc47989a1629458afe", + "orderedPathDataSha256": "0d3b3f6922f646d62e277f90cca992aefb17d92204d7ba2fc8d98d2659f5189e", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/accessibility_new.xml", + "upstreamIcon": "accessibility_new", + "upstreamPath": "android/action/accessibility_new/materialicons/black/res/drawable/baseline_accessibility_new_24.xml", + "upstreamSha256": "1296aeab4f0c7b7c03c0661e7ead0a47e46506d2d3ab5414a145273639f6430f", + "localSha256": "542512af1c62841a1f35234de3f83f77890096cac78cb47e8b59450bf725da01", + "orderedPathDataSha256": "9ed96a8b76898b94b513d18825d5eb0e30ac9b460301a00a7c0304649a058da9", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/accessibility.xml", + "upstreamIcon": "accessibility", + "upstreamPath": "android/action/accessibility/materialicons/black/res/drawable/baseline_accessibility_24.xml", + "upstreamSha256": "2dfe95706dba2b71f379599a8c7587fafd5c20d01597abcc5268128674ac3252", + "localSha256": "b6ad92d2aa98a97efb958008e6edfdf3cd96eaac598c00344060491fb9822121", + "orderedPathDataSha256": "9392867e3d6dee6146444007aa43c6b1df7344b1de075b7be0499e9d4d6eba60", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/accessible_forward.xml", + "upstreamIcon": "accessible_forward", + "upstreamPath": "android/action/accessible_forward/materialicons/black/res/drawable/baseline_accessible_forward_24.xml", + "upstreamSha256": "5e93aeba1ed867a71fcafc860f1e830293298895d9dad55b363a46362c2b5b0b", + "localSha256": "a00ce106410a9dca9cea884a824c3bf98918326cd2877738b60112993f7a5c47", + "orderedPathDataSha256": "0aa85d51d00a5aaedccad959806bb8dacccf5aa070239efb7d3a349efa4a35b7", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/accessible.xml", + "upstreamIcon": "accessible", + "upstreamPath": "android/action/accessible/materialicons/black/res/drawable/baseline_accessible_24.xml", + "upstreamSha256": "ab8f2296b8063934e4e40b88c9f57fc9820c53b3f9e754aaf3e1daa480003f90", + "localSha256": "1af0be942b899a10bf0edb0fc469df4e32ec8aa1e232026add0af2aae6f751ee", + "orderedPathDataSha256": "ff0492822bff2297f06041852b950436635304292464c8b9ba38e93b7eba0bde", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/account_balance_wallet.xml", + "upstreamIcon": "account_balance_wallet", + "upstreamPath": "android/action/account_balance_wallet/materialicons/black/res/drawable/baseline_account_balance_wallet_24.xml", + "upstreamSha256": "b92d4a46bd10b71edb5092639040467f802e3451938462a2ebe21ca5b408b0b8", + "localSha256": "88d5728a0c5a56e50574e9d86c1f5a0f58cfebc6f1034b34b5fd7fc19e752f54", + "orderedPathDataSha256": "0f6ac11c33edc2e3eca144a8e33e411e3c7e488b6c8394e58835233155f1e09c", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/account_balance.xml", + "upstreamIcon": "account_balance", + "upstreamPath": "android/action/account_balance/materialicons/black/res/drawable/baseline_account_balance_24.xml", + "upstreamSha256": "d5096358d521e88280c03ff7e57e631013771cae97bba2a5bcec1db076f662f8", + "localSha256": "986fd611f4c4841f43da728974bb38e0e466ef16422f06345e90bb5a9ff135bf", + "orderedPathDataSha256": "80da89238f503a1965ec4970c02025a7f62046d204b7112938d7ebc1afc37b51", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/account_box.xml", + "upstreamIcon": "account_box", + "upstreamPath": "android/action/account_box/materialicons/black/res/drawable/baseline_account_box_24.xml", + "upstreamSha256": "c9c41b2a6a0b8169ded6f122ccfec7359a6385ae1e5cd0edae93a9c82db39fea", + "localSha256": "d27e4b0187e777e3c71c474165bcd88d842f5fca89c285aa5852d9f48bd0e72b", + "orderedPathDataSha256": "e6e007d31fe3b5c92063d1441e238574171aa0ff84d41dfb04d1446ac49119e4", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/account_circle.xml", + "upstreamIcon": "account_circle", + "upstreamPath": "android/action/account_circle/materialicons/black/res/drawable/baseline_account_circle_24.xml", + "upstreamSha256": "19b7a3e4b26462c8b447424ed54e9d96adb1692fa5bbe380502c07ebaaffa69b", + "localSha256": "74162af01dbd2dd59bfb686c26b58e957dfbfc6d0debd630ee88902ef11f4666", + "orderedPathDataSha256": "38d6ff2fffc44534e930cda413c80df92513d04e400d0bd887d30908a561ac7b", + "originalGeometryMatched": false, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/account_tree.xml", + "upstreamIcon": "account_tree", + "upstreamPath": "android/notification/account_tree/materialicons/black/res/drawable/baseline_account_tree_24.xml", + "upstreamSha256": "47b982fee1aa78f3dead5e6d75846c788b32aa50f24599fa5a91fd3da7ff7bb8", + "localSha256": "55b477bbde1f559e987e2a48b0d87f5efebf3cdf04e41a2dcc5254869ac2628f", + "orderedPathDataSha256": "1c8a87b8897d8fdf8d1b29323bafbba7e6a90d3535df919f9f4786b501c2bfd7", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/ad_units.xml", + "upstreamIcon": "ad_units", + "upstreamPath": "android/device/ad_units/materialicons/black/res/drawable/baseline_ad_units_24.xml", + "upstreamSha256": "490b266d76282bd7fbe368767394a3f9ad68941aa062c7f6390698950f30caa0", + "localSha256": "753bf8a1b56ae05992a57468b57f4e9a815e1c420e6c07651a4cc291847a5279", + "orderedPathDataSha256": "657a323d034008e85ded449815d3cc29b49b4ac1fff40623c00e9180d98026df", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/adb.xml", + "upstreamIcon": "adb", + "upstreamPath": "android/notification/adb/materialicons/black/res/drawable/baseline_adb_24.xml", + "upstreamSha256": "91141110376a0a5eba47769addf4957c58b82f0d5c6b66f33dce3e2fd3a957c7", + "localSha256": "c2e5744d916b2839a8a65877f51891c72f1d43310efd45fe1cb2a905e27564ff", + "orderedPathDataSha256": "69269128058eaf1078b7b7c3219532cf1cb03185dd26b327f4aab86af8eb6e75", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/add_a_photo.xml", + "upstreamIcon": "add_a_photo", + "upstreamPath": "android/image/add_a_photo/materialicons/black/res/drawable/baseline_add_a_photo_24.xml", + "upstreamSha256": "8e7f78b3edb61b15a70cd6204e63d58d5fd55a1582808b6b9730139260c0ec46", + "localSha256": "ad21ff388846db723dd925319b504c928ca255ffbd6bad0f5fb5d00358cc64a2", + "orderedPathDataSha256": "a257c022414f6b320b1d64d3498978b5f68a76e856d8c76315c489d8b02a4e85", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/add_alarm.xml", + "upstreamIcon": "add_alarm", + "upstreamPath": "android/device/add_alarm/materialicons/black/res/drawable/baseline_add_alarm_24.xml", + "upstreamSha256": "fe9e1c3832cc07fb8883ee896ce7ccea98b129532b4f496d66cc5b335996ee42", + "localSha256": "6af9f18dbfd49c96bb7fd3f380d53a009779a0bb1575bb307113f2e652ce45a3", + "orderedPathDataSha256": "3f927087cf6c2dea74cbfe0ae659cdc79401450948b8702e69d7da0adbbc1cab", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/add_alert.xml", + "upstreamIcon": "add_alert", + "upstreamPath": "android/alert/add_alert/materialicons/black/res/drawable/baseline_add_alert_24.xml", + "upstreamSha256": "32d78aefc22f4ab4effc7fcca3cd9acebed8a5957897044f8a297ebe60f226a7", + "localSha256": "8e32d4772bee151704bd30906b5edef4c41691d3a431efe5b16a957e0b9ca37b", + "orderedPathDataSha256": "a7ee76e7403a725d1d83f009cc6bdeeffabf550450216645a37936f832d212c7", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/add_box.xml", + "upstreamIcon": "add_box", + "upstreamPath": "android/content/add_box/materialicons/black/res/drawable/baseline_add_box_24.xml", + "upstreamSha256": "d58c6640b1248ec6a6049c4bd2309a94447881077d21cb46069f5086e0b085c5", + "localSha256": "5b031b8445f93a3755f4c7ba94e0e8aaff8e504e5a5c532ec8ca1b3f9b05db3d", + "orderedPathDataSha256": "d0800e91c427560a1d5e3a64e4bbb3d795b4841e13415d1ce7d3c786a4775a52", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/add_business.xml", + "upstreamIcon": "add_business", + "upstreamPath": "android/maps/add_business/materialicons/black/res/drawable/baseline_add_business_24.xml", + "upstreamSha256": "e71dac54467a27def7e92b276c8061be9bd319f484926fb3b1689f6afbef2a8a", + "localSha256": "d578d5d53c8d555a17697c237563e62fea01a4cb829e7c44ce160f49db36d621", + "orderedPathDataSha256": "8c1d98a4517d932d98e8ccc97a97addb44f7a5013b642603e8ecef6a93abbd5b", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/add_call.xml", + "upstreamIcon": "add_call", + "upstreamPath": "android/notification/add_call/materialicons/black/res/drawable/baseline_add_call_24.xml", + "upstreamSha256": "27a7572206509325ac022fa8a9fdc5a677df3e888e097c1c369ffd1be9a37be7", + "localSha256": "dc4a00020f10d747bb8ff6ed8ef0cf432ff099be69016025c66d1c35570a70d8", + "orderedPathDataSha256": "9ca2c29c5811205505680c2b99ea4b931f49bc126357381907200f4736fe9f63", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/add_card.xml", + "upstreamIcon": "add_card", + "upstreamPath": "android/action/add_card/materialicons/black/res/drawable/baseline_add_card_24.xml", + "upstreamSha256": "42f7392545b32d95473dad4c1a512ac217893a006a62e4b8d796f8197507403f", + "localSha256": "3b6b401622df8c793fabdd3041d3661b84c82bb8de7dcac23aa03f06ba109264", + "orderedPathDataSha256": "e49be033b5a3cbab9025eee6461a0a1ac4059c45f30705493cb08c726c6f10c5", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/add_chart.xml", + "upstreamIcon": "add_chart", + "upstreamPath": "android/editor/add_chart/materialicons/black/res/drawable/baseline_add_chart_24.xml", + "upstreamSha256": "ae2a730e30b9dfcd575036951df52cf1b4e713783d7ff2dd1e453e5a0a42714e", + "localSha256": "29bd46c7fbca98cdf483ca6bbb48f0978045be00232c2fce60a6d967eb3b830d", + "orderedPathDataSha256": "e9f373e08ee0d045da63c19d7261b2f5fc3a9c270f4e9f3bb2b15ba3942687cf", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/add_circle_outline.xml", + "upstreamIcon": "add_circle_outline", + "upstreamPath": "android/content/add_circle_outline/materialicons/black/res/drawable/baseline_add_circle_outline_24.xml", + "upstreamSha256": "e67ae99953b461151eca68c52033cf5dd078d419f8b96cda518f876c99978136", + "localSha256": "921e69f7900138b9ab295fd184a8f73c6c0d612697af8275e1ec14ebd8918fc7", + "orderedPathDataSha256": "69a0baf46a0db4bdd904b859ec72e9da963f36f7824c55eecc092587b5680d1b", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/add_circle.xml", + "upstreamIcon": "add_circle", + "upstreamPath": "android/content/add_circle/materialicons/black/res/drawable/baseline_add_circle_24.xml", + "upstreamSha256": "3732c6c134db1e06caa56c992977efea54c407a24d0ea6f2b73ef79f905bd489", + "localSha256": "52d19db72d5e121d4c441f62d1afaf7e3524cba2e57133358859a5545e338c93", + "orderedPathDataSha256": "ca49f3cd8f6f7dd58dba0b5c745eb98763999c2c90e2b5152ac11f55f4404f9a", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/add_comment.xml", + "upstreamIcon": "add_comment", + "upstreamPath": "android/editor/add_comment/materialicons/black/res/drawable/baseline_add_comment_24.xml", + "upstreamSha256": "43a44bdfaf339d0721dd970bf4136568a0db6ac8396b8d156e17610b05aaf28b", + "localSha256": "8962d857bf03b9f932f450aebe8a7d14ee2eb1395255a53417f299dee6b4fdb6", + "orderedPathDataSha256": "46929f644658559ccf1bff9ffb6c6cbc5d92d9d0d94b1d8b6835ac6c899addd2", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/add_home_work.xml", + "upstreamIcon": "add_home_work", + "upstreamPath": "android/navigation/add_home_work/materialicons/black/res/drawable/baseline_add_home_work_24.xml", + "upstreamSha256": "5080d12575ecdcec332afa4c1c6b36bbe494b015b33a37be81bd72319da180da", + "localSha256": "4250a508c7c54da435c64a6a5c1e22f4dea05c1e51f9f9775c5001b87f66f48e", + "orderedPathDataSha256": "b4b95dacc4b3bd4e9eafbc264b4f750f5bed2bb1b10064fe63b077ccb657f592", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/add_home.xml", + "upstreamIcon": "add_home", + "upstreamPath": "android/action/add_home/materialicons/black/res/drawable/baseline_add_home_24.xml", + "upstreamSha256": "f7c5b5f4d41ad6ed272d83af4c2a80137a4733effcc7c8afd7f274af61234207", + "localSha256": "da502fd068ac46dbc6ffffe8ddfb23b44938ed625129d4b72d4de97ce705bba9", + "orderedPathDataSha256": "95b2e825ae8a9555ffce889aa7079bf79b64d1cd46325c76277617f665965912", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/add_ic_call.xml", + "upstreamIcon": "add_ic_call", + "upstreamPath": "android/communication/add_ic_call/materialicons/black/res/drawable/baseline_add_ic_call_24.xml", + "upstreamSha256": "27a7572206509325ac022fa8a9fdc5a677df3e888e097c1c369ffd1be9a37be7", + "localSha256": "6b93e27af5a535061949bbfd5d5f70e080629a65a6788813ca328cdf002a6904", + "orderedPathDataSha256": "9ca2c29c5811205505680c2b99ea4b931f49bc126357381907200f4736fe9f63", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/add_link.xml", + "upstreamIcon": "add_link", + "upstreamPath": "android/content/add_link/materialicons/black/res/drawable/baseline_add_link_24.xml", + "upstreamSha256": "a4fee26963f9ce5b33309644a33ab6b84783c62d8d92d20417c1a7876a347e7b", + "localSha256": "5d40e1a97e44bcd31a971ed027100c19e91f6770cc92a5e652be1a91643634d1", + "orderedPathDataSha256": "2889968df4df9a699a4a74c83e517b77d72da87921e4e807bb1409f4b922429b", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/add_location_alt.xml", + "upstreamIcon": "add_location_alt", + "upstreamPath": "android/maps/add_location_alt/materialicons/black/res/drawable/baseline_add_location_alt_24.xml", + "upstreamSha256": "ac20b8a0fcd2aacd1139b34febb19be2bfb32817a0ddd905c61d923c8f70ebe3", + "localSha256": "68e57f9228ac039305011be5d2657353638da0fe0aa93d64f0e0e5342c83b383", + "orderedPathDataSha256": "d0b60c259787610a4d22573223d3791c34e6b819707b02c3982a824b660a375c", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/add_location.xml", + "upstreamIcon": "add_location", + "upstreamPath": "android/maps/add_location/materialicons/black/res/drawable/baseline_add_location_24.xml", + "upstreamSha256": "d900cb8079a41246f013ad00fd2181c5b2ff6e7ed8c87af647518336b759a022", + "localSha256": "14e42f46ae4072d62c80819899b20025302b334fff0ef4055298319417bc105d", + "orderedPathDataSha256": "dba86bf3643bd4ba990fb5a49724bf4fc4a850c0b109648052e447e0b753b9e8", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/add_moderator.xml", + "upstreamIcon": "add_moderator", + "upstreamPath": "android/social/add_moderator/materialicons/black/res/drawable/baseline_add_moderator_24.xml", + "upstreamSha256": "2693be613609437de98a6cb03ce87ebcac8d319be34842bce093c8fdc10ac7fa", + "localSha256": "534e9245fdd9c9fda1d0e77e16525f88057af39979b8bb1b98c9771f8976782e", + "orderedPathDataSha256": "3ed6bbd2bfdc9b1effdb3c7d803a6e9cc4d2be8624bd27c1494c8efc8b2481a0", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/add_photo_alternate.xml", + "upstreamIcon": "add_photo_alternate", + "upstreamPath": "android/image/add_photo_alternate/materialicons/black/res/drawable/baseline_add_photo_alternate_24.xml", + "upstreamSha256": "34bb6209dfd0be2bc6af27f25cd5355dad35aabc8eb9299a9ed0f5dfa0224324", + "localSha256": "9da78b30504a6a45662c8d0a86cc365472ec90ad0d6d510ea66e3722716b512c", + "orderedPathDataSha256": "5489acbfd72dc72b2e685ddf0a85fdf8560b2052133555813df072f02b080978", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/add_reaction.xml", + "upstreamIcon": "add_reaction", + "upstreamPath": "android/social/add_reaction/materialicons/black/res/drawable/baseline_add_reaction_24.xml", + "upstreamSha256": "cac98b019122d03abefc4210110f65fa2e2ce396019f05935d5bd7a17c01207d", + "localSha256": "b1b9a65b259292be41a1b843842392e511b8f59b633ad96d5170f9c57b3d60a9", + "orderedPathDataSha256": "be6e018c416c279400468ad2f726d8adb54b64b63e1394b96174999b8b526039", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/add_road.xml", + "upstreamIcon": "add_road", + "upstreamPath": "android/maps/add_road/materialicons/black/res/drawable/baseline_add_road_24.xml", + "upstreamSha256": "0dd592d471f52282959f31cb511dadceab99fb25d11d79e211a3a01a8bda6411", + "localSha256": "bd98cddf7a50f98021f60b76db4c79dc56d2d6ae27ce4d165a67dec98a319d5b", + "orderedPathDataSha256": "15d967ddcba9e58bf333f0891590a806273ba4ce26bb535d4913e4a8d0262a94", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/add_shopping_cart.xml", + "upstreamIcon": "add_shopping_cart", + "upstreamPath": "android/action/add_shopping_cart/materialicons/black/res/drawable/baseline_add_shopping_cart_24.xml", + "upstreamSha256": "9070551539ec4ab7529f8fc64fcb59208bea01ac37a84336ef8da143856940b3", + "localSha256": "1fbf1a5774a9a29f9ea87128a2ec6b266953bf455d965dfe4c4c4011a183861a", + "orderedPathDataSha256": "841a046601fce8fa51e41bfd1711d87670f60317cacf01a9fd126f10da5de61b", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/add_task.xml", + "upstreamIcon": "add_task", + "upstreamPath": "android/action/add_task/materialicons/black/res/drawable/baseline_add_task_24.xml", + "upstreamSha256": "7c29f94531bbbe4a889ff8326882a7a3847e908316b8cbaf9d3a6818f685cb85", + "localSha256": "fd3a8301c804002795f06086c18fd26c713c22f8097330369dde703e4727ecfc", + "orderedPathDataSha256": "5fff99d9784736adb2361003d455a0bfd6c186b9ff0c9b1e598c9df6ba317754", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/add_to_drive.xml", + "upstreamIcon": "add_to_drive", + "upstreamPath": "android/action/add_to_drive/materialicons/black/res/drawable/baseline_add_to_drive_24.xml", + "upstreamSha256": "87438b1b25eb7ac56ad0df6b32373bb84cadc3737542aeecb35b22ff465f4fe4", + "localSha256": "e0c7f3fa286b7000c07199abf165800c0a9fa32f2cc95e6121682b4e0422edba", + "orderedPathDataSha256": "aeb2025ed6e27d2c15b4dd320de0db0529a4e3f6d844a581e2dc7a04db655583", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/add_to_home_screen.xml", + "upstreamIcon": "add_to_home_screen", + "upstreamPath": "android/device/add_to_home_screen/materialicons/black/res/drawable/baseline_add_to_home_screen_24.xml", + "upstreamSha256": "e737a7f2cfe818bdd2511e41618533e34b7d4054502485e43596ccaa53834fad", + "localSha256": "ab6f27e004fe2a6cc6784f9fa4b3cd43262096558a89d84bcba0089f638129ba", + "orderedPathDataSha256": "818cdbd5a9a6ec88e42332295652d700b952c6e71a3461c835db21fcdab315a1", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/add_to_photos.xml", + "upstreamIcon": "add_to_photos", + "upstreamPath": "android/image/add_to_photos/materialicons/black/res/drawable/baseline_add_to_photos_24.xml", + "upstreamSha256": "e5aba84818bacfff0a77dccc94e5af0aaeda9e3486e627458e33bbf6f2ffce1e", + "localSha256": "da50abe759f85642080feae431777510e58f5b1e3f679c1a7e01e8c2faa88f91", + "orderedPathDataSha256": "8d3086d102d2b4b7c5fa3c371c812aff886b1e8c1b7bb9fab383836da449c5fc", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/add_to_queue.xml", + "upstreamIcon": "add_to_queue", + "upstreamPath": "android/av/add_to_queue/materialicons/black/res/drawable/baseline_add_to_queue_24.xml", + "upstreamSha256": "26b89ddac7565fdd368c9b995539b537c40a238782d6a428eb86c2900c35b964", + "localSha256": "b0775fab4b943f05fb2a308f150ccaa1facc25fd6f729124bd9ee5bb695813d6", + "orderedPathDataSha256": "c28038c355dc8d5039a4273893600e8d1c451836c906ef2112ee3ae5409e660d", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/add.xml", + "upstreamIcon": "add", + "upstreamPath": "android/content/add/materialicons/black/res/drawable/baseline_add_24.xml", + "upstreamSha256": "6089b4febff7aef5294004ba90e504956010186fa3acfae289b33066e8529d32", + "localSha256": "df03d3798c18022ae755f862d80833e7666ea9d007229b1bab85aa5d51e9212b", + "orderedPathDataSha256": "0d2744ea566903e03b63eb7cf82e0598410a084e87296c089cace965709ac33d", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/addchart.xml", + "upstreamIcon": "addchart", + "upstreamPath": "android/action/addchart/materialicons/black/res/drawable/baseline_addchart_24.xml", + "upstreamSha256": "6e3f98e333d82e221cea638cc0ac07f2f9dddc5b0bf03ec334caf3f15845823e", + "localSha256": "05a4b7b907f5b7cfd0cd9e9707382fd0d763383f7e0798eaa8ffe934dda6f2e2", + "orderedPathDataSha256": "7bcc7a337f2e9793c2b0140b96e4c1d83d99e162477e2d512e2d582115972343", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/adf_scanner.xml", + "upstreamIcon": "adf_scanner", + "upstreamPath": "android/hardware/adf_scanner/materialicons/black/res/drawable/baseline_adf_scanner_24.xml", + "upstreamSha256": "f2d60dfb6e1a9d0a9797d0006b3ac5f046715e9f651db4e19f11bc46f19e2a4b", + "localSha256": "94f4d3fe5ab3ece0be1c279561437f5f39b615ee9a896025012352b44b698ec5", + "orderedPathDataSha256": "1cc0cf95fa15d3b92503b59df187f161cd9f738519993a5897db98a49d5024ca", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/adjust.xml", + "upstreamIcon": "adjust", + "upstreamPath": "android/image/adjust/materialicons/black/res/drawable/baseline_adjust_24.xml", + "upstreamSha256": "493dd7b8625c24e6bf9524f1bad37bca722e2c29a3057241b7896da16b0b8341", + "localSha256": "6743a93897ab1f4a357ab75ab6cdfab15b3210bb41a71fb7386a06773466d871", + "orderedPathDataSha256": "509b1500a38c1819d632a7e61d825b192dbadf6dd53a375ad9ee1ed309a1593b", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/admin_panel_settings.xml", + "upstreamIcon": "admin_panel_settings", + "upstreamPath": "android/action/admin_panel_settings/materialicons/black/res/drawable/baseline_admin_panel_settings_24.xml", + "upstreamSha256": "e5127cb1bc1218cff4c8b3c3a2240b42cb25929a0aa8f5010f9e3d91f0192277", + "localSha256": "b24c7ff2d5bcb9842852f4accff0a5c4f89e065eb66db847432f26f55da0524f", + "orderedPathDataSha256": "130a302b11e6591f4118c6de5bc491977e5b8cb198a2c59df687a76615471909", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/ads_click.xml", + "upstreamIcon": "ads_click", + "upstreamPath": "android/action/ads_click/materialicons/black/res/drawable/baseline_ads_click_24.xml", + "upstreamSha256": "654f9514a6c3cb1f3991e5008fa235da66d3cc80f7d4a08ca1683a911fd1cb1e", + "localSha256": "ee20a6c808c42cb542632f9ab263aad7bed07f1f8bed3881797da1a7e6676d96", + "orderedPathDataSha256": "e9a271fa38bbe04fec947e48b6190cd8068f00c357f4962c207bbd8c5101ba82", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/agriculture.xml", + "upstreamIcon": "agriculture", + "upstreamPath": "android/maps/agriculture/materialicons/black/res/drawable/baseline_agriculture_24.xml", + "upstreamSha256": "c82bce5a52ad663907bfec7dd41c3409898597fe51fec9c3347cfe49506bf7a6", + "localSha256": "5a2ef52ee22bd70c74e00ed3eee71ab2ce040dcf531cdcca4aa5557bc03a5e91", + "orderedPathDataSha256": "19813314b46709cc13fda323d497ed08e9b6a2556f671eccb289149e28d6bfc8", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/air.xml", + "upstreamIcon": "air", + "upstreamPath": "android/device/air/materialicons/black/res/drawable/baseline_air_24.xml", + "upstreamSha256": "0000759850276a9d790e70230772dbb566f99b3aa6a41096b308f3611ea3b007", + "localSha256": "58e9c11ae710c2a0d145f18e58f4a375532143edc3bd67513157bef5095b26be", + "orderedPathDataSha256": "bc7825b95d6e54769cb68b675e308d2f28ee5db2193a429a148270782edb59d9", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/airline_seat_flat_angled.xml", + "upstreamIcon": "airline_seat_flat_angled", + "upstreamPath": "android/notification/airline_seat_flat_angled/materialicons/black/res/drawable/baseline_airline_seat_flat_angled_24.xml", + "upstreamSha256": "e3e75a0d6f6361efb3727bb493d4bf7622b84eef915afb426301397eaea2fc6a", + "localSha256": "f243ef33d6094c9ac8b22dfe60d5906d12b5c766cb8526c6bacb903823fe2723", + "orderedPathDataSha256": "8ba7bdffd590a4ecefbe0fdf6156f09be30b08dec737cb6e6af3db645a5c9cfa", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/airline_seat_flat.xml", + "upstreamIcon": "airline_seat_flat", + "upstreamPath": "android/notification/airline_seat_flat/materialicons/black/res/drawable/baseline_airline_seat_flat_24.xml", + "upstreamSha256": "28b307c67a1a6f4f5c5dd7e8c9ef0eab0ac1abb47dff1aafdeeeb3069a8708bd", + "localSha256": "db06bfd0956ac698471786534d96eb3567cb5fc0ba5a16937aef5bf2110dddb6", + "orderedPathDataSha256": "6b2fa14aca3c799f9740ccfa5f7e51e08d1072c0c99486b2e51d2f3210ff360e", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/airline_seat_individual_suite.xml", + "upstreamIcon": "airline_seat_individual_suite", + "upstreamPath": "android/notification/airline_seat_individual_suite/materialicons/black/res/drawable/baseline_airline_seat_individual_suite_24.xml", + "upstreamSha256": "fb86afe93b8d9b97ff08f1c874d5df199df45fbf2500af300713fe1f6834f655", + "localSha256": "d35e312318c4cf52903c6f8aed4ff0057ff299b45118edf2fb71ffa6cd2806b5", + "orderedPathDataSha256": "464807d5d48460291e5ac572ce77838372595ca44347bb2d603b8dd993611774", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/airline_seat_legroom_extra.xml", + "upstreamIcon": "airline_seat_legroom_extra", + "upstreamPath": "android/notification/airline_seat_legroom_extra/materialicons/black/res/drawable/baseline_airline_seat_legroom_extra_24.xml", + "upstreamSha256": "eca673c273438595d8b6f092a8adccc99ab2e79e8b48a35b66bf38f003ecf9cb", + "localSha256": "07967b3142abfb0ed26f2ecec5621fa586695a3c1351c2dc4346c088eb5e6743", + "orderedPathDataSha256": "57322874364953ac93e92b43c32fc41ce53c5eb60df3e78d9105df26c628f712", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/airline_seat_legroom_normal.xml", + "upstreamIcon": "airline_seat_legroom_normal", + "upstreamPath": "android/notification/airline_seat_legroom_normal/materialicons/black/res/drawable/baseline_airline_seat_legroom_normal_24.xml", + "upstreamSha256": "27fe2d726a3d713166ec6c56e1ab5a4ec8d92c06a31db41e82e290b13024fcd9", + "localSha256": "85452b5bc07972614c179c5343a5e20094ec29e1a9ed4f1fc8c6938cf0b048ac", + "orderedPathDataSha256": "783f6abd0b442615d246ee9c6fb1184faf8839311b241acd887430bb76ce5677", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/airline_seat_legroom_reduced.xml", + "upstreamIcon": "airline_seat_legroom_reduced", + "upstreamPath": "android/notification/airline_seat_legroom_reduced/materialicons/black/res/drawable/baseline_airline_seat_legroom_reduced_24.xml", + "upstreamSha256": "844dfb8739d76c0aca9f46e0298c03564868e66d8f40ae9323aa555c09da388d", + "localSha256": "06ec51223dc9de16ac9f05d13c8ec42ea21e15f343a3d287d42366ae0b3d9093", + "orderedPathDataSha256": "5448f9039d6b72510a7babf8c8bc219825db8b48319a4aa82c8568c876d985c2", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/airline_seat_recline_extra.xml", + "upstreamIcon": "airline_seat_recline_extra", + "upstreamPath": "android/notification/airline_seat_recline_extra/materialicons/black/res/drawable/baseline_airline_seat_recline_extra_24.xml", + "upstreamSha256": "a1d94f200091f4c3ec1edf994ebc7daf571b11f6df4eb1a8e03761d60677bebc", + "localSha256": "8dd866c37fc7d66dfda58095db6b467c5b04750c33fc7455acebd8b92dbd807c", + "orderedPathDataSha256": "51952a0dcf95c6b90f476349845d64d6aa3e2bb856247eca223257e14234eecb", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/airline_seat_recline_normal.xml", + "upstreamIcon": "airline_seat_recline_normal", + "upstreamPath": "android/notification/airline_seat_recline_normal/materialicons/black/res/drawable/baseline_airline_seat_recline_normal_24.xml", + "upstreamSha256": "170b6604e4dfc8e3a44086bf59b772bbb326772a3faa6921994a89cb649ac9a5", + "localSha256": "cb365a8c4a19de37629b3dae7e7a0e3bb31dac88afb15cda1e9a90e035be2fb5", + "orderedPathDataSha256": "21c74b2ae9b1804db2bb519e6de2aca4c40e9718260fd86dc1177000eb5b87a6", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/airline_stops.xml", + "upstreamIcon": "airline_stops", + "upstreamPath": "android/maps/airline_stops/materialicons/black/res/drawable/baseline_airline_stops_24.xml", + "upstreamSha256": "254d0fc2e40a7e1afff099821799a151c1f5d39e80648743855d8ba79ba38108", + "localSha256": "b5ea0597da080ddcc0e64ade31e3eae5fa379857d128a873f4c06ed5e18b0222", + "orderedPathDataSha256": "2c762a431fe3f365ff8f1ed22b3b7feb0046fdf9438386f140f074f8bbbff5e3", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/airlines.xml", + "upstreamIcon": "airlines", + "upstreamPath": "android/maps/airlines/materialicons/black/res/drawable/baseline_airlines_24.xml", + "upstreamSha256": "d5dbd2244cc10cef58e27b903e4b18377efc60aa392ee271d241fabe297e8206", + "localSha256": "c90271c523d24fbd01276d0d147c8f2d93b201a3e294c2fec195f69d934e1100", + "orderedPathDataSha256": "52d5278444fceae18b0eb2b27cf6ca45ddc2fba3920a320a0bf84a59ef13b829", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/airplane_ticket.xml", + "upstreamIcon": "airplane_ticket", + "upstreamPath": "android/device/airplane_ticket/materialicons/black/res/drawable/baseline_airplane_ticket_24.xml", + "upstreamSha256": "87634cde4c02013f612f3e904da42667406c249a60dacc48fd5a5176aa0c83f0", + "localSha256": "ec459c5ec99be6121abe1b294f1ab1c02d1c800d94c8cb7eec9f79c060ebdd3a", + "orderedPathDataSha256": "9234d1158500b5289c1dca039fe8e763f730124021edde6a1581d65efc2c6e03", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/airplanemode_active.xml", + "upstreamIcon": "airplanemode_active", + "upstreamPath": "android/device/airplanemode_active/materialicons/black/res/drawable/baseline_airplanemode_active_24.xml", + "upstreamSha256": "9a5645ebd202351bbcbc577150dddb448e02681f5f2e67024b7d2426b96a0cf2", + "localSha256": "ff2c86e9a9ae50e7a86b447e15e768598367326ba58555d0a8f0477e55253de8", + "orderedPathDataSha256": "2a4db9a5d6ce5e95751943fe72413639d88f8135308c5f819a4f8c5e4b48f48e", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/airplanemode_inactive.xml", + "upstreamIcon": "airplanemode_inactive", + "upstreamPath": "android/device/airplanemode_inactive/materialicons/black/res/drawable/baseline_airplanemode_inactive_24.xml", + "upstreamSha256": "d7e7991a17a08fb4f21904958a3804954091573e7f415de900768c2d8ec45719", + "localSha256": "fc9ac2e0df1db57bec012079aa884e71954320a639ed1b31ef569ee4f1f4bfe7", + "orderedPathDataSha256": "ddedd4f33df88159f6b0b4cf717925736b9600bc570b8d6f64a236bbc6bb2119", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/airplay.xml", + "upstreamIcon": "airplay", + "upstreamPath": "android/av/airplay/materialicons/black/res/drawable/baseline_airplay_24.xml", + "upstreamSha256": "d3c624680d4e3aed5da8c92102c67ef6ed59fc90aaa61607b7d0297b902b7b5f", + "localSha256": "38dd88ee9b03a7ed9eae60676aa24f0f97163f4effd62de30b4e9fe2731d5cb2", + "orderedPathDataSha256": "e58b4274a154e09b2d1b3d4e8436503704f7fbf55269d45a453d1b0e35f36441", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/airport_shuttle.xml", + "upstreamIcon": "airport_shuttle", + "upstreamPath": "android/places/airport_shuttle/materialicons/black/res/drawable/baseline_airport_shuttle_24.xml", + "upstreamSha256": "2103fe3960d03cd6831b25e2056962c903a317cb9f04bd9b14043a5a836595e0", + "localSha256": "b30da36f4f6390aee948b6251f48f1abaf1ffd1b01a6ea11c9e4897ac972c73d", + "orderedPathDataSha256": "738ced1b41da4edeb3151887d716425b13d8a1d732e4fa8d9218fd87618c6b90", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/alarm_add.xml", + "upstreamIcon": "alarm_add", + "upstreamPath": "android/action/alarm_add/materialicons/black/res/drawable/baseline_alarm_add_24.xml", + "upstreamSha256": "fe9e1c3832cc07fb8883ee896ce7ccea98b129532b4f496d66cc5b335996ee42", + "localSha256": "2d690c57ea8b88821ea2e26ef8034bf6871ce8dd081799ed2d2d06bc88ac21e6", + "orderedPathDataSha256": "3f927087cf6c2dea74cbfe0ae659cdc79401450948b8702e69d7da0adbbc1cab", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/alarm_off.xml", + "upstreamIcon": "alarm_off", + "upstreamPath": "android/action/alarm_off/materialicons/black/res/drawable/baseline_alarm_off_24.xml", + "upstreamSha256": "a3b152efe30a8c1b9ec5af8ddbcfee15b10eb74bc451ba63329a272e4f5b6de1", + "localSha256": "4eb54aa89b27d2d62f7a1de73eed5950ba27a223f8f6ab4111775441359ec5b9", + "orderedPathDataSha256": "0b5266a166a26451b73014317e004a949e5054d4f164120aefe6e9fce677fc53", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/alarm_on.xml", + "upstreamIcon": "alarm_on", + "upstreamPath": "android/action/alarm_on/materialicons/black/res/drawable/baseline_alarm_on_24.xml", + "upstreamSha256": "d66b9d7a89b8d162f20677e16605251e213fec55bfaecd6ac0b9009ea816da1a", + "localSha256": "148293ca26722a6529bc8da386ac3af10cf0a5bf295356eb955bb8a9fd3ad597", + "orderedPathDataSha256": "563a4cc07d1d90dc81823f11d45bd477db848bedf7abce7633908fafbe08d1a0", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/alarm.xml", + "upstreamIcon": "alarm", + "upstreamPath": "android/action/alarm/materialicons/black/res/drawable/baseline_alarm_24.xml", + "upstreamSha256": "c4883911cc9343bef46087798760cfc8bac56fec9ee973119738b18a3076c27e", + "localSha256": "d0a98b5e0516d16e776c9c6079a713d4f1a8e47cb3b86cc648202483874aee2f", + "orderedPathDataSha256": "61a8ddef82893d9beeacff084b17b017349b53a94d837ffef90364800d61179c", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/album.xml", + "upstreamIcon": "album", + "upstreamPath": "android/av/album/materialicons/black/res/drawable/baseline_album_24.xml", + "upstreamSha256": "0729f8713473eee0b76418f1550c0d25eb1599290e1e1bc559775a3481809297", + "localSha256": "2c5735a28680b5fb12fe7b8c93c1b4e87c7ae9791cfee5d3d5bffd6b415be9b3", + "orderedPathDataSha256": "d35f7ce7ab17cba1e394a945f03ce3057af01ed4d95bd0459272f15afd550765", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/align_horizontal_center.xml", + "upstreamIcon": "align_horizontal_center", + "upstreamPath": "android/editor/align_horizontal_center/materialicons/black/res/drawable/baseline_align_horizontal_center_24.xml", + "upstreamSha256": "88021e59ea8e9ddda4d4ee6e522dcf0265bc8c055ed64412b7cab44482858dab", + "localSha256": "c121b559353cf635b0877efcbdaa2d248e1d9cb1eff24d4bd6ae96338254574f", + "orderedPathDataSha256": "bf2f2bda84f6ed05ba2b7a55d190ffe0e0738fc617b36dd2d218172646ac1895", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/align_horizontal_left.xml", + "upstreamIcon": "align_horizontal_left", + "upstreamPath": "android/editor/align_horizontal_left/materialicons/black/res/drawable/baseline_align_horizontal_left_24.xml", + "upstreamSha256": "9d88b147f891743653a8c69eab59f59b2d36ec83e27a5885e3c1e7b4e8e35c8f", + "localSha256": "ed806533c96e03f5aad562d164742e999375f1d52f1419e263e11688cf8175ac", + "orderedPathDataSha256": "6d51808b7582a0f5285f0cfd9d48f1a77f9574667bad70b2be9eba3c7a3734af", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/align_horizontal_right.xml", + "upstreamIcon": "align_horizontal_right", + "upstreamPath": "android/editor/align_horizontal_right/materialicons/black/res/drawable/baseline_align_horizontal_right_24.xml", + "upstreamSha256": "3a49520db26fc409a597050cbde14bdaaee1c7a8834a0d72fa364756edbc8cab", + "localSha256": "edf66c163987d1687339b9566054a6ef80f667d481e81ade4d7add0bbd1d0350", + "orderedPathDataSha256": "ab62f2448308888f4c5d3a7ffb74b281fdb558f332c522390787f4daa4b2a073", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/align_vertical_bottom.xml", + "upstreamIcon": "align_vertical_bottom", + "upstreamPath": "android/editor/align_vertical_bottom/materialicons/black/res/drawable/baseline_align_vertical_bottom_24.xml", + "upstreamSha256": "e29df906e18b16ae6eeb1cf37a2ab7892e81f1050dfcb897fe7d95c485e4de0b", + "localSha256": "a3b53ab439c2462a4975fed18afc0946e22e5b91c1563b478142dc7f791ceef6", + "orderedPathDataSha256": "d71f761f36a0918826703d6263a12946e0603df262cf0a713748ec42fcc678f3", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/align_vertical_center.xml", + "upstreamIcon": "align_vertical_center", + "upstreamPath": "android/editor/align_vertical_center/materialicons/black/res/drawable/baseline_align_vertical_center_24.xml", + "upstreamSha256": "0f2affe8ca9e8711da1121c89ce43f1f202e0ebec440e3ddec36c0410b55b401", + "localSha256": "002403a085f73c93bd42c6376ec2dd8527073324267242ed2923ae01bd641d2f", + "orderedPathDataSha256": "fd6828fee3437c2bb98f62423784d10aac467aa5499904c868ddb53d869ae022", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/align_vertical_top.xml", + "upstreamIcon": "align_vertical_top", + "upstreamPath": "android/editor/align_vertical_top/materialicons/black/res/drawable/baseline_align_vertical_top_24.xml", + "upstreamSha256": "9bf757cbd183dd925339fbed284ef86b4db07fca8b71c6fdfc2f3dee0ca583e2", + "localSha256": "798ff75ef5a4431c0b9cff3f066743806683d9120a5cabff0243dce656ecbbc9", + "orderedPathDataSha256": "b348f2859fcd248aa440fcfa32de3fb91f718fd7ec736eeaddc75cf80c9473d2", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/all_inbox.xml", + "upstreamIcon": "all_inbox", + "upstreamPath": "android/action/all_inbox/materialicons/black/res/drawable/baseline_all_inbox_24.xml", + "upstreamSha256": "e843450a06de62118f80e8b53c8d5b1ec339b7920922f59eec0f0cefb57e66c1", + "localSha256": "14a2a30c25d40ca50657e6630729ac95242663af2bf15b2d6f5c551b8cf56f6e", + "orderedPathDataSha256": "b9bb33dc437584e0c6ec22d51e6aa7fdd034573003df4dbc134e859a8c0a71e2", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/all_inclusive.xml", + "upstreamIcon": "all_inclusive", + "upstreamPath": "android/places/all_inclusive/materialicons/black/res/drawable/baseline_all_inclusive_24.xml", + "upstreamSha256": "17fb5eea82889cb768ab29ba8c929cf92d40664052182b9a9a991e33d2bdb18e", + "localSha256": "06537d6a9598fa72e5703396bb73556049b58e757c2e61f17e644c78c1a95c23", + "orderedPathDataSha256": "e44f3b388c52ace607da12c58f8fa6dbc703cdc0b4974f908165f527a0b36242", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/all_out.xml", + "upstreamIcon": "all_out", + "upstreamPath": "android/action/all_out/materialicons/black/res/drawable/baseline_all_out_24.xml", + "upstreamSha256": "77a5510d6c45803d6d61c53359156643f94422b138e359ed2069e13c6d4af92c", + "localSha256": "247645e1b5225a06d9ab667505d6951e7cc9df0789ce018ad09c7316549322b5", + "orderedPathDataSha256": "d9866a8915a4da9bb5767c6ef02dc3db63f48f3fac5fd4b85fc8c63282604f81", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/alt_route.xml", + "upstreamIcon": "alt_route", + "upstreamPath": "android/maps/alt_route/materialicons/black/res/drawable/baseline_alt_route_24.xml", + "upstreamSha256": "c7961f2920b4b79106a3fa30057dd16ede94482eecc7aafb31c72c31894dafbd", + "localSha256": "e502ebb42e361d76a00907f8ee32e3d879e549ded488ec1651af8753b21135bd", + "orderedPathDataSha256": "c66c3adcb9be769a87b5ef23382de5b3380436798730edbe66cd2e606d7008f2", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/alternate_email.xml", + "upstreamIcon": "alternate_email", + "upstreamPath": "android/communication/alternate_email/materialicons/black/res/drawable/baseline_alternate_email_24.xml", + "upstreamSha256": "10d20c1f6f2f5527d082b2fa3eeb243562877cedaa974879b5d93100489b6960", + "localSha256": "f1b0fa2d1c561403e32737962d198733c6ae13f2b94027ec8cabe7ac3b5ca640", + "orderedPathDataSha256": "3719561d83e28cf3819fe5784e57ceb913fa2cea9348c7bf1dc33f0fe0d8e716", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/amp_stories.xml", + "upstreamIcon": "amp_stories", + "upstreamPath": "android/content/amp_stories/materialicons/black/res/drawable/baseline_amp_stories_24.xml", + "upstreamSha256": "101dfb6b8df1221ed80df2be7edfb3d192aa63653794bcb2dd1f12a068cc4860", + "localSha256": "aa0116d8abbfc46e82694a78ab36a0540051a858f90db82f3f0ae7e7b79aa02a", + "orderedPathDataSha256": "7c0a7a5bfd31c6b88fedb616153147ae2ba7e4c3a09f0380c198c6678bfc23dc", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/analytics.xml", + "upstreamIcon": "analytics", + "upstreamPath": "android/action/analytics/materialicons/black/res/drawable/baseline_analytics_24.xml", + "upstreamSha256": "38055afc784dbf4ab03a9c9a811f5fd66c9d73a82fd060fff73202a785694103", + "localSha256": "516aef22d732b24d0c7dfcf227bd3266e7c5a1c2c04268fafd88375ab867abb4", + "orderedPathDataSha256": "3e0c70f0d6ab613f99fe7d43867850519a3cc26727ae30855219f1f2538b85b7", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/anchor.xml", + "upstreamIcon": "anchor", + "upstreamPath": "android/action/anchor/materialicons/black/res/drawable/baseline_anchor_24.xml", + "upstreamSha256": "e6700b40b6a27513fb248d538486a9b3e3c3c460eda412ec455265b5f4bf5537", + "localSha256": "cd0597b46721e51cc489268fd471027055c066c0fcf27a5f082129d59854757d", + "orderedPathDataSha256": "eedd5e359bc474460ac7d3b8f4ead07bbb103c59a00c3d2d3ba41a9306ea0870", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/android.xml", + "upstreamIcon": "android", + "upstreamPath": "android/action/android/materialicons/black/res/drawable/baseline_android_24.xml", + "upstreamSha256": "685c2c480c2ee57493c2285a775936463e7023844428797147cb393a258f82b3", + "localSha256": "d3d401d56330df58cb4ffa6bc28349e659274997ebca8701eb380f5c8266076a", + "orderedPathDataSha256": "40047e082a2b1fa4c8690d93b6e3cfa81b84dd513636c7af56a3ad64f78b24f1", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/animation.xml", + "upstreamIcon": "animation", + "upstreamPath": "android/image/animation/materialicons/black/res/drawable/baseline_animation_24.xml", + "upstreamSha256": "1013793351142ce8f1021b26a1bb13953f9c7bf7f16196f149b3656e0ba2f952", + "localSha256": "142e361d17676cb3f1149db7100b9d60f80d70fa7d67fdc973b9a22b3b68e054", + "orderedPathDataSha256": "7a5127721a0b61e988193facdbd59f22760b1f784a6795633ca041eaef0beb2a", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/announcement.xml", + "upstreamIcon": "announcement", + "upstreamPath": "android/action/announcement/materialicons/black/res/drawable/baseline_announcement_24.xml", + "upstreamSha256": "c51a3bbd8a3d0fb71684ebadd8fb9461c7225ed58032ed3d2875655929993fa1", + "localSha256": "20cfe3730fd848a109956e3e6cee228cb1a17b02bd58c7c09a5aa7b5f4ca9a3d", + "orderedPathDataSha256": "d531617dcf3276e85c7e663fbc00e1fcbd7740c1be5af320af8923d2dde54c71", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/aod.xml", + "upstreamIcon": "aod", + "upstreamPath": "android/device/aod/materialicons/black/res/drawable/baseline_aod_24.xml", + "upstreamSha256": "8b4a283346c5dc655799186a2f55439ea697289b0d4072e9b9a1d47dfe7a607d", + "localSha256": "49630935e6df9524b486bd09f245aed110a0d8ad22f71c04fdd31930f54e0c45", + "orderedPathDataSha256": "535079f661ded100f8369c36db0f4fea4e3a838b397f58e00a2c196c2ceb91b8", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/apartment.xml", + "upstreamIcon": "apartment", + "upstreamPath": "android/places/apartment/materialicons/black/res/drawable/baseline_apartment_24.xml", + "upstreamSha256": "7f4d25ef20848fd65adbef82b227c723a1bd2f7cc24bef975591ee78c3275a61", + "localSha256": "c06e7c6c1ce20f4234df35d033867b660498ed9a2fe2d15204809413b1d34661", + "orderedPathDataSha256": "a8f9a280aed9e484da884d7ab7e054a75a9a1498d0f76a1cb5c6e234b477db06", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/api.xml", + "upstreamIcon": "api", + "upstreamPath": "android/action/api/materialicons/black/res/drawable/baseline_api_24.xml", + "upstreamSha256": "078c26f96228bffe6a4872fd4d28dc9b7244c5ff15392a6bbfce0b485555e7d2", + "localSha256": "75133604f904162b6192b418632e1c90d85d687f83aa5e0516593e41be6d12a5", + "orderedPathDataSha256": "296abc24638c046b7ee59b2e7345081177dc2d0813fc4696f3a5eb094c6d6d3c", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/app_blocking.xml", + "upstreamIcon": "app_blocking", + "upstreamPath": "android/action/app_blocking/materialicons/black/res/drawable/baseline_app_blocking_24.xml", + "upstreamSha256": "8216faafc09963ceb6497551ae81f707c7422defbbdb2201c4642d671988bce6", + "localSha256": "dcc0ec2491f4edc7f3e03120978982c4502094537c1aa7c63418a935ab290f15", + "orderedPathDataSha256": "6b92bac1074a9e1154a757047944bc99a3e5c55de285436f3f2a4064a7cba300", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/app_registration.xml", + "upstreamIcon": "app_registration", + "upstreamPath": "android/communication/app_registration/materialicons/black/res/drawable/baseline_app_registration_24.xml", + "upstreamSha256": "6819bb79e4a0664dbe7aadede8895a40302c24f9cb8e0342a316f5937d718699", + "localSha256": "0a593ff5155a8a6369ed0c74d6ff31c9aacca92e6630fdb4eed17bfa6afb1ea7", + "orderedPathDataSha256": "38de91aed267c8f368b7275b4b357652b81cc413cbbb0f7efa19c2b6c470ab8d", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/app_settings_alt.xml", + "upstreamIcon": "app_settings_alt", + "upstreamPath": "android/navigation/app_settings_alt/materialicons/black/res/drawable/baseline_app_settings_alt_24.xml", + "upstreamSha256": "18097a1a1640e4860176bfab428b6e4c03ea654ec35b92a6c2e2d64a29fbff6e", + "localSha256": "e8b62c82f3fadb9442852c558172376b0720f8e102ed421e073b2e12907b13f4", + "orderedPathDataSha256": "7fe32efe903aa91a6c8e1f26ed477a931098b3183cf57e4a3be30eca405ab1da", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/app_shortcut.xml", + "upstreamIcon": "app_shortcut", + "upstreamPath": "android/action/app_shortcut/materialicons/black/res/drawable/baseline_app_shortcut_24.xml", + "upstreamSha256": "70307f16d4d0ddffa045a3c9936e17d38b7d1433692660c4075aca82e7c3d828", + "localSha256": "31cc2ee7d08966b86517ec0faccaf7a603abab721327ee33b09d0bbd7340649b", + "orderedPathDataSha256": "13b72de28e5af57152600551000d6a9753061e67934d262e247cd892fc301f93", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/approval.xml", + "upstreamIcon": "approval", + "upstreamPath": "android/file/approval/materialicons/black/res/drawable/baseline_approval_24.xml", + "upstreamSha256": "83ff9afdce2496fcc6ac308480f9f6cfac6b0c18b73fadaaedceb90e9dff0748", + "localSha256": "8480a6ad45450109b7493ed658e4ae525aa22fea1ce5c1869b992384d3fbd3ac", + "orderedPathDataSha256": "64be4e2001b3d6af42697a899ac4f5a78cc14600940dbdca9b69f80f81dbb330", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/apps_outage.xml", + "upstreamIcon": "apps_outage", + "upstreamPath": "android/navigation/apps_outage/materialicons/black/res/drawable/baseline_apps_outage_24.xml", + "upstreamSha256": "86a3c53e8bdf13bc00054f21d27b91a409feb038a3c1b75575259690d5e8e8a2", + "localSha256": "6899ebc8eb80108d4fceb7096ac68a641de10123404253ba47e5060d2d8c33e8", + "orderedPathDataSha256": "51c8ea0a79fbc2dad5da6b79262ea7848bbd0506c41f0afc936a6f1effbb891f", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/apps.xml", + "upstreamIcon": "apps", + "upstreamPath": "android/navigation/apps/materialicons/black/res/drawable/baseline_apps_24.xml", + "upstreamSha256": "ae24a3d2b6f58abd9b9759c69d4a5715d7762683c51f1c051c968d95599dffb4", + "localSha256": "228f04065ba4e7da9033a422b31e851033ee27ec32ce5c7d051a3fabbcab8e50", + "orderedPathDataSha256": "1021eb962df3bdd2b5246bd35dd7c92ca63877c6859417aec04904a99d83485d", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/architecture.xml", + "upstreamIcon": "architecture", + "upstreamPath": "android/social/architecture/materialicons/black/res/drawable/baseline_architecture_24.xml", + "upstreamSha256": "c0608c7950c496f1f85d6bf1e68e502529ed9f0952c21bb457ded611fec000a0", + "localSha256": "c2b4957614896f190648fff0122a78b723f9d250408946bfea11ba92db1fb814", + "orderedPathDataSha256": "95347cc3b877a41471f0ca77ec9cc798bc822a9245699aa377aa218da0cafbb2", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/archive.xml", + "upstreamIcon": "archive", + "upstreamPath": "android/content/archive/materialicons/black/res/drawable/baseline_archive_24.xml", + "upstreamSha256": "0b25a6d69cbcf5d31f09f4a42ccdf40d5fc644d82d68829c7f0584f5d2ffa846", + "localSha256": "13243c79fe906bd5bc0c9ea4121525ff526eba12d826e17ab3421b474de05cdb", + "orderedPathDataSha256": "83ce9e41f6f930f0950754bdc42000ccfc6baebb8e8404e25312fa587ef47f8b", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/area_chart.xml", + "upstreamIcon": "area_chart", + "upstreamPath": "android/editor/area_chart/materialicons/black/res/drawable/baseline_area_chart_24.xml", + "upstreamSha256": "a68390da0e6b257089e8ca409711b507e299b0105e2b6fa9f6a58ee8449699d2", + "localSha256": "6ef278474df80e29d8af9d2eb5e5f7f68aa3165c0feb0e3c3b0c6851948fcc04", + "orderedPathDataSha256": "46a5aa93e7ed387d3d0226999e8f34248b8c019d2ebaebeac73dcf2a7a9b840a", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/arrow_back_ios_new.xml", + "upstreamIcon": "arrow_back_ios_new", + "upstreamPath": "android/navigation/arrow_back_ios_new/materialicons/black/res/drawable/baseline_arrow_back_ios_new_24.xml", + "upstreamSha256": "aa59b88e33f24cdbd54966f18448054c29da1ebf377aafb5d925828e80bbb1e4", + "localSha256": "9f812c7ab89df645e8bc06cab5b09805dd6f47784d3a2378581a523bf0a17d8e", + "orderedPathDataSha256": "de4c1fe39ddf3e39c064b66edd433ad58f3e94b2d3182c4d4bf87001a2c15e26", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/arrow_back_ios.xml", + "upstreamIcon": "arrow_back_ios", + "upstreamPath": "android/navigation/arrow_back_ios/materialicons/black/res/drawable/baseline_arrow_back_ios_24.xml", + "upstreamSha256": "5f57b48bd307793eec405336af9d4a335182b7908387c2c3a54262b59f136e15", + "localSha256": "71790396adc5369e14f9f0dd6c6c9388d8dd3bbccf22cf3acb3d251497c56565", + "orderedPathDataSha256": "b9e7a1c7801f811629e549d943291ec86e1101ba68d2d68aa6f66d4ec7fda268", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/arrow_back.xml", + "upstreamIcon": "arrow_back", + "upstreamPath": "android/navigation/arrow_back/materialicons/black/res/drawable/baseline_arrow_back_24.xml", + "upstreamSha256": "4fd92512a9f0cd6d7128ccbf7f7702fea4eea92a93869118b8760a45f242cf36", + "localSha256": "eb160af43ad93124fbf569f9d266ba85680a627875931a9645c341b3eb4cf6c0", + "orderedPathDataSha256": "bfcd694b1a8bad85fb008ae1a99077135efd2201a775f0d274438aac447e3fa3", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/arrow_circle_down.xml", + "upstreamIcon": "arrow_circle_down", + "upstreamPath": "android/action/arrow_circle_down/materialicons/black/res/drawable/baseline_arrow_circle_down_24.xml", + "upstreamSha256": "f71742b81fcb478aab6ef8524905d882b6efade34291e9d48d7ca52d1bd2bb3f", + "localSha256": "884bf72234822e1905cafcf7061861796c6c7ea54eab6eef3753134798a1a5b1", + "orderedPathDataSha256": "5f948f8fc78b107edbb8f88c524c014cfd96e9413b677c787db88110cd864453", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/arrow_circle_left.xml", + "upstreamIcon": "arrow_circle_left", + "upstreamPath": "android/action/arrow_circle_left/materialicons/black/res/drawable/baseline_arrow_circle_left_24.xml", + "upstreamSha256": "dc64bcfa0db044c1bc3459ff95ac4d2692f7bb9b732f861bc7a9861080640c1a", + "localSha256": "475db95479912eadfd881efca4882a47a73a58d00d84f9260b7c963177e66f1d", + "orderedPathDataSha256": "e606a3e8d1e8b8b405fc76a892a9ff3268ecda50421b87279720c77572056256", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/arrow_circle_right.xml", + "upstreamIcon": "arrow_circle_right", + "upstreamPath": "android/action/arrow_circle_right/materialicons/black/res/drawable/baseline_arrow_circle_right_24.xml", + "upstreamSha256": "fe579439241e517aa11d3343ac76aab8309b857a358ebf083a86e390feb20020", + "localSha256": "c6d5d2093d2181e7f0acb4a3432d41e91edcf396a716367530f076ebb19858bd", + "orderedPathDataSha256": "27d82bc7259c9186b1cf1897f23f5f655d4aa5f4a43a66505393615610e23c4b", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/arrow_circle_up.xml", + "upstreamIcon": "arrow_circle_up", + "upstreamPath": "android/action/arrow_circle_up/materialicons/black/res/drawable/baseline_arrow_circle_up_24.xml", + "upstreamSha256": "38712fc02ffab6a8cd6088e200a61923b0a1c3e39e27993bfbd25ce33ffad0b1", + "localSha256": "ff5cd87a4e3da5fb41b43202df89dc5a3a328e61c9960de2589593f6317eb1d2", + "orderedPathDataSha256": "90f0423a291403d272743b0bec774d1584ba28359f47237fc59138594f6f5727", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/arrow_downward.xml", + "upstreamIcon": "arrow_downward", + "upstreamPath": "android/navigation/arrow_downward/materialicons/black/res/drawable/baseline_arrow_downward_24.xml", + "upstreamSha256": "6af3a703a16ea71f61381e2634a9357ce6e1aa245b64129187dbb88954d2e272", + "localSha256": "48aaac53ca40829cf784dfd55f21a711ff7d87e08e4f95d1c044b64f45e209d2", + "orderedPathDataSha256": "8b94b4aa4cd0a55a25a6e8099a727b0019dbcef3e334bc4264066d6c18b3baa5", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/arrow_drop_down_circle.xml", + "upstreamIcon": "arrow_drop_down_circle", + "upstreamPath": "android/navigation/arrow_drop_down_circle/materialicons/black/res/drawable/baseline_arrow_drop_down_circle_24.xml", + "upstreamSha256": "47aeb9ec3e6ed78380fc03f189c4c49eec23b235f0f0826f787efa2aaf196ef4", + "localSha256": "d9e89981df9d232656e74ecb87add260c03ed498697508453f616e0af052f024", + "orderedPathDataSha256": "d79a06811b3447c19e6c7626166736a4c56e2169e7d7dffbc60ac5047433b11b", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/arrow_drop_down.xml", + "upstreamIcon": "arrow_drop_down", + "upstreamPath": "android/navigation/arrow_drop_down/materialicons/black/res/drawable/baseline_arrow_drop_down_24.xml", + "upstreamSha256": "977fe0fca74de84e87b4eef31f452f37360dcb95bd8cc76d8a4bdfc24ae4ab24", + "localSha256": "5768fd115600648ea41563227e135fcd8a8e67c7d60e663bf210cf4235d8aed7", + "orderedPathDataSha256": "a6a38fda70204210ae774f0df462b8febbc66cc3484b4af3b0b0d539b1b01420", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/arrow_drop_up.xml", + "upstreamIcon": "arrow_drop_up", + "upstreamPath": "android/navigation/arrow_drop_up/materialicons/black/res/drawable/baseline_arrow_drop_up_24.xml", + "upstreamSha256": "1a8190d73046f19bfd6e283d3409247476751d72792af9170905a1ae6164c161", + "localSha256": "89c7ef8a751c9863493df618a57c24c38bb79ad954b8beabbd4faa75a7b34347", + "orderedPathDataSha256": "59c3f2f65d90e0d6ebdc0a86afa21324ee67d5cdfb1d70d493f8fe444aa7c5fa", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/arrow_forward_ios.xml", + "upstreamIcon": "arrow_forward_ios", + "upstreamPath": "android/navigation/arrow_forward_ios/materialicons/black/res/drawable/baseline_arrow_forward_ios_24.xml", + "upstreamSha256": "b4a4f32aa88cc56d0279b4b6c40836c2ae3ca4401c4446f5fc3a18c94626e8f3", + "localSha256": "0af927adcd9bc2f271cd5bc5bb345eb4d52d1df5e4da2272896e0f0998038f50", + "orderedPathDataSha256": "525d6bf4021e266dbe536ab53f09bc5b855babc25c39c8a96e9f622780dc8e34", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/arrow_forward.xml", + "upstreamIcon": "arrow_forward", + "upstreamPath": "android/navigation/arrow_forward/materialicons/black/res/drawable/baseline_arrow_forward_24.xml", + "upstreamSha256": "9d43029835e820bb7b98ff91f6f317abf69e95b219f1cccb6242e13cd90e743f", + "localSha256": "ea32f41c798874c23ef233ca71b8ba745f2bbd55fe116813aac3d3a3b0e7ea8c", + "orderedPathDataSha256": "482add5523e46545716260b1645857bf14819dd93f633f09d04bf7189e7e0995", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/arrow_left.xml", + "upstreamIcon": "arrow_left", + "upstreamPath": "android/navigation/arrow_left/materialicons/black/res/drawable/baseline_arrow_left_24.xml", + "upstreamSha256": "b6fd5097155e06f72a14d6f19c737c09b584718daa9764af23b24cc64da05886", + "localSha256": "4a544f4890ccbb3483f65da30937c38316dfc8f2d866efa2bfeaa5be129d75c3", + "orderedPathDataSha256": "1284a07ce157c7ae15f61d006fefe6bdfcb1a84f44839b6eaae6997d80338a72", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/arrow_outward.xml", + "upstreamIcon": "arrow_outward", + "upstreamPath": "android/action/arrow_outward/materialicons/black/res/drawable/baseline_arrow_outward_24.xml", + "upstreamSha256": "fcd0ad8ba226995174619709ea9e0727c872b8783d88e54dfbd6e4856029e259", + "localSha256": "58afe03456f89f49849810e8b3001784adee0fe6d9c6de4b093863f2552d1165", + "orderedPathDataSha256": "5037c6c33db7bf3d27245106d1d9604b86748a4ec0bd2f43c51a715e46858de9", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/arrow_right_alt.xml", + "upstreamIcon": "arrow_right_alt", + "upstreamPath": "android/action/arrow_right_alt/materialicons/black/res/drawable/baseline_arrow_right_alt_24.xml", + "upstreamSha256": "eea99efff2ced84f95d86fa71a8418a796323b6560337307a497b16bd85a7e94", + "localSha256": "b7a111b9cd6b6b8cb2700570841e136a7a3be72c076b8d7107c3f442125742e6", + "orderedPathDataSha256": "a8043a3c21f56dd9667d4dc4847d9213df9871defc45ef3812fdfcec390459db", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/arrow_right.xml", + "upstreamIcon": "arrow_right", + "upstreamPath": "android/navigation/arrow_right/materialicons/black/res/drawable/baseline_arrow_right_24.xml", + "upstreamSha256": "4ffa40cafb03d87973e940865d6eac9b2b9d868520b98829226d50046d192c0b", + "localSha256": "73495fcc3c56b654d540fb340b097c7cc8a834452fcb484eed4f77f97ce3b1e0", + "orderedPathDataSha256": "cccceda6ee7ea0585d53b5e434f687381c78c87cb4c3c329cc46f8467a27511d", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/arrow_upward.xml", + "upstreamIcon": "arrow_upward", + "upstreamPath": "android/navigation/arrow_upward/materialicons/black/res/drawable/baseline_arrow_upward_24.xml", + "upstreamSha256": "9c351e75826f024888fa1eef2eab2d1c85e6f0d211e7f2b2cb44e9407e5b5307", + "localSha256": "0b7d5e7cabe5dae90d94fcac0dc11d4cb2cc6ad8fcf85e0f5dba1fa9cf86e7cb", + "orderedPathDataSha256": "9a4d2b1cbe982e54e224e428157b6f21823ed7d1577e24f163f57078a82d00dc", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/art_track.xml", + "upstreamIcon": "art_track", + "upstreamPath": "android/av/art_track/materialicons/black/res/drawable/baseline_art_track_24.xml", + "upstreamSha256": "eefc3f3f45a7eb9daf2caecb7398aa3a4322458648df4e6f0e1bc63abc533a1a", + "localSha256": "8ffe2b7c3acdabba35d59becfe4a683afa6ce25d86916035d0fcbe7265b6d9e8", + "orderedPathDataSha256": "cda8b3917ac557bf17037a0ee973834684880e040f13bc8f3cfaf2198c0b6e2e", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/article.xml", + "upstreamIcon": "article", + "upstreamPath": "android/action/article/materialicons/black/res/drawable/baseline_article_24.xml", + "upstreamSha256": "48f1552d904fe2f4c5171961fcaa1eb85dd0a6361a518315d76442fb8bf8d107", + "localSha256": "4e57eacf05ff818a2f71cc6c767c1f4ecf315ab091d8bdd938b419de7405b149", + "orderedPathDataSha256": "8421a2cfc3263973924be2e49c62c733740bca89ade07bc20bbd4e996b036b65", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/aspect_ratio.xml", + "upstreamIcon": "aspect_ratio", + "upstreamPath": "android/action/aspect_ratio/materialicons/black/res/drawable/baseline_aspect_ratio_24.xml", + "upstreamSha256": "92324488c879e1dda8f19dcc474facc05e0019fddefa6c602a5ea208ecf85f58", + "localSha256": "1efb0112f86371a6f286940f6a281af10f73302b28de7920d7aef47e1c6ea425", + "orderedPathDataSha256": "3c1cc3ba3d1eea6aff5804e73baebbc19bd2ac476607df5049acd5c72e222530", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/assessment.xml", + "upstreamIcon": "assessment", + "upstreamPath": "android/action/assessment/materialicons/black/res/drawable/baseline_assessment_24.xml", + "upstreamSha256": "0e94ceb6a779575229de3f72871b35131d9e80696590ca7f43a469c5ec328324", + "localSha256": "6a56eb5e7737db071383da7eeb832f554ea004251b3306789c0ca36012b676db", + "orderedPathDataSha256": "0cfaad9b87c240933f6bcb31fda116b19adebaec8c530c3c724a6a3dc44f0c66", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/assignment_add.xml", + "upstreamIcon": "assignment_add", + "upstreamPath": "android/action/assignment_add/materialicons/black/res/drawable/baseline_assignment_add_24.xml", + "upstreamSha256": "78a97a835bb203bb7e5bc20f532a6fb1ecc2542d4323f66a62728bc1f54fc5a3", + "localSha256": "e515f55326372a9ce4dc00ccd7d5ecf4840e910a5ed6366c87fe7f8dc4ed6772", + "orderedPathDataSha256": "7a74df49940a134400b386927770b97eabba24ade3fb3228685c177e13bf33a5", + "originalGeometryMatched": false, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/assignment_ind.xml", + "upstreamIcon": "assignment_ind", + "upstreamPath": "android/action/assignment_ind/materialicons/black/res/drawable/baseline_assignment_ind_24.xml", + "upstreamSha256": "39cb070d789dd89e27c75e40ecbe4af9dfc4b083468fbe31a52aa96d0136706c", + "localSha256": "fac47c0ca12ed8387e07840aa882f875ebfc753c4949562a9a1e3ccb69ec9e6a", + "orderedPathDataSha256": "42915938d018645d008c67ee03759e69d5592a62ae7bdc0fb0a11e81d7ca28d2", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/assignment_late.xml", + "upstreamIcon": "assignment_late", + "upstreamPath": "android/action/assignment_late/materialicons/black/res/drawable/baseline_assignment_late_24.xml", + "upstreamSha256": "99471c49c1736b78e4cddddfd2a45db69bc0fb477f3d78abd02a7df26460b9df", + "localSha256": "df609ab7b3321ac82de730f56f166963ee875cc2291f7b4cbb12e3cec494e042", + "orderedPathDataSha256": "bb68de949e57163d29d528cfb0be08d61d0c00d050ecf4b0511253e0d15130f2", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/assignment_return.xml", + "upstreamIcon": "assignment_return", + "upstreamPath": "android/action/assignment_return/materialicons/black/res/drawable/baseline_assignment_return_24.xml", + "upstreamSha256": "b7aec7dab5306b7305ba36a3afc5a1a7f6e854434ed7cad8ece1e73298f52190", + "localSha256": "2e8b32392ce14d95d4aa2ee203e3ea0796eaa1f69357f2cca003088c77498be0", + "orderedPathDataSha256": "6bd457ef36a7ce681f2478d03a960ea95d7445c80854fea10e97063c4ed64bed", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/assignment_returned.xml", + "upstreamIcon": "assignment_returned", + "upstreamPath": "android/action/assignment_returned/materialicons/black/res/drawable/baseline_assignment_returned_24.xml", + "upstreamSha256": "6839408ddfc60b13330688d746f7557e1245e0eacf74624a228b7a3fa4eaf422", + "localSha256": "d1610090256a95a2b15596fd51d5568d81b8849af260090a163f45952a80eb39", + "orderedPathDataSha256": "6d6cdf6acdec299f3d2214f80f9f459a39c590fa19947de94e330c36b4a685e4", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/assignment_turned_in.xml", + "upstreamIcon": "assignment_turned_in", + "upstreamPath": "android/action/assignment_turned_in/materialicons/black/res/drawable/baseline_assignment_turned_in_24.xml", + "upstreamSha256": "a681e8734c619373266fbaf112ec4b84413e0cbb46a699051c80e9a6b17f4875", + "localSha256": "dbd9eb898e15e388f3b35d996ea79c2d1b442176dbaa1d24a002a85c3b0a2942", + "orderedPathDataSha256": "c77a4dc37f70a7b06e710d8b607c2eea78a66b57f0772bd21afa36962c369117", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/assignment.xml", + "upstreamIcon": "assignment", + "upstreamPath": "android/action/assignment/materialicons/black/res/drawable/baseline_assignment_24.xml", + "upstreamSha256": "b207d367bc2521a37d1093bf2362b32a2926224c75bb665d3c456ffe95282e37", + "localSha256": "b79abfae76f65db973ab13a3f97eb799e48cabfb8002bf0b8d1a646de5bdd17e", + "orderedPathDataSha256": "535d27bb35a93486a5eaa01360281be30413a2c7036cf955acb87a9f4d8686ff", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/assist_walker.xml", + "upstreamIcon": "assist_walker", + "upstreamPath": "android/social/assist_walker/materialicons/black/res/drawable/baseline_assist_walker_24.xml", + "upstreamSha256": "cab69c621652d5d6c9db8018aab845280cc6ae400920c1806b4eda88f556e72c", + "localSha256": "13236704d076fb5497f6c2bbd13d86c5a7660046cd5fcfee4f218a8d0d8b8d6d", + "orderedPathDataSha256": "227ae8ff1c09c5785f0ad1e5429028f780affc7a94299cdded9c46d012c3aaa9", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/assistant_direction.xml", + "upstreamIcon": "assistant_direction", + "upstreamPath": "android/navigation/assistant_direction/materialicons/black/res/drawable/baseline_assistant_direction_24.xml", + "upstreamSha256": "ff5a90cfc9a7f17034c3f6fb27228b81be662a265a8348bdce054e38da7e92ca", + "localSha256": "ae01928a5923285223f7507a6e33d7171c92be7fd1c14c261329d8611bc2af0f", + "orderedPathDataSha256": "9cc899036866e7f22c633b1b84d30a3b5a45b5b5ef00ec6459741ee6e417d1b3", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/assistant_navigation.xml", + "upstreamIcon": "assistant_navigation", + "upstreamPath": "android/navigation/assistant_navigation/materialicons/black/res/drawable/baseline_assistant_navigation_24.xml", + "upstreamSha256": "6da63e874b793552f2fa1a5a6ea7ccd499504aa39e367a737f926de49f5df195", + "localSha256": "9be331143138ecb73f7a3b2378ca0c48c6d716e027d0019eb613aa84131e8230", + "orderedPathDataSha256": "8dd2a2fb2a00e821b86a244ca57a7d973a81bddc96fa1f89cfb8e2922987330c", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/assistant_photo.xml", + "upstreamIcon": "assistant_photo", + "upstreamPath": "android/image/assistant_photo/materialicons/black/res/drawable/baseline_assistant_photo_24.xml", + "upstreamSha256": "8e642329ab85bda6bc0092feedfd328e15d1f7ee45c07141bf15270fa549bf34", + "localSha256": "ae4a917f0cf3ab31b9d5382fb842282f4399f5da082c1551ae31b5036400dc52", + "orderedPathDataSha256": "b549c7ef778e8c4ab20faa8d6a40e73b98d27c80ef66e3e75ca5c733bd36ef5b", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/assistant.xml", + "upstreamIcon": "assistant", + "upstreamPath": "android/image/assistant/materialicons/black/res/drawable/baseline_assistant_24.xml", + "upstreamSha256": "574c81b9198f4eace8023d9eb6b21043cb9a9d3f95437c0c04546dda7c536b19", + "localSha256": "fbe16eb790bc1b0f935d7094ed6bd27f463d6bb2d9b723043562587aee6edc07", + "orderedPathDataSha256": "3f37dd9963b14def9fab2c14c005cdf146147c020f6719d21176dcf243209c16", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/assured_workload.xml", + "upstreamIcon": "assured_workload", + "upstreamPath": "android/action/assured_workload/materialicons/black/res/drawable/baseline_assured_workload_24.xml", + "upstreamSha256": "b3909e79a26a7eb29b2d9fd887508cbe01de39b61e8f70b11493746f968e9698", + "localSha256": "b7bfadc0d3507cb40d88d4223e6170f0395f35d63f25ed6ea89a169233a78140", + "orderedPathDataSha256": "53bc509835b2b74f4f577270cc45773af0fa971c80df6287c0503406ea0cbfd5", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/atm.xml", + "upstreamIcon": "atm", + "upstreamPath": "android/maps/atm/materialicons/black/res/drawable/baseline_atm_24.xml", + "upstreamSha256": "691e13c75992d7ceb37e9867dde6de334488cc76b85649235807e584c1a5d0f6", + "localSha256": "3a2f7cca2a4cdfe7f79fbbb4039ff604524f745cf37231ec5b76f71ecf90e568", + "orderedPathDataSha256": "e14f8c423394c93ebb26d690cbe20beb202e677b12e458b6a35d9c0dc4b9f2d4", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/attach_email.xml", + "upstreamIcon": "attach_email", + "upstreamPath": "android/file/attach_email/materialicons/black/res/drawable/baseline_attach_email_24.xml", + "upstreamSha256": "81859e0350bc8f7e4d4100837e017d38bf9340d034d77313898b90ff25703bb5", + "localSha256": "ee4f49eb7d921881f747d82951f06adce6dbd62280790ebef3f3af2344c76a62", + "orderedPathDataSha256": "e65487b828caf7e02dc0bfdbe4cc502e7278f0b51fbfe6f1d4c487402157af19", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/attach_file.xml", + "upstreamIcon": "attach_file", + "upstreamPath": "android/editor/attach_file/materialicons/black/res/drawable/baseline_attach_file_24.xml", + "upstreamSha256": "9ca2466d308bbde8c711a233914048ef82112ea6c27e6912b2cc2f66fd8cc316", + "localSha256": "0e259bb5fa5de9b137f9555c9f754e5965af28c66146faba968351e894f09a1a", + "orderedPathDataSha256": "7d6573fa17cfabc0b0dca18fe5f3f13e6c33a243361a7cd46a68061c419ec655", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/attach_money.xml", + "upstreamIcon": "attach_money", + "upstreamPath": "android/editor/attach_money/materialicons/black/res/drawable/baseline_attach_money_24.xml", + "upstreamSha256": "c7dc89b7e60655c978b4ded089f2457845189c27d365eef212dea4badfe3ccac", + "localSha256": "112b26aee6babc9342c73854b3f915a136c0dc6fd74eb0de00df8c8f38947116", + "orderedPathDataSha256": "013d1f2506736b5dab5ed4143eca5567b85da30e9d4489f05605d09dfdc36546", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/attachment.xml", + "upstreamIcon": "attachment", + "upstreamPath": "android/file/attachment/materialicons/black/res/drawable/baseline_attachment_24.xml", + "upstreamSha256": "345908fa71dd832cf282fd35375544113b3efc92320782663358cc1b32b1ee74", + "localSha256": "e4c9974fdd365638bf68d6b43b159d241d5d0f63dddfe360023714caf1065c24", + "orderedPathDataSha256": "98f212bdd3476b32824e53acc6eb09f91d9d2acab1d4251e3d293ff676a982e5", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/attractions.xml", + "upstreamIcon": "attractions", + "upstreamPath": "android/maps/attractions/materialicons/black/res/drawable/baseline_attractions_24.xml", + "upstreamSha256": "bbb52f7d782543bbf8011d70f9da611f4803156264aba1cb7fbae9b2259dfeb9", + "localSha256": "0d8ff32e2cfd40cf36213400ef62ecd649349ba616e1893b261e4e287db2cc8a", + "orderedPathDataSha256": "46acbd30b8e63e0a6ac75d92dc6eb7a6151cdb77a7c067c6d391c9cb29e5e249", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/attribution.xml", + "upstreamIcon": "attribution", + "upstreamPath": "android/content/attribution/materialicons/black/res/drawable/baseline_attribution_24.xml", + "upstreamSha256": "8d426c8cda456682748e179ee8fa79db21bfb3847816e088c895b25b3c65cb91", + "localSha256": "75767d52e25b582d8d015a52f902db90dffa5f62f23ef9078f26c031085bbc6a", + "orderedPathDataSha256": "bafad2f4488cf9416d91c275cd6cf3cd96a30f6a53f28fca3330cd1184fca9e1", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/audio_file.xml", + "upstreamIcon": "audio_file", + "upstreamPath": "android/av/audio_file/materialicons/black/res/drawable/baseline_audio_file_24.xml", + "upstreamSha256": "cc554aae35d19cd08ab9f6c6286ffc0185340f9ba539fb9e65398c5716b22862", + "localSha256": "a0ad5970a39a9e70440091dbfa5f7b3e165af481a0ecb1dc9d70a54223077ba4", + "orderedPathDataSha256": "99da74710de8e31ebd23da8ccf88afc9edcf837fbf3dd69784d80cad51ecb1ee", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/audiotrack.xml", + "upstreamIcon": "audiotrack", + "upstreamPath": "android/image/audiotrack/materialicons/black/res/drawable/baseline_audiotrack_24.xml", + "upstreamSha256": "72c5a100d3b9710f86f0aaad99f4bed29b975510178ec052f93b1075f68f0d5a", + "localSha256": "8ff70f36cbcdc0dae8194074d7e4c2a0ce611afafc778fe92f90f84c40360fc4", + "orderedPathDataSha256": "6dfdbb1db99143ae3b98b5287318506eb32cd6ee47cb900d54f1313875a32613", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/auto_awesome_mosaic.xml", + "upstreamIcon": "auto_awesome_mosaic", + "upstreamPath": "android/image/auto_awesome_mosaic/materialicons/black/res/drawable/baseline_auto_awesome_mosaic_24.xml", + "upstreamSha256": "3f2888401839037ee1ade4937d15341e9bec42706dadc480f9d1ab408eb20f7e", + "localSha256": "68fb104ccefd12811148fda6d4168c17f26aeaa01850cce52be0843d93ac5c75", + "orderedPathDataSha256": "d67487025908c4e33deb29e8a44b9ebffa2f8be328df2efb0ea017803d312798", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/auto_awesome_motion.xml", + "upstreamIcon": "auto_awesome_motion", + "upstreamPath": "android/image/auto_awesome_motion/materialicons/black/res/drawable/baseline_auto_awesome_motion_24.xml", + "upstreamSha256": "cd87fefb5a18bcf20e82a8046224edf1eb3ff929932ac1b01cc86276ae08bc5c", + "localSha256": "5f1318c690485f7d48db32e2eae8142a7d3d9c6ca39b31fd8c6cbdb747ec2ddb", + "orderedPathDataSha256": "73db01382534cf720b14e4f115ba76314c03b93fbd49d5d0a2755ae1ba4c992b", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/auto_awesome.xml", + "upstreamIcon": "auto_awesome", + "upstreamPath": "android/image/auto_awesome/materialicons/black/res/drawable/baseline_auto_awesome_24.xml", + "upstreamSha256": "6f7606551de44c92722004352b090c05b0846853a530dea909bfbc37a50f9ff1", + "localSha256": "faa71523586aba520ec3a20f6a427731314f63f7cbb20a65688b888dd1653a90", + "orderedPathDataSha256": "40ff4100bbf23cdb28e33215a6f01299c5fd47b3c9acd0f84a510de8303e5c01", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/auto_delete.xml", + "upstreamIcon": "auto_delete", + "upstreamPath": "android/alert/auto_delete/materialicons/black/res/drawable/baseline_auto_delete_24.xml", + "upstreamSha256": "2cc88c8cb3d2de8929a0870996aa7f254f1c02527d584bf60dea1d4e3084ce35", + "localSha256": "4e92937c79ab6473a4cc9049afec7a88034d494d4cd1fb5bc09504ddfc3c57f4", + "orderedPathDataSha256": "7e3e3a8628b41ca559aedf961ff14cf6e63fbdb1588e21a9e934097e75d63a09", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/auto_fix_high.xml", + "upstreamIcon": "auto_fix_high", + "upstreamPath": "android/image/auto_fix_high/materialicons/black/res/drawable/baseline_auto_fix_high_24.xml", + "upstreamSha256": "b646a4ef2fe4dee4e6e9aabb0b493d272a0baf2f8fe80046561304904c121084", + "localSha256": "60a6498e2099679d99708cedef897e68808512e5abaccedf24186da4d9163010", + "orderedPathDataSha256": "5d08ce18be0862659745e93affb034e94f53d5494f9329b48dcacaaea2487a05", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/auto_fix_normal.xml", + "upstreamIcon": "auto_fix_normal", + "upstreamPath": "android/image/auto_fix_normal/materialicons/black/res/drawable/baseline_auto_fix_normal_24.xml", + "upstreamSha256": "4b9e42c5eb91fd2e043b97963d4017b8d05e51e4337c7b9f673199890cb1c6cb", + "localSha256": "bafde62b9027535edc636049741f2b7ab492ef45c9f4b4f60854d759a9face54", + "orderedPathDataSha256": "9e07d6bee609e4dc60b8d9b1d2b0a6af9047392f0879960b276f1ca1f133c95b", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/auto_fix_off.xml", + "upstreamIcon": "auto_fix_off", + "upstreamPath": "android/image/auto_fix_off/materialicons/black/res/drawable/baseline_auto_fix_off_24.xml", + "upstreamSha256": "3afe27f0bdb8d4e7449119555ba934957ff7b4665210222595516aa1419d6904", + "localSha256": "e81025c2e15317cca2fc1c81ba40ef273d7afc152f909e2772ec8e714e9c6fea", + "orderedPathDataSha256": "0efb6c57a3840d7f1969199f88b708f4de2e1afeab30929de954686f2a279c51", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/auto_graph.xml", + "upstreamIcon": "auto_graph", + "upstreamPath": "android/editor/auto_graph/materialicons/black/res/drawable/baseline_auto_graph_24.xml", + "upstreamSha256": "101a325bf5bfc833d507bd3e29d157babbbed6e258253e010a7d82c7ea05cd99", + "localSha256": "1d5c097052698d2927f42ef188366a706b14f66c8439b2b84de0f9b07e2e89d5", + "orderedPathDataSha256": "56cb4a735bfb41dceb4a003ff2c53aff3860a0f5b7e2990292952a12fb0f981b", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/auto_mode.xml", + "upstreamIcon": "auto_mode", + "upstreamPath": "android/home/auto_mode/materialicons/black/res/drawable/baseline_auto_mode_24.xml", + "upstreamSha256": "f98cf1d45910ca26c3f2c192a7802bf764bfd6bfee87e03c5c009f769924dfa5", + "localSha256": "52021f975417071667852af8dec9990c7ec99461bebd39cb5fe37f3d4aab4c1a", + "orderedPathDataSha256": "3aab2449ecc261f3cb998406f5590ed7c01912054bcf35c32f8366eb3b3bb4f8", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/auto_stories.xml", + "upstreamIcon": "auto_stories", + "upstreamPath": "android/image/auto_stories/materialicons/black/res/drawable/baseline_auto_stories_24.xml", + "upstreamSha256": "695065e50c41f17e378eb7f745fb7d35b5f23422e8e9d2d46554d11ed8a03d2e", + "localSha256": "e38a5886e2b589a81c66e8b5700640139215c2623d352c668af7070125c6ebb5", + "orderedPathDataSha256": "9a2b0cffa8dd289be69a9121399d8733dcb2ec0d9ddde38f5a1242b65208803d", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/autofps_select.xml", + "upstreamIcon": "autofps_select", + "upstreamPath": "android/image/autofps_select/materialicons/black/res/drawable/baseline_autofps_select_24.xml", + "upstreamSha256": "9415da4963ed0ecaa5ccb41d478d87f17150a32d8c94cb13a78396daf99e47ee", + "localSha256": "dd6f54fc54946ed7feac1afaf72a429acdc1af4bd559810c3e1c5bb0cda4e1ff", + "orderedPathDataSha256": "0115ce76259f51d686c79d98a631e3592724780833e463620a611b742c5b4aa6", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/autorenew.xml", + "upstreamIcon": "autorenew", + "upstreamPath": "android/action/autorenew/materialicons/black/res/drawable/baseline_autorenew_24.xml", + "upstreamSha256": "3a4c1af64b5b88e5b0ec6830f1276f24dd8f1aa037209fc55dd5cb74dca84ee7", + "localSha256": "e006077c80b2ac79d04ec0b1935762a38a3f7e926cb20e6950a8061c884ddbb0", + "orderedPathDataSha256": "7a3cd28bf2b9732400c602d98f738a3613f8cbb4a5fee9c74ecf99ffc00cfd70", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/av_timer.xml", + "upstreamIcon": "av_timer", + "upstreamPath": "android/av/av_timer/materialicons/black/res/drawable/baseline_av_timer_24.xml", + "upstreamSha256": "4e784aff4f7b426883ab09c76c1de1d0f3f4a30130f2013f9c45f78e336c7734", + "localSha256": "485d24ee4a57d314d1aed5b2cc5931281da4896bfbd9b65d2e195f906e07ac87", + "orderedPathDataSha256": "70392c5439ccd727da7e74352cef4ee2b55e4597962d6310a38f1263c394fe05", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/baby_changing_station.xml", + "upstreamIcon": "baby_changing_station", + "upstreamPath": "android/places/baby_changing_station/materialicons/black/res/drawable/baseline_baby_changing_station_24.xml", + "upstreamSha256": "98a6d5a9624e9ca991b9f70361c4c94ae8d2850bc5b5d2587c5a1e16ecb5ee10", + "localSha256": "774d614aecbc73c2f10101bd005fab9238206a63f049c31580fe3ddf606f1a74", + "orderedPathDataSha256": "7561d26f72db91f1cb9128e4e753a88371e3daa82656ca71715ed32f87876bd8", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/back_hand.xml", + "upstreamIcon": "back_hand", + "upstreamPath": "android/social/back_hand/materialicons/black/res/drawable/baseline_back_hand_24.xml", + "upstreamSha256": "cb6bcfdae9c101a7fcdc82eba176ba7c1d76059e5efa202b5015a0a5a64ae20b", + "localSha256": "8b044290c250ac19860b71f4660e78d8b7384525752518afd71d03cfc703634d", + "orderedPathDataSha256": "2c6b3a24c7a7b03a7d5b50819e87606fbbca48de7292a688c264fd803648ee6f", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/backpack.xml", + "upstreamIcon": "backpack", + "upstreamPath": "android/places/backpack/materialicons/black/res/drawable/baseline_backpack_24.xml", + "upstreamSha256": "2e433679ac3e6de9f70b793ed538a45824352c9221e96fe24fd87f46267545c6", + "localSha256": "ff3b1923baa955a6476d5aff3c9805cd23e67bdfab37856f9b1be3abe0b366e9", + "orderedPathDataSha256": "3d5e4db62c44166cdc466fbe4540fa155d23da02a2d28cae5cff4adae3c7bd61", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/backspace.xml", + "upstreamIcon": "backspace", + "upstreamPath": "android/content/backspace/materialicons/black/res/drawable/baseline_backspace_24.xml", + "upstreamSha256": "90fbc28054c0408b83a9e58e4ab00d8ed1faa40630438dfb9e7e2c5e8963fefd", + "localSha256": "2ecef3d50f761685e13e7351d71b294791c28e22fe2e2af9e0456c9b2abff33a", + "orderedPathDataSha256": "2a682fc7eb530c4c1b7702574939ebb7352dc019409e087e9fcfdcb0e169f64d", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/backup_table.xml", + "upstreamIcon": "backup_table", + "upstreamPath": "android/action/backup_table/materialicons/black/res/drawable/baseline_backup_table_24.xml", + "upstreamSha256": "1139658875a5556abe9562ac1ac20e1c263ee694aa47079388fbe39a9fd5f229", + "localSha256": "b3ccf54ee1ab3a7de6d362c351eec25789e819e23d50c19c78477e70bfd62002", + "orderedPathDataSha256": "b7739b6ba1ec03f05ed9f160d0629a7d05680e7638f0effec18630d9f2e1fe99", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/backup.xml", + "upstreamIcon": "backup", + "upstreamPath": "android/action/backup/materialicons/black/res/drawable/baseline_backup_24.xml", + "upstreamSha256": "885bedeccfac16796972973fc020d14d6dfeb8afe834d6681d03019fd90e2c94", + "localSha256": "7e2fcbb4ba6e5198343e45d66444ff3a18940d1a326c77c214581300d60e94dd", + "orderedPathDataSha256": "855744ac09715bc6a366f6081433f29893e62c4e3f02ad4a907b5025517b335a", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/badge.xml", + "upstreamIcon": "badge", + "upstreamPath": "android/maps/badge/materialicons/black/res/drawable/baseline_badge_24.xml", + "upstreamSha256": "0cf0950666658e69cb4742e8eaf4088259c0be730263a9bd00e7b90eab7290bf", + "localSha256": "1fd84e07d1b5cbb87e637281a607bcf7d87b19b369b121d5b9df1e228bff241c", + "orderedPathDataSha256": "e170aead31150a30e1d403791256a27b4c75bd40b8124bdfc76a64fc7a5be43c", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/bakery_dining.xml", + "upstreamIcon": "bakery_dining", + "upstreamPath": "android/maps/bakery_dining/materialicons/black/res/drawable/baseline_bakery_dining_24.xml", + "upstreamSha256": "b54ac6a360604c55fe8ef6d45514024f20e8876bd74420347a54afaa241f753d", + "localSha256": "7a07f36553828ebccdcb0b69d7f9f30034f3718a4f50db75f0651a9699e97bc7", + "orderedPathDataSha256": "8069ba1cecce62fc98498a76bfedc8cdadd6a15230ad64de1e7765dcbb86c886", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillType", + "value": "evenOdd" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/balance.xml", + "upstreamIcon": "balance", + "upstreamPath": "android/action/balance/materialicons/black/res/drawable/baseline_balance_24.xml", + "upstreamSha256": "a91264078bad334c9728c9a6261cebb6e74f4d2a31cc845d8311618b76024e35", + "localSha256": "68b9d6715ebeb186e305db930cac489fc2e9df0de8f60fd5df0a36da531e44f7", + "orderedPathDataSha256": "52eed61c166bcf3a8ea2224855bc7fa723a5616db0f2e7291c95142043277ab4", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/balcony.xml", + "upstreamIcon": "balcony", + "upstreamPath": "android/places/balcony/materialicons/black/res/drawable/baseline_balcony_24.xml", + "upstreamSha256": "e337b597121bb1b8ef21d414f0bc46731685da556656c29c162fff356a0be410", + "localSha256": "c5a6578ea18aaa8ebf3793d7e73ae575ba9ac1499214fa1206a2d423e0091c8f", + "orderedPathDataSha256": "ac981f15e7aa800782407bd81a63b9c1035318b12573e11cf19b2127df3b185a", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/ballot.xml", + "upstreamIcon": "ballot", + "upstreamPath": "android/content/ballot/materialicons/black/res/drawable/baseline_ballot_24.xml", + "upstreamSha256": "a5cba78e1debb4d27e51e03efafede93cc48304773f59f1f8a285aa32d01e881", + "localSha256": "3948868286a088cdc0765a29378c892ae7776f0d112e3fe9c3ec76967be8e664", + "orderedPathDataSha256": "710a577c697bef1792077ae444a037209ec0556b3e53e2695f10e98e6105d8ba", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillType", + "value": "evenOdd" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/bar_chart.xml", + "upstreamIcon": "bar_chart", + "upstreamPath": "android/editor/bar_chart/materialicons/black/res/drawable/baseline_bar_chart_24.xml", + "upstreamSha256": "d86524b57487428dcf973b9845c7845bc9d18c77a22c585d8afadac897d6e49e", + "localSha256": "ec912067e3012f2eb2f37db5e4baefc0990a21fdc1c5cb22b2d0332d88ab2c69", + "orderedPathDataSha256": "e4305fbf68f72ca68dfa6219a7003dad4f691296b01e2b8bfe22874d814f4de6", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/barcode_reader.xml", + "upstreamIcon": "barcode_reader", + "upstreamPath": "android/action/barcode_reader/materialicons/black/res/drawable/baseline_barcode_reader_24.xml", + "upstreamSha256": "5241304bc2eb7cbdfafde8e6b3b45f892138c0e5044b8b0286fa227c8e919d21", + "localSha256": "6cc2f81de8a27bea3c400aacf1e9109c00ff2bd78bae340c48976e80f7df2b16", + "orderedPathDataSha256": "7e48b516c81e456c789914f11a8e410a4d941e719192ec5a3edb71e2b686c66f", + "originalGeometryMatched": false, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/batch_prediction.xml", + "upstreamIcon": "batch_prediction", + "upstreamPath": "android/action/batch_prediction/materialicons/black/res/drawable/baseline_batch_prediction_24.xml", + "upstreamSha256": "41183f5a8f631878ffa9281b4f3ff2b72447d61383227523273e373c7f6ea54a", + "localSha256": "0f8cffa4d1a4bcb8934c57184c35100cacd31ffbb2c802d36cec6d99579be2f3", + "orderedPathDataSha256": "e6848546dfbebbd9ad47c7a5d36a52365224e34ba45334035de51f0a2deec325", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/bathroom.xml", + "upstreamIcon": "bathroom", + "upstreamPath": "android/search/bathroom/materialicons/black/res/drawable/baseline_bathroom_24.xml", + "upstreamSha256": "3c217b45b2c77e732ba45ef577072c528c4fd9e1a4aa5e5161a1f285fe0ff7da", + "localSha256": "36b58d5979a5f78586a4a8a56ecda7ec2c382e860b80beebf00b4932a87e7bfa", + "orderedPathDataSha256": "f4367e35178ab54dfe14dbef9a5facf2e0ac60f8d5fc755c611e30aa02750e09", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/bathtub.xml", + "upstreamIcon": "bathtub", + "upstreamPath": "android/places/bathtub/materialicons/black/res/drawable/baseline_bathtub_24.xml", + "upstreamSha256": "29d3294268dfa360b73e6124919fa2850f5ac38211ce4812fe7f5eff3d2fb3e9", + "localSha256": "43693531f71c24fe3b60475b2674d439707febaa3a0d3e4b8a9975742e0ce3e4", + "orderedPathDataSha256": "193ce2ee2d85fb340d4ee173e47bf23efb874ff6f333f9ec4e8165b04c5570e9", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/battery_0_bar.xml", + "upstreamIcon": "battery_0_bar", + "upstreamPath": "android/device/battery_0_bar/materialicons/black/res/drawable/baseline_battery_0_bar_24.xml", + "upstreamSha256": "794a5c008a93469c0e7a9b5299b5a0e9ac3d562a80b83d694733bb0053b4d2a8", + "localSha256": "6890649c64caab1e367e3731e9aca59dd2558f7b6760dcc234b12afc7f0d164d", + "orderedPathDataSha256": "6314d1e0a181b72a85478e2676a61754a1db55cf2587fc044edb04812f478725", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/battery_1_bar.xml", + "upstreamIcon": "battery_1_bar", + "upstreamPath": "android/device/battery_1_bar/materialicons/black/res/drawable/baseline_battery_1_bar_24.xml", + "upstreamSha256": "152db316b808430d82947cd4231054003def7bc90632900a08eed69bc5f535fc", + "localSha256": "939bc328a7a9b88efbafa6743879d13c2fe0838172aa4100e555724cf59da95b", + "orderedPathDataSha256": "dbd0d7c7238ec43ef01263815f2948f8931477beb0724c9d82ab356c64096e9a", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/battery_2_bar.xml", + "upstreamIcon": "battery_2_bar", + "upstreamPath": "android/device/battery_2_bar/materialicons/black/res/drawable/baseline_battery_2_bar_24.xml", + "upstreamSha256": "3a69f54277f5bb1c5edf588dd16da5d2262a3d3d0c75c51cee321f6c3eeb5edc", + "localSha256": "8946587167b6dd093a19f96011f6c74a8757b78058fec58ca2e02c42432fa9a6", + "orderedPathDataSha256": "8516e27a76677bef34e3b9d764a869f58c2c2762574540e9909106056c223e46", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/battery_3_bar.xml", + "upstreamIcon": "battery_3_bar", + "upstreamPath": "android/device/battery_3_bar/materialicons/black/res/drawable/baseline_battery_3_bar_24.xml", + "upstreamSha256": "683e49b1ca62e33799c02780e1dda9f5691542749cd28a1deccfe623d4442091", + "localSha256": "2e80c671762eb8f5a9d79aaa986b4712ef32e2150848b45509224408911357af", + "orderedPathDataSha256": "3a82ffad04488ead79e02018190ae46350dfbba2ceecd9dad060585b1ad78954", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/battery_4_bar.xml", + "upstreamIcon": "battery_4_bar", + "upstreamPath": "android/device/battery_4_bar/materialicons/black/res/drawable/baseline_battery_4_bar_24.xml", + "upstreamSha256": "3afb4d1c522f9a3a8a0ab16a614e7eb8c047e924c034d344969cffb69829fdc8", + "localSha256": "17483c9583f6681b4c8968f2cf8652f0cb29dcc803b79c59fd66bc361a0473e4", + "orderedPathDataSha256": "9a25c54991b73cdcb85460b4445d9cdba3cab91f1d7e14184a6bbb24b823cb00", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/battery_5_bar.xml", + "upstreamIcon": "battery_5_bar", + "upstreamPath": "android/device/battery_5_bar/materialicons/black/res/drawable/baseline_battery_5_bar_24.xml", + "upstreamSha256": "9d555543edbf39f9824c1d0ba23960c2b854bb5c3b42f55d32267dd07bbafdc2", + "localSha256": "77496606ea068f3343afc29ab1ba025a7a8515e0169195cdf2c02abd120b80aa", + "orderedPathDataSha256": "ec2e3df2525178c78ec6a253bc253c37fff77983995e9aace2cc1dbc8f8d1d2f", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/battery_6_bar.xml", + "upstreamIcon": "battery_6_bar", + "upstreamPath": "android/device/battery_6_bar/materialicons/black/res/drawable/baseline_battery_6_bar_24.xml", + "upstreamSha256": "3e5732acdcc6f991c3616111dc1fffc19ddd8655d22818de8c5536d2fcbc9c38", + "localSha256": "569c2882e4b435793b2f2c1ea44fb73f0829101f701872365ee22ee052e3f25a", + "orderedPathDataSha256": "6f589f5925952c4086fb54ea096f272844c0127da8ffd07e579d9520324ce610", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/battery_alert.xml", + "upstreamIcon": "battery_alert", + "upstreamPath": "android/device/battery_alert/materialicons/black/res/drawable/baseline_battery_alert_24.xml", + "upstreamSha256": "341d5b05bd068192ca45b9d68b608d89c6a66a9b87f07c61288ccdce054f9430", + "localSha256": "3c6e56106ebb3cc658df6e258f20095e3e3a3b891c1ee55b8cded0d29715c3b9", + "orderedPathDataSha256": "789dc917df0f710f27df1b3eaf78e1b9ded2ffb61a63b03bf3f11f6f3df6dd3f", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/battery_charging_full.xml", + "upstreamIcon": "battery_charging_full", + "upstreamPath": "android/device/battery_charging_full/materialicons/black/res/drawable/baseline_battery_charging_full_24.xml", + "upstreamSha256": "b7e952cf14cd080ab998ea6dae252fff1ac1f646729b384e48939e7e20f0e24a", + "localSha256": "fe575648f9f359f5c98b1d2012cf47504b7e3020349848b93937a22edcf4f04a", + "orderedPathDataSha256": "75eb89a1d9503d59bf13841088f84f45e129e51c61041157d668aab7a3098b36", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/battery_full.xml", + "upstreamIcon": "battery_full", + "upstreamPath": "android/device/battery_full/materialicons/black/res/drawable/baseline_battery_full_24.xml", + "upstreamSha256": "b61e9b872fc337c6000a65a4a020ba48c9c0e5d33595fc16d297bff97463d6e7", + "localSha256": "6f06832877ca1df7d5d3a2a9831c6b2ec9434baa9c8ec1c7f72ff33ee4f80988", + "orderedPathDataSha256": "b4e4329ffc468dd2e0bdc4892a8f5b2481ec5c85b73c57d1343ef340f7c2624e", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/battery_saver.xml", + "upstreamIcon": "battery_saver", + "upstreamPath": "android/device/battery_saver/materialicons/black/res/drawable/baseline_battery_saver_24.xml", + "upstreamSha256": "37e801add7ef2d47ff6720f9c8eecbea20e6a5ef0dc58113e26afab18c7ac096", + "localSha256": "317cac731afcac0bd2778abd12b7a8d7e197736055e9a631171559ed5122e5a3", + "orderedPathDataSha256": "3aeff00085b37f7cdfd87ba189a441bee6a6510ab8a7c15cc262582876cca609", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/battery_std.xml", + "upstreamIcon": "battery_std", + "upstreamPath": "android/device/battery_std/materialicons/black/res/drawable/baseline_battery_std_24.xml", + "upstreamSha256": "b61e9b872fc337c6000a65a4a020ba48c9c0e5d33595fc16d297bff97463d6e7", + "localSha256": "a7723779d290b03d6971a89e3db30df31c75305a8e96ea99b789f9d7568a536f", + "orderedPathDataSha256": "b4e4329ffc468dd2e0bdc4892a8f5b2481ec5c85b73c57d1343ef340f7c2624e", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/battery_unknown.xml", + "upstreamIcon": "battery_unknown", + "upstreamPath": "android/device/battery_unknown/materialicons/black/res/drawable/baseline_battery_unknown_24.xml", + "upstreamSha256": "783666a660b2a4330eab4e79041662eae7605acab5cd244a88b0842fca3995f8", + "localSha256": "4815387ae1db89bb4ea1b4fcb290cab5cef4c310ad19ed226d5a55baf0539c75", + "orderedPathDataSha256": "e4e079dcff86b654f96e24593eb27a05aa3e2a85e5136f0c8e35393c600d9ded", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/beach_access.xml", + "upstreamIcon": "beach_access", + "upstreamPath": "android/places/beach_access/materialicons/black/res/drawable/baseline_beach_access_24.xml", + "upstreamSha256": "91e30e363743f885a07fe788bbdcd8539abd23bbf9a86c2744b3256b8f23e18b", + "localSha256": "9f06529f437a8907c193451f23c1c4ce21f11f8a3f2ffa13be2d8388b5eb57fa", + "orderedPathDataSha256": "c19a1a021887ce2fa6c90d1a7648aaa5182fec492e4a99ed7908180e77ea2fb8", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/bed.xml", + "upstreamIcon": "bed", + "upstreamPath": "android/search/bed/materialicons/black/res/drawable/baseline_bed_24.xml", + "upstreamSha256": "7fc699935ef9e17744b3c0c1be51cda4b13f98a7ad84c27f3af9aab28b6d1c8e", + "localSha256": "5e32690bcd97f6df0153483a8921e1bc6dde536391cdcbe4b7a7180d46daed1b", + "orderedPathDataSha256": "069848f455a923ca8bfa3785984357ed9b5560c8ec5138f426a6df2c2bd1e9f8", + "originalGeometryMatched": false, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/bedroom_baby.xml", + "upstreamIcon": "bedroom_baby", + "upstreamPath": "android/search/bedroom_baby/materialicons/black/res/drawable/baseline_bedroom_baby_24.xml", + "upstreamSha256": "3924a670d6f4c9ea5dbfbba9efc102d34c05bc1d2268de669e7b4eeb16ba8220", + "localSha256": "500c88200aa9c75a11368ee7c39ace99048740bd5766aebe3321b472a9c80b07", + "orderedPathDataSha256": "a3df1aba5fa2a2ab66979e7f0b2b31eca9f7137c2f5f8103be2aca93f994c8b4", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/bedroom_child.xml", + "upstreamIcon": "bedroom_child", + "upstreamPath": "android/search/bedroom_child/materialicons/black/res/drawable/baseline_bedroom_child_24.xml", + "upstreamSha256": "f2d06ca771d87269803833858435fd52218d835bb5bbe26c8932059c16bb1a6e", + "localSha256": "a15752936112478f5c9fc43b92b42586a70c72e459d4c72fdbb762816e10b99a", + "orderedPathDataSha256": "040621b76ea911a6fb743d321ba941ecb5f104bb9606ce286761c768c9b613dc", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/bedroom_parent.xml", + "upstreamIcon": "bedroom_parent", + "upstreamPath": "android/search/bedroom_parent/materialicons/black/res/drawable/baseline_bedroom_parent_24.xml", + "upstreamSha256": "a6ccb1ac086f79e9f396e745323b2f362ea7770308846779a085c25ef645b9a5", + "localSha256": "779c2b69ca190c44cfd5437b5ee3083df1e16235067035243fa418ef96f77f89", + "orderedPathDataSha256": "f48f217d7145e086a0b5ed49cd44573705923a94a021d360407a562f5c4f5c46", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/bedtime_off.xml", + "upstreamIcon": "bedtime_off", + "upstreamPath": "android/image/bedtime_off/materialicons/black/res/drawable/baseline_bedtime_off_24.xml", + "upstreamSha256": "2b26ade765f061088a2d67ef6e2a34ccd775e027871360d938a71265e7d6fce3", + "localSha256": "7b28ce27e86061c5b6c5b0bc296d92a193507416319148edac760b0728bb5a8b", + "orderedPathDataSha256": "d8d7f2d6026996819b305614f7fbbc19ac6c8534376f12888be2f03ed04f0585", + "originalGeometryMatched": false, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/bedtime.xml", + "upstreamIcon": "bedtime", + "upstreamPath": "android/image/bedtime/materialicons/black/res/drawable/baseline_bedtime_24.xml", + "upstreamSha256": "224dfaf250a072c3c2e534813e97365ec65c68c0ab4889d8551263ad69fc6638", + "localSha256": "4cd503f79ae8798bd27b132375c5d4088905dd18893753d75ca1901ee04c4656", + "orderedPathDataSha256": "8d40cf53dd82b0fffe31b47358eeaa1c5e2a09c5acb58dfb342ce0daae9f0080", + "originalGeometryMatched": false, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/beenhere.xml", + "upstreamIcon": "beenhere", + "upstreamPath": "android/maps/beenhere/materialicons/black/res/drawable/baseline_beenhere_24.xml", + "upstreamSha256": "218a0862b9fd0c7dadac3425381d37164aa3336f68bd665ac16772c9e644e97a", + "localSha256": "69fd6659e4973f907484e6b6d820157680f6272938203da5c156bdadb5278c03", + "orderedPathDataSha256": "873218012659c21248701d839bfc1441948ac0f8c452806fcc99e33a1606297a", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/bento.xml", + "upstreamIcon": "bento", + "upstreamPath": "android/places/bento/materialicons/black/res/drawable/baseline_bento_24.xml", + "upstreamSha256": "756abc161b3fbfc68a588c2bfb1deff1d16e0388468f3e81c1ee30cd099adf0e", + "localSha256": "a9f5edeaa256a36f25be63e3b94ffd25381b6735a417131241767d8e988e6314", + "orderedPathDataSha256": "bcae1bd00b1b2d783c781efde22c0331b56ac86b463d194da479b25f6a93fc27", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/bike_scooter.xml", + "upstreamIcon": "bike_scooter", + "upstreamPath": "android/maps/bike_scooter/materialicons/black/res/drawable/baseline_bike_scooter_24.xml", + "upstreamSha256": "9970e75a0a0ac79b62dedde322014262991b70a6ed39a1c7b6b1c55f542bf7a1", + "localSha256": "ee1e97d2754b8469b16e06d645cdc638642d787212d314a0c78c439311c16e83", + "orderedPathDataSha256": "bd350801b0aa777f80a9bd496a511efcc208e9617637fd0739a8511b68799a36", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/biotech.xml", + "upstreamIcon": "biotech", + "upstreamPath": "android/content/biotech/materialicons/black/res/drawable/baseline_biotech_24.xml", + "upstreamSha256": "59e4b1d10098113d10e4568890ca6190b905e314c74f60747208ebe3f2e26753", + "localSha256": "54e34061478afe9be21ab2029f680e5e3d9450174ab41f30d86dbbe65aba5139", + "orderedPathDataSha256": "d54893dbaf32729074842ea929e9171734226f44f4844daf89209dd75b84fa93", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/blender.xml", + "upstreamIcon": "blender", + "upstreamPath": "android/search/blender/materialicons/black/res/drawable/baseline_blender_24.xml", + "upstreamSha256": "4a24e9409a0dd579ae7625d146b016354b5fb3f1bb9bf800fe2157124b65ad87", + "localSha256": "1bd7ed8b6b11c59e9710aabfc5c7a5046e0f6292499bba4ef75f38e2bae8585e", + "orderedPathDataSha256": "d5d9fe3bacdac0b096534c20e97bf38be173a0dc97a296a49c196906aed7a037", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/blind.xml", + "upstreamIcon": "blind", + "upstreamPath": "android/social/blind/materialicons/black/res/drawable/baseline_blind_24.xml", + "upstreamSha256": "5ddea7a6d9b93845f4e5a0616f0ee752aa4642b8eec662e8a5cf256f3e692947", + "localSha256": "5b2e829f18f0bd41cecfa808992a2b709ca9ac6c55143608052b001eb37151b3", + "orderedPathDataSha256": "1e311dfb54b57ab6de32e0f6de85d9902778f85a3a0d5bc3170f1ec2335f3538", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/blinds_closed.xml", + "upstreamIcon": "blinds_closed", + "upstreamPath": "android/home/blinds_closed/materialicons/black/res/drawable/baseline_blinds_closed_24.xml", + "upstreamSha256": "b2e9b894134334d2cf972c31b0a9c70011916af6ae9c123f29e5c3424f2be7b8", + "localSha256": "3d501bf590b089935f813046391bb755c7516e376fdc27508f6ddf46595986ea", + "orderedPathDataSha256": "5c9dd56b3d098dd8e733e68ddfe5ee2925b67c536a88304e4cf74705c910d23e", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/blinds.xml", + "upstreamIcon": "blinds", + "upstreamPath": "android/home/blinds/materialicons/black/res/drawable/baseline_blinds_24.xml", + "upstreamSha256": "3ddbf3e2170ee83ebef0e7f8b848e7f60feb059af9eba77d8dcdc2d3548b47cb", + "localSha256": "11415361cc0b19b77e0e42e13f3831b88d15de3402e695818651ddcbd8119933", + "orderedPathDataSha256": "0317cfc0fd0cc52728688df5a22cd9f9633d37738433cbf819f6b665cd248bfc", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/block_flipped.xml", + "upstreamIcon": "block_flipped", + "upstreamPath": "android/content/block_flipped/materialicons/black/res/drawable/baseline_block_flipped_24.xml", + "upstreamSha256": "7c338727c68847c5b5b04bda88ef0f98238f21f2be92fbb8469d8f1d01ff15df", + "localSha256": "28453ff6a04def23c4baa7f9c0e55b28183d65f1889ed32860550f8ffad51997", + "orderedPathDataSha256": "6de92f19ed4d0bf35b57976052d670d85789efcdae9110963ecf73537ac22ddb", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/block.xml", + "upstreamIcon": "block", + "upstreamPath": "android/content/block/materialicons/black/res/drawable/baseline_block_24.xml", + "upstreamSha256": "f320be7c5dfbda7d7e3c48bdafd7ee8dc6bb0e3c3d20bc55620134bc1ccd0dd7", + "localSha256": "fff040af31c9a6066827406d7c81cbfa934b25f6084e5386098009cc57189448", + "orderedPathDataSha256": "cd66ef1348e258f452088bd75bc652f0c621aea2185ec191ef0436eca84b2880", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/bloodtype.xml", + "upstreamIcon": "bloodtype", + "upstreamPath": "android/device/bloodtype/materialicons/black/res/drawable/baseline_bloodtype_24.xml", + "upstreamSha256": "6e5654e744d830b7123e9571561d71bc50fb29a36b59cd4618153d9b431f9cb0", + "localSha256": "947a1c2ae83db111a704f29cd4a067b6caa1ec3bef69f9c4c181024916f079de", + "orderedPathDataSha256": "a26cb0f23c7bd0f1126f7750219442178f17922985ab303979e045d46adf5ca8", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/bluetooth_audio.xml", + "upstreamIcon": "bluetooth_audio", + "upstreamPath": "android/notification/bluetooth_audio/materialicons/black/res/drawable/baseline_bluetooth_audio_24.xml", + "upstreamSha256": "96108ec6d189369945f7eedf3d7fcd21cd2393a4ab9cd7b16bc397080529b00d", + "localSha256": "fd73f80dafeb4290e82a6734030e36bc265b0abd54f0d7a8415dab412a7c2661", + "orderedPathDataSha256": "a7bb9b6413e06c4dcb7d79e7bb3787c79347e396b553a1363f1a39003e558c1d", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/bluetooth_connected.xml", + "upstreamIcon": "bluetooth_connected", + "upstreamPath": "android/device/bluetooth_connected/materialicons/black/res/drawable/baseline_bluetooth_connected_24.xml", + "upstreamSha256": "1320b0240832aeef8f666dd3d5d884a6384cd56e35b2c27c05278e77501bf46d", + "localSha256": "7097cc5aa39bdd3d32acc5d511701133f11d058611e13e7d34ff2f735322fa73", + "orderedPathDataSha256": "cd809d949769828a7fd6eb3bd94c777c9344a737f5621f0c774a02cdd7f01d17", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/bluetooth_disabled.xml", + "upstreamIcon": "bluetooth_disabled", + "upstreamPath": "android/device/bluetooth_disabled/materialicons/black/res/drawable/baseline_bluetooth_disabled_24.xml", + "upstreamSha256": "e5b21362c0172d94ca5fce91a66ee9be3bab30c538f41f25e9c28f0a9ffc067c", + "localSha256": "145c8d52799be39f120ecdef8b5e0dafc2520764f999b3219df559f53cd26c64", + "orderedPathDataSha256": "da369114c57f9a6edc790fef6b955f45fbd1d5501c77d54c6a96585a7d9f1ba1", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/bluetooth_drive.xml", + "upstreamIcon": "bluetooth_drive", + "upstreamPath": "android/device/bluetooth_drive/materialicons/black/res/drawable/baseline_bluetooth_drive_24.xml", + "upstreamSha256": "f7ed1e10ad1eadbabbc778240ed849a620fa5b8bd4157a7919ef4f89ca45fd00", + "localSha256": "1d3221242ba00f9a0ac4cab8d4a05ca3940c5defb8bbbb1ec3bf3d4c8ab3a996", + "orderedPathDataSha256": "79c6b933f18d96f62d971c33ffa8590798269d639aaba23672fc49703b2a96e4", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/bluetooth_searching.xml", + "upstreamIcon": "bluetooth_searching", + "upstreamPath": "android/device/bluetooth_searching/materialicons/black/res/drawable/baseline_bluetooth_searching_24.xml", + "upstreamSha256": "710e2822387c71dc61029162c3f3c6965a777a192733a8cf5009131dcb572c98", + "localSha256": "80bc754e3ede4ea2cd86f9aa1b3a5f6c6c16085cf08bd5cb822b61bb2df2157c", + "orderedPathDataSha256": "a7bb9b6413e06c4dcb7d79e7bb3787c79347e396b553a1363f1a39003e558c1d", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/bluetooth.xml", + "upstreamIcon": "bluetooth", + "upstreamPath": "android/device/bluetooth/materialicons/black/res/drawable/baseline_bluetooth_24.xml", + "upstreamSha256": "3a569733b00511a29a8482bf62603dea663119b3246f8f83737bebda9d088a2c", + "localSha256": "d4af65a587a5b1e59d4fe4eb04cf831b99a5892d881d3c858fefd7b70505da6f", + "orderedPathDataSha256": "7623ca0ad0d2b6ca8eb7f293fd0d1fadf6652eb0ed4329cacd6c57f8c98fbfb0", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/blur_circular.xml", + "upstreamIcon": "blur_circular", + "upstreamPath": "android/image/blur_circular/materialicons/black/res/drawable/baseline_blur_circular_24.xml", + "upstreamSha256": "e0079505013727a33e2bcf6cd142e590d650aba8ee9060bec9ad938b3c8efc8d", + "localSha256": "2fc7c928eb61f77b4d3cc4eaaf1d7ad434f06284353337715591e28e662cf506", + "orderedPathDataSha256": "204dfb2fdb10e1de8fa01b13c5ea81341e5860c6d65ee91bce8d25170ab93cbb", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/blur_linear.xml", + "upstreamIcon": "blur_linear", + "upstreamPath": "android/image/blur_linear/materialicons/black/res/drawable/baseline_blur_linear_24.xml", + "upstreamSha256": "393a72dea92ba9c0e233d98c4b05470441b508e34ecc460492190a02245c8ec7", + "localSha256": "c537e20a02eed1226043ba2699f4380e0e827588f4796f9dd9409262239c0489", + "orderedPathDataSha256": "c4aa6c53399ecaaa570a77a32e3f6f29e1fc3ba3bb834f1bfc43e2df18a37183", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/blur_off.xml", + "upstreamIcon": "blur_off", + "upstreamPath": "android/image/blur_off/materialicons/black/res/drawable/baseline_blur_off_24.xml", + "upstreamSha256": "27fd573cf4dfb473d86bfc2ad0a0d4cba14beddb8f5edb9f553ce878358832d4", + "localSha256": "ee2fb38540ce2a853ae8168d9a32cafd3cf75d85035995b4e59414758572ec56", + "orderedPathDataSha256": "fd35f81ec1c89e266882e12ff67d45c040c956aa9e96967c60d292c1f6889493", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/blur_on.xml", + "upstreamIcon": "blur_on", + "upstreamPath": "android/image/blur_on/materialicons/black/res/drawable/baseline_blur_on_24.xml", + "upstreamSha256": "12b56c2ef116ea824d94ee3358f727d1cc6bebe5454ab86a21bfc51979a201ff", + "localSha256": "a973733f8c91c1f8307bf506f64d1048d1e0da984d3759f915b0483009751140", + "orderedPathDataSha256": "903a9d3b1471219b388c742c431b5a78c4638779290d4987a5f0f822c5a8b537", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/bolt.xml", + "upstreamIcon": "bolt", + "upstreamPath": "android/content/bolt/materialicons/black/res/drawable/baseline_bolt_24.xml", + "upstreamSha256": "dd9e86961ac2aa6907ebce1968a5bb7dd69d55109f80f782fbdfe8386c4b23f7", + "localSha256": "124dc871edccb035c1fb2b3c758e8492a56b4a4e05e00e05fe08c1057679d87a", + "orderedPathDataSha256": "9e9c3d24281568923b1e5f2fc1e2cc468c52635956877c259e1c87440002f2e9", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/book_online.xml", + "upstreamIcon": "book_online", + "upstreamPath": "android/action/book_online/materialicons/black/res/drawable/baseline_book_online_24.xml", + "upstreamSha256": "90f1a60f514e7a4f2c37d594bc22f7ce9cab381752cf3b70cef1db414f3fae29", + "localSha256": "741d4cf901bca6b497c287f162dc897a685faf7512a419048b4094294b3f1906", + "orderedPathDataSha256": "9453b2ddf9779d8a7f653a554c5d9118b3748e11a24a59cc25d62ba12f69fa93", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/book.xml", + "upstreamIcon": "book", + "upstreamPath": "android/action/book/materialicons/black/res/drawable/baseline_book_24.xml", + "upstreamSha256": "4b8fd6fd514cfbe051f70eb9bb3bdd0bce1538d63a6f216281a5e5d158d31d44", + "localSha256": "68fb30be03591c455d0b2e256710d649bfe812909fb135e0187789fc0811b47a", + "orderedPathDataSha256": "22ceebf57e1846c6bd8ae11b9845ddea359849ad8a26cd8fac3687dc8a614bbe", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/bookmark_add.xml", + "upstreamIcon": "bookmark_add", + "upstreamPath": "android/action/bookmark_add/materialicons/black/res/drawable/baseline_bookmark_add_24.xml", + "upstreamSha256": "26668d1e600b5908b70b3006b2316150a4067bfd93995646bd9b2599adacbf22", + "localSha256": "565b29d4c448b12d72d7d23fce25e1eab14db009ac03587fe78951d1806c3eb7", + "orderedPathDataSha256": "ffbff17bdc9c565e29bb24286f0d370937c9a425bfe4dff3e33d1b6bdfc501b6", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/bookmark_added.xml", + "upstreamIcon": "bookmark_added", + "upstreamPath": "android/action/bookmark_added/materialicons/black/res/drawable/baseline_bookmark_added_24.xml", + "upstreamSha256": "bc7c262da50647e39fd1b186ef2c8e1320a94c56c4eb28cabdc4abf6190556cd", + "localSha256": "b5973abace1fa4a69c88286f9e63b53546e7b01301922e23a0f6c3dcb99a8556", + "orderedPathDataSha256": "a57e474956a97be7a35dde0978a92c93c63e55c95c6717721d0dbe7a6fa55acb", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/bookmark_border.xml", + "upstreamIcon": "bookmark_border", + "upstreamPath": "android/action/bookmark_border/materialicons/black/res/drawable/baseline_bookmark_border_24.xml", + "upstreamSha256": "b87efcdb4ead96f3211f7bf1854d427bd689afe9ebc8e209c42765827a3c4ce4", + "localSha256": "f6f98993c0398b6dd4bca03ec3cf8313c6363ca0e0e6a14e2883af0bef524c49", + "orderedPathDataSha256": "b19623c4a42ca990090ed8a05fe20adca5583b401b6dba51f52bd8fe3a434752", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/bookmark_remove.xml", + "upstreamIcon": "bookmark_remove", + "upstreamPath": "android/action/bookmark_remove/materialicons/black/res/drawable/baseline_bookmark_remove_24.xml", + "upstreamSha256": "c6a2e3ad5b5dd6cac776e8ac850120ae9374e49d09688550cf957da1596272a4", + "localSha256": "cb99fc48952fe85d05eb6bc09ced4375b294d758d2dacf19bc60ddb63ab1a7b1", + "orderedPathDataSha256": "836c70bec3107f8c812b63d2a6ed1f85320b456695650a388b189cc9561045c2", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/bookmark.xml", + "upstreamIcon": "bookmark", + "upstreamPath": "android/action/bookmark/materialicons/black/res/drawable/baseline_bookmark_24.xml", + "upstreamSha256": "8538ebd2019185382d3d5962ec39fd81e26b8350b7affc7a68bf57b96b84c5bd", + "localSha256": "6dd1cd0c0a52eb9db91a78db03d3f8ae2cee3be8df85f253223e84e21ed330bd", + "orderedPathDataSha256": "9243e321a5c37d9e698adaa1907a669564f746829c9877bcc349f6d81d5dc8a9", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/bookmarks.xml", + "upstreamIcon": "bookmarks", + "upstreamPath": "android/action/bookmarks/materialicons/black/res/drawable/baseline_bookmarks_24.xml", + "upstreamSha256": "38b0a2e750bd122a6436ec0d06e4867750cd4a2be209e9a4fd197e07e5d4a9f0", + "localSha256": "389298b0d9be947188379d7024ab607c71e7c7bde5cdde0ec91349350bc4583b", + "orderedPathDataSha256": "8c20638ac5cee6d58f03b015afcdf54a458fd8a974e4c64ddb6738db4420b976", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/border_all.xml", + "upstreamIcon": "border_all", + "upstreamPath": "android/editor/border_all/materialicons/black/res/drawable/baseline_border_all_24.xml", + "upstreamSha256": "bafd38fb14376100a5badd971ff53016160dbdcf6cc2da12d65e39c95f4f287f", + "localSha256": "42fa878704a15445cf88615a9c6048ef8d8d6bbcd2c7ef50163250272112e6d5", + "orderedPathDataSha256": "5954501cfd1b724b9260a7f53ac658fee71011fa4246caaee23d7854b4697112", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/border_bottom.xml", + "upstreamIcon": "border_bottom", + "upstreamPath": "android/editor/border_bottom/materialicons/black/res/drawable/baseline_border_bottom_24.xml", + "upstreamSha256": "5696c41c4e155cbbaf40f8d30dfe69705348b1eac3c51accf62220b40b48f51d", + "localSha256": "64673bf7a8dba915136ba07ea95c67c618e75ec27a8604ee33ee1f3239d7cdb9", + "orderedPathDataSha256": "67563635010d76c3c4775ae8761221db653e0a1fd4c543104548b7203ca94501", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/border_clear.xml", + "upstreamIcon": "border_clear", + "upstreamPath": "android/editor/border_clear/materialicons/black/res/drawable/baseline_border_clear_24.xml", + "upstreamSha256": "5c97451854e00bdc990542249fa08e58c9281c21765af1c4e7e110d77bef7a27", + "localSha256": "f5f01abc8611e73df5cfc26ac93cc334343d5db2e059f3fbe01418c8e6180105", + "orderedPathDataSha256": "263dc5387e1e3134562b2a1906851bf1816418812a28b1631dd7c2660ac9ca6e", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/border_color.xml", + "upstreamIcon": "border_color", + "upstreamPath": "android/editor/border_color/materialicons/black/res/drawable/baseline_border_color_24.xml", + "upstreamSha256": "8ad972f66d6dee2415aac7dc68db5f1429b92d04d433cf32c1a15efd419fb574", + "localSha256": "dbe96935a314ac674d6022ba441a7f9aa54c01d7e76bc58922650e8361fc0e93", + "orderedPathDataSha256": "f33d393f5ee0e9ad74e25e38c86e91ac3995fc0c225c6264ba0deed2ce679cc5", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/border_horizontal.xml", + "upstreamIcon": "border_horizontal", + "upstreamPath": "android/editor/border_horizontal/materialicons/black/res/drawable/baseline_border_horizontal_24.xml", + "upstreamSha256": "c244fe86294e0f8296e26936f48912b1d065449b55807e71fc8c2dc08df8fd6c", + "localSha256": "23785b263826990c4876283725eaf73e1bea84fa9ea2a3dfda08ac84d3f53cf3", + "orderedPathDataSha256": "5f474b93fc61211764ba2bcc0abaccbbf5b8f63d671bc071962b5c04bbdc18f7", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/border_inner.xml", + "upstreamIcon": "border_inner", + "upstreamPath": "android/editor/border_inner/materialicons/black/res/drawable/baseline_border_inner_24.xml", + "upstreamSha256": "b4f3d26b64d6cfec82489bc802f7bd9a70bef0871479298043bfdcdeaad3e72d", + "localSha256": "8b094999d891bc89364d15ec5115376c17f53f1d5124506383e9991d95ee845b", + "orderedPathDataSha256": "366b4ed2a8fa2a232594a3e9bee8865daa252649ed0231a7e7d98b37b40e05ec", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/border_left.xml", + "upstreamIcon": "border_left", + "upstreamPath": "android/editor/border_left/materialicons/black/res/drawable/baseline_border_left_24.xml", + "upstreamSha256": "bc984903f193ca5c237c31610467de3db5bbe6c6e5b1f46d7bb09b55a0178276", + "localSha256": "6dd07b658359541ffa88694035d61634386dc4197424da4d39c5b27a76e07ea8", + "orderedPathDataSha256": "08a700f00f53c098e9330d02543dcffb95f356e94f54333551d5636421905aef", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/border_outer.xml", + "upstreamIcon": "border_outer", + "upstreamPath": "android/editor/border_outer/materialicons/black/res/drawable/baseline_border_outer_24.xml", + "upstreamSha256": "c59f6aa754a2715d6c751c55aa652be8fab3b4211ea2b0f7c2a0b9b787e0d7ba", + "localSha256": "a2db6468959ab1fba6cd859237e291a3c693ee6e38f0b9955edb5c33fa46df1e", + "orderedPathDataSha256": "2db5b635cc66f0047e2c9b46392824e67a513a1bd897a93d7290aeb8f79c7508", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/border_right.xml", + "upstreamIcon": "border_right", + "upstreamPath": "android/editor/border_right/materialicons/black/res/drawable/baseline_border_right_24.xml", + "upstreamSha256": "b77a42bed6a419ba2c39eb81a332e588bd313fdcad891b03c7c132b133bb1bc8", + "localSha256": "04f75594f8bf61dbefc214b5a2b06ca014e4755c9db6572f5f25d4f9d7cf3c76", + "orderedPathDataSha256": "23cb93fd03b6b36c06af0f2dc94ac3c71488a57f655b88501d5a96b4069ff67c", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/border_style.xml", + "upstreamIcon": "border_style", + "upstreamPath": "android/editor/border_style/materialicons/black/res/drawable/baseline_border_style_24.xml", + "upstreamSha256": "d11a6b1cfa466c77ba5236eebe3212864cc361ac0688d600b39f56dbae942032", + "localSha256": "e14248cc8c12b9587f196137440b94caebb8e2ad59b07ff86ea59e80cec69756", + "orderedPathDataSha256": "d29faef751ef2503a0f043c1aecb2e5dee5321110363edaa0fb1a1fb345bae52", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/border_top.xml", + "upstreamIcon": "border_top", + "upstreamPath": "android/editor/border_top/materialicons/black/res/drawable/baseline_border_top_24.xml", + "upstreamSha256": "d49ffb26921cd98e734e9bbb0b8bad89a3c58bf77a66d8bac2dbcc131f00d599", + "localSha256": "28ccd53fbe9059145570754960fbe5b23fa0fa5ba124b71efc43b31f2fd42d41", + "orderedPathDataSha256": "5865d0d7eec307fc0da08fd515a75820ee3ca39f951d46b0fe3c0bb5f2899f06", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/border_vertical.xml", + "upstreamIcon": "border_vertical", + "upstreamPath": "android/editor/border_vertical/materialicons/black/res/drawable/baseline_border_vertical_24.xml", + "upstreamSha256": "b79a7d6796a2f772c044d66223b1fc5b174a2e20988e0dc72838247b3c1f8892", + "localSha256": "b819ef0ca2b3844fddda82fcdd140dc4d50d48f1d6e25759da7ae09950d50b92", + "orderedPathDataSha256": "60e7978fd82381381d746b8a681776f4d375b5196c06688f3ea9c793fcb97391", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/boy.xml", + "upstreamIcon": "boy", + "upstreamPath": "android/social/boy/materialicons/black/res/drawable/baseline_boy_24.xml", + "upstreamSha256": "36da5ef769d7e4a31a2e46ad69063658a32f9dcc0be9144d3dbfadac3d6f573a", + "localSha256": "2c23e8c0782136835c3f1415407ef6e6faa96892c97b2306a7031557a060dd66", + "orderedPathDataSha256": "68b7c9ef6a7011c657e6b833bf9f1a3db2678440188559bed271a0601e1ee49e", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/branding_watermark.xml", + "upstreamIcon": "branding_watermark", + "upstreamPath": "android/av/branding_watermark/materialicons/black/res/drawable/baseline_branding_watermark_24.xml", + "upstreamSha256": "c8d901b12f6329a3928b3306d849c34a4f0bf9576b1cba6ff86afb3a153c3be2", + "localSha256": "286395024df89ecb3bfd589cd6df819a2b12773e5c8dc645b7766adc1efe8886", + "orderedPathDataSha256": "36e306b1682f9ad7e36cb19ff4a1a95a61e5f894ca61d27a0736a35e1476fc69", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/breakfast_dining.xml", + "upstreamIcon": "breakfast_dining", + "upstreamPath": "android/maps/breakfast_dining/materialicons/black/res/drawable/baseline_breakfast_dining_24.xml", + "upstreamSha256": "bb8ba9dbe2db2096268805ef5e5d8138d50c0f4589981aba59123fb101907fd6", + "localSha256": "2a77c19b4033daad2c5d220e1d261f0d9a054fafd865c3f27a857a3f9281197d", + "orderedPathDataSha256": "34169420aa03a69efa57899a9730ff277cbb1487c0d1290b0f24ca0ff6690a28", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillType", + "value": "evenOdd" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/brightness_1.xml", + "upstreamIcon": "brightness_1", + "upstreamPath": "android/image/brightness_1/materialicons/black/res/drawable/baseline_brightness_1_24.xml", + "upstreamSha256": "5dd76e348c1a35cd80463cc21f3a3df6dc0b5cdcbe0d9789d70a7237ee817df6", + "localSha256": "690b9e2189ef25f747bc1bc5f70f36a8838c2f0940886e7d9a235f34bffdff99", + "orderedPathDataSha256": "7015f7ce26056b43676318591165eca1fa0cba0b30922ad45efe25abba97881d", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/brightness_2.xml", + "upstreamIcon": "brightness_2", + "upstreamPath": "android/image/brightness_2/materialicons/black/res/drawable/baseline_brightness_2_24.xml", + "upstreamSha256": "f96f0b6603464db3806be3bdd12099105ab1d4ddfc61673bde404618c66a1ccb", + "localSha256": "46fb18b2e736f731fbf904f5ae30443f8805aef0e33e59ae2c566a7b6fbe6abe", + "orderedPathDataSha256": "fca70dc696d83fcd1f1c277f13f27396f52f7126fabdbc166593a6ed4ea38e5e", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/brightness_3.xml", + "upstreamIcon": "brightness_3", + "upstreamPath": "android/image/brightness_3/materialicons/black/res/drawable/baseline_brightness_3_24.xml", + "upstreamSha256": "f1e0e3878b638a415f455c55f5f6724e304e8b17f6465cccdc7f7a9943b1e6fb", + "localSha256": "448ce5e72006951b82213e0ddddca0f4384b8775c6df900291d8c4b4f715bbe1", + "orderedPathDataSha256": "b7a493ec0a8321dcc88f34c399d3b5dfd822e117eca80fc632102e1168a197f1", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/brightness_4.xml", + "upstreamIcon": "brightness_4", + "upstreamPath": "android/image/brightness_4/materialicons/black/res/drawable/baseline_brightness_4_24.xml", + "upstreamSha256": "372ae5e3d6a840315c2d4d8c1e570501f6bcafb02ab5a6b49283a4859378dc64", + "localSha256": "2d008cd46239e85cf9df5a7670b2f042c76f2dbfa8cba7e19dea75744a5c796b", + "orderedPathDataSha256": "92f1251fda0b26fcf469e632cbd60dd26639508a42d73ac596e55b453f435f3a", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/brightness_5.xml", + "upstreamIcon": "brightness_5", + "upstreamPath": "android/image/brightness_5/materialicons/black/res/drawable/baseline_brightness_5_24.xml", + "upstreamSha256": "cee88be4fea613c3cd6cd7bd8a0fd34fc6720b2b62048dea690caed1896bea65", + "localSha256": "4fa1cd21437a3854c3679d31d0ece73dc6db09dc890bb06ced7981c169360a79", + "orderedPathDataSha256": "f1c9e34cf5a15abf09bccd9a1742cdfe8b1baeb9a98108b49ce0452e39022703", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/brightness_6.xml", + "upstreamIcon": "brightness_6", + "upstreamPath": "android/image/brightness_6/materialicons/black/res/drawable/baseline_brightness_6_24.xml", + "upstreamSha256": "ecd3e79fe9442f216d00f3b0242854bdcd78ad81576aea46720534663ed9ec73", + "localSha256": "fe61bde0b306931e54430a5d0f836e58459f3745cba54f7f96cba2b280cb8918", + "orderedPathDataSha256": "1e0869b6ce5c6a4e6c37ed816e76b20c745e6e1461e2bea2d17405e53e444988", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/brightness_7.xml", + "upstreamIcon": "brightness_7", + "upstreamPath": "android/image/brightness_7/materialicons/black/res/drawable/baseline_brightness_7_24.xml", + "upstreamSha256": "cc1c22b9c774efbe40b1461a1a0316dbf1f72d5d8a9c0e487c91e605afb0ccf3", + "localSha256": "ce5e886e1a62df539e5284a55dbda1e5fbc1091e8f50a3de3eb648418f88dddb", + "orderedPathDataSha256": "e5d33c53c063f6aa1f36e1c2ab8894604c230026e36f10de8aa5ef2566964b33", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/brightness_auto.xml", + "upstreamIcon": "brightness_auto", + "upstreamPath": "android/device/brightness_auto/materialicons/black/res/drawable/baseline_brightness_auto_24.xml", + "upstreamSha256": "73c951e2aacb0ee7c174a63ac0d2984dfcb8504609c8a2fb208cd3972ab5e958", + "localSha256": "67679b4813a19151b184bd7c1d1d33c3685c7f6e27b22412f30e32c7b5002e5d", + "orderedPathDataSha256": "6887537b020024c86a2a2195b11a4d1870155316f3230636460000bb5b4b6e76", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/brightness_high.xml", + "upstreamIcon": "brightness_high", + "upstreamPath": "android/device/brightness_high/materialicons/black/res/drawable/baseline_brightness_high_24.xml", + "upstreamSha256": "cc1c22b9c774efbe40b1461a1a0316dbf1f72d5d8a9c0e487c91e605afb0ccf3", + "localSha256": "54c795656bcc648e6a0ac73922aa7c79ced7d3fc0dda16529ea617a7994fc880", + "orderedPathDataSha256": "e5d33c53c063f6aa1f36e1c2ab8894604c230026e36f10de8aa5ef2566964b33", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/brightness_low.xml", + "upstreamIcon": "brightness_low", + "upstreamPath": "android/device/brightness_low/materialicons/black/res/drawable/baseline_brightness_low_24.xml", + "upstreamSha256": "cee88be4fea613c3cd6cd7bd8a0fd34fc6720b2b62048dea690caed1896bea65", + "localSha256": "b79d9abef625a3b22ec2ab8254e45c9f4f5e6ada3450596a3ebcf9b33ac8cc10", + "orderedPathDataSha256": "f1c9e34cf5a15abf09bccd9a1742cdfe8b1baeb9a98108b49ce0452e39022703", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/brightness_medium.xml", + "upstreamIcon": "brightness_medium", + "upstreamPath": "android/device/brightness_medium/materialicons/black/res/drawable/baseline_brightness_medium_24.xml", + "upstreamSha256": "ecd3e79fe9442f216d00f3b0242854bdcd78ad81576aea46720534663ed9ec73", + "localSha256": "85e011b2af7537db5b374743c4b02e49cadb4f6f756e0e8ea5ca156dcb4aa9d3", + "orderedPathDataSha256": "1e0869b6ce5c6a4e6c37ed816e76b20c745e6e1461e2bea2d17405e53e444988", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/broadcast_on_home.xml", + "upstreamIcon": "broadcast_on_home", + "upstreamPath": "android/home/broadcast_on_home/materialicons/black/res/drawable/baseline_broadcast_on_home_24.xml", + "upstreamSha256": "2f2f0cd312f00ae2540afe2307d635fbd8d8d7249c6587cac1f60afe24d17b50", + "localSha256": "7e2cba6a6d7086819cfcb29a5711c388ab865b4612d49607dd14f97bf51ac0f2", + "orderedPathDataSha256": "64e83d4bd1c9b069f551fcffc29add2fc109b1a913da62d5d9448d4d0d1f300b", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/broadcast_on_personal.xml", + "upstreamIcon": "broadcast_on_personal", + "upstreamPath": "android/home/broadcast_on_personal/materialicons/black/res/drawable/baseline_broadcast_on_personal_24.xml", + "upstreamSha256": "b46cf4339f53b3c02c3e99a441f9be7825d4e6084d2990f4e0a0db962ce13303", + "localSha256": "02c09c9e3a55e83fe108c5b7b9d7d0dd54d95d8ffe89a385f0df2a05ec28b107", + "orderedPathDataSha256": "b463feb1b9df39d3156e5ed500465fec4e0f4c50e2e6c065ec640fe6ed350ae0", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/broken_image.xml", + "upstreamIcon": "broken_image", + "upstreamPath": "android/image/broken_image/materialicons/black/res/drawable/baseline_broken_image_24.xml", + "upstreamSha256": "5941f1a9f7a8e708b5270210ba91a53b2749cf597a931e581b11b1b15e25808b", + "localSha256": "f91ecd380550360971acdc76757f5f0a87faadfdb83d0f3980ca9798a0ac9332", + "orderedPathDataSha256": "c11c5dfb6719fdaec536e084e921691f056e098f039921ba77922844de847491", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/browse_gallery.xml", + "upstreamIcon": "browse_gallery", + "upstreamPath": "android/action/browse_gallery/materialicons/black/res/drawable/baseline_browse_gallery_24.xml", + "upstreamSha256": "4132be94a2b9dd7af949cd5a2d0a96b961610f022d2a6ba8db6f857f2ad6471f", + "localSha256": "e420a37e49a2266780f268cb65b0ed52b343b84b4cd6ef973b2c3b54e7d116cf", + "orderedPathDataSha256": "50abef032b61463d9c9e5e640fd33446ea9b3560c5bb4c65dbb188f6caeed35c", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/browser_not_supported.xml", + "upstreamIcon": "browser_not_supported", + "upstreamPath": "android/hardware/browser_not_supported/materialicons/black/res/drawable/baseline_browser_not_supported_24.xml", + "upstreamSha256": "f8164ea229bac0e61158e156cce58a95501394e8e1d980851d3af215c94e7cdd", + "localSha256": "2ffa1cc5ec22fb863b2ee97bf9009ad2bca007fc5d84cedd53cf2804136f0878", + "orderedPathDataSha256": "f2d0f2f1a2f8e39eda418a1fe0a503e87748c5357e866893013969ca5976fb91", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/browser_updated.xml", + "upstreamIcon": "browser_updated", + "upstreamPath": "android/hardware/browser_updated/materialicons/black/res/drawable/baseline_browser_updated_24.xml", + "upstreamSha256": "81486dae912733c9e828d67d9a36a217cca92778c80d731e47c14440ca44cc69", + "localSha256": "e12618a4306a368407f07b38af3b1b2933f15118e89a46200effcc46ac2a739e", + "orderedPathDataSha256": "d9f533139224fddd7da0e96498d774360d21354ddc0c62d95cf0e76a9b86bc45", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/brunch_dining.xml", + "upstreamIcon": "brunch_dining", + "upstreamPath": "android/maps/brunch_dining/materialicons/black/res/drawable/baseline_brunch_dining_24.xml", + "upstreamSha256": "fce86a38cb1d55d93f2408cc74daafba6c5d1d1ecef532185fbf8286fdcf4b58", + "localSha256": "0ea489de1e01c754b18589e9ad30bc29db81511532218537dff850b3c70e29ec", + "orderedPathDataSha256": "31507bb93e7f1d207f9d3f5bc9dd3474ffc65dd60e31f60b0e7526f896e412ae", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillType", + "value": "evenOdd" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/brush.xml", + "upstreamIcon": "brush", + "upstreamPath": "android/image/brush/materialicons/black/res/drawable/baseline_brush_24.xml", + "upstreamSha256": "e41dba2b1f0a066c411ee9471fb702b3732b1ebb06dbd9d97d859055837d2121", + "localSha256": "2ae83d27480f0867aba5c20709044219ea3b00ebaff4d56fa4ce5bf1c27c0420", + "orderedPathDataSha256": "26ae4d4f49fcbccba52bca2ec13cd8a9f01b8c2890126f5d1782cf76c29b82e5", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/bubble_chart.xml", + "upstreamIcon": "bubble_chart", + "upstreamPath": "android/editor/bubble_chart/materialicons/black/res/drawable/baseline_bubble_chart_24.xml", + "upstreamSha256": "98caac9e9f4f073960d69268f5481886303f47b7544a5412ec9e20a1d3c22510", + "localSha256": "bb386f0ce308d22680cbfc47d168afae75be2890a1b5e4fa3589c60ca3bfe7ba", + "orderedPathDataSha256": "580208f82f00c91334fb89d2fd6692926ba1af13aa822a28e0399329a3779aa4", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/bug_report.xml", + "upstreamIcon": "bug_report", + "upstreamPath": "android/action/bug_report/materialicons/black/res/drawable/baseline_bug_report_24.xml", + "upstreamSha256": "3d244c7d12c71a63cdc44379097bb79c65301efcb7d15d1313cfa69e5b91aa20", + "localSha256": "482ec4f94620ffb60fc5a153436291ed730f03996b96d8fb1df7fe4e66dcc6b2", + "orderedPathDataSha256": "190dd621e00da578d7e6f0df711e5307ae39aa2930749aae1a79926f228f5bd1", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/build_circle.xml", + "upstreamIcon": "build_circle", + "upstreamPath": "android/action/build_circle/materialicons/black/res/drawable/baseline_build_circle_24.xml", + "upstreamSha256": "bd22ad4a73d64bd5d0b10d1a7009a191b4c129b1a44c6aba580106a55810d4e9", + "localSha256": "7987931a57163addc08e4d559bf919e8e6126666c57446e4af7161024f573633", + "orderedPathDataSha256": "af89b5edc4c09cabdaea7ab3d1c41baa8a54df02ab0d294b090ed0d78d6272a0", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillType", + "value": "evenOdd" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/build.xml", + "upstreamIcon": "build", + "upstreamPath": "android/action/build/materialicons/black/res/drawable/baseline_build_24.xml", + "upstreamSha256": "0a0c00774d535d3184754165549ed7bd2d91070f56988bed61706eb7a90e0e33", + "localSha256": "324fb636adbd8cc8f4c893f16184a1733f46c5cf75d2111c2b56b07dea1c56d2", + "orderedPathDataSha256": "29f64bd1a2ed296cd055355f748af0fe42892f29dcfd3913a49cc48dd9fb482f", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/bungalow.xml", + "upstreamIcon": "bungalow", + "upstreamPath": "android/places/bungalow/materialicons/black/res/drawable/baseline_bungalow_24.xml", + "upstreamSha256": "94e321fd06f65fefd0dde6bb1ff2637e5eb872ae2be89d5f867cb9f87ef04d61", + "localSha256": "a243c4c8f216ee9a7abddcc795f9130278f227ba079d723e29b91c3b1c79ccab", + "orderedPathDataSha256": "07141db5d9ad6ee9aef2ac4af7c9a2b23e592e716401aa1c0044148ffcff05eb", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/burst_mode.xml", + "upstreamIcon": "burst_mode", + "upstreamPath": "android/image/burst_mode/materialicons/black/res/drawable/baseline_burst_mode_24.xml", + "upstreamSha256": "b9c4da83672cf7b0fc1378e4e3423fb7d803cfcf1bd3a8ed524ddc4a39fa27dd", + "localSha256": "87e84bb97d5bb3efa7d6f3c0c1bf9ce6605cc7377816b3d44d152b8bcee0d73b", + "orderedPathDataSha256": "4ae89ca5f4525237205d1eec943ba5b2ee4a6b9538ac4bcc742611b6aae3d713", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/bus_alert.xml", + "upstreamIcon": "bus_alert", + "upstreamPath": "android/maps/bus_alert/materialicons/black/res/drawable/baseline_bus_alert_24.xml", + "upstreamSha256": "f670dff014996c8dba2b8c4ebdfe716df9ccae0926d119f5602be4cd44df51e0", + "localSha256": "204658677f7422db62331f75b9088299a5ea18bd9a4bff4032970faec6446edf", + "orderedPathDataSha256": "eff6d19adb68a40ce6bc8c725bd71ecde4e994ef70a5f712789c29085d6b977f", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/business_center.xml", + "upstreamIcon": "business_center", + "upstreamPath": "android/places/business_center/materialicons/black/res/drawable/baseline_business_center_24.xml", + "upstreamSha256": "cfaca643d2a9e0f47a345b192e705faed082e4a38966a94530aba94b5d0f89fd", + "localSha256": "553de81fb4a5885c30483719ce9b7f6c1992545ecc3d3e68cae3d2158be67511", + "orderedPathDataSha256": "9c5886c77af88a2320b2cfaf02b0eccf99d50687826c8e0cb459a9aa948240c2", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/business.xml", + "upstreamIcon": "business", + "upstreamPath": "android/communication/business/materialicons/black/res/drawable/baseline_business_24.xml", + "upstreamSha256": "fb445a33a4a82d2bfbf4f6c0ab1052a87fd80e73b71743b2a5547b0a24e01c48", + "localSha256": "9b3b4b04931c31977e39f4cf82744c78435d3dcd61eca4ca19748b8e61aa0d48", + "orderedPathDataSha256": "a5608e09b3da9ffe6cab5c8b40dfd374b2bfb930cc2f9f3f4b516cfa2bac8ac0", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/cabin.xml", + "upstreamIcon": "cabin", + "upstreamPath": "android/places/cabin/materialicons/black/res/drawable/baseline_cabin_24.xml", + "upstreamSha256": "98f554dcb785c467fa0dbc7f4a70c4fc53d084f9e8cf9ce709c67700cbd981b4", + "localSha256": "2e88f588a40ef8d188ff0db226e1e611fc37b41d05c22006fb194a92a2db81b0", + "orderedPathDataSha256": "ba9b8cae3be900c126db7b4f837630c355dd08982d27debe85c8840284336210", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/cable.xml", + "upstreamIcon": "cable", + "upstreamPath": "android/device/cable/materialicons/black/res/drawable/baseline_cable_24.xml", + "upstreamSha256": "e879a99ac67bbdcd384945fc3bcbf32f0302501a9b62c2bf22e03246cfc0205c", + "localSha256": "7367db6e71654fd506f3bffd03d466fd9be870799a8e5b54ae04252431587716", + "orderedPathDataSha256": "1746605e7e22c34ff7e4e1aebf8e7efd934f82c7f3190e3b1d54f05e812012c5", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/cached.xml", + "upstreamIcon": "cached", + "upstreamPath": "android/action/cached/materialicons/black/res/drawable/baseline_cached_24.xml", + "upstreamSha256": "6ab68c9822f2fe56d91fb8b339d2e1c349fffdbe45a247443e4d7b6010d321f7", + "localSha256": "0f5fba8486314e2da87b2c7bc7c8844d685f9051da9168f969c7d21241559aa0", + "orderedPathDataSha256": "bea4726d930a1d5f411bf34aaa56351e25b198a8a68f2a9fea9b7e9b725743ab", + "originalGeometryMatched": false, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/cake.xml", + "upstreamIcon": "cake", + "upstreamPath": "android/social/cake/materialicons/black/res/drawable/baseline_cake_24.xml", + "upstreamSha256": "cfb04595595f2dd5b72bdf2dc3ce52ced6b8fa2e82901b353a73f5c75d635e6c", + "localSha256": "be8f91db696f246964ffe43c3fbb5d20ef2be6f1101535d9480665fde7351e58", + "orderedPathDataSha256": "b950cd324c24a1dc1691e240555195942239f6cbd038e0c5c3e6d4bacd62293a", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/calculate.xml", + "upstreamIcon": "calculate", + "upstreamPath": "android/content/calculate/materialicons/black/res/drawable/baseline_calculate_24.xml", + "upstreamSha256": "8449feabab50ddc20e3687568f7d908e2eac29b996a9290a3183f6997d70b005", + "localSha256": "82367637030c1c9ac53cb126aba162526aedc8629ea04125c2092557f3c83847", + "orderedPathDataSha256": "d0e21b078012a361b510a360cb5969a773e1da4217b143fa2e8061e3cac52c5b", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/calendar_month.xml", + "upstreamIcon": "calendar_month", + "upstreamPath": "android/action/calendar_month/materialicons/black/res/drawable/baseline_calendar_month_24.xml", + "upstreamSha256": "3180796c8d499961244883d196c7bf3ca309dce2fdd59b193c19920e271f6f72", + "localSha256": "1a2bb0625936392dd0cf9d39df3a52c6335ad77503f8a26638a9d2a4372f7d72", + "orderedPathDataSha256": "fb3a0da34117c73ff6e82abf5c9aab904f7cb4f152f4244a5858db24af1a86a0", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/calendar_today.xml", + "upstreamIcon": "calendar_today", + "upstreamPath": "android/action/calendar_today/materialicons/black/res/drawable/baseline_calendar_today_24.xml", + "upstreamSha256": "304326bcea447f8c37d19236b551530a61e93239abcfba153f9528f917568cff", + "localSha256": "627bb3166a17439b3116ab4fb79b9028e2c56dde9f5cc69c3e1741ee04a94464", + "orderedPathDataSha256": "27487a89ea43557a4c348655293d02c960c67d9264fd1ef12ecb13fe96c93548", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/calendar_view_day.xml", + "upstreamIcon": "calendar_view_day", + "upstreamPath": "android/action/calendar_view_day/materialicons/black/res/drawable/baseline_calendar_view_day_24.xml", + "upstreamSha256": "0027c3e0746b7afe343756b9a273d2cb7330ef8def799622b83688f2f1e2813e", + "localSha256": "71c119b7b0b6432125a16daa06d731b933053af223d07caa2eba2fa9dd9d6d6b", + "orderedPathDataSha256": "fe44e0424ad082ae686af4548617d38c87e30986cd62f17bca51735de03e97d5", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/calendar_view_month.xml", + "upstreamIcon": "calendar_view_month", + "upstreamPath": "android/action/calendar_view_month/materialicons/black/res/drawable/baseline_calendar_view_month_24.xml", + "upstreamSha256": "194d1fd4fdf64b339788b7425d66dcc2664df32cac6d6057fc4917e3148b4e2a", + "localSha256": "80940f7b5b0c1f99e169e33ba96f0eecef7d5c96600dec28eb131bb5c4fb8778", + "orderedPathDataSha256": "3e7248de41adb8138ed9c995041ba39006cf19b776425e44bc25fc3c9f7b7ffe", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/calendar_view_week.xml", + "upstreamIcon": "calendar_view_week", + "upstreamPath": "android/action/calendar_view_week/materialicons/black/res/drawable/baseline_calendar_view_week_24.xml", + "upstreamSha256": "86be1e272a8d55c2813bcb02a6944f39006866dc6776f9bdfdf6b7267c44499f", + "localSha256": "5cf7c7ca5cd21ec1111c72220661620d7a8f691b13cf44e3c7084f21b9cb38b2", + "orderedPathDataSha256": "13641de607e14f5e93c452c10438a34e3e82f1f13cb4ae661ae4bb044370c7eb", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/call_end.xml", + "upstreamIcon": "call_end", + "upstreamPath": "android/communication/call_end/materialicons/black/res/drawable/baseline_call_end_24.xml", + "upstreamSha256": "63fdd5ac9f7ea4f13175e9378685a3a7c361c12b983b52739a7bc15aa1a751ff", + "localSha256": "0820bf921cbd4618962dc49cc4c686e4c7b9eab3637035115c75fd0bf6d7147c", + "orderedPathDataSha256": "e8fe8fc3c4aaa06225e20ca73bee2b6a2e2825373a45a3e1eb7a094cba639020", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/call_made.xml", + "upstreamIcon": "call_made", + "upstreamPath": "android/communication/call_made/materialicons/black/res/drawable/baseline_call_made_24.xml", + "upstreamSha256": "dca0fad85cec37c318cef9bfb1ef118ab8b7a17b9c6ef0f3ba2b13f9ffdeb4ba", + "localSha256": "2f1131eda65ea2fffc652bb6135961cd86eb0f4ff88a5ed405494aa0c85d5158", + "orderedPathDataSha256": "583378c659454a4e3bff2287cd053203eaad8c8604cd13fd5d298b9979b486fb", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/call_merge.xml", + "upstreamIcon": "call_merge", + "upstreamPath": "android/communication/call_merge/materialicons/black/res/drawable/baseline_call_merge_24.xml", + "upstreamSha256": "0f519d541d625ef84a817582516ee55c9abe83ca25428867c9d7f75ec7fb433d", + "localSha256": "21d06f761a4b6e8a9bc8cbb2978df4a4ad33868cf001196462f99f87c62b1f8c", + "orderedPathDataSha256": "49351cbe496ffedc21c2a121e87802d0fdd3f075b50da67ed8cccdea949582f5", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/call_missed_outgoing.xml", + "upstreamIcon": "call_missed_outgoing", + "upstreamPath": "android/communication/call_missed_outgoing/materialicons/black/res/drawable/baseline_call_missed_outgoing_24.xml", + "upstreamSha256": "70e623f9280acb7770e5519441d3bc530332fc65b2e2b8620be4fbe098b458a6", + "localSha256": "4c7faa6beac79d1d47b7c744acb9fbf291cd9fad74b6c76ebcb3013f60951856", + "orderedPathDataSha256": "301c3ea0ddc1d60d84efd018e63c79eb3d1b24ded54d5e7713573a23ba8f7320", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/call_missed.xml", + "upstreamIcon": "call_missed", + "upstreamPath": "android/communication/call_missed/materialicons/black/res/drawable/baseline_call_missed_24.xml", + "upstreamSha256": "c4ced4241f6c0fcac971c650daa801f5704caccccdf62787e432e9fc49ef9ba3", + "localSha256": "61b51b19fd31fd5bbf8ba29b46ae7244ddce857f3f2eabebef07ca1927d3de20", + "orderedPathDataSha256": "f87403072fb77ba5050aed0c69d1fec2f6e541674053b5ceb7d35b022ba535d7", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/call_received.xml", + "upstreamIcon": "call_received", + "upstreamPath": "android/communication/call_received/materialicons/black/res/drawable/baseline_call_received_24.xml", + "upstreamSha256": "7fa946e1820b9e5a76cbec7fc88439b20942c4b883f15d5ebc276c8ba02db9b7", + "localSha256": "26c1c9ee8daa0eecaebf1249013f3af8214b8d2624c3f98db061f2c14eb19f1d", + "orderedPathDataSha256": "00085050099b59cebc11dd4988d45825a35248108982adda983fd00328911cce", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/call_split.xml", + "upstreamIcon": "call_split", + "upstreamPath": "android/communication/call_split/materialicons/black/res/drawable/baseline_call_split_24.xml", + "upstreamSha256": "29717c596ce36df4117d6eac17a39995a249dd2bc09fbf440d731a873e665267", + "localSha256": "71d9055ad1bf57029832f005c4d7fe397732d00f5cfbfd5603e56c7580767559", + "orderedPathDataSha256": "d5a16776db0abd6daed234ae4a14092d8d5dc5443a3bef4dba96eb1f7ee0476f", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/call_to_action.xml", + "upstreamIcon": "call_to_action", + "upstreamPath": "android/av/call_to_action/materialicons/black/res/drawable/baseline_call_to_action_24.xml", + "upstreamSha256": "41f6a44862efdbaf912fb8f022e5e9102821cca148b5ec12e4f7a6f12361a7e7", + "localSha256": "5bb86b2dd8d045c744ec5f92b1668c185a1ebf97d86bd24d6cbe0092f3e618ba", + "orderedPathDataSha256": "f64a33fa28e72d92ef1082f4cc212caacc4c2a9e03aeeb025cec7e608796db99", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/call.xml", + "upstreamIcon": "call", + "upstreamPath": "android/communication/call/materialicons/black/res/drawable/baseline_call_24.xml", + "upstreamSha256": "42fcf13a41e8f4636b97127ac7c4c4476fb18eb89084c8d88306255d828464bf", + "localSha256": "3b4fb627e45cb13bb0f7db82e0fa1fd0d5ba7c367de4c76dce29a80197908be3", + "orderedPathDataSha256": "3f500aa334948a62f783ce9549ff9f5b17b33b6c6a9c55bebaa9bab3425a2bf6", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/camera_alt.xml", + "upstreamIcon": "camera_alt", + "upstreamPath": "android/image/camera_alt/materialicons/black/res/drawable/baseline_camera_alt_24.xml", + "upstreamSha256": "0976ddaeb4144665433a3840295f48bce05a7d70f8e09a3282e20dbdd72da291", + "localSha256": "b9e3ea639dd5d40afb80a74943fcaeb9bb34b10180dfdd701acf1f1a2bb4d2b3", + "orderedPathDataSha256": "8532e25ecb7bf8eb37c3b87779a6e8cdd5cea2f2c55e8dc4de035accb046bcac", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/camera_enhance.xml", + "upstreamIcon": "camera_enhance", + "upstreamPath": "android/action/camera_enhance/materialicons/black/res/drawable/baseline_camera_enhance_24.xml", + "upstreamSha256": "96170da9ab80d8d8370bfbdc72aac5b38d17614ac4dd44dbf9a257a5ffb0e9ab", + "localSha256": "1d42c99410a088243f862987615707aea48c7157d80d5c67ae5063ef0950b147", + "orderedPathDataSha256": "ff4cfe6530158a70cfefe337745789cd6dd6e7a47ab589b422f375d7be62a3f0", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/camera_front.xml", + "upstreamIcon": "camera_front", + "upstreamPath": "android/image/camera_front/materialicons/black/res/drawable/baseline_camera_front_24.xml", + "upstreamSha256": "cc960da6009c01dd11bb7548f9d0c860246c159576f64907d734ca8f5580b94b", + "localSha256": "4d9bfbd42521ea3de70a7cdbc324999b0946d6429aa7f1a71d776e7925fb7c43", + "orderedPathDataSha256": "ccae56764d8a88f3974e7e5507772352fadf6b2dec202799590d132df52c2716", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/camera_indoor.xml", + "upstreamIcon": "camera_indoor", + "upstreamPath": "android/search/camera_indoor/materialicons/black/res/drawable/baseline_camera_indoor_24.xml", + "upstreamSha256": "0b07ded738515d046dce28c9a38739041e2556aef4f92848b2a6f0421b8839cf", + "localSha256": "7aa8a645789030cfba793c127fc1bc22475eddf41cb9badb5eb8cc2d395a5dcb", + "orderedPathDataSha256": "077c01d867f39a0b73002284ab2aef91052bcb066660dc9e5e3426b88d569bb1", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/camera_outdoor.xml", + "upstreamIcon": "camera_outdoor", + "upstreamPath": "android/search/camera_outdoor/materialicons/black/res/drawable/baseline_camera_outdoor_24.xml", + "upstreamSha256": "5de80ab61ea3760ab40c6a8f31d70e99ac8fdc3e2c1df1a07dfc9185448c9dbb", + "localSha256": "76c378c14337975531a71cd3f3866a386b0d0888997e23590a52ed6f41a55de6", + "orderedPathDataSha256": "8ec502e61549ba15900e50907d66bc534767cb2cd9eaca18afb81bd89d5f83a3", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/camera_rear.xml", + "upstreamIcon": "camera_rear", + "upstreamPath": "android/image/camera_rear/materialicons/black/res/drawable/baseline_camera_rear_24.xml", + "upstreamSha256": "0ee3903c2fbbefab95af807ae8f63e241ce19cd7cf16126ef3054b89358d7321", + "localSha256": "f1a5051a622e6a87eced26dad1f978481a372c5b969276928b2cb8004969d370", + "orderedPathDataSha256": "06595487c06022d7efd987ab8ca63902a2af0c6b0fd32e01b099f9ec81899226", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/camera_roll.xml", + "upstreamIcon": "camera_roll", + "upstreamPath": "android/image/camera_roll/materialicons/black/res/drawable/baseline_camera_roll_24.xml", + "upstreamSha256": "9b10a31cef94c3f40e08594ad6f01ce5b6de90c46df179049d0d6652f0d705d0", + "localSha256": "ca708fd59959bb6d898c35c4050bd30c0a4a62ef74c95682e71a249c7ff51ecd", + "orderedPathDataSha256": "3e10ee97222ccec1417c8e69c74ea940c1adfae44d176a4f7b0d1f853784c2a6", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/camera.xml", + "upstreamIcon": "camera", + "upstreamPath": "android/image/camera/materialicons/black/res/drawable/baseline_camera_24.xml", + "upstreamSha256": "bfe995a5ac50229caba7bf82bd748405927e908299e322e34875c51742a17c85", + "localSha256": "e293249b3b320b5c0ef0a3cef99a49b23e7ef2f0fad62d6a7c82f4802d5a10e1", + "orderedPathDataSha256": "0d04b530b0a133a5c658591fdc090252a9ddcfb8134c20dfe19b2d5b3be9777b", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/cameraswitch.xml", + "upstreamIcon": "cameraswitch", + "upstreamPath": "android/device/cameraswitch/materialicons/black/res/drawable/baseline_cameraswitch_24.xml", + "upstreamSha256": "711351278caae6f9147603b51c3944765ac566feaaa81467cbc49d7764f466f3", + "localSha256": "7d7726b5ab3c8998d4ca48289be99ecc8464816c2ad2adac4f1c07aa100b431a", + "orderedPathDataSha256": "381702bc83801f02d9bd1cb6ac32386dbf70ee686dccf31ae84a750aeccb175c", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/campaign.xml", + "upstreamIcon": "campaign", + "upstreamPath": "android/navigation/campaign/materialicons/black/res/drawable/baseline_campaign_24.xml", + "upstreamSha256": "4771ebcb2708b58c81160aebd8c910a7007fa65276d91c29a65cf1afd346e148", + "localSha256": "e783486647f4c356a77e26158fad0a1115e8d2d1fc4111d5b82e3260143e9258", + "orderedPathDataSha256": "c0069172f2bbaebf126869aa59be6bfa384b7d5297799df857b585a31ec4d530", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/cancel_presentation.xml", + "upstreamIcon": "cancel_presentation", + "upstreamPath": "android/communication/cancel_presentation/materialicons/black/res/drawable/baseline_cancel_presentation_24.xml", + "upstreamSha256": "c4d24c7ee67146c393ad5afe1ae9b0c442a4f482c1d8e6eba8377e7456173fa0", + "localSha256": "70b14e8e4dfaee372f401181cedb46611ecea033df3143921f3085e9d072c631", + "orderedPathDataSha256": "315234d0c39796be003b893dd85ca5a733ca05aa30f663b5b13a7091086b9dab", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/cancel_schedule_send.xml", + "upstreamIcon": "cancel_schedule_send", + "upstreamPath": "android/action/cancel_schedule_send/materialicons/black/res/drawable/baseline_cancel_schedule_send_24.xml", + "upstreamSha256": "7cc1639464d3af9b17db7a0dd01b7a96fc3b778ed09c6c784e4b959c620e9b18", + "localSha256": "5659450e68945362f64a94764fb6fdc75d5756eafae182794117ff343cb88926", + "orderedPathDataSha256": "5483da581051f0101e282a932095b6db8c7aa1e3d0cb1a96894a6db998092554", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/cancel.xml", + "upstreamIcon": "cancel", + "upstreamPath": "android/navigation/cancel/materialicons/black/res/drawable/baseline_cancel_24.xml", + "upstreamSha256": "5120bcac235fe04c6a1fcedc54b79d7608c2e42f211c3a8d6919bff3c81d4496", + "localSha256": "33ae8cb7394cab87d74e33a8af059c848b985bfa555b84f66847a955f0ecbc7c", + "orderedPathDataSha256": "19cf38ef19b82e1efb10e4a6606226e1e386338b9904c0761eb6a7dfca35b0fc", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/candlestick_chart.xml", + "upstreamIcon": "candlestick_chart", + "upstreamPath": "android/editor/candlestick_chart/materialicons/black/res/drawable/baseline_candlestick_chart_24.xml", + "upstreamSha256": "3a384e72e5757a0a5dcc1ce56ddeef77ff1f05df26f283de898d9f008a42e793", + "localSha256": "466aac8fc8e9aa0717150bc1c1add4a614b14ceddc9cbe6e15dca26e4d9b4661", + "orderedPathDataSha256": "e8a8876514236530f09e006be7c0ca69ff9e7824853820572455d806c00cc9b3", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/car_crash.xml", + "upstreamIcon": "car_crash", + "upstreamPath": "android/maps/car_crash/materialicons/black/res/drawable/baseline_car_crash_24.xml", + "upstreamSha256": "2b92500aca1c1c4bd8bed3899150888086bada67f1f2f741a3e137397cb54de9", + "localSha256": "3d3c114009e262a9563dd87b6f93822e6f39ac3431beb7b8d7a484f4004d613b", + "orderedPathDataSha256": "6ba63c0890678c065da71f03e808b0c0c9272c7bb79db8d61c090703e5a66d39", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/car_rental.xml", + "upstreamIcon": "car_rental", + "upstreamPath": "android/maps/car_rental/materialicons/black/res/drawable/baseline_car_rental_24.xml", + "upstreamSha256": "d56ffce5c66d828b180e487cda0992b733513e23b60a66abb2edb8a0922345f9", + "localSha256": "d7c44d4fe34646343d7fe3065a22a7a2968ce74d5d191af4496363b0872150a7", + "orderedPathDataSha256": "eefb9df7881c584bb0219dc807947774bb81857ab98e05f1e7804bcf88b55614", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/car_repair.xml", + "upstreamIcon": "car_repair", + "upstreamPath": "android/maps/car_repair/materialicons/black/res/drawable/baseline_car_repair_24.xml", + "upstreamSha256": "86f9893a62fc4740fa5988b9d41040ad5df1a8ab56f551ef3140418348dc1099", + "localSha256": "156f8248824cc75a4098516ff3826e8764ce1c512a99d405bef2d920fb74d4aa", + "orderedPathDataSha256": "aeab3161dfbdbf9b02d25de81720c42b9f9f6a6e9ad2fe18d740f9c79d25ee3e", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/card_giftcard.xml", + "upstreamIcon": "card_giftcard", + "upstreamPath": "android/action/card_giftcard/materialicons/black/res/drawable/baseline_card_giftcard_24.xml", + "upstreamSha256": "b472a796464da2dfc6a21d2386767788da688cfa49ce227679e496e0696dc885", + "localSha256": "275fd629ff5db1ece046904a3a485e40b1c08a09dc63048dac9401b4d4385e26", + "orderedPathDataSha256": "1fd1dc6fe08a0bdcb6eaf2cf94d8b402a062013c4e7a7214408147ca5c450d3f", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/card_membership.xml", + "upstreamIcon": "card_membership", + "upstreamPath": "android/action/card_membership/materialicons/black/res/drawable/baseline_card_membership_24.xml", + "upstreamSha256": "633075571bc2b41a41a9aaf69ed35149a85857063c185c8694b04325342e2e3c", + "localSha256": "63070e4ad39ff8fa24e58e90b6f2709e6c0f6f4eff8043da2c80195f78c50e7b", + "orderedPathDataSha256": "2ecff48a9b5f5ee95424346c89d3b8c68d5c9939caaa57a291f1013d748356f9", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/card_travel.xml", + "upstreamIcon": "card_travel", + "upstreamPath": "android/action/card_travel/materialicons/black/res/drawable/baseline_card_travel_24.xml", + "upstreamSha256": "42fe22f5c0e64f6d95afb0c73804e17cc78027a53d51bd50909140e7c7ebace3", + "localSha256": "aaae2ac04b33025d90859e309a8c035a31fd0a6ac74c1c430bc555d5ea885c9a", + "orderedPathDataSha256": "dd6469278bcfeb1dbdfac6c5a28d9df7874b10d1a07edf393edd46161e18b34c", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/carpenter.xml", + "upstreamIcon": "carpenter", + "upstreamPath": "android/places/carpenter/materialicons/black/res/drawable/baseline_carpenter_24.xml", + "upstreamSha256": "5d3a4dbb32e2125c9bf6970597bfe8337a7de2a2b738b7289856b4b549111657", + "localSha256": "42e29410bea4ba85548595435ceaee96a277b9c040cdf1e04bb63e9e9b6779c4", + "orderedPathDataSha256": "0e9ef854bc5df5dee482333af18b3c4ac708cd704ff1e6ad5e1e67f319d3b4c3", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/cases.xml", + "upstreamIcon": "cases", + "upstreamPath": "android/image/cases/materialicons/black/res/drawable/baseline_cases_24.xml", + "upstreamSha256": "91a41b351074a115a8482d02dfabf7b754c14b61a0fd4c9cc29202c23b6b3ac2", + "localSha256": "2538a24753ac756f4002fac246bf4d37358461802290736a575539ff9138f1b4", + "orderedPathDataSha256": "0860c4c2098a1fd1e74a9d4ce943c4ccc0dcdb311f390bd2fe5c7613a1da527d", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/casino.xml", + "upstreamIcon": "casino", + "upstreamPath": "android/places/casino/materialicons/black/res/drawable/baseline_casino_24.xml", + "upstreamSha256": "d0787616bfc6b995faca44f764cb43077defbf2ac1da81f2daf15b17d81648bc", + "localSha256": "29424b77897a355c42f599a0c41937122cf7f64f7346fe0aa08a6acc49181722", + "orderedPathDataSha256": "9614a6a181da8f9082948fdf4f9a09916ad95a6cba38bf961b82894a21133226", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/cast_connected.xml", + "upstreamIcon": "cast_connected", + "upstreamPath": "android/hardware/cast_connected/materialicons/black/res/drawable/baseline_cast_connected_24.xml", + "upstreamSha256": "83616c2f639b2796b5460a642d34fd524478839925641608ba2e3993e25c4f38", + "localSha256": "3316842ceaa797aec0484b5301f9504e9f4c68247c56d72f8c4a3bb23a50227d", + "orderedPathDataSha256": "f8c09f5411390eb6dbb0a00a69805c808b510979e2e1195e644faab4d74f4766", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/cast_for_education.xml", + "upstreamIcon": "cast_for_education", + "upstreamPath": "android/hardware/cast_for_education/materialicons/black/res/drawable/baseline_cast_for_education_24.xml", + "upstreamSha256": "591fd1d64f8ce82e3347243848e330aeb7581d632caf34cdc5ddd13a820cd6c6", + "localSha256": "f86bcf4a326c930f626e043084c07c809d2ed95e8c837afbc12f3aa396532913", + "orderedPathDataSha256": "8fd67ab5ec91bee7b2665d2af872e250d08a00f06dee105fa492e54fe7cf1351", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/cast.xml", + "upstreamIcon": "cast", + "upstreamPath": "android/hardware/cast/materialicons/black/res/drawable/baseline_cast_24.xml", + "upstreamSha256": "f396942c0ff68d415792865d7e47e26b082e7d1093a5d40b203b5e981a11e86b", + "localSha256": "a86680317d992ad3e94dab1d51875e862883a3727921b3dcae5e7934320051a0", + "orderedPathDataSha256": "f481dd62266e510dcc352a6369564b8089f6e65d721e42093b71703d9244d5ec", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/castle.xml", + "upstreamIcon": "castle", + "upstreamPath": "android/maps/castle/materialicons/black/res/drawable/baseline_castle_24.xml", + "upstreamSha256": "516b964988c1534b3f0be94a571657095b788b420dc797e9fe16657627e71b77", + "localSha256": "d206dba1dfc4e9778b78dc1a3c2f90e6d0f064411d2d1c66322785fecd8a9d9c", + "orderedPathDataSha256": "87d1dabea9457df24225c52c87caa19b093eb2bf30a1f1b56720ed3f805fa340", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/catching_pokemon.xml", + "upstreamIcon": "catching_pokemon", + "upstreamPath": "android/social/catching_pokemon/materialicons/black/res/drawable/baseline_catching_pokemon_24.xml", + "upstreamSha256": "c61e43f0365ef393d5a5f835ca4829179e4fe8867e6c7525491814d950561d87", + "localSha256": "ea701c36f1c26a65fadfe3b13d8fbde18f341c10a910a65157418471d5864298", + "orderedPathDataSha256": "fbbebd45592e77608569e2d86713b3f584e457c2ecbdf01f1113a56e1b4a95bd", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/category.xml", + "upstreamIcon": "category", + "upstreamPath": "android/maps/category/materialicons/black/res/drawable/baseline_category_24.xml", + "upstreamSha256": "f9953b8b90ad6b3cb6f063607c5a563e6b7a84a01aa858be193bad02d7615c4e", + "localSha256": "7d898b0053e809643fc8a53aff347cffe469e1b148fc7548350fa02e22bac764", + "orderedPathDataSha256": "fe38e17a4f04d8439969350ba2c92d5e93d2704fc9ff371a47153c30ff8f6753", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/celebration.xml", + "upstreamIcon": "celebration", + "upstreamPath": "android/maps/celebration/materialicons/black/res/drawable/baseline_celebration_24.xml", + "upstreamSha256": "8fb72996f065ed5d09f853fda9fac66ed0cf9cdc5e720a8f75e4e51a9fbfcef9", + "localSha256": "b2a2d24e21e8f0979f85d3bd43c66f014f291931447d8c6e05245bc658265962", + "orderedPathDataSha256": "4ed18d1dc898592e0d1c10a8948abf06a8e694c1e57788dc01e1d2ac67f15ecf", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/cell_tower.xml", + "upstreamIcon": "cell_tower", + "upstreamPath": "android/communication/cell_tower/materialicons/black/res/drawable/baseline_cell_tower_24.xml", + "upstreamSha256": "b81623a0f9ddc85f15f747c904f18708bcd97cffc915489541136f1744b44bd0", + "localSha256": "0434ee29222a53a2a881f92d85e60b01b80f9c9ffe6c36391ec3032f3d0a02d0", + "orderedPathDataSha256": "301c06d27c14d5f842146c6f0f2c794459e734d62af41cf8acba254d84a682d5", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/cell_wifi.xml", + "upstreamIcon": "cell_wifi", + "upstreamPath": "android/communication/cell_wifi/materialicons/black/res/drawable/baseline_cell_wifi_24.xml", + "upstreamSha256": "a3ba51b32ebcaef91dbde0abded021df2703c41851001c375b3cfb6a0417a692", + "localSha256": "d5efb08a0420dd455db49fdd99b1b606dc6b80b9722811b403915f76e5f4808a", + "orderedPathDataSha256": "143f42554bf62c04538ead5118bfbf964c6291bce6922c1854988fac40239249", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/center_focus_strong.xml", + "upstreamIcon": "center_focus_strong", + "upstreamPath": "android/image/center_focus_strong/materialicons/black/res/drawable/baseline_center_focus_strong_24.xml", + "upstreamSha256": "f12c98c885d25e05b110b810a48d8600519383e5f7b9732c2ad6ecf2c00a8402", + "localSha256": "ed9f941c8400bac9dd3de995d551896065ef34c27970100bddf913b85022026a", + "orderedPathDataSha256": "dac55806e48a0caaa0768b50f8c646b27248c1256c0029b6487ae6f61becc531", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/center_focus_weak.xml", + "upstreamIcon": "center_focus_weak", + "upstreamPath": "android/image/center_focus_weak/materialicons/black/res/drawable/baseline_center_focus_weak_24.xml", + "upstreamSha256": "1e5203c25a3ae5bfc2be06cd4c2458f772dd6cda043ff4743f61684ac6e6a811", + "localSha256": "f054c26cf8eb4f93117cb016051538ad37dbd643cc1c09d3d83364cf9e868294", + "orderedPathDataSha256": "bc3506e74d8c8519094c888a40fddc32abe020a7e2d7d6c4e7e96950c318093d", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/chair_alt.xml", + "upstreamIcon": "chair_alt", + "upstreamPath": "android/search/chair_alt/materialicons/black/res/drawable/baseline_chair_alt_24.xml", + "upstreamSha256": "b7331d9c4ee1d2a03b30467facc6e91e064386aac36a342a504512fdf8886727", + "localSha256": "f844242f0f57911d0e8bd3097688f34325be2d95b3852877beafb55f67f88fdb", + "orderedPathDataSha256": "c1a194ade5700096ef3cfd50f6419d090c0d314cd74ca64e0679ef1d2180145a", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/chair.xml", + "upstreamIcon": "chair", + "upstreamPath": "android/search/chair/materialicons/black/res/drawable/baseline_chair_24.xml", + "upstreamSha256": "b6c7915fadaaf8bb3a69f23039666fdd2be8a9c7d54d5433302d92096dba4cdc", + "localSha256": "b3c3204c0b2614defa3181c9a2a1257af9cfbe9271865b581db6783eb5a8db4e", + "orderedPathDataSha256": "ff7e9505b1184ea62367a6b6a725bb3f109812ab2a4d6cbfe5a666f79f95be9a", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/chalet.xml", + "upstreamIcon": "chalet", + "upstreamPath": "android/places/chalet/materialicons/black/res/drawable/baseline_chalet_24.xml", + "upstreamSha256": "dd9449adb1b76160d208e0c1bbfacb9834aab836ef21e81f53a5762a61b60010", + "localSha256": "883d4fcf0020f038eb1f0da5e497eae0d53b50af8d7efd826491bae7de365b8a", + "orderedPathDataSha256": "14d97814d3cdc95fe374b6075b1c3031d21c1fe4b699a902fe3998a9184031d6", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/change_circle.xml", + "upstreamIcon": "change_circle", + "upstreamPath": "android/content/change_circle/materialicons/black/res/drawable/baseline_change_circle_24.xml", + "upstreamSha256": "9c7cd920ab3943e7c912bb1c594333ec0ac343bfa322f714e6abe69b1d248856", + "localSha256": "9df7920e4fca3ab50fa4f2d791b3965dc8820ec932c0635ce4c8f97673d7ecba", + "orderedPathDataSha256": "2d00106a803dc2289b387d4541f41f11cdc9dd528958e19d31f487cf54cd1e83", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/change_history.xml", + "upstreamIcon": "change_history", + "upstreamPath": "android/action/change_history/materialicons/black/res/drawable/baseline_change_history_24.xml", + "upstreamSha256": "5f304cfd07274e6fc91083e39ff7f787f525cea872b764683a9eb3642cf5b697", + "localSha256": "1e7b398cd54aabbc7f99c7f972b4ac5f246610b0d0cba983d09a3edf36091423", + "orderedPathDataSha256": "e2a59940d56a721874464b34e64202a2da172ffb14644c8dc0416bbc82012397", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/charging_station.xml", + "upstreamIcon": "charging_station", + "upstreamPath": "android/places/charging_station/materialicons/black/res/drawable/baseline_charging_station_24.xml", + "upstreamSha256": "6fc06e403f5b88bc9f2302b7c1d3bfb74cfa7e1d377bdec8dce591aa34925d5b", + "localSha256": "33a2f703e0a6ed1e5188a3c45c4dff7bf750cd1037be119bed332342eeec1d3e", + "orderedPathDataSha256": "d61754bb9ade41ef188ffe451b9efa525d4175838e8702da058762410ae137b4", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/chat_bubble_outline.xml", + "upstreamIcon": "chat_bubble_outline", + "upstreamPath": "android/communication/chat_bubble_outline/materialicons/black/res/drawable/baseline_chat_bubble_outline_24.xml", + "upstreamSha256": "cb1f9b6e4dcf5fb09b316dc1784c5a81eb473019bcd8df0dded2cebc2e7f3744", + "localSha256": "375b801e0ace67d38a06f99db0b934a394aca38d593cbc81370b95fe36ce7123", + "orderedPathDataSha256": "97f07bc7920132702caa4a11165e176f2c4bab29455de945f47357d3b24a82ff", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/chat_bubble.xml", + "upstreamIcon": "chat_bubble", + "upstreamPath": "android/communication/chat_bubble/materialicons/black/res/drawable/baseline_chat_bubble_24.xml", + "upstreamSha256": "9ef7c2c6d36f6d80bd5d56f7816368d95118e20de0d00fcc0f5ed3526e8f133b", + "localSha256": "279fad7a653708fe02ea75d1f51ac66b86a65741b85de4a0c4c953c6006673be", + "orderedPathDataSha256": "5d69b4f54d404ed0c1fd33304acecdb548d3d1e9168cc858f7536a76d01e5743", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/chat.xml", + "upstreamIcon": "chat", + "upstreamPath": "android/communication/chat/materialicons/black/res/drawable/baseline_chat_24.xml", + "upstreamSha256": "2329ba8300b3a80a79a6c254adf76e3c86d395879976053b2dd0bb4e6a2a48b4", + "localSha256": "599ada0807b574bb40675462da6b9d9795a01acbbc6c59ee2ec80a83c26cae1a", + "orderedPathDataSha256": "3967f8c82402cff32df3ddec6700e59842de0872cb6c183404667018e1016ccb", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/check_box_outline_blank.xml", + "upstreamIcon": "check_box_outline_blank", + "upstreamPath": "android/toggle/check_box_outline_blank/materialicons/black/res/drawable/baseline_check_box_outline_blank_24.xml", + "upstreamSha256": "53cbe293b1aa47cbf48ebec0c3d69c3a6cb0103f0e1fc4b7523d44678b20e9fa", + "localSha256": "a5949bef75dad07a2ab6b9e074496fcc7402d26f1263aa775f91ac68895d8dac", + "orderedPathDataSha256": "7dcfef928fc44920ba3cfa6cf6924c58e5510515419a7a4c8534016f2fd2e006", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/check_box.xml", + "upstreamIcon": "check_box", + "upstreamPath": "android/toggle/check_box/materialicons/black/res/drawable/baseline_check_box_24.xml", + "upstreamSha256": "b759d90cd1e0698f2d51ebe30ca7fd56119b82f90f360dcf4e7aa37251d0471a", + "localSha256": "8090bfad63b6a2bc5da264fa7117cd4e2241e798870e77aa5002937bbe14a4b9", + "orderedPathDataSha256": "477e9fbaf5ec281a8175a669227aa4a0ae570cf99e628776887fb83fe00b35de", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/check_circle_outline.xml", + "upstreamIcon": "check_circle_outline", + "upstreamPath": "android/action/check_circle_outline/materialicons/black/res/drawable/baseline_check_circle_outline_24.xml", + "upstreamSha256": "6cc3bb28a8c2ae477d78fe944e2ca18c2f3a5e67639fc822dad92fb585a2e319", + "localSha256": "b7d1a76709af6c2c5517a06b864fe520e959d4f409daac9bc0919112d691a4e1", + "orderedPathDataSha256": "9dd6f4568dab8bf44cb3eb7c0ee7761a8c4bc8e7fff28c92802e4c06a3654ca5", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/check_circle.xml", + "upstreamIcon": "check_circle", + "upstreamPath": "android/action/check_circle/materialicons/black/res/drawable/baseline_check_circle_24.xml", + "upstreamSha256": "5b831ba5cd2dde0845877c56ff297d21c47ccd0085971139bd30e52e2141d842", + "localSha256": "a6b13ab44aae3fd616d24e47bd46863b7978093456d8feb22c9cffb8faed35ce", + "orderedPathDataSha256": "a6d79a090cf744e03a1947d09d965c84e59b50dcd18e42b2e3d629907cecf02b", + "originalGeometryMatched": false, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/check.xml", + "upstreamIcon": "check", + "upstreamPath": "android/navigation/check/materialicons/black/res/drawable/baseline_check_24.xml", + "upstreamSha256": "1d827bd3684ef026677cde6e25ad38df0942e304cf9ab9b35d64b440662f5d90", + "localSha256": "fc6f106ba8b13802d9aaec02f8209780eaccf4e5b4604bcec614a7883a4727ca", + "orderedPathDataSha256": "fe2b0a159bf21a6921440f6155a631c29140b3c768ae810ce5d3814162b407e2", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/checklist_rtl.xml", + "upstreamIcon": "checklist_rtl", + "upstreamPath": "android/editor/checklist_rtl/materialicons/black/res/drawable/baseline_checklist_rtl_24.xml", + "upstreamSha256": "f815bddbc2f87966af6884158d21f63fcee4059a56efc66ffd954fcad4dd7612", + "localSha256": "c759b2d5a8296da5312e4931693599930bebb8699f7321f26590b7b6552d6a80", + "orderedPathDataSha256": "d0c93c57951abe431706f116190defd5183db50b1c6a746ce3a2a2f5a55c757a", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/checklist.xml", + "upstreamIcon": "checklist", + "upstreamPath": "android/editor/checklist/materialicons/black/res/drawable/baseline_checklist_24.xml", + "upstreamSha256": "2beb948c6f4e5ff9419f351b7341c267fba4ccd24d77e90316c024abc9a41979", + "localSha256": "41417a23e632dbcd4a614d1e94c87833c73bbacebd7fa03b021f39bf6fb5c4b0", + "orderedPathDataSha256": "7919d5ac1c037794d610b658c1eb15872d609c6a45ce40aa068e806bbf0c8d01", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/checkroom.xml", + "upstreamIcon": "checkroom", + "upstreamPath": "android/places/checkroom/materialicons/black/res/drawable/baseline_checkroom_24.xml", + "upstreamSha256": "f0363b02b00801b89190299d9031f1d280e356d22f627b7991e3a0cd32e8460f", + "localSha256": "23f1df7f1dfe8191fdb19dc59853d95006037da21f92a094433798dd817c27ac", + "orderedPathDataSha256": "99bb75570eb42e4e176800dc59989a5f623f04a63bedd9984de216c3784e1184", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/chevron_left.xml", + "upstreamIcon": "chevron_left", + "upstreamPath": "android/navigation/chevron_left/materialicons/black/res/drawable/baseline_chevron_left_24.xml", + "upstreamSha256": "10f57b624ec83ea77a61712818d5da1f4ce09fde3be8a0be171f097fd7338d36", + "localSha256": "633d8d4f8f3644fa531151a24152f82854797a9000b598edbe5cca8f0a41afb3", + "orderedPathDataSha256": "6362814502f3cebc12db1db023d53fa2ab235b85dbd9c6b1d50e4c226ba3b80a", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/chevron_right.xml", + "upstreamIcon": "chevron_right", + "upstreamPath": "android/navigation/chevron_right/materialicons/black/res/drawable/baseline_chevron_right_24.xml", + "upstreamSha256": "04a48c7333b6254214a12b7c6ae0eceb6b0a78810a404283700754147d41f7df", + "localSha256": "cb94322a56b598aa6dcddeccd0f07e557ed846d61753575392b6fc03c03d5730", + "orderedPathDataSha256": "25db7c5772252a6fafae5f7d0a79d4c93cd78089e53c0146b9f89b47b55f5747", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/child_care.xml", + "upstreamIcon": "child_care", + "upstreamPath": "android/places/child_care/materialicons/black/res/drawable/baseline_child_care_24.xml", + "upstreamSha256": "a1ddf1068693ad9371413a2eea0c75439d12fccc86a281cec710d33176740372", + "localSha256": "aa914cd27c3098b02506d9a0a741aa9672421f982f61ecfb0ee2a1feaac73ecd", + "orderedPathDataSha256": "a9c3567ccf4fa3ec1d2a83d2331af29668b0347499671cd5a592458df39a9c0d", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/child_friendly.xml", + "upstreamIcon": "child_friendly", + "upstreamPath": "android/places/child_friendly/materialicons/black/res/drawable/baseline_child_friendly_24.xml", + "upstreamSha256": "4cc8351da85c37119afae722f4a9340833534f26fcb7600e6d35dd645eb32403", + "localSha256": "399ba2920cd943931257aa1daf3c63b857f5a8d47801f5712d8ce86ea223498a", + "orderedPathDataSha256": "877996cffee71c38b30d70c0e31d59dbc2eef0c9f720a435ae2848de4a5443ba", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/chrome_reader_mode.xml", + "upstreamIcon": "chrome_reader_mode", + "upstreamPath": "android/action/chrome_reader_mode/materialicons/black/res/drawable/baseline_chrome_reader_mode_24.xml", + "upstreamSha256": "58a6ed90de20437785a0ae5e7230d57f10053e6232b66836bec669e3b4ccaf22", + "localSha256": "d844761b8b4619075217ffb70dfc442453c13f05e87c0977b30ec49a2e83c184", + "orderedPathDataSha256": "49b7f719113e50ed5f1e238698a65fdfe140b947d7595a02c87b8a20cbcb0468", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/church.xml", + "upstreamIcon": "church", + "upstreamPath": "android/maps/church/materialicons/black/res/drawable/baseline_church_24.xml", + "upstreamSha256": "8506912969b9b585c447b90f5985ff31c7275306c4a47f05b24f351a84eaf454", + "localSha256": "8edee503115c215496a9a89183cd89c82b59278abee8fff1d35f00604c97d237", + "orderedPathDataSha256": "5d30b74bb527ec7e03d6f96d2f2060c5e5af0bd07d1e94705d2809b57240b7f3", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/circle_notifications.xml", + "upstreamIcon": "circle_notifications", + "upstreamPath": "android/action/circle_notifications/materialicons/black/res/drawable/baseline_circle_notifications_24.xml", + "upstreamSha256": "6940ad0d737a5c90edd1a34cc7eea79d4a9ce992726b2da9a8c0cffed6a21615", + "localSha256": "74ce59f4663026eda258e8856d7db2b0b1879e94b09080504452ac3e9681c78f", + "orderedPathDataSha256": "6fc18c8a6c3c059846ab342d6961d1087a08a107e34b70e858291135c6f2707d", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/circle.xml", + "upstreamIcon": "circle", + "upstreamPath": "android/image/circle/materialicons/black/res/drawable/baseline_circle_24.xml", + "upstreamSha256": "2b1579f067686af1abb8f906bebb07e12feb465b29183779bb2b18d2ee8414e5", + "localSha256": "a266bb445ea9e0295c5608ee4f94eb8a5bd6eb9b4fc9dbd4e545a8f12190aa09", + "orderedPathDataSha256": "636e628ae694386bc18e7cac07637f0a1919951192586cbcf13e917a5adf76b9", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/clean_hands.xml", + "upstreamIcon": "clean_hands", + "upstreamPath": "android/social/clean_hands/materialicons/black/res/drawable/baseline_clean_hands_24.xml", + "upstreamSha256": "232d09017f79f4d48a4fcddd96ae575084608197f63406b12e1fbc0190611f67", + "localSha256": "d373d0da85c1980331e962a44d65d7616711a2ac4b5ea8af85635d1d886bdddc", + "orderedPathDataSha256": "a4d1cc4743947628ba5f9fd25a714f3c7af573d5e3eabd914177a7adc03f8838", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/cleaning_services.xml", + "upstreamIcon": "cleaning_services", + "upstreamPath": "android/maps/cleaning_services/materialicons/black/res/drawable/baseline_cleaning_services_24.xml", + "upstreamSha256": "821eeab606a6b09f200d0465a4f225b5becf4c67eeac0a568868ebe9543a445d", + "localSha256": "467ccbb015d567747d32dfe057d5438e63998699a9570b6846e688018dc95230", + "orderedPathDataSha256": "9a14d0a8f392cf9b3aa5a8f5f8ece1f3c7daee1f14c13fddc9e9cadba1e694c1", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/clear_all.xml", + "upstreamIcon": "clear_all", + "upstreamPath": "android/communication/clear_all/materialicons/black/res/drawable/baseline_clear_all_24.xml", + "upstreamSha256": "8364f43f7a45d6d77c9832ff51fc98921ea7c5daf5d3e441ff8b35dc2636bf22", + "localSha256": "7f3bc935ba017557ecfe5692fca76a6d8adde653ed088c8ed108319d0a3c88ea", + "orderedPathDataSha256": "e83892d545e60b8bcf57c9b5f5c24f24119440b3800ff8705b9bdbed5c103128", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/clear.xml", + "upstreamIcon": "clear", + "upstreamPath": "android/content/clear/materialicons/black/res/drawable/baseline_clear_24.xml", + "upstreamSha256": "3e40fea86110c38e6930418b8ad464b85fce1c76d6abf3baf35fc1881f0dfc14", + "localSha256": "76ea16cf1ec5fb6c26f207bf2a984b1f0c35deb880239790507c8e41ed54c588", + "orderedPathDataSha256": "b1d884be39702747f67e4bd488523ba69957d7ad260657ff63c519e09256ff60", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/close_fullscreen.xml", + "upstreamIcon": "close_fullscreen", + "upstreamPath": "android/action/close_fullscreen/materialicons/black/res/drawable/baseline_close_fullscreen_24.xml", + "upstreamSha256": "156a2e3b35f63ee72e8f2e3362ef765419b67d3d5d96b8fdc64f0bcbd9ec2f57", + "localSha256": "852f6c5cce9044f6fd0045a16ab07cfe3a261329feda174199e7af0d1b35d410", + "orderedPathDataSha256": "213eb34a30eccb1acbe759b44637ac292b4ef168acad333cf086901516fae04c", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/close.xml", + "upstreamIcon": "close", + "upstreamPath": "android/navigation/close/materialicons/black/res/drawable/baseline_close_24.xml", + "upstreamSha256": "3e40fea86110c38e6930418b8ad464b85fce1c76d6abf3baf35fc1881f0dfc14", + "localSha256": "2e4495b46edb59988f1bb9c4493f040916f8ddf01d4b39a495fdc1f442e29c4b", + "orderedPathDataSha256": "b1d884be39702747f67e4bd488523ba69957d7ad260657ff63c519e09256ff60", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/closed_caption_disabled.xml", + "upstreamIcon": "closed_caption_disabled", + "upstreamPath": "android/av/closed_caption_disabled/materialicons/black/res/drawable/baseline_closed_caption_disabled_24.xml", + "upstreamSha256": "7b1f8f4032252390dc2d2017cbaa3bd869434686ae904104495c87c8f9a63456", + "localSha256": "8222308f5dc5eac245d18fe7c55cc830df4f10fd1696658c8da2af855279cccc", + "orderedPathDataSha256": "f40b8ebe0225b51a5b7df2451fc369f38af5521de72f8abebc4ddef71fad2dd7", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/closed_caption_off.xml", + "upstreamIcon": "closed_caption_off", + "upstreamPath": "android/av/closed_caption_off/materialicons/black/res/drawable/baseline_closed_caption_off_24.xml", + "upstreamSha256": "7f4200c73452ebed9d492b4fec23bd8efe081fb83b3aa2d53f9dddd1eb15810a", + "localSha256": "9a6d9ad8a9d8ddf1e06e8511ab711df55962778e55aee80e40bbfd4870716973", + "orderedPathDataSha256": "f2c356778c924b81cdd5ffcfcebafadaa7e4289012a419b90a9b40476f08f7ca", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/closed_caption.xml", + "upstreamIcon": "closed_caption", + "upstreamPath": "android/av/closed_caption/materialicons/black/res/drawable/baseline_closed_caption_24.xml", + "upstreamSha256": "b84ac541e17d5639ca3df2a88a26f64f74895911a31820c40d4387da9f4e4521", + "localSha256": "a9e112ba7c0b90f2c4a29db228947a6b424bb9bb6dbe0129d204b7e829933111", + "orderedPathDataSha256": "60c6aab864326d4ca4e2fec64468e79687762fbadc69761b86034b23ed2318f4", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/cloud_circle.xml", + "upstreamIcon": "cloud_circle", + "upstreamPath": "android/file/cloud_circle/materialicons/black/res/drawable/baseline_cloud_circle_24.xml", + "upstreamSha256": "3031f93b2249f3a63d7c9ea0b2fb78bc44c8fdab4ee6a6c2f324288b0746d633", + "localSha256": "fedf1a293c4049c7f690f9dc4206de71568597ea5f228389d063d97287e058a0", + "orderedPathDataSha256": "bb2dad413ac0c22f9a0706fe23ac5d66b2d92af3d95e5fcaffc7a18e46697b9c", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/cloud_done.xml", + "upstreamIcon": "cloud_done", + "upstreamPath": "android/file/cloud_done/materialicons/black/res/drawable/baseline_cloud_done_24.xml", + "upstreamSha256": "70a638291c51e06597840031e16fee7eddeeb6e31757f23d992fa83048182996", + "localSha256": "12f84f3ace6afa27c70fbe8331942863085191ced8b80ba1e06a65d8e4a33c12", + "orderedPathDataSha256": "c6edfcdc1106e229f8023b11a8c8a170de1ce809120b226c7e1aebdaa1332001", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/cloud_download.xml", + "upstreamIcon": "cloud_download", + "upstreamPath": "android/file/cloud_download/materialicons/black/res/drawable/baseline_cloud_download_24.xml", + "upstreamSha256": "38081b52d5e71c5f2e865918a1ed8c1ecc114aaf04c461549b9f31d3b038f1d1", + "localSha256": "6b1da0c5029255663e234c4f337ec78f678c995ef4bb7a85e1284cb55c92d50a", + "orderedPathDataSha256": "e51810532d796493022ef2ff34ae4da6e89c8d4e3856804fbaa7ebe622386e33", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/cloud_off.xml", + "upstreamIcon": "cloud_off", + "upstreamPath": "android/file/cloud_off/materialicons/black/res/drawable/baseline_cloud_off_24.xml", + "upstreamSha256": "13131d2a237473f4230e966f1627f3cd24b786081c6cc78df3219065f13a6929", + "localSha256": "79f3898b5ca2cf606d5a22e95326572b24f454d31c457bb9c835fd816a5b76d6", + "orderedPathDataSha256": "6031c642ca9078fc1c48e588115f005e22eda60122b615a3799adc48282adee4", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/cloud_queue.xml", + "upstreamIcon": "cloud_queue", + "upstreamPath": "android/file/cloud_queue/materialicons/black/res/drawable/baseline_cloud_queue_24.xml", + "upstreamSha256": "ca40a0a5657aa74b5d2c28252b819bd6a78502dddb261e593ff95ca651f09e96", + "localSha256": "61a6792c74c908616052b9277c34ffc72a386a773ad322b6595bc2a7ac68ed7d", + "orderedPathDataSha256": "2a48a8a19fe0ad26e6f91009c7df663dfcf51bf42cf507553d7114ec42d0ea0f", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/cloud_sync.xml", + "upstreamIcon": "cloud_sync", + "upstreamPath": "android/file/cloud_sync/materialicons/black/res/drawable/baseline_cloud_sync_24.xml", + "upstreamSha256": "1eaba6067d28450e2772577fe8af57d675a4a04951c6be170b9eae38321cf2d1", + "localSha256": "199e9662fc6d2f58a591a46701901f585f7daf9d678ed05ef448433ce34f81ab", + "orderedPathDataSha256": "bb91b8a92e51107f55db47f8e1c32964c846e511caaac446547c856871fd8d4b", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/cloud_upload.xml", + "upstreamIcon": "cloud_upload", + "upstreamPath": "android/file/cloud_upload/materialicons/black/res/drawable/baseline_cloud_upload_24.xml", + "upstreamSha256": "885bedeccfac16796972973fc020d14d6dfeb8afe834d6681d03019fd90e2c94", + "localSha256": "f0ee085a4ae30da380444a9cc41b5e82727dcefc1117e3a28188cc5372ca005d", + "orderedPathDataSha256": "855744ac09715bc6a366f6081433f29893e62c4e3f02ad4a907b5025517b335a", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/cloud.xml", + "upstreamIcon": "cloud", + "upstreamPath": "android/file/cloud/materialicons/black/res/drawable/baseline_cloud_24.xml", + "upstreamSha256": "4f854ec1413af84b9cb0b4cd1f2d6d488b0ecc7b7a1cc8919f6cf82aed5a8b97", + "localSha256": "13322d81b4170f6bbea9babef2ad0744d0cc11adb956ab39edbf7a38b7025769", + "orderedPathDataSha256": "e7b7882b29225d6ca43a0c33dd91a99ef6c80a72fe1f3f4427d5d0aedb5ff882", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/cloudy_snowing.xml", + "upstreamIcon": "cloudy_snowing", + "upstreamPath": "android/home/cloudy_snowing/materialicons/black/res/drawable/baseline_cloudy_snowing_24.xml", + "upstreamSha256": "0aa236e49c7d3e3c9c8b9bb4b49bbc774989567718ed075ea1613e60655fe2a2", + "localSha256": "848fdc1fec8cdd5479d7bde3406a15d662f79eed1afb2dd1a634f8311f885660", + "orderedPathDataSha256": "9d3fcf2ef902ab2dd50fc55cf0c52f80b81cf8b6eb2186fa9902a5ac3192afa1", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/co_present.xml", + "upstreamIcon": "co_present", + "upstreamPath": "android/communication/co_present/materialicons/black/res/drawable/baseline_co_present_24.xml", + "upstreamSha256": "e765bcbf300140da1656a5d280d60daccd8b91e77d5927222227b3104e5ab4ff", + "localSha256": "21c0838a59b4f69c703c98f4ba17f74b17c24c9689d77185c697ad8106310c2e", + "orderedPathDataSha256": "15a62fa8513a3d343222589ce3a18aceb253423d135ca1a7a84838cc9f57c48d", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/co2.xml", + "upstreamIcon": "co2", + "upstreamPath": "android/social/co2/materialicons/black/res/drawable/baseline_co2_24.xml", + "upstreamSha256": "32bc3c4537a50d6ee283ba60eb0c93e8618066200fecf7517bce5b818c5e671c", + "localSha256": "4614fe222fc56e5fa63d23518203ffb403f8917e6803b36f24a65435d9ab30fc", + "orderedPathDataSha256": "589dd59758052b1123c2783570552d48dbfa87e2f50860bb0261b3268e623aa8", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/code_off.xml", + "upstreamIcon": "code_off", + "upstreamPath": "android/action/code_off/materialicons/black/res/drawable/baseline_code_off_24.xml", + "upstreamSha256": "d223977970bace96cbdbd809776721e72b60a320902ecec7abdd7f9776b10d1d", + "localSha256": "0afb73d64e32bf18fbc30e44a805f0eff54deaac1954228672065541db860bbd", + "orderedPathDataSha256": "51132e33a9ed466971fc1326a3443e3b9bc8a8384ddaaf899d27518b54767b0f", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/code.xml", + "upstreamIcon": "code", + "upstreamPath": "android/action/code/materialicons/black/res/drawable/baseline_code_24.xml", + "upstreamSha256": "e7e4ea3c59ad3fed7b4406a7f87369e817201173358fd616844aa90fe8b72769", + "localSha256": "a3c5ac41dda8c84daa418b52b4c84497fdb05b6144a48cbfbc147f7eae5b54b7", + "orderedPathDataSha256": "46ebcff2546b9f0bd3b364fe8898da84ddd317107a6f64295334ff8feb07caa6", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/coffee_maker.xml", + "upstreamIcon": "coffee_maker", + "upstreamPath": "android/search/coffee_maker/materialicons/black/res/drawable/baseline_coffee_maker_24.xml", + "upstreamSha256": "342c347756fea969644432bc1dcc21e6a67d4ad991f892117c829ea18246144b", + "localSha256": "1b32497727913c57926a5628d57626cf80db27a589e9e336d9402435cbd62fb7", + "orderedPathDataSha256": "7e40086545d93cbf06bbbdf84eb09719c4a6f56b177ab09a514ac811bf92ef2f", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/coffee.xml", + "upstreamIcon": "coffee", + "upstreamPath": "android/search/coffee/materialicons/black/res/drawable/baseline_coffee_24.xml", + "upstreamSha256": "7596360882712ca6fb73416dbf88ddab2b42757c9a5a91217b74299feb659c79", + "localSha256": "0841150b03e23045fccbda71617453cefbd8f6b306a055c074afafd39e61c716", + "orderedPathDataSha256": "4849b59c0445444896ca5bb70e1d2c024a8f97949313d62c386de0565e23aa84", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/collections_bookmark.xml", + "upstreamIcon": "collections_bookmark", + "upstreamPath": "android/image/collections_bookmark/materialicons/black/res/drawable/baseline_collections_bookmark_24.xml", + "upstreamSha256": "c67e4dbc53ad39aa1191378e476a5f4edfc0163c7affaca7f85e7b0ef6f3b845", + "localSha256": "183b655a1aaa5af10156c908f357ebad4af7f090cd74d3f40f419455f53d50ae", + "orderedPathDataSha256": "ba8009f9cc6911617456a8ae4fa31c1404d65daa369fa4483223258f12fedc62", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/collections.xml", + "upstreamIcon": "collections", + "upstreamPath": "android/image/collections/materialicons/black/res/drawable/baseline_collections_24.xml", + "upstreamSha256": "ce3e1047fd91a389a7049eb60c8ac11d588da161a065ab0595461e2007c8f1d3", + "localSha256": "35a126db24896e42280bc312376d7d100ffd5edce4340589d3a73ab71201bacc", + "orderedPathDataSha256": "efdb1fb1478389acdfd07e08eaf5505ca4b6625dee22806e0da143b4aae8e51c", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/color_lens.xml", + "upstreamIcon": "color_lens", + "upstreamPath": "android/image/color_lens/materialicons/black/res/drawable/baseline_color_lens_24.xml", + "upstreamSha256": "282c3a3127fb9cdc48b8069cbd15819047d998089d24b0e942f1fb69a52562ae", + "localSha256": "65361f8c1f6fb3c96bb9535a410d45692a5c397675047f2c57b8e14b63adac6a", + "orderedPathDataSha256": "2ccfd6a0e08df2905ad17b6ef43b0c4536fcfd8fc748ee02964d1ed58a186b57", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/colorize.xml", + "upstreamIcon": "colorize", + "upstreamPath": "android/image/colorize/materialicons/black/res/drawable/baseline_colorize_24.xml", + "upstreamSha256": "7d58c1eb2c6f6080a3db49f3717fe9a41482bc2d9da61bf698a54565b37dda63", + "localSha256": "dabb62a742f9dadc4881f0a925419152b4d29646086129a5972e7ce0d90fee25", + "orderedPathDataSha256": "ecd349ab37fe769ad74ceb732aaf05f3d03a7919c3cf87e5d1500c486adc2eb7", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/comment_bank.xml", + "upstreamIcon": "comment_bank", + "upstreamPath": "android/action/comment_bank/materialicons/black/res/drawable/baseline_comment_bank_24.xml", + "upstreamSha256": "cb216ee4f8891bf44e1ee487267c60aaa15264255f82225656e4738edce1567e", + "localSha256": "2d26779e183ef828beabcf0cb96510f7b79e9fa6ffd7b1766ba7ea1a7fce9db1", + "orderedPathDataSha256": "f5feae74b2433ecab04622b49ccfaefea87699b1291a7f6fb9376c5bdd03fd61", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/comment.xml", + "upstreamIcon": "comment", + "upstreamPath": "android/communication/comment/materialicons/black/res/drawable/baseline_comment_24.xml", + "upstreamSha256": "24e31d40ed13ba940b2d50a4ac1b78c60ad397cd26ce1cbf5c75fb274f0df2d7", + "localSha256": "45385f9be5b13d2488882fadfde39fd8c8b14c64040e95b1ebb3756c7a901e4a", + "orderedPathDataSha256": "1e4803f2df5422e405f471b4baeb69452ba9adee793e7de0b091b66931f1be38", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/comments_disabled.xml", + "upstreamIcon": "comments_disabled", + "upstreamPath": "android/communication/comments_disabled/materialicons/black/res/drawable/baseline_comments_disabled_24.xml", + "upstreamSha256": "e7624bd1d7ef5b285050aef5650eee2560f77cae73c949be0b647bc3a981d8a7", + "localSha256": "8fa5bc74138ae23509541aacea4fb215991bc44068ba032f0bf1f841bd86895b", + "orderedPathDataSha256": "3660e9678547d0538f0f6c42a2d2868acd908b51672569f2afd3f4597f9c3856", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/commit.xml", + "upstreamIcon": "commit", + "upstreamPath": "android/action/commit/materialicons/black/res/drawable/baseline_commit_24.xml", + "upstreamSha256": "9e7f62c28caf0c177d477b4c7c9a4c13a1ef3c15bbacfd0cd8b20f3c119338ef", + "localSha256": "07a4671a768ca3d21aef095c703d051ed11dc3a12d04ce3f99b4c437e117c96d", + "orderedPathDataSha256": "19791beafb017e5c09cf88708910fae8c1de794708a7078c34237b56220bac9e", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/commute.xml", + "upstreamIcon": "commute", + "upstreamPath": "android/action/commute/materialicons/black/res/drawable/baseline_commute_24.xml", + "upstreamSha256": "1665d8d65eb17a45a90bd2237e4230e7b1e85f67796c990065f0b2d211ee5d5d", + "localSha256": "84ee27d7a81808c3194e8e8046b4bd568064462461be99e8a530d33ade4c41be", + "orderedPathDataSha256": "adf12b2dfc027462a955c9d3b9316efdaf679720083ca87d2f19747c58e69dd4", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/compare_arrows.xml", + "upstreamIcon": "compare_arrows", + "upstreamPath": "android/action/compare_arrows/materialicons/black/res/drawable/baseline_compare_arrows_24.xml", + "upstreamSha256": "7235f3daed6de13bf55fb1d8d17a0669f275b8b8c91c757bbd3de38569fda1d2", + "localSha256": "3db70e3391870b3ad521c0a4e6a25384619851a416464350a6cb7deb30254fd7", + "orderedPathDataSha256": "0c448fee1581e4cc3d2ea688ba6f66ee6757494e1f26af9cd244b9fab0219833", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/compare.xml", + "upstreamIcon": "compare", + "upstreamPath": "android/image/compare/materialicons/black/res/drawable/baseline_compare_24.xml", + "upstreamSha256": "a098736dd168d08f38ee789d9971be1b9a50f309d73cf17672f7552d1fca484e", + "localSha256": "96eb1101b5643701808b64c793f97327c502b3e4da3ba8e25b983268a08e8410", + "orderedPathDataSha256": "dcba5e53cf2f130ecb4faae7c82908c297ba176a3c57e7feb20416073acf3fd9", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/compass_calibration.xml", + "upstreamIcon": "compass_calibration", + "upstreamPath": "android/maps/compass_calibration/materialicons/black/res/drawable/baseline_compass_calibration_24.xml", + "upstreamSha256": "ffda474af91e384dc8ba629baf48b9f6dc9a91a26032d56b0085a42a541d3daf", + "localSha256": "200044bf530b82f2c4d907f4cd1a8d3f788746a2a5d16784c38979d37097adcd", + "orderedPathDataSha256": "73b2c416d0f0e10098f1328fa7206bc8e90878a2201f6a59ef7dcdc5f5d0b3b5", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/compost.xml", + "upstreamIcon": "compost", + "upstreamPath": "android/social/compost/materialicons/black/res/drawable/baseline_compost_24.xml", + "upstreamSha256": "6d2b3dac2c5ddcdb4ffc79d560015f32880de9d58c7aa83580e79014f1361c8b", + "localSha256": "aaa996f6283047c67f49b8546a8c7f9c5b003ca5f201fe165d4cce9c69267730", + "orderedPathDataSha256": "dd1852fb3cc4b30e7d273acfd1b01c459fe479ed1e9adc676cb9a26a19bc5270", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/compress.xml", + "upstreamIcon": "compress", + "upstreamPath": "android/action/compress/materialicons/black/res/drawable/baseline_compress_24.xml", + "upstreamSha256": "dbb7296f397d2d1f5715736b4f2fb549627a85db64516917ee76bf94f8a154bd", + "localSha256": "c21bb83808ef3be214c919af55a6081d73a1e8e53c5bfc7ef622ed4808991280", + "orderedPathDataSha256": "2f1fe3710824fc4e7449d0fc98b995de3b31322a3a97f84d17118e8827f8ef1d", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/computer.xml", + "upstreamIcon": "computer", + "upstreamPath": "android/hardware/computer/materialicons/black/res/drawable/baseline_computer_24.xml", + "upstreamSha256": "1dc92d5f2c80ebd8458ba8c841589e96573d82f43120b895287d78ae59df3890", + "localSha256": "caa8695dbe188ce99c5f873b03583373aa9182df4cf0ff6e6bcf3df053e676f1", + "orderedPathDataSha256": "c9d908457f438fe84bab42bc47c357177cc2f499691f032728c999da9204c08f", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/confirmation_number.xml", + "upstreamIcon": "confirmation_number", + "upstreamPath": "android/notification/confirmation_number/materialicons/black/res/drawable/baseline_confirmation_number_24.xml", + "upstreamSha256": "a4051710a6c290d90c08df4df2b76d8bd5c078497ab1fa8740f4004707aa554f", + "localSha256": "df442d3fce93a07494baeb67b3ff603ead33f22d566a59e5c20dd7709e55bc02", + "orderedPathDataSha256": "a32eb526430c86096aca9f5ed2969d7b0b71b1aa0834e506cf2e3986fd446538", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/connect_without_contact.xml", + "upstreamIcon": "connect_without_contact", + "upstreamPath": "android/social/connect_without_contact/materialicons/black/res/drawable/baseline_connect_without_contact_24.xml", + "upstreamSha256": "5f40db625722e7fac31d28807559fda23776bee72176bc21181ed324a296710e", + "localSha256": "d129ec796c095a9ab2aa6b3b4d1f3f152f70d477917ec1f8dd68627e31ab3486", + "orderedPathDataSha256": "d7b0ec0f2a65f381b490ed640d6644050471c5e60d568def70493218b819748c", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/connected_tv.xml", + "upstreamIcon": "connected_tv", + "upstreamPath": "android/hardware/connected_tv/materialicons/black/res/drawable/baseline_connected_tv_24.xml", + "upstreamSha256": "33d21f363ab05a5cd08787a06f143acc3145aa54db54b26a406b1b0ca4231133", + "localSha256": "1bcec361708dd2c29980a1fa2a9851e07eb7325b16b5ea04ad6ccaf71f25cc9e", + "orderedPathDataSha256": "85bf92da6e7294e64f72e6240cdc3f6f7226a982bc99379e9d435dfe8cc4fd15", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/connecting_airports.xml", + "upstreamIcon": "connecting_airports", + "upstreamPath": "android/maps/connecting_airports/materialicons/black/res/drawable/baseline_connecting_airports_24.xml", + "upstreamSha256": "f973d88edbb359592ce14dbc6866e7f82ef12168125b70ada24b2456fe2ea5e8", + "localSha256": "6e56b7ae8214dca6a0359568f7868b29eab3efff0b43aabf1b2cb068d367e5dd", + "orderedPathDataSha256": "651dc726b9ce608fbd790ae66c56dae9cdb655573cbb75446ffde6fdde7604de", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/construction.xml", + "upstreamIcon": "construction", + "upstreamPath": "android/social/construction/materialicons/black/res/drawable/baseline_construction_24.xml", + "upstreamSha256": "83db19658e558b98d3df3d38e7b17b2e8f6e09226f6a5921336725a92ebbdbc8", + "localSha256": "21a5a1a2be21970512a93e71b08e2a4239aa5cccef149642c9e4742d525f948e", + "orderedPathDataSha256": "431d4f8ea74a876b6b4ca3316fd783ef9ccc6f27cd4c4a68334f396742d94f13", + "originalGeometryMatched": false, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/contact_emergency.xml", + "upstreamIcon": "contact_emergency", + "upstreamPath": "android/communication/contact_emergency/materialicons/black/res/drawable/baseline_contact_emergency_24.xml", + "upstreamSha256": "a5de632830babfb51bbb97a45c9feef5d7450f3f696861e5d078aa189672788c", + "localSha256": "ea5398a973dd30eb3e087e1385a44ec3ea9e816906cbf5db01af30fd027c5e78", + "orderedPathDataSha256": "ba99840b92cacecb9b669dbd2fcd87891a00a9cbdfb411ca23de8ce7f87e48b4", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/contact_mail.xml", + "upstreamIcon": "contact_mail", + "upstreamPath": "android/communication/contact_mail/materialicons/black/res/drawable/baseline_contact_mail_24.xml", + "upstreamSha256": "25a50d5134446affb5de090c0d4d241594eaeec77dbb873543f437af151b5d48", + "localSha256": "cadf19a814dbb4366ab3a9de091eb1f8a95939315d5097b215c6e9a4b7f96109", + "orderedPathDataSha256": "c2a384f745dc75204035b53f583c1d65241a06a9d958b6aafcfb85077bf9d4bf", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/contact_page.xml", + "upstreamIcon": "contact_page", + "upstreamPath": "android/action/contact_page/materialicons/black/res/drawable/baseline_contact_page_24.xml", + "upstreamSha256": "57ccdf36314c15f3baf475e334daa43216abe4bb8c33e84791f6cd587abf13a9", + "localSha256": "018fd4c7f85712509d822f285f29fbf938bb136c8a9ab696edc257cab80d2bd8", + "orderedPathDataSha256": "66bb64a85fffb739aa4431211d8f142cc35e0321e8e5126344a0f8a2a2318644", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/contact_phone.xml", + "upstreamIcon": "contact_phone", + "upstreamPath": "android/communication/contact_phone/materialicons/black/res/drawable/baseline_contact_phone_24.xml", + "upstreamSha256": "43781efc3e9b1e46b5eaea033a4e5c92617976367481456a6d999acdcb143584", + "localSha256": "4f99cf01596ff556ed37f1d6a0bade6ef115060ba610bf49bb5d95a5d883b177", + "orderedPathDataSha256": "c59b0164e5d84df723cb3f39ebdcec0dad2900dd687fe035cfbc7a40fb3f6038", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/contact_support.xml", + "upstreamIcon": "contact_support", + "upstreamPath": "android/action/contact_support/materialicons/black/res/drawable/baseline_contact_support_24.xml", + "upstreamSha256": "0368713fb3482c2849df26679a4b58071213ae39bd41606e89bca4f0714755cb", + "localSha256": "9f9dc54e059be36e820ebfa5d21350cc1fd6307a493265b70017f0e941597b1b", + "orderedPathDataSha256": "68212a73bc06446e398f4f35f50687a591a7a54b888faa91426e6f259837755d", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/contactless.xml", + "upstreamIcon": "contactless", + "upstreamPath": "android/action/contactless/materialicons/black/res/drawable/baseline_contactless_24.xml", + "upstreamSha256": "a3973b8a42cdbb3efaecd2b57173ae083c5715bfffad1eed6e1a347775505f9d", + "localSha256": "ea66655dacaf03e16fc04617d12c47279bab0743617f8dfc40c38dbcaf5ac6a8", + "orderedPathDataSha256": "1482a6f5d8823b41f83c56afb171755bc3692e54f61d294f0d3af6d42a799ab9", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/contacts.xml", + "upstreamIcon": "contacts", + "upstreamPath": "android/communication/contacts/materialicons/black/res/drawable/baseline_contacts_24.xml", + "upstreamSha256": "0ae5f87736e7e3b7e2c35d53ebb47008dacd22edc9d3961457c1ae4ee27bb30f", + "localSha256": "e51f0893297569056ebcd90967ecea8c8af5787ef33ed730271efe392e3fdb09", + "orderedPathDataSha256": "32aa7dbe6033cf24ce910e2af18ab42463ad2d8249c08eb39963839aeca300c0", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/content_copy.xml", + "upstreamIcon": "content_copy", + "upstreamPath": "android/content/content_copy/materialicons/black/res/drawable/baseline_content_copy_24.xml", + "upstreamSha256": "1e7ba6fe5c7e6f1cb0556e3c205cfd91fe332e698da4aafe6293f0f9af857864", + "localSha256": "1546df9180cbc1883b6840702d376c382bf4f9208fbffe50ec1066ff596e9ad5", + "orderedPathDataSha256": "5f90d0c6eac4f26a9bce6a3ad44728fdf2719930621fe131ca3a90a8d56a17fc", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/content_cut.xml", + "upstreamIcon": "content_cut", + "upstreamPath": "android/content/content_cut/materialicons/black/res/drawable/baseline_content_cut_24.xml", + "upstreamSha256": "7c10e2fa73883e4e858d17a4a1f3a1bae6fe34870eadec2ea3e47621c11caab7", + "localSha256": "52bf3d109709285c05f868821375f52c764f683ecc17a28d56f8679115f95895", + "orderedPathDataSha256": "095bfccc58a73dbb95667e28b8f51607adbb27b8a03976d1b74d9d8d60dc155f", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/content_paste_go.xml", + "upstreamIcon": "content_paste_go", + "upstreamPath": "android/content/content_paste_go/materialicons/black/res/drawable/baseline_content_paste_go_24.xml", + "upstreamSha256": "c11807da86a35985d47b512da76499a5d62f84f68365d33f3b63dd09ebb3e54d", + "localSha256": "7d65f4c76386c94cdcb0aa90e3d4f8d9d9dbe465003763e3e07d37fdc6f2a81f", + "orderedPathDataSha256": "8fb2d78db5e3a9afee7231d953e357a8366714e84fa4fec7ae07595c584ffc53", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/content_paste_off.xml", + "upstreamIcon": "content_paste_off", + "upstreamPath": "android/content/content_paste_off/materialicons/black/res/drawable/baseline_content_paste_off_24.xml", + "upstreamSha256": "d03f26fdef660242ae130d8023adb35806c39c2949862e84c622f14711689cf4", + "localSha256": "365b877d3c2dd4db029dffc263c3e5f564b03e92b3572d01f3f519fa809d4505", + "orderedPathDataSha256": "a4d2ed4f4beeb5945e42e8392445d813a9b2ee89aa32285d1a96c3ef47bc90e4", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/content_paste_search.xml", + "upstreamIcon": "content_paste_search", + "upstreamPath": "android/content/content_paste_search/materialicons/black/res/drawable/baseline_content_paste_search_24.xml", + "upstreamSha256": "73e1523e70b15df1d5a63b012f53a6a158cd209f03e524ecfd03cc58204aa13a", + "localSha256": "e5db5b9300c532dd0c8a4eadb1ab20531d835521849ae0f2343b4b0c3021b9b7", + "orderedPathDataSha256": "87a590cd2f407daea1db4a89fd4f561a0138384e0d9ab9534eda1f2f87176bf4", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/content_paste.xml", + "upstreamIcon": "content_paste", + "upstreamPath": "android/content/content_paste/materialicons/black/res/drawable/baseline_content_paste_24.xml", + "upstreamSha256": "66949296e8cbc37817673b73b8d689b3e47b6e4ea8477156494917ea66ff80dd", + "localSha256": "da0f75d44cecd2fd897b63eb6f28f0aed289ca5da47532396f9a78d30cddfbc0", + "orderedPathDataSha256": "7ab5378c365be78d72f13db76e2a588845030e2ff9da42261167cb2df1b78283", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/contrast.xml", + "upstreamIcon": "contrast", + "upstreamPath": "android/image/contrast/materialicons/black/res/drawable/baseline_contrast_24.xml", + "upstreamSha256": "b7ba9c805f1392b410e7a464cb1785820eeab21c947a9d52dc5735a3a0cf248b", + "localSha256": "fd90a47059f2748c66d38995b5fa401c12cf54a0d88b6e10d56603c6e852e54f", + "orderedPathDataSha256": "062f808a31d89f474ba7ea28a9afab7c1152df72e1a6360db1b6c42aea390f7d", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/control_camera.xml", + "upstreamIcon": "control_camera", + "upstreamPath": "android/av/control_camera/materialicons/black/res/drawable/baseline_control_camera_24.xml", + "upstreamSha256": "90174fe90c15dc46e498d9d776b94bf373f5bb0baeeb08860b00cd84e21d4437", + "localSha256": "d1e2b242e3edd04ac304574c19a2686b1bb448cc6799663b80f4e9018539fb7a", + "orderedPathDataSha256": "7a6afb2554cbdfff6a206fad8ef4f63464ed9b6e5656ca40966081ae885a1b93", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/control_point_duplicate.xml", + "upstreamIcon": "control_point_duplicate", + "upstreamPath": "android/image/control_point_duplicate/materialicons/black/res/drawable/baseline_control_point_duplicate_24.xml", + "upstreamSha256": "d43d561abe3d3aee7f0ad267bbaab831d85d48911220af0049c8431d21d72670", + "localSha256": "8287f7bcadc606c154c7293bd793faec0e64c4de2cfb37a8a13c324a8088b7d6", + "orderedPathDataSha256": "80adbd73b69bec0940818445f6c067aa1514998dfd00737917c49582ff2309d4", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/control_point.xml", + "upstreamIcon": "control_point", + "upstreamPath": "android/image/control_point/materialicons/black/res/drawable/baseline_control_point_24.xml", + "upstreamSha256": "ad32f831f03c3faf0229803e504eee1e636aca0a4d4ee3950356e7dcf13757c4", + "localSha256": "e3407c2e13e28fa38e8e34c81322f6cad3097be58fd7334664dee0ec575701eb", + "orderedPathDataSha256": "867e0f3f8fd9664e200e4ae87727f3cb950fe359f7426066875b6bc014db59e4", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/conveyor_belt.xml", + "upstreamIcon": "conveyor_belt", + "upstreamPath": "android/hardware/conveyor_belt/materialicons/black/res/drawable/baseline_conveyor_belt_24.xml", + "upstreamSha256": "14682b99f69ccbb3cdcbaacd0a6ddf043c05cdec2604bac0e0392aebc7fd8c55", + "localSha256": "ff4163ab5916413f77d0565424eec90a60644d854256f315635e7ed797822299", + "orderedPathDataSha256": "ad81593c46615f128472bb3784e4489b01f31bc115147b8c2f33f08c4226af3f", + "originalGeometryMatched": false, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/cookie.xml", + "upstreamIcon": "cookie", + "upstreamPath": "android/social/cookie/materialicons/black/res/drawable/baseline_cookie_24.xml", + "upstreamSha256": "39a4cdb7e0dd6b441378381320e83e4e2613b8f0961e2a301bd95e4b76743e5a", + "localSha256": "cca2332e06411cecd68b295fbaecf407034aeb31be0ff25c20fd6b45baf0535d", + "orderedPathDataSha256": "295bdc0f111e5608e2161856c2e47cf917b5bea648757e4029107474b08f447b", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/copy_all.xml", + "upstreamIcon": "copy_all", + "upstreamPath": "android/content/copy_all/materialicons/black/res/drawable/baseline_copy_all_24.xml", + "upstreamSha256": "034e64b0a6b3edcbadb301144dea54cb6260974af62ba98894eaaf85f554b668", + "localSha256": "50786f1359432ba468e21a5c7dfaacde44c9b343ef688b7a615d02fc8a9bc514", + "orderedPathDataSha256": "4227be27cce3f20bd3ce6b1da3157c76c69b04134c69de2f785ef96a2d5495a9", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/copyright.xml", + "upstreamIcon": "copyright", + "upstreamPath": "android/action/copyright/materialicons/black/res/drawable/baseline_copyright_24.xml", + "upstreamSha256": "a7b71a70b323c3aff3d19d2f03ed91a4419e21694b0093fc86e85eb4a4fc7fff", + "localSha256": "84aebc5a0a7f2e691ce1c0a9acc97b3561e768742aa26e5be5d9ea2c6acb78aa", + "orderedPathDataSha256": "bd70f59997f1831cd2601b79613626e2246ffcae476031562f2e98b52235933b", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/coronavirus.xml", + "upstreamIcon": "coronavirus", + "upstreamPath": "android/social/coronavirus/materialicons/black/res/drawable/baseline_coronavirus_24.xml", + "upstreamSha256": "d32c811e1145165a38c0ba566ec634239b65062a039d84b77a58669cf8e6cc90", + "localSha256": "46a35f4c3cec7e2d269e8ecb85cdb0c2ef01f3c0ecd9cc589549574778ba45e6", + "orderedPathDataSha256": "70a1a54c732145d6341ecb7556b2a263898d127aa541e76f20c6e8d903247da4", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/corporate_fare.xml", + "upstreamIcon": "corporate_fare", + "upstreamPath": "android/places/corporate_fare/materialicons/black/res/drawable/baseline_corporate_fare_24.xml", + "upstreamSha256": "089d3716339a50690b1097f315a75156e57fa64bec97e16b4cf40df1a5bcaa33", + "localSha256": "5febce817c2826855416e05ab102cd66f3ce293e8f3a42179af43dc4bdc9bfaa", + "orderedPathDataSha256": "ad5eb967b8d2994d81e7960f993b767bd5c8b1e5fef7a6eec423f140880ac967", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/cottage.xml", + "upstreamIcon": "cottage", + "upstreamPath": "android/places/cottage/materialicons/black/res/drawable/baseline_cottage_24.xml", + "upstreamSha256": "dca325f01c2075dfd4096ae9ca7f30234fff7e352db9192eb6b58cb29f49fac2", + "localSha256": "16b7b91bed37a4e2051c6e16722d585335adeba90a41d186e2c3d24ebd0f2d5f", + "orderedPathDataSha256": "f17f9a2eacb0f8db416b2e15abba8355e62513b4f20b2bc00d8d0f93862d18cc", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/countertops.xml", + "upstreamIcon": "countertops", + "upstreamPath": "android/places/countertops/materialicons/black/res/drawable/baseline_countertops_24.xml", + "upstreamSha256": "1882b2eae65d6fb7d5771d1ebd5cf73f18d48616c2be43a160854fd0b1e30f1a", + "localSha256": "714e3b3eac5252681e6d4e0613aa6ef9dc430ba3ab53e1ca911c5947f4a088d0", + "orderedPathDataSha256": "82f235f77d3acce88892a72cb1dc693e8a712b101502e84fc76fe408962b9193", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/create_new_folder.xml", + "upstreamIcon": "create_new_folder", + "upstreamPath": "android/file/create_new_folder/materialicons/black/res/drawable/baseline_create_new_folder_24.xml", + "upstreamSha256": "c721b4514b4945f04fc100519ffad59ff4415fa6bb67c55157e50f71865d2f53", + "localSha256": "cef6425faa1016f9b45907caaefac3d67d528327f717b20877cd61e33e8dc668", + "orderedPathDataSha256": "f8c99d318c4a2a6f0876ffc59f3be077a498272ee4413985d0d33298685f9e77", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/create.xml", + "upstreamIcon": "create", + "upstreamPath": "android/content/create/materialicons/black/res/drawable/baseline_create_24.xml", + "upstreamSha256": "6dafcab0f0efe423057c0e888e5289f4afcd71398160b80d590b79e4ea8c9a15", + "localSha256": "f1b6266bb4e61766aeb685a4c675df41613debfdc7c7058cebae0c52a40c7adc", + "orderedPathDataSha256": "07dde6bfc5cde03816252478751d2f87cfce698223b50bc351eab71d7fa19502", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/credit_card_off.xml", + "upstreamIcon": "credit_card_off", + "upstreamPath": "android/action/credit_card_off/materialicons/black/res/drawable/baseline_credit_card_off_24.xml", + "upstreamSha256": "c896fe0652ea0f10a24f1e03c1d640bc32c773c8b6f23ffb2a39f36cea9d7837", + "localSha256": "e6f6c16a6fe2f9a4dcaf00fe6a8c7bc21fddd01cc841a82339eac2eb1a360764", + "orderedPathDataSha256": "ac9108c50661d0a9df7c9de63aa31fae7f4a9768c587623c277077e7abf2ba8d", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/credit_card.xml", + "upstreamIcon": "credit_card", + "upstreamPath": "android/action/credit_card/materialicons/black/res/drawable/baseline_credit_card_24.xml", + "upstreamSha256": "06ac77bf8d9c1cdc0563b3c4a13c1479630d702d0378cb23ea5cb960caa78c98", + "localSha256": "68333498bca83a0a6503fcb35ba51f6d4c2df95a69c0eedcfdcbc83025ad02ac", + "orderedPathDataSha256": "7e0d75beb2530bc72c5b830b7371d0012c36857e994e1a6aac524cf4ab01c1da", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/credit_score.xml", + "upstreamIcon": "credit_score", + "upstreamPath": "android/device/credit_score/materialicons/black/res/drawable/baseline_credit_score_24.xml", + "upstreamSha256": "c295ef8769e6a658f5f5a76d7137e90a3da1c2cd141ed40b5eefb66c25e55828", + "localSha256": "669234ccd7e2d619ba4cf4fee574f057db00ea0761109e4dd6a4c711311a0130", + "orderedPathDataSha256": "8a32cb29a49dd4de9dd04ee594d66ccae84fdabf16dfc7ed596fc8125fa2f1a1", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/crib.xml", + "upstreamIcon": "crib", + "upstreamPath": "android/places/crib/materialicons/black/res/drawable/baseline_crib_24.xml", + "upstreamSha256": "67f061e57e290732df89a2379c259d7b6aca554a8918a7732444438b22010dab", + "localSha256": "4ca1bcf4776fe7fa6e6fca8ead291e5d3b35f46782ae3cce682a83535b6be414", + "orderedPathDataSha256": "c103bb22bbec41dc29e996842226382dae4a0101b19a371f162a58cf688a55b7", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/crisis_alert.xml", + "upstreamIcon": "crisis_alert", + "upstreamPath": "android/maps/crisis_alert/materialicons/black/res/drawable/baseline_crisis_alert_24.xml", + "upstreamSha256": "25037fb1afa6a1e0303ae87589aa793eb9886868dc306478b5e8ea57ee861315", + "localSha256": "e7710f85d0f1a64e800f0b13b5978ee36f9ac0ed0555862c52824052d69dd6c6", + "orderedPathDataSha256": "6208fd341373434de23b8a81886744129e2fd2c11a3e7042bfc72d6777044eb8", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/crop_16_9.xml", + "upstreamIcon": "crop_16_9", + "upstreamPath": "android/image/crop_16_9/materialicons/black/res/drawable/baseline_crop_16_9_24.xml", + "upstreamSha256": "c1de4b54fe7ccaf3b11237e756fd89589d43512d263a87bb26038dbe6d577fb8", + "localSha256": "b0882d74fc8e305a3a2241c24560314b2a59b5f8cf8635716867deed39398392", + "orderedPathDataSha256": "439bd0e764ad67c4ffdb5687a58b9ebb2ddcd29a2849f76cedff30d9f5e86fca", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/crop_3_2.xml", + "upstreamIcon": "crop_3_2", + "upstreamPath": "android/image/crop_3_2/materialicons/black/res/drawable/baseline_crop_3_2_24.xml", + "upstreamSha256": "8a8f41554b5b89d5d81e4c7ce682017f2ed17e15c6f36cd149de384c0d2d331a", + "localSha256": "437d5dc009e8ca497ca5cb48b869b00b6cad43afbcd95d7447c3e0adf362f6a0", + "orderedPathDataSha256": "c961a60ea9d52bccd02a335e75c9b7a7b131edde35d965eeb53f964f7834a489", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/crop_5_4.xml", + "upstreamIcon": "crop_5_4", + "upstreamPath": "android/image/crop_5_4/materialicons/black/res/drawable/baseline_crop_5_4_24.xml", + "upstreamSha256": "48be6917c559ddb5e51a4f47818db05a27df7aeba5afb31e93cefdcbfad3e5a1", + "localSha256": "a6c384dfb6c7105135dff8782fbf9b903350646c77ba2b8247e733685c5909f0", + "orderedPathDataSha256": "d6bad398ef542b5b3e7652b40b952f2d66b7346f992a4d7bc419e849ce4afef9", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/crop_7_5.xml", + "upstreamIcon": "crop_7_5", + "upstreamPath": "android/image/crop_7_5/materialicons/black/res/drawable/baseline_crop_7_5_24.xml", + "upstreamSha256": "953c41ab91ecb608e5e6cc6c4e606589c59a63ca79efa6d0a9749f5cc2557a3b", + "localSha256": "84ba7fc8fad92ee6bec73c3972158e2c595555ecd880ab59c93f45853471fb63", + "orderedPathDataSha256": "adcb8671f2761e50dd5aabbf2f7a1615cd3161d7b0db434b3eaffca39f72401b", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/crop_din.xml", + "upstreamIcon": "crop_din", + "upstreamPath": "android/image/crop_din/materialicons/black/res/drawable/baseline_crop_din_24.xml", + "upstreamSha256": "a43f43005b2e632a98ab15b8329e03e159a27185868e1b19c61db02906c6a4ea", + "localSha256": "7ce6eec78a41d9f80c362a817b7a181b2281dc81fbe334095321a7af72048373", + "orderedPathDataSha256": "56a674c693047e8935f221d730beef230ebe0f80956a218ddc458df037d5251d", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/crop_free.xml", + "upstreamIcon": "crop_free", + "upstreamPath": "android/image/crop_free/materialicons/black/res/drawable/baseline_crop_free_24.xml", + "upstreamSha256": "8c8aeadd69487a87b72b4afdc551cd9b5f79b9d9bbfc5d1b87cd049e528f9165", + "localSha256": "f7068f0b55184b880ed76030853df5cc203ca906cbb0d083fa3b1b0ab1a06023", + "orderedPathDataSha256": "2b1aa5ebff16f70cbea13a4f9e8711df1699e1960b39a8736bcdcb891bd13a42", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/crop_landscape.xml", + "upstreamIcon": "crop_landscape", + "upstreamPath": "android/image/crop_landscape/materialicons/black/res/drawable/baseline_crop_landscape_24.xml", + "upstreamSha256": "bed20be30754a90b0c8c5c5e16d81e0d5075e718a213d6a5e1cbba3caf884b41", + "localSha256": "0da01a6f32591fdcda6a3be28c87c4be2bf3136cbc31883d7568c41a131bbc7f", + "orderedPathDataSha256": "e9d082a25a289f210390eff7272810d08521e681075024c683f2493a2ce68d1c", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/crop_original.xml", + "upstreamIcon": "crop_original", + "upstreamPath": "android/image/crop_original/materialicons/black/res/drawable/baseline_crop_original_24.xml", + "upstreamSha256": "168f0863e737e18445866c38dd26af190b76cfd27f4a9be72692f4569aafa617", + "localSha256": "eba33e72daa6a918b21ac34d0e324d16cf4157c64347065811593b16adf98aec", + "orderedPathDataSha256": "61b74a437ea68b665be1d346491a50967eb2ace9135f0f0e0a697ea203274e44", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/crop_portrait.xml", + "upstreamIcon": "crop_portrait", + "upstreamPath": "android/image/crop_portrait/materialicons/black/res/drawable/baseline_crop_portrait_24.xml", + "upstreamSha256": "40073d13a6dd18b1a9318158a4f369c9573ec8b5482fa2c494de9b48e9d112ad", + "localSha256": "f3bd068e6924cd8fe6d4b53772f1a5e50578040c6bca4619361130b201c2aaa4", + "orderedPathDataSha256": "7eda350b5d65e98865aae1f2421dccfe9c65f9b91b1edd57aeca84fd726c6919", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/crop_rotate.xml", + "upstreamIcon": "crop_rotate", + "upstreamPath": "android/image/crop_rotate/materialicons/black/res/drawable/baseline_crop_rotate_24.xml", + "upstreamSha256": "381d1387c7578fb1c39e4da69abfe56a38fc7ba77789af185d157e2cc3e14236", + "localSha256": "928cd0e2ae3dd487d211935e69fc743dc609009aae8541ed84cc99331505879c", + "orderedPathDataSha256": "3c2a266227c5804c2b51612a8392a3e1a045067fe26eb63d215f64d1e2250bf2", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/crop_square.xml", + "upstreamIcon": "crop_square", + "upstreamPath": "android/image/crop_square/materialicons/black/res/drawable/baseline_crop_square_24.xml", + "upstreamSha256": "396eab6e09d3415da2db968d451732435f0065aa93338d917e8e297fd3796af1", + "localSha256": "ee9ad457fe6cbfed6a8e585b678220237cbb468f34754929e3fd77c25a03ce20", + "orderedPathDataSha256": "e9ed823f112ed9c7d50ea7b932d39294226ebaf5665a7e25dac70fcb6db7dc08", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/crop.xml", + "upstreamIcon": "crop", + "upstreamPath": "android/image/crop/materialicons/black/res/drawable/baseline_crop_24.xml", + "upstreamSha256": "d2ed365668d0322f5382accabe0a31235b61087bb7c57b627d69333985612cfe", + "localSha256": "2d6297728055493be236bb5cc12cb2e48066bc4342d0edd190e2c1f348ec73e9", + "orderedPathDataSha256": "0ec2196912ddec609410ce9a595856c4ecf5ed312562d4cbb1e880b97b0548dc", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/cruelty_free.xml", + "upstreamIcon": "cruelty_free", + "upstreamPath": "android/social/cruelty_free/materialicons/black/res/drawable/baseline_cruelty_free_24.xml", + "upstreamSha256": "7f937fca9155e0a2be6c88239f0418a443a6943df71ac37e87fa372f80313cca", + "localSha256": "ea10c192e48459634e150b617d9e0d9dd7d78ba26ffdb695790634965b955b38", + "orderedPathDataSha256": "c3d34bba7883d907c7912789219b0d31512ff51fc5b8e9510661856323dd7ba7", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/css.xml", + "upstreamIcon": "css", + "upstreamPath": "android/action/css/materialicons/black/res/drawable/baseline_css_24.xml", + "upstreamSha256": "46b96d360a64c2d2da001cf817665f8c24fbc1e5860efec806405d344460dace", + "localSha256": "1e49316c129a9de308102d3bd24b78fa7b83bb287bb4d331c17e1336a72af1c0", + "orderedPathDataSha256": "fe80f052bbc74945d82e23a62fa08bec2535feedfe9b68a6079b45f7fde237c5", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/currency_bitcoin.xml", + "upstreamIcon": "currency_bitcoin", + "upstreamPath": "android/image/currency_bitcoin/materialicons/black/res/drawable/baseline_currency_bitcoin_24.xml", + "upstreamSha256": "e4b25209b092faf7c91dfad47c112a58dbf2b4074dde102ab0bf4e485d78f456", + "localSha256": "140b049af7c4709a715e1f84794a9f6b26bc0f9b65d2c77b9694de6a31429435", + "orderedPathDataSha256": "adbefff0fd5b756b8764466bced7499a0c69c0bc188ec50b2a62f9a9e4af9b55", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/currency_exchange.xml", + "upstreamIcon": "currency_exchange", + "upstreamPath": "android/action/currency_exchange/materialicons/black/res/drawable/baseline_currency_exchange_24.xml", + "upstreamSha256": "eb4ba6782a6f74c63c6a77c38756fe3931f03ab840a2476aa2659bd0934be390", + "localSha256": "ec9321e2f14ddc5488f0d641e3e5137a101b22ef1ba911cc73298df4c39edf76", + "orderedPathDataSha256": "d184b4b7105d28e3c321dcfb92e37f654093f09b4404efcf51e202d67e5dabdb", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/currency_franc.xml", + "upstreamIcon": "currency_franc", + "upstreamPath": "android/image/currency_franc/materialicons/black/res/drawable/baseline_currency_franc_24.xml", + "upstreamSha256": "8710d68dcad1bebb3d883e72e37515885de418c23f58f28702da21fd028c91e5", + "localSha256": "ff0567d3d2c34cf224d4071e6c36a0456c803f09cd5c86206574c36eb32a91bd", + "orderedPathDataSha256": "87ce032f6c708333438b38b663ec3b22b2b000a39be0bacc99a5848d262c5c9a", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/currency_lira.xml", + "upstreamIcon": "currency_lira", + "upstreamPath": "android/image/currency_lira/materialicons/black/res/drawable/baseline_currency_lira_24.xml", + "upstreamSha256": "f4923dd9495a8b7e9ca97518fd8bfe50f526c36aeab8ea11fd1b5f1cdbc6c2a6", + "localSha256": "46d55b09b595a2b63971c96f0f2b641102afb616d33cbb8e5add9e15efd228f2", + "orderedPathDataSha256": "08322e7c8b3fd65c5a713345a12f252f424167b4ec6920f4d81837a1d6b14699", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/currency_pound.xml", + "upstreamIcon": "currency_pound", + "upstreamPath": "android/image/currency_pound/materialicons/black/res/drawable/baseline_currency_pound_24.xml", + "upstreamSha256": "ab47be0857392cea84d042ea54c72f4fe5993590e058cba23bbb885e39950a5d", + "localSha256": "425580bacfc3d38f4c9ceee6a3a6bddea3d261acab9e5be8e7a73cae0250701c", + "orderedPathDataSha256": "8e0a2532c36e9656bff4db9117bed407cf54a4f87afbfb79d5551b4c31af78ed", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/currency_ruble.xml", + "upstreamIcon": "currency_ruble", + "upstreamPath": "android/image/currency_ruble/materialicons/black/res/drawable/baseline_currency_ruble_24.xml", + "upstreamSha256": "72395f8080a65a9d31120ed5a020241e9df2cd98a474bb5f7f06c9ba5ef9f471", + "localSha256": "b1dbf1996c26ea1afe3bb4edbaad08fa2ef8338579e866efa4ee58491a2e2e92", + "orderedPathDataSha256": "bff49579dab44cb416b4dc88a13b8adb4b4202f400e2878a25e89c2029b2a9df", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/currency_rupee.xml", + "upstreamIcon": "currency_rupee", + "upstreamPath": "android/image/currency_rupee/materialicons/black/res/drawable/baseline_currency_rupee_24.xml", + "upstreamSha256": "d8393cd5c0e4272c38711d8cdc49ffe77d8c8036660a6e56bbdb1d7ea699bea1", + "localSha256": "08f9c42f429d7eed5cc529d70fd3627891bfc42f370ef16b091f8ea4122f11c6", + "orderedPathDataSha256": "287d3102730ad1dce9f49db03a3a32de613a003f678e78bc6c18351c787e1cb4", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/currency_yen.xml", + "upstreamIcon": "currency_yen", + "upstreamPath": "android/image/currency_yen/materialicons/black/res/drawable/baseline_currency_yen_24.xml", + "upstreamSha256": "2200923ab63492506a92519173b8323d5307d15f2d6fb19e73c9ea64e1b36055", + "localSha256": "ed7d5fd0e583d1c4a0f0e979b2de575c4a78d40472872e4716c724eec36d8c54", + "orderedPathDataSha256": "812d7f48de39d3a05225e7576a264b6dca4af12e51a0a425139af71bb1ce658b", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/currency_yuan.xml", + "upstreamIcon": "currency_yuan", + "upstreamPath": "android/image/currency_yuan/materialicons/black/res/drawable/baseline_currency_yuan_24.xml", + "upstreamSha256": "39be82645e1514c1673269acbe21acdc2afdacce24e539c8e484e51fe10cda23", + "localSha256": "ca312da2eebc7c3bc6e2a280123ef05b7aff74edfb101d04fcd0a051840268b2", + "orderedPathDataSha256": "0c404ec7cbe14ec4c84a19e1c564f07cfe32721033d56c12048fcc7ab786ccda", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/curtains_closed.xml", + "upstreamIcon": "curtains_closed", + "upstreamPath": "android/home/curtains_closed/materialicons/black/res/drawable/baseline_curtains_closed_24.xml", + "upstreamSha256": "75d9dadcb49593a818c1dd526167a4d9e61b6113627c7467603123c178d4d391", + "localSha256": "3668972b37df99a5a64adea1b73719f6d08c6c83a07d2b50d66413f7490d3b9b", + "orderedPathDataSha256": "65a3e4c41c63e38f2832f255248c8c464d7db6a1fab9c91d15acfaee1c879e5d", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/curtains.xml", + "upstreamIcon": "curtains", + "upstreamPath": "android/home/curtains/materialicons/black/res/drawable/baseline_curtains_24.xml", + "upstreamSha256": "ad458acf7c46d9af3bc7b28539d7cc4ee4b9db47831be0822a32a4fff9b1d05d", + "localSha256": "0332c692c5925c6b6547ad7254d8c98f09ecb915f9cf035e9d084d25be7a7dce", + "orderedPathDataSha256": "7d7ce321d4343412ec726d2f225e523ea3fed2957e054772c40039fe156069ce", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/cyclone.xml", + "upstreamIcon": "cyclone", + "upstreamPath": "android/social/cyclone/materialicons/black/res/drawable/baseline_cyclone_24.xml", + "upstreamSha256": "973435b9270a4d222d6aae06e7523ed60389941fb1b436d735bb8dc5fa4c678f", + "localSha256": "f8cc830b9d597babe101cadbd7087d5ed7fab1956d6af5d0852f69ce83d3cd90", + "orderedPathDataSha256": "72d8b014d783d5d8dba6ed6dcdf4de245782ecdcce98189e143ff9f3dfb1878a", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/dangerous.xml", + "upstreamIcon": "dangerous", + "upstreamPath": "android/action/dangerous/materialicons/black/res/drawable/baseline_dangerous_24.xml", + "upstreamSha256": "d99a17189b63bbaa58b9304383e0c1c70f6524285cc20f04aeb8a78efcb8535d", + "localSha256": "843540125b76c88037b0a6c1848af60a818d07dd39d130a3cdb057d185045855", + "orderedPathDataSha256": "471d02f8b401fb4093890de58a70814cea9802da8476efde49fc12a110e32383", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/dark_mode.xml", + "upstreamIcon": "dark_mode", + "upstreamPath": "android/device/dark_mode/materialicons/black/res/drawable/baseline_dark_mode_24.xml", + "upstreamSha256": "ccc68864f64e5d93a79e710bbea4bdd0a368d1be70ee170e11a566c17f640b21", + "localSha256": "7031ee42c440b7c2ab0b9d4e62ece89318ab893a7a1616bde158335657e603db", + "orderedPathDataSha256": "36490bf6bbb29ec925b0841d5cb63b57d2c65f7c52feec55d95c3b78cc52c8b1", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/dashboard_customize.xml", + "upstreamIcon": "dashboard_customize", + "upstreamPath": "android/action/dashboard_customize/materialicons/black/res/drawable/baseline_dashboard_customize_24.xml", + "upstreamSha256": "538528a439c0f20fa31ffa833a739e7cff507271c8cfd2401ff64a613c5476e5", + "localSha256": "1f72bd430590e7f0e4d182428a5c76a09ac482988209a34410c6109fe1f28cef", + "orderedPathDataSha256": "32af9b69bf19422c45a690f374cf4d313e276a6c86e310019a3e79ef41de2aa0", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/dashboard.xml", + "upstreamIcon": "dashboard", + "upstreamPath": "android/action/dashboard/materialicons/black/res/drawable/baseline_dashboard_24.xml", + "upstreamSha256": "953d38f8444d912a290741d14b956756927073adecac4b159b0180891e3e6936", + "localSha256": "8cd318f04bae11a058a587d78d1155d56064c40829a25a26afac0a87daa04af6", + "orderedPathDataSha256": "6fceaf2de77ca2a45936b9cb3de18671b036f8902fbf3732d6c84a148416b02f", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/data_array.xml", + "upstreamIcon": "data_array", + "upstreamPath": "android/editor/data_array/materialicons/black/res/drawable/baseline_data_array_24.xml", + "upstreamSha256": "b1c69c7cc37be405ded4afd6074728bc9a259aa099ce12f2aaa16ff7a32b5e8a", + "localSha256": "c64aec14e87589f4aff323b116bea7ee3413e7e692a899d2dbeb0327f54c3edb", + "orderedPathDataSha256": "86c1ab4dfab7a92ce70c3e80bbe5f6260238c8d4a1175aac198f9253a6cad970", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/data_exploration.xml", + "upstreamIcon": "data_exploration", + "upstreamPath": "android/action/data_exploration/materialicons/black/res/drawable/baseline_data_exploration_24.xml", + "upstreamSha256": "2a07302ee4da2704b4579f1de9299e13edd769258cf6151bbbaff4f2310e7b31", + "localSha256": "a49ed12b8194c327bc21cc6489f66997a01160a1fc93d2f0f068a18159523b8b", + "orderedPathDataSha256": "8dd58ec516f376dd57554d04e22c142fbf5eadab82b007597d80618957b266e0", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/data_object.xml", + "upstreamIcon": "data_object", + "upstreamPath": "android/editor/data_object/materialicons/black/res/drawable/baseline_data_object_24.xml", + "upstreamSha256": "15e81639d54cbd0d4b359ff34ce3a9c659148dd71a140249aa21fb6b47738c51", + "localSha256": "b0c960ecd1ff1d281be1a7e0121a37b72e04ed23d65650162cf584c346427c5d", + "orderedPathDataSha256": "16ea349fc88d299cc6805dc3028908ab68a4d19157c8376942b666b89e07c6d5", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/data_saver_off.xml", + "upstreamIcon": "data_saver_off", + "upstreamPath": "android/device/data_saver_off/materialicons/black/res/drawable/baseline_data_saver_off_24.xml", + "upstreamSha256": "a7b488106185268f3394f1871efc1e958427e31f667cb2138428c7657acb50c3", + "localSha256": "d09b67927d33af04e601db5b434b8163f72eb24582c7890cdf8152e27d7f5d84", + "orderedPathDataSha256": "2faf1b591f0ea07cc2725e5041518e9b8bfc5416372c6b54ceb7c7fa0caef8ad", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/data_saver_on.xml", + "upstreamIcon": "data_saver_on", + "upstreamPath": "android/device/data_saver_on/materialicons/black/res/drawable/baseline_data_saver_on_24.xml", + "upstreamSha256": "be6498381f9835cc693c2b6e16770d77d8e6a4294dc1f1cccc22662ec58a34c8", + "localSha256": "1033d1d2a044934e19ef66d21e208f119c363444b017ac47ec7724d6729bc2f6", + "orderedPathDataSha256": "4123a1a0b5e23723af20a9d2311003702cf3424a4053cd34ded76164609fbe83", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/data_thresholding.xml", + "upstreamIcon": "data_thresholding", + "upstreamPath": "android/action/data_thresholding/materialicons/black/res/drawable/baseline_data_thresholding_24.xml", + "upstreamSha256": "1d4063f5fb11a6f123df00433c0f3d8f2580c7133c43d370362d90f04acf2d73", + "localSha256": "30413d5c566857ddcf694eb71c87f3a7ea6c8841c0713c307dd72cc2ca01babd", + "orderedPathDataSha256": "c7e3b9fbca2ed3ce8529e031f2bb90e0e204edbfd63aa3880992cef4bdce891a", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/data_usage.xml", + "upstreamIcon": "data_usage", + "upstreamPath": "android/device/data_usage/materialicons/black/res/drawable/baseline_data_usage_24.xml", + "upstreamSha256": "e4df684bb1a2964b4225fd6683387d6ea494b32e201262cb022ca12fb061321e", + "localSha256": "63084ac1b8590ff95a205af2cd2081639cf6883216158b0cca3c1c0187ce2e8d", + "orderedPathDataSha256": "2a40ac94df3f729a01246067ccf72b07a5b97805fcda792a4284c7b16d00a06b", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/dataset_linked.xml", + "upstreamIcon": "dataset_linked", + "upstreamPath": "android/device/dataset_linked/materialicons/black/res/drawable/baseline_dataset_linked_24.xml", + "upstreamSha256": "225261c3af75aa3410251e932efde4e238f9eee42ea1db00e3b958b7a90a9808", + "localSha256": "9dc5acaef697395e714919d4f0b55ba10f7ecdfff235e560c547617d2bf5e6bb", + "orderedPathDataSha256": "cba87f3e8527c82c009986fd43cede1b7810521c01834ae38b4d7b749ca6da82", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/dataset.xml", + "upstreamIcon": "dataset", + "upstreamPath": "android/device/dataset/materialicons/black/res/drawable/baseline_dataset_24.xml", + "upstreamSha256": "0e65487357e6067401aede6d9071cbef625e17ad0c9328df2fea60801a53ca90", + "localSha256": "e7648b3a19ccecd9fc87c31f058e504ef9d8c40c91e35ef6dcefdb436314d917", + "orderedPathDataSha256": "add3696882595f87a04ffa05378511509b8c2c244078f84cb896f2b1597b1043", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/date_range.xml", + "upstreamIcon": "date_range", + "upstreamPath": "android/action/date_range/materialicons/black/res/drawable/baseline_date_range_24.xml", + "upstreamSha256": "c63e9be395d8564d3e3e263cbb25c685eac413a99290470a5ae1bf3acc706a06", + "localSha256": "0e0ec0f31714aaa9d1a80824612c1c2517e67983f50e461c4abf70c94cc092c5", + "orderedPathDataSha256": "ad0913f49c7d0966bc908e7ed984eb28c9c919b754c57b7ca38aa5cda7fc9651", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/deblur.xml", + "upstreamIcon": "deblur", + "upstreamPath": "android/image/deblur/materialicons/black/res/drawable/baseline_deblur_24.xml", + "upstreamSha256": "5f4b175beb6be5f1165edfd6ccee908aa24000540f939f0ea89015f1910ec94b", + "localSha256": "7cf449431f9feab044f20efc5f6b6e114af413680d77063e8cbee6962ae19fe8", + "orderedPathDataSha256": "8cf55727e6a3fd99d6c272df5b42e3a201a6ecf6622c47c20635e9ec26ef261e", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/deck.xml", + "upstreamIcon": "deck", + "upstreamPath": "android/social/deck/materialicons/black/res/drawable/baseline_deck_24.xml", + "upstreamSha256": "c3330ee4f84a76ce965c415f56e14bcf491dec10a71b88a7c9d7207630af0884", + "localSha256": "c3890a6ae952934ef74a20c8f9360cdb26f289312ea192330faa4b0cf08268db", + "orderedPathDataSha256": "176cda0a040d059c2b6aa7dec409ac0ff64597bcb5ce7b5dc5d49aad7af26c72", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/dehaze.xml", + "upstreamIcon": "dehaze", + "upstreamPath": "android/image/dehaze/materialicons/black/res/drawable/baseline_dehaze_24.xml", + "upstreamSha256": "0b06d4ebeb5dd29104dcd7122bcf4a4cdd27afa40a631c9ce91c3346f5213442", + "localSha256": "cda9631db50f7ccae8604a247e7e71183fc728fe89cbeffe3eec4057f0fb2651", + "orderedPathDataSha256": "ccf99f4feda18c4f74abfdd8eb812a12134efaf3a0abb8a106bdd07f1b39fb89", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/delete_forever.xml", + "upstreamIcon": "delete_forever", + "upstreamPath": "android/action/delete_forever/materialicons/black/res/drawable/baseline_delete_forever_24.xml", + "upstreamSha256": "a3a71dc1fbd800640a995b1b3fc95287e20854e0a7252e8ece7ddf0f9ae33228", + "localSha256": "0fcd3edf1194a6e44d3a85a0af3e1cbe2060f4909cc7a239bd56a208b5de746b", + "orderedPathDataSha256": "dfb261cb4e4b8b17d980cb0b7669f5f964ff339d8b5ad7d8e9a941a69b655af3", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/delete_outline.xml", + "upstreamIcon": "delete_outline", + "upstreamPath": "android/action/delete_outline/materialicons/black/res/drawable/baseline_delete_outline_24.xml", + "upstreamSha256": "e9721213478f5763a36b63425351fc5c15799ff43e15e1a64288087a0efd5c3d", + "localSha256": "f66c33c11cc514e5fd215913e3880849163d44314b3d5d389cddc33f7a548827", + "orderedPathDataSha256": "c4e47cf167452ce4482af0a16a3bacf10757a0c63cd01fc42e54f304da88c592", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/delete_sweep.xml", + "upstreamIcon": "delete_sweep", + "upstreamPath": "android/content/delete_sweep/materialicons/black/res/drawable/baseline_delete_sweep_24.xml", + "upstreamSha256": "5dd8153a11457c96de70d7869a72c1cbb6b821c3832512e096d0f94cc0da372e", + "localSha256": "612221ad04af39438add5e0cabe53cfcbb20251d8203cb149fd161b09a0e8bcf", + "orderedPathDataSha256": "d3152d23aef819b27d6de0fcb5e5953c0f06b3fe0cd9c57eaf06e406eb93661b", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/delete.xml", + "upstreamIcon": "delete", + "upstreamPath": "android/action/delete/materialicons/black/res/drawable/baseline_delete_24.xml", + "upstreamSha256": "9c0e045f1957e099da95e5b72ef2efeac674c3d6ca4cbc9d03d08b81ba2e3b37", + "localSha256": "32116a3c44fb617c4afea9c69072bc347d24dde4f5646eb3a1c998b560494e54", + "orderedPathDataSha256": "69efb83027be9b0948b9e8081850d67a286129c9818e7e8bd45a99b64e83b555", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/delivery_dining.xml", + "upstreamIcon": "delivery_dining", + "upstreamPath": "android/maps/delivery_dining/materialicons/black/res/drawable/baseline_delivery_dining_24.xml", + "upstreamSha256": "3d5911c857d5a257bf452ca153a3112caa60ddfc3b3ec431e36a4882ff425bf3", + "localSha256": "8140020609817ddf9abf8ce97394a4cacb27dc5e3ae2cc8ac48488885fc0c104", + "orderedPathDataSha256": "a9e7c4566f8890a4609027fddd03efb0d7421e95103353b4607e32548e544181", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/density_large.xml", + "upstreamIcon": "density_large", + "upstreamPath": "android/action/density_large/materialicons/black/res/drawable/baseline_density_large_24.xml", + "upstreamSha256": "840c7c2fdce8f09256a7c056ca67bb45ce43e54904d751f595bcd19b22789d4d", + "localSha256": "d695219487ed227b3a659b5d0dd4bbb86f36d9a97fcd385accbace70b624411d", + "orderedPathDataSha256": "330507ba3f20bd41f935e375a0dcb4889757b3f5b963b713de5a3d0d8e409eab", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/density_medium.xml", + "upstreamIcon": "density_medium", + "upstreamPath": "android/action/density_medium/materialicons/black/res/drawable/baseline_density_medium_24.xml", + "upstreamSha256": "b7c114bb2d8189638dd20a101c1d6c8c1fcc25790bef43f5d65deccf032654bb", + "localSha256": "74669913dd566f3a141ad8d9412a57f7ce714932ac036540b0d1a12858a17c34", + "orderedPathDataSha256": "8621c5d824794e3d40a6548ed2e4fb4db80d687f208a38329194726865f95476", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/density_small.xml", + "upstreamIcon": "density_small", + "upstreamPath": "android/action/density_small/materialicons/black/res/drawable/baseline_density_small_24.xml", + "upstreamSha256": "f251b047d7f2d09633c1486c7582925725c90d50ba709bf3995c0387b1932b6c", + "localSha256": "b4dd8a100642d284e1ccc9af9f32ef12e2ac52969ec6cf5321fb394af2b905f8", + "orderedPathDataSha256": "2784341117443fd7c04484d7a6388499b68d67c7bc2eb2c7bb3d57e084ec36ab", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/departure_board.xml", + "upstreamIcon": "departure_board", + "upstreamPath": "android/maps/departure_board/materialicons/black/res/drawable/baseline_departure_board_24.xml", + "upstreamSha256": "86c0353bcd705c800df04145d5d88031c1781c56aeb8b36ea34465cddafcf636", + "localSha256": "a738882f549f2c4310529f1c09907ae0b8f0663e2bae24fe30ed3430209e54f4", + "orderedPathDataSha256": "666dbb77f04d93391148daa39300458bb8aec4769bc607b20d92b6628840f509", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/description.xml", + "upstreamIcon": "description", + "upstreamPath": "android/action/description/materialicons/black/res/drawable/baseline_description_24.xml", + "upstreamSha256": "ee6bb4b28bde24b4c4123f6a3eaae5c7c8ca19a808da16082e56837b75ada3ee", + "localSha256": "bd9be270831fe6b16c731fa46b603ac0c53ba69d72d88c4f4e1f937a8f8250ec", + "orderedPathDataSha256": "0e6ce01aac20bca923239631b6f39f71b08e558e560406a6ab14f6de7f620682", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/deselect.xml", + "upstreamIcon": "deselect", + "upstreamPath": "android/content/deselect/materialicons/black/res/drawable/baseline_deselect_24.xml", + "upstreamSha256": "4fd1b4bbfaa9aa3084d8547c624aa3f77ab4b81da859c53b0656dc8ac4f7265c", + "localSha256": "5b101913beed63c05d46a5d8ce83ccd25aedf425318018bd74480a1672e685de", + "orderedPathDataSha256": "65969e71dcdefac13abf5a4544409c0e358390dbf6bbc18c6ead09820114a07d", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/design_services.xml", + "upstreamIcon": "design_services", + "upstreamPath": "android/maps/design_services/materialicons/black/res/drawable/baseline_design_services_24.xml", + "upstreamSha256": "63208ff7142b0d35701a0c8171e274fb8f6dd75f588cd7498e07ce0450e44bc4", + "localSha256": "5d979c839d18ede9e1a4a51de0d1cdb4ea3e9dfe7cbcc446dae4bd5d5ab23df2", + "orderedPathDataSha256": "7f3f061e68ab903de39e212cc86c1b932c071af9ce9e4e21aa6d92c31f634499", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/desk.xml", + "upstreamIcon": "desk", + "upstreamPath": "android/places/desk/materialicons/black/res/drawable/baseline_desk_24.xml", + "upstreamSha256": "169b9460b6b3e749ba690672f3ac0183565c3c2446f0aa755e9de0d510fcef84", + "localSha256": "8c0cc9ad85a789f29cba75aa669b451dca32a69e4fdee97b094cdf472b563a33", + "orderedPathDataSha256": "6716c8f1117690cdb69229284f476380632807aeba66cf311e48c865324a6b0d", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/desktop_access_disabled.xml", + "upstreamIcon": "desktop_access_disabled", + "upstreamPath": "android/communication/desktop_access_disabled/materialicons/black/res/drawable/baseline_desktop_access_disabled_24.xml", + "upstreamSha256": "9dc9dfd466b6cba19c281352e280c69ffbe5eb6b7785e08dd0197f3846e8673b", + "localSha256": "2b61e3dba15c4fc79d92d2ba33e519f32d00846963e9c363f91c73506ba63419", + "orderedPathDataSha256": "2a17e5501f322537838438bdb0c4d69526bec77b833cf8841641a1215038b8f5", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/desktop_mac.xml", + "upstreamIcon": "desktop_mac", + "upstreamPath": "android/hardware/desktop_mac/materialicons/black/res/drawable/baseline_desktop_mac_24.xml", + "upstreamSha256": "dfeb7a8c2a8b33506fd079aecd24153f545e6ee18c7ab489de392e362bd17571", + "localSha256": "8c907c1142fa7893dc82319461b824ea8af0b1606454653893bdc27631583472", + "orderedPathDataSha256": "21dd975cb7adc76b69b943e3b1870f4b562b4daaf17680df97b56716fe78cbd5", + "originalGeometryMatched": false, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/desktop_windows.xml", + "upstreamIcon": "desktop_windows", + "upstreamPath": "android/hardware/desktop_windows/materialicons/black/res/drawable/baseline_desktop_windows_24.xml", + "upstreamSha256": "8617e59126a488cf7aee0ad12f499e4b800f60573d933f62a0983eeeb01b1667", + "localSha256": "cbebb39864629395b6c706044d32574b486923443e12e45639dbfe78c9b567e4", + "orderedPathDataSha256": "04e0cdca283d9d35bedf7e95b6da6f54c6f75d7e6f933c1bcb88aae8cc297522", + "originalGeometryMatched": false, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/details.xml", + "upstreamIcon": "details", + "upstreamPath": "android/image/details/materialicons/black/res/drawable/baseline_details_24.xml", + "upstreamSha256": "e1af4434a0cea8b0c423490adb94af3b540bcc5432741df774a9ed381f25426c", + "localSha256": "0df59dd7d15c4543180f9149722255ad5c5831ba9c31f790809a6ec5f54d4dd8", + "orderedPathDataSha256": "e2613a0e72fa677fb0f686377faf26b9f0adef2874c76ad85a7117905f445d1d", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/developer_board_off.xml", + "upstreamIcon": "developer_board_off", + "upstreamPath": "android/hardware/developer_board_off/materialicons/black/res/drawable/baseline_developer_board_off_24.xml", + "upstreamSha256": "6703ffc891dcaffcbb7ec30023a7e123984ad95858a2c35cfa91a3869bdc44f8", + "localSha256": "e62a0ac74dad440de2366c1fc767f118311721e199794393ce2f28a8fac1e2fb", + "orderedPathDataSha256": "e25c40f571eaef47c4384609102059771011d624b2d8e0e948bd6d1abf230ee9", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/developer_board.xml", + "upstreamIcon": "developer_board", + "upstreamPath": "android/hardware/developer_board/materialicons/black/res/drawable/baseline_developer_board_24.xml", + "upstreamSha256": "0dc8b5b05be48fee8df1c029c3f95218e5e5da0d450116893ce84dd68210c2d8", + "localSha256": "6877965b824c5dc1d63b06b826383900c1515f3226b0ad9822b9c9bf33c6de48", + "orderedPathDataSha256": "8e3bc97f3c07391799cb76ed2fb16d0d73a312e764d41223ea127cfe65e10dbb", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/developer_mode.xml", + "upstreamIcon": "developer_mode", + "upstreamPath": "android/device/developer_mode/materialicons/black/res/drawable/baseline_developer_mode_24.xml", + "upstreamSha256": "8a658709d57d20741e9dc6029661dce4421792036bcb9ab6b4d8829ad52d9b72", + "localSha256": "cccf4a72fbb7381008b923891c6a97ae63602a0a2cdb5ce6f209f3f114d65260", + "orderedPathDataSha256": "0b264d7f7a429e6690c4656c9331f5ff248f7eaa1f3f2d00a2ad2d4c7c30e5e0", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/device_hub.xml", + "upstreamIcon": "device_hub", + "upstreamPath": "android/hardware/device_hub/materialicons/black/res/drawable/baseline_device_hub_24.xml", + "upstreamSha256": "93e3ba52c8b1570ee99b6c8dd8644c4380e15f2797fa4b806b323f0965fb5041", + "localSha256": "e37091792b7c64073651327e2b68b84f7f1d8e6f333ae15d8d062fb87804cc6f", + "orderedPathDataSha256": "756cd9582e04db6f253e81b5ce770639b003c29673b9c02f237fae7dc5d28f18", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/device_thermostat.xml", + "upstreamIcon": "device_thermostat", + "upstreamPath": "android/device/device_thermostat/materialicons/black/res/drawable/baseline_device_thermostat_24.xml", + "upstreamSha256": "17fe1df373ba8a0630cadc3f2b37b59f438a35d5063c1ce656d127dbb270049d", + "localSha256": "e4507e9b504182a7df6db3e1381186a54be4787c85a7d835d7fd9cfdbaba922f", + "orderedPathDataSha256": "1425c7372c29115ea1c59b524cea78bd81d3d0d181fd41546c6746a03d0eb7fa", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/device_unknown.xml", + "upstreamIcon": "device_unknown", + "upstreamPath": "android/hardware/device_unknown/materialicons/black/res/drawable/baseline_device_unknown_24.xml", + "upstreamSha256": "f6d805aba7d0fa795e60137e574581a7b41794f4d54694617533f604228786e3", + "localSha256": "f866d4af86e3bf76ab08126daf572360fa33c69a5fd5eabb7fd2a09adf5ccb49", + "orderedPathDataSha256": "06856fb22676308a625ebda8ee113b2829cc2c73a3becdf59c402946f7063e73", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/devices_fold.xml", + "upstreamIcon": "devices_fold", + "upstreamPath": "android/device/devices_fold/materialicons/black/res/drawable/baseline_devices_fold_24.xml", + "upstreamSha256": "7f08fd9c6321a94b64aaa7ea0513846ab9b3e999e7c079d81028a8481b3ee830", + "localSha256": "0eed1cda6ef7dd1e219c15309f82c110b1dba9bce6475558cab5bf4d441529f6", + "orderedPathDataSha256": "01e038d511f1e5e0e7fe6429983e93f067042ea1fb1c6913f8fbe0874831f1dc", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/devices_other.xml", + "upstreamIcon": "devices_other", + "upstreamPath": "android/hardware/devices_other/materialicons/black/res/drawable/baseline_devices_other_24.xml", + "upstreamSha256": "5dc3690a4893f1e94c173582d6bc40208807884c935b41706b2b318ee2d7530e", + "localSha256": "5ea6680c1021cdcf6c1abe459adc3ffde1ff7ca0bc4cd9c1f6d5ea231f38440c", + "orderedPathDataSha256": "0a9da4fb2e05a354d5e1308957b025e9974b467372d032eb1c7862fcbe060485", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/devices.xml", + "upstreamIcon": "devices", + "upstreamPath": "android/device/devices/materialicons/black/res/drawable/baseline_devices_24.xml", + "upstreamSha256": "5bb9c6ac25869337d97b9f0fe8dd548325230386cf804c1a4004133330f9bcdb", + "localSha256": "cc9cf210bf1368b7f17842be48a8780d88285f2deafba5a54226560cdd4c6b50", + "orderedPathDataSha256": "49d9ecb483b9fb4efce9d199f25bfc37b5cc4a1689e7e190d4c2ba198ea5307f", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/dew_point.xml", + "upstreamIcon": "dew_point", + "upstreamPath": "android/social/dew_point/materialicons/black/res/drawable/baseline_dew_point_24.xml", + "upstreamSha256": "3f802137f2b6e79b42f4b90f42c68e161baf4ee051db049103b67ad5cb64c70b", + "localSha256": "f3d70aea8007979448dd1d4235db10fc91895e259ed95c631069e62b3b7d1b24", + "orderedPathDataSha256": "b74040bf887dd1d50126af428bfac41f50dfdb318ced2bad178ab0c4f4e221de", + "originalGeometryMatched": false, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/dialer_sip.xml", + "upstreamIcon": "dialer_sip", + "upstreamPath": "android/communication/dialer_sip/materialicons/black/res/drawable/baseline_dialer_sip_24.xml", + "upstreamSha256": "d899f51e97e13f4866bfe1f0057d056102ab876c59d7a943cce1396c30c1f25d", + "localSha256": "f76747ed5b03804ad6f3d3641cb538d465c75a90c257d75c1d087ab19a8112cd", + "orderedPathDataSha256": "fe237ae3aa70a7fd464d14fba796402523a7439f2bf3100359c49c9592e022f1", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/dialpad.xml", + "upstreamIcon": "dialpad", + "upstreamPath": "android/communication/dialpad/materialicons/black/res/drawable/baseline_dialpad_24.xml", + "upstreamSha256": "15ebe55beb06d346a7ae38df31c55ef39bbeb4e902e85e69c72b16867e29d579", + "localSha256": "a84b165e3e7aa82552ccd376b4accc87340f3115a25834860151db655dcc9c01", + "orderedPathDataSha256": "f547cbd86455ee6de46d46637e152190ed958b025bdd06217a1ecea7b0b80598", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/diamond.xml", + "upstreamIcon": "diamond", + "upstreamPath": "android/maps/diamond/materialicons/black/res/drawable/baseline_diamond_24.xml", + "upstreamSha256": "d10a6a17d9e7e40575e358831d07aa192007dcb1d24f1a3567ca9b18f24d95ab", + "localSha256": "ccaab1d25acfa1d43de916ae3a7c6d7c3412cb9deb72e13d08933c435372ed8f", + "orderedPathDataSha256": "349693033d5e9585274bae1d1744e757e6a913b24c47413181df99d9890bd5a8", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/difference.xml", + "upstreamIcon": "difference", + "upstreamPath": "android/file/difference/materialicons/black/res/drawable/baseline_difference_24.xml", + "upstreamSha256": "c447e137e2115ed2189ed75d039111b1f4b17eceee774ec3150f100781cc7d8e", + "localSha256": "7a0e9785a6cbc02274ac4b5f0e177d29531a14309d4b5cddd2c4a00f4b3391b6", + "orderedPathDataSha256": "a12429c7937619f35b1f2a0874b5db6dd5dc78d5c4f0dc0f88c42eb0d4449acf", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/dining.xml", + "upstreamIcon": "dining", + "upstreamPath": "android/search/dining/materialicons/black/res/drawable/baseline_dining_24.xml", + "upstreamSha256": "a22272ef6a664ab22385390d289332d5b51fb816df37b625405f0131a123e799", + "localSha256": "96555d8190050b5d132d0cc39c29f4c6c1dadb2e0580a6880f0122118e8e70cc", + "orderedPathDataSha256": "e00dc1c019e4b277fcdd97fe4544a1598c97295edb2a2b4037cf70fda3817179", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/dinner_dining.xml", + "upstreamIcon": "dinner_dining", + "upstreamPath": "android/maps/dinner_dining/materialicons/black/res/drawable/baseline_dinner_dining_24.xml", + "upstreamSha256": "24d895ac083a276273be0f3397cd3ae06563e1c145c3a0fbed29e3b94da0d951", + "localSha256": "a5e673927776c6c3051f2f6723957fb1ea5b1f86b06fbb958cb6705bca1824f5", + "orderedPathDataSha256": "952625467450e30b326896d323fe62fe315e5c4d4d885630a94e78da9424b362", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/directions_bike.xml", + "upstreamIcon": "directions_bike", + "upstreamPath": "android/maps/directions_bike/materialicons/black/res/drawable/baseline_directions_bike_24.xml", + "upstreamSha256": "c399dd4d37923c8cd2f0af4c6bc154ee70377f06eb6d06949f71ee6778ff54ea", + "localSha256": "c16108211a9ce9fd56f9c9f6d4515410dcfc5c97b5f615dba229c3b37c2aab45", + "orderedPathDataSha256": "e91dbbcc629094de3480861f9e4709fbb2103ee8319c8978d74a96f80dc2ef58", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/directions_boat_filled.xml", + "upstreamIcon": "directions_boat_filled", + "upstreamPath": "android/maps/directions_boat_filled/materialicons/black/res/drawable/baseline_directions_boat_filled_24.xml", + "upstreamSha256": "720ee9e77aa121f4b3fd3dece0d4017e9207c90ff6bbcf023dffc1779fad54b7", + "localSha256": "b633d8941bda4c147bc3b0198e3aa009d1ff42405c935ce26628ec1f20b79751", + "orderedPathDataSha256": "951a88da18c45b0e4907cd554fa632bee4b3dab1a499d82670080505b01e4a88", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/directions_boat.xml", + "upstreamIcon": "directions_boat", + "upstreamPath": "android/maps/directions_boat/materialicons/black/res/drawable/baseline_directions_boat_24.xml", + "upstreamSha256": "2d8127dc64d2ccf9126f591b8f41694c674eaa89cc73baff137ca1b14579a260", + "localSha256": "73d8f028fe7530affaceb24b8a5c6ed56baaf413f862e91bcc3394995b3874dc", + "orderedPathDataSha256": "90e4bafa01e7c875fcc8040151c187b42dbe80d7525259f0bba193a0d9a4fcc0", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/directions_bus_filled.xml", + "upstreamIcon": "directions_bus_filled", + "upstreamPath": "android/maps/directions_bus_filled/materialicons/black/res/drawable/baseline_directions_bus_filled_24.xml", + "upstreamSha256": "fa128ca5106ae3e6676e37ff476e479c028e1f7a21ff61eb201e8a15b3a33fa0", + "localSha256": "9a7088ac7c9f450ba7732e71cb610f3e0cfa257cdbf01aeafba0e04ff057d55d", + "orderedPathDataSha256": "dd566e2bcc5105c9031c23fbede9a1a8bf865603eb059224e0240dc159b32fa9", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/directions_bus.xml", + "upstreamIcon": "directions_bus", + "upstreamPath": "android/maps/directions_bus/materialicons/black/res/drawable/baseline_directions_bus_24.xml", + "upstreamSha256": "27a948362b8d4ec150545528dbe60729670b6cf63792e405ba0d1c9ef071081e", + "localSha256": "00b649fb11818b885085dfe03c427b9b0f1c744b5319c7fc32a57ada7eab7566", + "orderedPathDataSha256": "537486cb6a3bb75071bd4cef220c63b812c98b7742fef4637a1cf4dd05a15f85", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/directions_car_filled.xml", + "upstreamIcon": "directions_car_filled", + "upstreamPath": "android/maps/directions_car_filled/materialicons/black/res/drawable/baseline_directions_car_filled_24.xml", + "upstreamSha256": "60ec1050af1724b1546f590d61e27ec875ee03bac1458c11924f423a69a71b25", + "localSha256": "8d623a78d568d21e0ee0572a1844c68bcb149f6881b96dec31fcc88444816612", + "orderedPathDataSha256": "d3f6af55e3317c3a8e66af993a669456633f03e5e6d755e950ef44c38fe2a9ed", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/directions_car.xml", + "upstreamIcon": "directions_car", + "upstreamPath": "android/maps/directions_car/materialicons/black/res/drawable/baseline_directions_car_24.xml", + "upstreamSha256": "96f5f8e009989edcb511d5df9f122e092a8f715473b7f6c6d7737a1a9744e7b9", + "localSha256": "00c359d30bb2883f6010db1c7d870ef01a6e7d241bba24127f655f1a77374d96", + "orderedPathDataSha256": "8768ba6a3bb5770c7632cb315d1fbed8a3fc149bd70ac39838e89f2ce2348176", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/directions_off.xml", + "upstreamIcon": "directions_off", + "upstreamPath": "android/notification/directions_off/materialicons/black/res/drawable/baseline_directions_off_24.xml", + "upstreamSha256": "150a5c8792185e3f667f88683e0a37a3a625fd5ed7480bdd5a1985e0039697e9", + "localSha256": "7060d328b7577b1367702dc0569c8ffcffcc39f7cb3e78316ffbcfb34bd2862d", + "orderedPathDataSha256": "2324aba87dee5a96032fb0783bc3465dcd2c106f86d0cad2ccc0141fb0ad81ae", + "originalGeometryMatched": false, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/directions_railway_filled.xml", + "upstreamIcon": "directions_railway_filled", + "upstreamPath": "android/maps/directions_railway_filled/materialicons/black/res/drawable/baseline_directions_railway_filled_24.xml", + "upstreamSha256": "623550e8bfb16795c308e551472dbff6f3c8d444f9c07477805ee78822eee80f", + "localSha256": "e4a0bc1c87ef8d82dd980f56d902602c9effd2432c3db3c23f06a3fca058cf15", + "orderedPathDataSha256": "50657d4f9c88fbb3cf1803030541f9dd7dfe09ba2686296cd0a291fa7c7cf672", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/directions_railway.xml", + "upstreamIcon": "directions_railway", + "upstreamPath": "android/maps/directions_railway/materialicons/black/res/drawable/baseline_directions_railway_24.xml", + "upstreamSha256": "ce98be47d070ecdc7456fb8e90c261a28302a450457b0f55c9f3f5f7cce91e56", + "localSha256": "2bed8017a6d1adb6ef8391ca7fd9f4201ed3f9d947489b3bc18080819ea305cb", + "orderedPathDataSha256": "daa505a2e2aef1d73ddce289a468d6d5555f1a4e9f8ae9d8e1c4d4b1c374c9f2", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/directions_run.xml", + "upstreamIcon": "directions_run", + "upstreamPath": "android/maps/directions_run/materialicons/black/res/drawable/baseline_directions_run_24.xml", + "upstreamSha256": "6742f5bafba2f059bd1fb5d4fb9600e35b2ae9a091ea4e37e40b28bfe7739648", + "localSha256": "5f4342e43b42871a2981046ffca3d8c0c25a31381eac8dc997b24fe6d8582203", + "orderedPathDataSha256": "f2df6439c22b43f040957abe598ea663cf3cee891b7ca710613ad5c516336056", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/directions_subway_filled.xml", + "upstreamIcon": "directions_subway_filled", + "upstreamPath": "android/maps/directions_subway_filled/materialicons/black/res/drawable/baseline_directions_subway_filled_24.xml", + "upstreamSha256": "098c0e72a22f79fc7c56a45d88985322d496d1516918509a939c571b0fd73db7", + "localSha256": "b64e84b3b1235109b0da16a8ef1e012746139787b3a10e06bdf1ce4c15856328", + "orderedPathDataSha256": "d9d498caf9dcd32c8a8b51329e19083b7e62030d77cd94902f50fe99922651a2", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/directions_subway.xml", + "upstreamIcon": "directions_subway", + "upstreamPath": "android/maps/directions_subway/materialicons/black/res/drawable/baseline_directions_subway_24.xml", + "upstreamSha256": "cee35e1332bd03e77bc454d269d915ce3df6af9ba5ad8b8fee05fdfdcec4cf7a", + "localSha256": "7b62cc8e3d9a10b8322e8814225c2bcf9731e452f96be9b9a8e600c214ae0e4b", + "orderedPathDataSha256": "10f94fd73178e132d5e8d7a161257d271e7fc258f172ae8fb0070b6f9bd988b8", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/directions_transit_filled.xml", + "upstreamIcon": "directions_transit_filled", + "upstreamPath": "android/maps/directions_transit_filled/materialicons/black/res/drawable/baseline_directions_transit_filled_24.xml", + "upstreamSha256": "098c0e72a22f79fc7c56a45d88985322d496d1516918509a939c571b0fd73db7", + "localSha256": "fb37592f139a118916aa800fa2703be49ac3d0fd0ab9221e803a335531cd55c9", + "orderedPathDataSha256": "d9d498caf9dcd32c8a8b51329e19083b7e62030d77cd94902f50fe99922651a2", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/directions_transit.xml", + "upstreamIcon": "directions_transit", + "upstreamPath": "android/maps/directions_transit/materialicons/black/res/drawable/baseline_directions_transit_24.xml", + "upstreamSha256": "cee35e1332bd03e77bc454d269d915ce3df6af9ba5ad8b8fee05fdfdcec4cf7a", + "localSha256": "8bf317fe384ab5eacf8811f57898b03432a250c7061a450ece5eb7ed566c2c6c", + "orderedPathDataSha256": "10f94fd73178e132d5e8d7a161257d271e7fc258f172ae8fb0070b6f9bd988b8", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/directions_walk.xml", + "upstreamIcon": "directions_walk", + "upstreamPath": "android/maps/directions_walk/materialicons/black/res/drawable/baseline_directions_walk_24.xml", + "upstreamSha256": "a97b2ef6ac9bf0e9e12e5a226236b0de49a633e1e8d1dfa58ff3bb083f44a215", + "localSha256": "734103c45eed5c83e8310eb5c6f977aa1470ce245fd5054353679f12ef96b6a7", + "orderedPathDataSha256": "25054dcd2c3dbcfd7480305a4cdfcf75d9d957ece34fec7a17a189fa33aad5be", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/directions.xml", + "upstreamIcon": "directions", + "upstreamPath": "android/maps/directions/materialicons/black/res/drawable/baseline_directions_24.xml", + "upstreamSha256": "5037c29255c486eba22c03fd173cfe1ea5a4ea52038e91ad82e4dfe356eea7d6", + "localSha256": "982f3292efe82037e3f32eb71e35a285207bf6eab8187e491bc0c64c0b7d407e", + "orderedPathDataSha256": "c12771b38d51a6f4fee4e42aeae7cfed58827bf5f3f40acb655740c13ab72578", + "originalGeometryMatched": false, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/dirty_lens.xml", + "upstreamIcon": "dirty_lens", + "upstreamPath": "android/image/dirty_lens/materialicons/black/res/drawable/baseline_dirty_lens_24.xml", + "upstreamSha256": "afb94373da4b387905a387425fe8c6288f00bb0d1d637605bece5d56d4cfdb76", + "localSha256": "43b18b06df64f2583739e62cfa54cea271edd1d655479a80b4a7ea23e1abdc87", + "orderedPathDataSha256": "209c2829abe5ad32df833f40735cc7c9f58fdd7954f3d326fc40ea4866be99ff", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/disabled_by_default.xml", + "upstreamIcon": "disabled_by_default", + "upstreamPath": "android/action/disabled_by_default/materialicons/black/res/drawable/baseline_disabled_by_default_24.xml", + "upstreamSha256": "0acbc982b98537db04a697beb811f34c9624e8ef829377f712249b477f5d2758", + "localSha256": "5249670d432d113e58698ea2b6eafbffebbcca5ad8204a6e9f381a715162cc71", + "orderedPathDataSha256": "e24628703b5049152626e6f96f877a91026f6d6f81ab72cb7b7b43eb86dfd218", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/disabled_visible.xml", + "upstreamIcon": "disabled_visible", + "upstreamPath": "android/action/disabled_visible/materialicons/black/res/drawable/baseline_disabled_visible_24.xml", + "upstreamSha256": "b5a27c51ace31a057cdb50665b749b7dbe3e572120dd57d61854f5fa6684c1ec", + "localSha256": "b9de880c7949daec6bb97273cd4c3d973ab3e1b069fcbeac33a8d13125010b10", + "orderedPathDataSha256": "2077f7f7b27cfab771b8ce60d259bbe5c3191543c6aa6c3f4ec08c3eb86ddbd3", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/disc_full.xml", + "upstreamIcon": "disc_full", + "upstreamPath": "android/notification/disc_full/materialicons/black/res/drawable/baseline_disc_full_24.xml", + "upstreamSha256": "27bb5369107d8d3424af5712a008e293f46a8766f48c32c510ddf6fb6bd1803a", + "localSha256": "d7384e671789a7deb1753c390219a81539e73dd4d5d821f588f44b17763d8826", + "orderedPathDataSha256": "27d1c91e6d7a3fc2e2421a0d6ee5b96966c3e711b2a616bf762e56e87fa1692a", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/discount.xml", + "upstreamIcon": "discount", + "upstreamPath": "android/device/discount/materialicons/black/res/drawable/baseline_discount_24.xml", + "upstreamSha256": "8eb319895b12956c813d4ddef583278217ea072924b2fd701a1228f344c7233d", + "localSha256": "1361ab636c6da77835d5aae9cb5f68c5303a9e7585dc74e737f41e747083b636", + "orderedPathDataSha256": "2ba04bdb3bcc5a5f57d0ee7b287f885623701d11f5717b900acfdc339571a925", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/display_settings.xml", + "upstreamIcon": "display_settings", + "upstreamPath": "android/action/display_settings/materialicons/black/res/drawable/baseline_display_settings_24.xml", + "upstreamSha256": "334475e1df4be441ca702c40fc37daf365ca1d14051052f52c14e9d1e1146c78", + "localSha256": "cdb3d475066bd19d73d2e7e5b62a62dc91847d169088c14ab6eb9b64c6accd15", + "orderedPathDataSha256": "f8c82c702d08bbbb34768df67f6d1b90872ddaff94aa1284649c1fd03d039fce", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/diversity_1.xml", + "upstreamIcon": "diversity_1", + "upstreamPath": "android/social/diversity_1/materialicons/black/res/drawable/baseline_diversity_1_24.xml", + "upstreamSha256": "f9de0359d2247881802e6cf20ce2e3d3dbea18cc86a27dec93c4c6b9cd401a53", + "localSha256": "b656da421abcf5786c25bec23b6e382e804a426d925ea11c1376faae9e24ceb9", + "orderedPathDataSha256": "b3b11711b8b127caeac992246126fc0ca002b83a0eee6d7d1c1ab9dd7a6b57c9", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/diversity_2.xml", + "upstreamIcon": "diversity_2", + "upstreamPath": "android/social/diversity_2/materialicons/black/res/drawable/baseline_diversity_2_24.xml", + "upstreamSha256": "a2cd8225dc5a1423c2a96e1687b3174ee053810beedb623fa5d3766a40f0ee25", + "localSha256": "5d28f23b17cb2ff673326d7f2e50847ea538674b1b164a4663e9702e9b03a084", + "orderedPathDataSha256": "8f176686d8194512c51c100f8b8089fdf9c74770cccd928db4b822d2d652cbc0", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/diversity_3.xml", + "upstreamIcon": "diversity_3", + "upstreamPath": "android/social/diversity_3/materialicons/black/res/drawable/baseline_diversity_3_24.xml", + "upstreamSha256": "50232eaaf83f7921ebc97c886de57f7616fefe086e8ed9262074b065a19e7b96", + "localSha256": "272fccaea88c373c898f9f33f8c72ee20289f23d973821215d4f02d654718444", + "orderedPathDataSha256": "0b75240fc4f6bc061a7973d6aeb4fd9619804fb3e1f3d151fb76b815876bd2a8", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/dns.xml", + "upstreamIcon": "dns", + "upstreamPath": "android/action/dns/materialicons/black/res/drawable/baseline_dns_24.xml", + "upstreamSha256": "8cbd1cd5967fdad906526f0e77f1ba8db068a1a0782a2a9e0f024b8f6067762b", + "localSha256": "030861158b2fba499003c07ac48c8015fb24c29124b9d028813aa98c4394216d", + "orderedPathDataSha256": "e40701ae0b13dd4044d9a2e287a2c15ade8da6fc46cf8e6c7408810fa66ec0d4", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/do_disturb_alt.xml", + "upstreamIcon": "do_disturb_alt", + "upstreamPath": "android/notification/do_disturb_alt/materialicons/black/res/drawable/baseline_do_disturb_alt_24.xml", + "upstreamSha256": "459a06afbfe795c157799efac4feb13d6782f7fec0916611a002c43599b30409", + "localSha256": "7fbbf1814f80a5a239ffd7b90e492d65d7da3601204b88b2474fa13759642fb1", + "orderedPathDataSha256": "db1d5d49989811b8375d13b4cca73cd9bb822ed6d7f59addbb008533efc8dafd", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/do_disturb_off.xml", + "upstreamIcon": "do_disturb_off", + "upstreamPath": "android/notification/do_disturb_off/materialicons/black/res/drawable/baseline_do_disturb_off_24.xml", + "upstreamSha256": "82ff6ebd9ee17b1dc251fd9b5aebf594fb9489e5afd9e32956f26aef9a8e75cf", + "localSha256": "ba5f570375d765a403b62e3f767213f6138c145be3d4323bdba5e514f9b17756", + "orderedPathDataSha256": "e046f07e036930b30a4b790a656601e0b99ebee04f042689612086838448d243", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/do_disturb_on.xml", + "upstreamIcon": "do_disturb_on", + "upstreamPath": "android/notification/do_disturb_on/materialicons/black/res/drawable/baseline_do_disturb_on_24.xml", + "upstreamSha256": "6f1dddfd7e9a349db0e5b185945cefe2c3799b18b39852f5d6acd6ca4a0775fa", + "localSha256": "218734475c8a3e22e86fe8f4aca4fbe572ad38fecffaac68b969a894da61ac0d", + "orderedPathDataSha256": "677ddd71ddb67799fac757aff4744e4f35c127fad3013e9f4da970649d395a8b", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/do_disturb.xml", + "upstreamIcon": "do_disturb", + "upstreamPath": "android/notification/do_disturb/materialicons/black/res/drawable/baseline_do_disturb_24.xml", + "upstreamSha256": "5332fb56437562ead7a1097f2ecfb650fc7719e9f029dcd487975632fa3ad8a4", + "localSha256": "2c194f0ef38afb9ab13aee34692e3819a4d3691b602e4afc0c989fdb8491ef4d", + "orderedPathDataSha256": "2ad3154297e7dc809e5b8815103b1901fd84df7ebe8c2f731ec5071b6b7a63c8", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/do_not_disturb_alt.xml", + "upstreamIcon": "do_not_disturb_alt", + "upstreamPath": "android/notification/do_not_disturb_alt/materialicons/black/res/drawable/baseline_do_not_disturb_alt_24.xml", + "upstreamSha256": "af1bd5d7c1e0e1f8b85478d63386d792f8e416bfed5decfa2bb163f75056685e", + "localSha256": "6a95e4d88bda2190c6bb9515c34cf5987f816a8c6309f746390910f36f6d70b4", + "orderedPathDataSha256": "dc2a8706d04e62d73e64c66fe2c190345ae98831cf481efbf3c9b86b87605824", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/do_not_disturb_off.xml", + "upstreamIcon": "do_not_disturb_off", + "upstreamPath": "android/notification/do_not_disturb_off/materialicons/black/res/drawable/baseline_do_not_disturb_off_24.xml", + "upstreamSha256": "b1a240ac8d0039dbb882cd62ef1d27b6bd4a0b8e21851f7b7c9fee3048e2c693", + "localSha256": "697df4bd75d70df5939a61b598482f07e4cec20e2b51efe3421b06fce87572bc", + "orderedPathDataSha256": "1c27f918b364f1513c4bd016cafea81a274839c07b0d02d72165ed5213072a0d", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/do_not_disturb_on_total_silence.xml", + "upstreamIcon": "do_not_disturb_on_total_silence", + "upstreamPath": "android/device/do_not_disturb_on_total_silence/materialicons/black/res/drawable/baseline_do_not_disturb_on_total_silence_24.xml", + "upstreamSha256": "cd90a73aa51fcd95016a954852463ab4de3ca80eb14e8c329604c814458cb19e", + "localSha256": "e4b5009ea024fa295cba7994fa589582db61535632a101a526e8559473a4c582", + "orderedPathDataSha256": "134abd1e0aa74b108c239531278cd4d20baebdf5bc8418e676409c02900269cc", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/do_not_disturb_on.xml", + "upstreamIcon": "do_not_disturb_on", + "upstreamPath": "android/notification/do_not_disturb_on/materialicons/black/res/drawable/baseline_do_not_disturb_on_24.xml", + "upstreamSha256": "fdd5faa301da2090c52e5ac4922a9470de08450f94fd422471c9b2b81b7faf7f", + "localSha256": "d5ec6eae4ad4660f6daaa8382d8173befbd1c06ba8f2d4fe3c1be688f93b4d8e", + "orderedPathDataSha256": "56a378fdfda3760908ecb7198c1c51ef4ee2191e192727f8e7a58984412dba4b", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/do_not_disturb.xml", + "upstreamIcon": "do_not_disturb", + "upstreamPath": "android/notification/do_not_disturb/materialicons/black/res/drawable/baseline_do_not_disturb_24.xml", + "upstreamSha256": "e3ae82644d7872282dcf4cade6134adf65f61148ef73c446c9719336821867be", + "localSha256": "f9f85e2850664374fe0da2d91c7dc1a0f8fa87f0110ecd6bcde96c32bfe98f61", + "orderedPathDataSha256": "38de4af27a5ed4443cbb861ffafab183e269bc38aa41af46b53e57439d17e5a6", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/do_not_step.xml", + "upstreamIcon": "do_not_step", + "upstreamPath": "android/places/do_not_step/materialicons/black/res/drawable/baseline_do_not_step_24.xml", + "upstreamSha256": "23ed1328377297cdc0ada687e58c4ef7041b6f84fd98f280d2c182ae4b925b68", + "localSha256": "00605b02c58521cfa302121b9607369915c438fdb951870d85aff4adfa171cd3", + "orderedPathDataSha256": "b98cf6860e97d5c72e02a1108c1655d6272b1dfab32403317f425ca32407e657", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/do_not_touch.xml", + "upstreamIcon": "do_not_touch", + "upstreamPath": "android/places/do_not_touch/materialicons/black/res/drawable/baseline_do_not_touch_24.xml", + "upstreamSha256": "edfda6bb12f9e004fc84f1cea0adcfd18fc82fba146886f867a0c9d3fa53199c", + "localSha256": "71b311f513b241e2b9a05963d9d8d61bd51bbc99b2dbf7fee9c20300a8f03514", + "orderedPathDataSha256": "10b5dd92a6a49d67ffb21aeea6f6f0d902a7b5cf2c80aca710523bc923ec0547", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/dock.xml", + "upstreamIcon": "dock", + "upstreamPath": "android/hardware/dock/materialicons/black/res/drawable/baseline_dock_24.xml", + "upstreamSha256": "feb9e0b51c1b7fa71bc946f87422826fa182a0e275dcb6b3319e135e9de39d30", + "localSha256": "e5d942a0d642c59f2e5b1cbe13ac1dc454e0845fab5f9a492bdef8da79302a38", + "orderedPathDataSha256": "c0ed8f9955ca7cd9a642f8b284d5601d7aa15d9a56f9a20e080eb5fefd89bc04", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/document_scanner.xml", + "upstreamIcon": "document_scanner", + "upstreamPath": "android/communication/document_scanner/materialicons/black/res/drawable/baseline_document_scanner_24.xml", + "upstreamSha256": "ada8e20dd71e909a591ab64d1a9f102db7f3ea5dfcfe14eb601203f8ad4d35be", + "localSha256": "21baee93b4621ff08be5a092b8e9e734df8bd022a93a469772e17b19c3173039", + "orderedPathDataSha256": "5f6dda39c52c9fbba7b1a3cf34b0e2535a826ce6e85c5aa01a3f970b5c1b3257", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/domain_add.xml", + "upstreamIcon": "domain_add", + "upstreamPath": "android/social/domain_add/materialicons/black/res/drawable/baseline_domain_add_24.xml", + "upstreamSha256": "fad29c6d4c36eb682eb9f51b7bc2c0e5ae42c299ed15b8c8b350094f95b30be2", + "localSha256": "20da3649326907c37ef92649bc8f6ff30a6b60efe4cadb5134749f922f40ed74", + "orderedPathDataSha256": "cdeba6d5e8f3b45ada699bb582456934c3b59a390e1b4831d4044954b5c43512", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/domain_disabled.xml", + "upstreamIcon": "domain_disabled", + "upstreamPath": "android/communication/domain_disabled/materialicons/black/res/drawable/baseline_domain_disabled_24.xml", + "upstreamSha256": "63cfb0e391334fc075d9e0daaa22d4959ba0af3beedcbcabfaa3825a4bf7c4f1", + "localSha256": "2889d9d821eeb6bfe52e8741bc53841ee89d39ff421fdf9918c958877233a28b", + "orderedPathDataSha256": "83f741e5648b4cdaa5dd2387ae4f50cafca46564de32e02ad356d5ab1e813f4b", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/domain_verification.xml", + "upstreamIcon": "domain_verification", + "upstreamPath": "android/communication/domain_verification/materialicons/black/res/drawable/baseline_domain_verification_24.xml", + "upstreamSha256": "a39ab9b556d6483daaf46cb176dc654a271eb0b28cb39b1f435df908bccbecbd", + "localSha256": "1c948f1c5c28aa1480ba74d67a87921faad48b2f18ce5408bda469dc5e68a7f0", + "orderedPathDataSha256": "c38b06e569c058e7c4a82021988addd7ceb78ef11feba71d300d7dc63b6b9f34", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/domain.xml", + "upstreamIcon": "domain", + "upstreamPath": "android/social/domain/materialicons/black/res/drawable/baseline_domain_24.xml", + "upstreamSha256": "9d0560450d25ed11b16da2d6a66595fa42a86cacc83cc3607ad50ddf1c25c4fb", + "localSha256": "c46fa5be6983535709c2f31fbaab2c0a56ec28e6a7ceea56892f6a3b2f5b837a", + "orderedPathDataSha256": "709dec0dc93b3758631cc8fbef73678e34e960f260dbd8bcd332d185e2617d16", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/done_all.xml", + "upstreamIcon": "done_all", + "upstreamPath": "android/action/done_all/materialicons/black/res/drawable/baseline_done_all_24.xml", + "upstreamSha256": "2f1841a88c694cec503ad402434571368fec50835a7b86ff648a4e42c7ef0e12", + "localSha256": "a7128cc25ebd84b551667b15a5ae0d5e83e6a64744a0d1c944efca13d2b3a247", + "orderedPathDataSha256": "11509c7b1cf1731d779c55ebee609dd7d72ea223c66ac5abcc87f8e103943c17", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/done_outline.xml", + "upstreamIcon": "done_outline", + "upstreamPath": "android/action/done_outline/materialicons/black/res/drawable/baseline_done_outline_24.xml", + "upstreamSha256": "e2a87871969bc63fc99639685f390cc8f12fc75f8f4901a88495155f9e75c7bf", + "localSha256": "8d4ca282b547064a1117dd48fbbcfc45a96e15d05020e58eb03bbc29ce6abdfc", + "orderedPathDataSha256": "92c4c4b07e9cb8795f01112f705c44bad407a802c70aa89cbc7a112a79f874df", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/done.xml", + "upstreamIcon": "done", + "upstreamPath": "android/action/done/materialicons/black/res/drawable/baseline_done_24.xml", + "upstreamSha256": "8dd92e04d69418c92c044c02fb0530fd8838c5f7381befb3d8c9138318962bfb", + "localSha256": "95949cea9992e4396fb56af777e2b7c8833bab2db034ac801be9c99f0b2af731", + "orderedPathDataSha256": "400f29c6cd6d675932d7f7259a4a3b3ef37116cf2b22995583313eb2d2234877", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/donut_large.xml", + "upstreamIcon": "donut_large", + "upstreamPath": "android/action/donut_large/materialicons/black/res/drawable/baseline_donut_large_24.xml", + "upstreamSha256": "a74db37345149e8ed199210f0df04982121fc1321e1e1d025c7759c762e5bbec", + "localSha256": "ae05913b1f705cf3f8c59173278ff966eab84b6baa013855a4581024327973a6", + "orderedPathDataSha256": "f47f5afc593c206cf70e6628739d66b4f9ef9d467566d03e4990a2e4dcba83f0", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/donut_small.xml", + "upstreamIcon": "donut_small", + "upstreamPath": "android/action/donut_small/materialicons/black/res/drawable/baseline_donut_small_24.xml", + "upstreamSha256": "c4248348e1d7745763e8967d85dda2fcfac10cf4e16f4fb21e94078a86980128", + "localSha256": "eb6222c7e2d5016d52644c7a9575f87cfe04a2b4bd6d8264468c36b655b12fde", + "orderedPathDataSha256": "4a693b6c073faa16b41dc7b73cd9cf43e947e825271bc51c2e7de1813a57f553", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/door_back.xml", + "upstreamIcon": "door_back", + "upstreamPath": "android/search/door_back/materialicons/black/res/drawable/baseline_door_back_24.xml", + "upstreamSha256": "6e46c9d7e30cb930af3ff5683146b75481af210e6360ec214cc931ce4d0b0e35", + "localSha256": "ae04dc20b1722238e254599e9e24449ebffb134fa68bc84cd120bb0c7676e4fe", + "orderedPathDataSha256": "94a02dba9ad826ca5b01b9b7956c611947c48dae1ee35940adf47a9e9e889620", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/door_front.xml", + "upstreamIcon": "door_front", + "upstreamPath": "android/search/door_front/materialicons/black/res/drawable/baseline_door_front_24.xml", + "upstreamSha256": "b2f5c731dbe1e5868d7d3f24585cade0c4fd958b0d0c7fc78e5bac3e093f4160", + "localSha256": "d6a55824f9c6e00e649c76e5d5861dba50d983ec3e7211fbd0437ca3b398d79e", + "orderedPathDataSha256": "66c3c6d013354400b848a2e087c043aafca91f9fb12a39d990191b17dbcfc889", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/door_sliding.xml", + "upstreamIcon": "door_sliding", + "upstreamPath": "android/search/door_sliding/materialicons/black/res/drawable/baseline_door_sliding_24.xml", + "upstreamSha256": "a2c8f8ffa4a4dbe80363b3042efd99df3244c239fda624a43fd7935d34cb97c6", + "localSha256": "c6bffbbf68d9c71e8b7e0c88740f771bda4438b9ddfbb1c798b81938fa18140d", + "orderedPathDataSha256": "bf68b836be2e5f2318191c418449192233247ff0e9415d2614b1b7b326373955", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/doorbell.xml", + "upstreamIcon": "doorbell", + "upstreamPath": "android/search/doorbell/materialicons/black/res/drawable/baseline_doorbell_24.xml", + "upstreamSha256": "3d4bb0c1b66328ea528dad96d269657a661592f76101fde17fd59a9266a38a39", + "localSha256": "283a221b0f3a08335e796f46b0bc348b8da6b57d20f1da5833c6ab04308a9314", + "orderedPathDataSha256": "91452de1cd3e237774beb2e9f4c75cb43d40910e8cdc2dac2775c3f3e74934f2", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/double_arrow.xml", + "upstreamIcon": "double_arrow", + "upstreamPath": "android/navigation/double_arrow/materialicons/black/res/drawable/baseline_double_arrow_24.xml", + "upstreamSha256": "521d1845f43d5cf010be2c26d1b665a55eb4cdfa15e459cee2c06ca44652a9db", + "localSha256": "c9ad34ea88f9641bc9554ec8bd748659951ef8f83ccc408ef3035c8f339a132b", + "orderedPathDataSha256": "34421fcdb834e2b9c4e68c330b5134c7861a5f6317b2498a2c788035bda54f72", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/downhill_skiing.xml", + "upstreamIcon": "downhill_skiing", + "upstreamPath": "android/social/downhill_skiing/materialicons/black/res/drawable/baseline_downhill_skiing_24.xml", + "upstreamSha256": "d94e40d10b0a809b46225a2cb4252cbb0d5f6e4bcf771ffa7c1e6ca94b02bc9e", + "localSha256": "c749483be266a3783bd68a7fd87471a3311be53817bdf3c2b3dd6c8407c841d8", + "orderedPathDataSha256": "3de10dcbe9e9253239b139dda4061863eb3384590211c65f0462bf56a786acf1", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/download_done.xml", + "upstreamIcon": "download_done", + "upstreamPath": "android/file/download_done/materialicons/black/res/drawable/baseline_download_done_24.xml", + "upstreamSha256": "11bfa659240291618fd33eebc8f1f164e974bbcb580a894dc05d92e4b15457c3", + "localSha256": "c0fa2cc3aea3355672d6b1955476e8b0ba1d0663f334e492fa955138b987efb3", + "orderedPathDataSha256": "caff1871197128efcafb1067cea4912ef7580c038c25d76e75c1c40777635030", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/download_for_offline.xml", + "upstreamIcon": "download_for_offline", + "upstreamPath": "android/file/download_for_offline/materialicons/black/res/drawable/baseline_download_for_offline_24.xml", + "upstreamSha256": "7fb86a55e78d67629f44c8230422e767f29812e9505352abfcda503dff849a2b", + "localSha256": "45dab4d7f80f8457dbaa07f01c2be8a1083e2f686e13baf53662dbd950ee004a", + "orderedPathDataSha256": "d34d1e4d6dee2eb94d4eeedd5ac8502aa68d823732e53e455d48e5ba9a7dd7bc", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/download.xml", + "upstreamIcon": "download", + "upstreamPath": "android/file/download/materialicons/black/res/drawable/baseline_download_24.xml", + "upstreamSha256": "cfb677a99e611be306ffe109317f1c2075a767a7cd5e7ebfa6ee52e38ae97cab", + "localSha256": "a8633a6561699307bf38505ed981a8f79042ca23610da4deb406970e01265856", + "orderedPathDataSha256": "8d2bf848d9fbca0bd94508cdccfa018b474d75719f7871d062aa8d32ed29ea2f", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/downloading.xml", + "upstreamIcon": "downloading", + "upstreamPath": "android/file/downloading/materialicons/black/res/drawable/baseline_downloading_24.xml", + "upstreamSha256": "762da306b47912f8ec23e7c7939da676ca5908ad2ed59d2cddab4ca820a06435", + "localSha256": "60da3cc8b5def55e935730f85d08131ff8d53fa8d0c0e93e0263cd913c00352e", + "orderedPathDataSha256": "139c911a6f1cd3c04478c70ea9be7a5527dd357c0005cf75e793fa39dfb17203", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/drafts.xml", + "upstreamIcon": "drafts", + "upstreamPath": "android/content/drafts/materialicons/black/res/drawable/baseline_drafts_24.xml", + "upstreamSha256": "1bfbe92e3c2b778cde4010e62064aa1c364f335bc84d629f76aee8f37dc3e758", + "localSha256": "ac7afe2763c7da4ef25b2d161b5db5ddcf69c686cb7194923b471600b1f53de5", + "orderedPathDataSha256": "a285c8ea8bf538fca9a347456ae5f144ef42303c2b84f1f92df2df6a1e66c93e", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/drag_handle.xml", + "upstreamIcon": "drag_handle", + "upstreamPath": "android/editor/drag_handle/materialicons/black/res/drawable/baseline_drag_handle_24.xml", + "upstreamSha256": "8046ea4953f3b4c23b2bb4993b710fd93a64ff2294d682e936b466294ef78acf", + "localSha256": "990a4934acfdf85ebdbb6e695473c1ed53c303e800a8c6412adc37a129c2fee7", + "orderedPathDataSha256": "dc37d6574d7667402428ea63902127eaa426816a4b0cff44571a3ddf3cd2282e", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/drag_indicator.xml", + "upstreamIcon": "drag_indicator", + "upstreamPath": "android/action/drag_indicator/materialicons/black/res/drawable/baseline_drag_indicator_24.xml", + "upstreamSha256": "4bb82687b4787698750fa618d87af557773279887da09a9991a7b73fd7008241", + "localSha256": "10093da86b06a682d00375a23327c3bb421e388cd8af58bc910717231d90129e", + "orderedPathDataSha256": "525051240a9f909b2d6c679e8dd716e3c8b6f64b5b142d5608ae481f457ec45b", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/draw.xml", + "upstreamIcon": "draw", + "upstreamPath": "android/editor/draw/materialicons/black/res/drawable/baseline_draw_24.xml", + "upstreamSha256": "96732592ef506da41f3d99542256a009a3551a438b6283e0c0d5cbc2de8f3558", + "localSha256": "9f79854dfaf10d3f7b0ac4e4aa9daf6b50444efe2103e8c05a4cce57b064e3ec", + "orderedPathDataSha256": "00e382ac333156314c5cd3977ae6ad7c52b896cafff7cc760ab062dd66dd65fe", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/drive_eta.xml", + "upstreamIcon": "drive_eta", + "upstreamPath": "android/notification/drive_eta/materialicons/black/res/drawable/baseline_drive_eta_24.xml", + "upstreamSha256": "71da486b8e2b22488201b571a079e0f151f384fbfeb8e47a52173f4d6d51cbaf", + "localSha256": "5d7b23766f34cb69713e1d2e5cab37859fe24f0b73b24705561f4afbca87224e", + "orderedPathDataSha256": "c90fcdb410a3d0ba26e6e9705571e13af62d90ac57efc1ff7f10ac311b24253b", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/drive_file_move_outline.xml", + "upstreamIcon": "drive_file_move_outline", + "upstreamPath": "android/file/drive_file_move_outline/materialicons/black/res/drawable/baseline_drive_file_move_outline_24.xml", + "upstreamSha256": "4c1ac3a021e5f646198eacab7ad03d53873e301cb5e02f6d171f2f077757f96a", + "localSha256": "7c4b94a69ecce5ee759a1c90e779cc936a0dbb9edf05dbc66419cb123c165bfb", + "orderedPathDataSha256": "161ff1bc79d7f1a08ff97dc9f55b325b1ee5295152a10692e392816b41254dea", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/drive_file_move_rtl.xml", + "upstreamIcon": "drive_file_move_rtl", + "upstreamPath": "android/file/drive_file_move_rtl/materialicons/black/res/drawable/baseline_drive_file_move_rtl_24.xml", + "upstreamSha256": "c55252c6bb8cdd458ff14fe24b7692bd73008db32665c883e2ba6a58a19393cd", + "localSha256": "9cb4d5b59c8937d6f20da2fc06101dd8a07bdc3c4e205c2b8e2b5a6323514a6b", + "orderedPathDataSha256": "5d993f1bfb326f63c8a9e5055fba2cde2e45a82fed74cd854d4575ae2953c7e5", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/drive_file_move.xml", + "upstreamIcon": "drive_file_move", + "upstreamPath": "android/file/drive_file_move/materialicons/black/res/drawable/baseline_drive_file_move_24.xml", + "upstreamSha256": "2084ec25e0f2f1d816e1dc37e45bd4980b667d9a07604e8f99ea00d42ce101e3", + "localSha256": "ae0c62c033ea49c249d9dc93cdc00ef5bd5b4ef12294372f188e65e092727162", + "orderedPathDataSha256": "bf86d81c8ded8af00e1116dc266434d5ec13f16661d2b7f5b18c1f4978712074", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/drive_file_rename_outline.xml", + "upstreamIcon": "drive_file_rename_outline", + "upstreamPath": "android/file/drive_file_rename_outline/materialicons/black/res/drawable/baseline_drive_file_rename_outline_24.xml", + "upstreamSha256": "25d6c2f3cf1b599d5f606e2f403d4725fdb19dc7d003bb0099c25f469ee57160", + "localSha256": "9929bc76bccee6f50e455254716d93b66d888e94732e76a9feb7c0be3d38628d", + "orderedPathDataSha256": "a10f7b23f29d30a410624503b2db8093ddc68f2afa17bcbe6a0dc90de7190585", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/drive_folder_upload.xml", + "upstreamIcon": "drive_folder_upload", + "upstreamPath": "android/file/drive_folder_upload/materialicons/black/res/drawable/baseline_drive_folder_upload_24.xml", + "upstreamSha256": "c7b9d4ad8b3ee9c15eb83b5dcc9f9067ea6f2565861dc1731bc980252b182ee2", + "localSha256": "f3e2d27c995d41f7b7d022ad590cc6d3ef80bcdda783226621ffd4d04ec9169c", + "orderedPathDataSha256": "a640a506ddca4845451be092eaad3c7fa13d60588d8c4b46afc149f2a09ec1ed", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/dry_cleaning.xml", + "upstreamIcon": "dry_cleaning", + "upstreamPath": "android/maps/dry_cleaning/materialicons/black/res/drawable/baseline_dry_cleaning_24.xml", + "upstreamSha256": "2064dd2892d4886fc95e3f70e87b38730a4dac6b08fd13f921321e20a5d91534", + "localSha256": "9bfd079c3dbcfedca03a9338297a7be8988420e1188c85b4f0f0843d27579254", + "orderedPathDataSha256": "84584f21f0a840fd5179ca974bfb00b5b349a76f146ecb31fcb27e713a8f42b0", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/dry.xml", + "upstreamIcon": "dry", + "upstreamPath": "android/places/dry/materialicons/black/res/drawable/baseline_dry_24.xml", + "upstreamSha256": "879439ee98b7cebf171bfd8a22ea67d67bcecad174d65f1c8074db7a387e8af3", + "localSha256": "1a2f7dccb5e96d3d3e54a46881f2bb0844a46719d22b098059525f77b041e95a", + "orderedPathDataSha256": "ceb084982174a11225bfb6bdab90cf562e77fd78660c7570cd871f3e1c046725", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/duo.xml", + "upstreamIcon": "duo", + "upstreamPath": "android/communication/duo/materialicons/black/res/drawable/baseline_duo_24.xml", + "upstreamSha256": "3cfbdc0fca17aa6ef0fa28788391d809a6463ce9d7a385d4ca2c0cc76793a13f", + "localSha256": "8222da6c8584ef67f67f55d4848d18697832f1e4cf331e06fde7a7b37edeb119", + "orderedPathDataSha256": "40a58a67d943c3b4a57a9c8cfbd610b6b2955de90b5ef44a4d847c2dc0c8d7b1", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/dvr.xml", + "upstreamIcon": "dvr", + "upstreamPath": "android/device/dvr/materialicons/black/res/drawable/baseline_dvr_24.xml", + "upstreamSha256": "09cd00fd6d5740ee0fb65182bec3154ad10034dfb9d56eb2e3c842ef5c99b7e5", + "localSha256": "bd3204414b55c7f31a5b438eff2a39f3762ca2157dd2a8fd236b5d90c7e4faca", + "orderedPathDataSha256": "8e154d5b540ff7716602b6328806e634d02883cca798bc0263034d021a555bde", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/dynamic_feed.xml", + "upstreamIcon": "dynamic_feed", + "upstreamPath": "android/content/dynamic_feed/materialicons/black/res/drawable/baseline_dynamic_feed_24.xml", + "upstreamSha256": "d6a938dcbf388abea1e0b52f9b8eb962edec63a65fca535bca3134e967d48676", + "localSha256": "8720be9bfbb09ebebf8445e2a295368509a540bd9e09e7653668e0a1767f3028", + "orderedPathDataSha256": "a46d8f6033605b2c268aa2e6eb164be30f098818280baae6a7fccf552f032238", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/dynamic_form.xml", + "upstreamIcon": "dynamic_form", + "upstreamPath": "android/action/dynamic_form/materialicons/black/res/drawable/baseline_dynamic_form_24.xml", + "upstreamSha256": "ef3d007d7b6605f0b121823653d82cedd37d7f8a7723bd5be7352159b9706dc6", + "localSha256": "2189e732af4286c4b88067c1d909c2fdb5ac29105205248e0d3bd3813926ec3a", + "orderedPathDataSha256": "c6d165e694734be5a9212e16df3c3209feba98a8c749a9a5aaa603cd07842ed1", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/e_mobiledata.xml", + "upstreamIcon": "e_mobiledata", + "upstreamPath": "android/device/e_mobiledata/materialicons/black/res/drawable/baseline_e_mobiledata_24.xml", + "upstreamSha256": "2a4e1726a1565989903aa36c3e7ada499c19494a3ae70df5f84379fb5619b696", + "localSha256": "d43217b4d0b213bf05a5ec81e57013885507a1bccc09dc1721afe1487ab3583e", + "orderedPathDataSha256": "35a631ccfd3c7de62987b0ee2692cd0acbd8dcc0f16544571494af69f309305f", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/earbuds_battery.xml", + "upstreamIcon": "earbuds_battery", + "upstreamPath": "android/hardware/earbuds_battery/materialicons/black/res/drawable/baseline_earbuds_battery_24.xml", + "upstreamSha256": "3fae14a2c605ebce2c20bb9d39b541469396926a5c96438d1490c30ffebac994", + "localSha256": "d70d6bb238647c2fc57eac76f3f139e3d76916edf6818a4e386974c38233d3ca", + "orderedPathDataSha256": "57df2ebb6e08b4dc0d9e2058c125c5cac84f60bc56d660aaa1faf43130aca30c", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/earbuds.xml", + "upstreamIcon": "earbuds", + "upstreamPath": "android/hardware/earbuds/materialicons/black/res/drawable/baseline_earbuds_24.xml", + "upstreamSha256": "c97593270551d911eaab61dcc01ddb364130a37c685cddad1d80e2abfead85b3", + "localSha256": "af4004981f92bbe36a55078e631cdbc885e59bfe4c6ce6c4e0c272019c41f079", + "orderedPathDataSha256": "209cb2e728eb168ab7f464dc9e94faeecc7594863e7a1a23a3ad85bcd240db56", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/east.xml", + "upstreamIcon": "east", + "upstreamPath": "android/navigation/east/materialicons/black/res/drawable/baseline_east_24.xml", + "upstreamSha256": "172a98de98ca793e9d3bd8f0bd3572e7d961bbfa59bba5ac6acd7eb117e49be4", + "localSha256": "05c67fc685264a8eba7acebea3c0952eb2b28151ce2f35080426bb5592a894d6", + "orderedPathDataSha256": "f9551000d4ce7ac2083aee6931c86b66cd03e04bcdb08a5eefefbc214ca0b77a", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/eco.xml", + "upstreamIcon": "eco", + "upstreamPath": "android/action/eco/materialicons/black/res/drawable/baseline_eco_24.xml", + "upstreamSha256": "00262105e18064665a3b75a7d59f8f4159316cb5cc61b3a7b0f14ead57f6d169", + "localSha256": "69bf7a1fb6833b9b63a3f3f63a4e7e1c72e8d816d1175ff781ca3d14eb4a0ef0", + "orderedPathDataSha256": "81542ec5ef57b166a277e1feace24881f583be8aba404b627e71d49af70bbacb", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/edgesensor_high.xml", + "upstreamIcon": "edgesensor_high", + "upstreamPath": "android/device/edgesensor_high/materialicons/black/res/drawable/baseline_edgesensor_high_24.xml", + "upstreamSha256": "9e7e1763c0e014ac41221058b1c22d1652664448e0783b1783fa827cc349743c", + "localSha256": "82e316e859465d60f0a1dc57736345468bfd57fb5b100b86c0a7365efc3af98b", + "orderedPathDataSha256": "c9e8292db4f8f850300c295a6956cf1424a980b1ff480e87ad6bbf05ec5c08f8", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/edgesensor_low.xml", + "upstreamIcon": "edgesensor_low", + "upstreamPath": "android/device/edgesensor_low/materialicons/black/res/drawable/baseline_edgesensor_low_24.xml", + "upstreamSha256": "4d1ba8807acbdf0e6cb59a95f9444d24e1a153bb5808f0779813aa968698feb7", + "localSha256": "7e8c5db92487aa42ed64305eab38b69afa30f31164c8538af7a96143eeef9153", + "orderedPathDataSha256": "c451904cb28357a44765da82f707dc23b718262e40877229684332bfa2365dfc", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/edit_attributes.xml", + "upstreamIcon": "edit_attributes", + "upstreamPath": "android/maps/edit_attributes/materialicons/black/res/drawable/baseline_edit_attributes_24.xml", + "upstreamSha256": "2245147fdcd45a398d319178ea3d0017077de18598cb1b97b3f51cfaa979e6f4", + "localSha256": "d98b3001424c44feabec582b81d3f2d091e249d376605806ea83f7cf367fd988", + "orderedPathDataSha256": "69e406a09808b6e9b3d78a8538e42cdb46b499b44340019f1ea8c8564e419bbc", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/edit_calendar.xml", + "upstreamIcon": "edit_calendar", + "upstreamPath": "android/action/edit_calendar/materialicons/black/res/drawable/baseline_edit_calendar_24.xml", + "upstreamSha256": "5d6b6598ae2881a14abd2b2ccfaccfe82df04409a337c2b31fb2b4d822118a13", + "localSha256": "e335cb2ddbc7801f33e9df97df18da2740fd9561e164be54bde42e1c6d3eba47", + "orderedPathDataSha256": "29cf145dd9fff250ee874ffa894efa398c1e35bc6323a3a0232063b359c29b7e", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/edit_document.xml", + "upstreamIcon": "edit_document", + "upstreamPath": "android/action/edit_document/materialicons/black/res/drawable/baseline_edit_document_24.xml", + "upstreamSha256": "9e3672494288a320d425929cc0dc497a87a20a66fa212a76d99470551eee7964", + "localSha256": "de00f01c5df3306f8b08ca46a331d2398b15402a1359acc39a61b41605a683a4", + "orderedPathDataSha256": "fd33b43a0bc291b65d7a4498e22db8d9dbb9abf353236ed3c7f61a79c6244893", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/edit_location_alt.xml", + "upstreamIcon": "edit_location_alt", + "upstreamPath": "android/maps/edit_location_alt/materialicons/black/res/drawable/baseline_edit_location_alt_24.xml", + "upstreamSha256": "06fcf0ace43bc20f21bb7f0277ce96ab648320f8d1246543e00580afb84bca0b", + "localSha256": "77602b186018a5954f80621f18776bd94ba3e977c4559a5a7cd32397fc308d8d", + "orderedPathDataSha256": "5286886b071c27c484256fc674ebbbdb2adeb432f93f5c4c82397bcec94449b8", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/edit_location.xml", + "upstreamIcon": "edit_location", + "upstreamPath": "android/maps/edit_location/materialicons/black/res/drawable/baseline_edit_location_24.xml", + "upstreamSha256": "1928f12bf84633846b23ac749f40f8b0b38cfe4b04414dad3228ad352b0c9f50", + "localSha256": "fdd258adfaa54851ae18d563793e442a29f2613a94c267f15fae6261fc117934", + "orderedPathDataSha256": "00cfee1e7ededfd62a1a394514d9c152f61d2626130289e94d4af887deb44815", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/edit_note.xml", + "upstreamIcon": "edit_note", + "upstreamPath": "android/editor/edit_note/materialicons/black/res/drawable/baseline_edit_note_24.xml", + "upstreamSha256": "e983742e1df8ba0a7a908c10e0b044f8b157dce5fbc0da1f3af1078c4b1f25cd", + "localSha256": "9b57395a5b11fd75aae911fbb2e0f1eb5a5bf32111d83624f382daa37baf8b6c", + "orderedPathDataSha256": "90e2dfaab1f24dc30c37d9133c353b71f0b2d0c789ced4a7ffb0d473bf830f96", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/edit_notifications.xml", + "upstreamIcon": "edit_notifications", + "upstreamPath": "android/social/edit_notifications/materialicons/black/res/drawable/baseline_edit_notifications_24.xml", + "upstreamSha256": "760c535d58d9104af495f498451c76c1e78364d6191816c8ed1a921c8d00c490", + "localSha256": "578ba59146bf133d0a338270204e66d917a697e8327cad9a8bb6dec53b1b8afb", + "orderedPathDataSha256": "a638d21024e18898284d73345782676423c95e09a7fe00c31df19fe4689805a5", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/edit_off.xml", + "upstreamIcon": "edit_off", + "upstreamPath": "android/action/edit_off/materialicons/black/res/drawable/baseline_edit_off_24.xml", + "upstreamSha256": "f28ddf5aff0ab9381c95e2def411c703da35871746d8e2fb5536b72df8438322", + "localSha256": "aa1ddab3ca9399c575dc4312258b66304732ab7525fd84f35137a6527c68d8ee", + "orderedPathDataSha256": "b27d6fbe931f67771aad096407c51691b9dce292106e48988d9a4323969e3740", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/edit_road.xml", + "upstreamIcon": "edit_road", + "upstreamPath": "android/maps/edit_road/materialicons/black/res/drawable/baseline_edit_road_24.xml", + "upstreamSha256": "714416f60d94f19b2e43b44577e04f88c0e9e21895ed46bcabca66b5986ca399", + "localSha256": "561aa9997914f582f0f25cc281fe7d1142c5ada00b9f82cf9d3e8853a7c73fb4", + "orderedPathDataSha256": "cc0d8a0ef0c0543e8bc75d9cdb72417d7ea465286d556384e7c6b556c94881d8", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/edit_square.xml", + "upstreamIcon": "edit_square", + "upstreamPath": "android/action/edit_square/materialicons/black/res/drawable/baseline_edit_square_24.xml", + "upstreamSha256": "a5762573dbe9312b3714346b8624b4ac414322a9364c40795530503ceac1c61b", + "localSha256": "bb6d96e27c8b47879d4e43a94417ec8335e923e75530b22e062d4ddb09c002a9", + "orderedPathDataSha256": "188d4edca5cf52ee17ed31d0dedc6c3c5acd125380249f274d388144a198ed28", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/edit.xml", + "upstreamIcon": "edit", + "upstreamPath": "android/image/edit/materialicons/black/res/drawable/baseline_edit_24.xml", + "upstreamSha256": "6dafcab0f0efe423057c0e888e5289f4afcd71398160b80d590b79e4ea8c9a15", + "localSha256": "3aa09cc06995663be16e83610c936233ac71890c49902bb5efe3d7b1a84bcef0", + "orderedPathDataSha256": "07dde6bfc5cde03816252478751d2f87cfce698223b50bc351eab71d7fa19502", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/egg_alt.xml", + "upstreamIcon": "egg_alt", + "upstreamPath": "android/maps/egg_alt/materialicons/black/res/drawable/baseline_egg_alt_24.xml", + "upstreamSha256": "ac8f629394c4b3ef0b35af79f456f22fa42717c92114e73cf4eb2db99d6b950f", + "localSha256": "95a30a60991be48bca700d623874b375b5ba117eadc87c6989430d960c257ed1", + "orderedPathDataSha256": "cdba19bf314536671f899896d539808ec8e4a429bbfa6993fb63a4373ce141dc", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/egg.xml", + "upstreamIcon": "egg", + "upstreamPath": "android/maps/egg/materialicons/black/res/drawable/baseline_egg_24.xml", + "upstreamSha256": "ef55717b3f44dba28c765a5a48fb55553a237ff8fecff5268224354b51eb9779", + "localSha256": "a3154b96dd1a65cdee6bcf49ee6f8c8bac8b66f5dad0c793f09af13816783c65", + "orderedPathDataSha256": "97b636072aa717aa56194eca9ebe8c49bb424f2e6541c05a2bc29e75ed63382d", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/eject.xml", + "upstreamIcon": "eject", + "upstreamPath": "android/action/eject/materialicons/black/res/drawable/baseline_eject_24.xml", + "upstreamSha256": "968e6c778578eb435c5ddb6e83e31d0e37aef2638c81dec28e314bafc1aa0272", + "localSha256": "3b02a2c929f82d317f8ecaad6006135898f0e8b4f35994af279cc021bd94e835", + "orderedPathDataSha256": "aa1e8c9c8b702fe3fabe5928064af9cfa09e9be1a789da14168b3d2c70e39596", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/elderly_woman.xml", + "upstreamIcon": "elderly_woman", + "upstreamPath": "android/social/elderly_woman/materialicons/black/res/drawable/baseline_elderly_woman_24.xml", + "upstreamSha256": "d85cb302f07812e007eb79a774e7cf9c6e76394b6b0f0ed117e7349a70f67b37", + "localSha256": "5fafb3e278a9f593d7a8e311c774282beb3e9773d750ef4ec7ae79171f2c9481", + "orderedPathDataSha256": "d78df7e4592e85addec75ced950a3a0ac18c949eff2b9fd205097cd510f32dbf", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/elderly.xml", + "upstreamIcon": "elderly", + "upstreamPath": "android/social/elderly/materialicons/black/res/drawable/baseline_elderly_24.xml", + "upstreamSha256": "e42f7253bd6afa3a80dcaff55c27613fdac56527a17f77a0f8a1b5af342d58e5", + "localSha256": "f7a5918371a0cf67aebfb8f2423a32e4e75749406c67f7f0423bdfe0ed1da917", + "orderedPathDataSha256": "c644f725bb1e9c594034e030eb06d2f7d73bc36a48252596eca0c79de36f9a58", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/electric_bike.xml", + "upstreamIcon": "electric_bike", + "upstreamPath": "android/maps/electric_bike/materialicons/black/res/drawable/baseline_electric_bike_24.xml", + "upstreamSha256": "9442aeb71997a8f98d4375f364ad9b7931e1f842f22ff003c5eaf2f91ddcd510", + "localSha256": "236e3e29c1a7ec234ad72261809f601f8a47d5876b884d01fb4a12a2c4115856", + "orderedPathDataSha256": "ad0f1941234d0ec31cb3f0a46fc79a9b7e2a9d5d85a34f0a0e0ebecf1807d73f", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/electric_bolt.xml", + "upstreamIcon": "electric_bolt", + "upstreamPath": "android/home/electric_bolt/materialicons/black/res/drawable/baseline_electric_bolt_24.xml", + "upstreamSha256": "6bb2f898fa83e5803ddbbd723c963196b547eaa5090d75d0e532639935cc5f19", + "localSha256": "624929857ae1da27d6fa3c6a821291c284b7ab203108084fac029908dc23b9e9", + "orderedPathDataSha256": "a7a5814295475e3b78f15977ace61d1e2862876312702d156d283f94ebcd5092", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/electric_car.xml", + "upstreamIcon": "electric_car", + "upstreamPath": "android/maps/electric_car/materialicons/black/res/drawable/baseline_electric_car_24.xml", + "upstreamSha256": "a194b41e2ff33c0eeaa62ed7cb829f50b99c8740e7c5286cd66220a561268acc", + "localSha256": "6c85839739b3e0027792eb6946af86a8bcf6d941e585584eba82d5e53ea0e0e0", + "orderedPathDataSha256": "f781354cf425ca56f625274d9cd2dfbb541be0fe4e3faa53879644d2e5f36650", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/electric_meter.xml", + "upstreamIcon": "electric_meter", + "upstreamPath": "android/home/electric_meter/materialicons/black/res/drawable/baseline_electric_meter_24.xml", + "upstreamSha256": "8c6ab378eb722649431ee3aa2fd5122a73ab3562f870c300ac91a8116340956c", + "localSha256": "ff7fab237506d0312668d89ed0c5bea5b4dbdf21131c8322b44f644031c6d6fb", + "orderedPathDataSha256": "8de5d9c25ff437b4802654e8186eb07417b1e9c57e52c86c34fcf5e2d1fb0740", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/electric_moped.xml", + "upstreamIcon": "electric_moped", + "upstreamPath": "android/maps/electric_moped/materialicons/black/res/drawable/baseline_electric_moped_24.xml", + "upstreamSha256": "512fc0cb5d5f587c696251460468068fbf0883d271a2af796d4c42276ee402a3", + "localSha256": "222c69eabd6dcde648886466265c6816ca6ceef4c4a55915e2b6dba6e68570e7", + "orderedPathDataSha256": "10736808c7c7cac9b2f48ad333328e8b5b046a2dc18602a39bb4ddbd114fd18d", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/electric_rickshaw.xml", + "upstreamIcon": "electric_rickshaw", + "upstreamPath": "android/maps/electric_rickshaw/materialicons/black/res/drawable/baseline_electric_rickshaw_24.xml", + "upstreamSha256": "6e7bbbee551434a8f8a252b430148d362e71520fd9eec9e5f74611afcfa3de9b", + "localSha256": "fcec91575133ee5758ff3c7f69baf819d74774bf96676c64e7bc441604192272", + "orderedPathDataSha256": "e3c02b97f4e2ad22217350867e1dccd32ff8c93212156fb2903065e038a8f24d", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/electric_scooter.xml", + "upstreamIcon": "electric_scooter", + "upstreamPath": "android/maps/electric_scooter/materialicons/black/res/drawable/baseline_electric_scooter_24.xml", + "upstreamSha256": "a11424d6915b7d400b1886c1a9f2b2b889ee5a2ceca0435434cbeb1d51d1bf96", + "localSha256": "96d4dc16c12692bdfc014c0f72a0a00278eb2cc09769141629495156e4e8d428", + "orderedPathDataSha256": "051c20f8c19aa672b76418fda08da26878c38c021cd5bd10d4585f7ee11351cc", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/electrical_services.xml", + "upstreamIcon": "electrical_services", + "upstreamPath": "android/maps/electrical_services/materialicons/black/res/drawable/baseline_electrical_services_24.xml", + "upstreamSha256": "caa22cffd8810f6adbb8c76c37cf58d4a521d4c70ff28b3c3feb34b3812d3488", + "localSha256": "2a2ee0042c67dbde5220cd4fd4da4e17b25c7ba38156c68e2d10dfbb6b6e1cbc", + "orderedPathDataSha256": "18710ed72da28fc08a2e24ee0d29feea4a8f4a0a9c44bc96d8fab333fc9cccd0", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/elevator.xml", + "upstreamIcon": "elevator", + "upstreamPath": "android/places/elevator/materialicons/black/res/drawable/baseline_elevator_24.xml", + "upstreamSha256": "a076553162547ccf9ec349339b1bdf3bb67d08c02e30061a8dd41a7e08d47f3a", + "localSha256": "e9a615bc2e55767d3da83153164e48a624beabd95aa8978f66f5c5ae18a09b15", + "orderedPathDataSha256": "53229666af038172da8935a631c3b94ffecad6402a956252bf43975d6c4547f7", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/email.xml", + "upstreamIcon": "email", + "upstreamPath": "android/communication/email/materialicons/black/res/drawable/baseline_email_24.xml", + "upstreamSha256": "9e90ebb0f59ff59fa85239762edfbc627a0c5b50a8e6485d3104c2304996a3c4", + "localSha256": "66db754f576fae840eb553f627f9805571e5c6bc216fb7ed2561aa87fe95e405", + "orderedPathDataSha256": "331777901ea3aa8b3e42d95fef1280a1b7a5bcc64beef81c3bf95abae3d21190", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/emergency_recording.xml", + "upstreamIcon": "emergency_recording", + "upstreamPath": "android/maps/emergency_recording/materialicons/black/res/drawable/baseline_emergency_recording_24.xml", + "upstreamSha256": "f97cd4c57c29a6334026a727285cdd7a51162e1b796b17c3cc1466890366864e", + "localSha256": "559dc101596632f436faa012034d4a2433df1e2c55f38f37f1534edac9833043", + "orderedPathDataSha256": "b9175d1565416b23a5303dc59aac496eacb4444d483c358bb2c0ce9585643783", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/emergency_share.xml", + "upstreamIcon": "emergency_share", + "upstreamPath": "android/maps/emergency_share/materialicons/black/res/drawable/baseline_emergency_share_24.xml", + "upstreamSha256": "7def3ddfafd1a544c18bbf021f1d21d69d71bfbc5cfcd30c4979ebc25cdf3988", + "localSha256": "5a8069295d62cdfe43e774698227b6bbb28d52e65ccfc43915bf1615205cf347", + "orderedPathDataSha256": "e44f18a3dd982939532398f89e911474511f7d4a4e8a33ac194bf3e9d3e376af", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/emergency.xml", + "upstreamIcon": "emergency", + "upstreamPath": "android/maps/emergency/materialicons/black/res/drawable/baseline_emergency_24.xml", + "upstreamSha256": "19006da4c8dbbfd55fa86fe085aac2684af547544bec36af87c73992e8b72184", + "localSha256": "52de99725ec2e5ebf04b06e5cb4022b318d737f646a904557db4c5c01ba2ac3d", + "orderedPathDataSha256": "d9bc9a3edf86bcfd400310924fd65039077a2447c9979a26d684ca69ed33bea9", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/emoji_emotions.xml", + "upstreamIcon": "emoji_emotions", + "upstreamPath": "android/social/emoji_emotions/materialicons/black/res/drawable/baseline_emoji_emotions_24.xml", + "upstreamSha256": "04e607b5a13ae328caf5840999cf0d6e36c73eb613de62c5dd0c48a9d784b4ed", + "localSha256": "d6c5281e6f3b77e698d15ac513bdd7d86f21553b915254cfb55c3a0b7d829458", + "orderedPathDataSha256": "972f86d691fa13156f5923e8019b32941692b6045c137f647a986bd910f1f3d9", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/emoji_events.xml", + "upstreamIcon": "emoji_events", + "upstreamPath": "android/social/emoji_events/materialicons/black/res/drawable/baseline_emoji_events_24.xml", + "upstreamSha256": "a3e7ae8c449dc5a63efeb3ac21e7779655538484c327be14da9e39017b367dee", + "localSha256": "5d774fe5feed802ea79d9c603f554e7f38e1e01aadc260114b135c062d066976", + "orderedPathDataSha256": "b30e5ee882f3c26bca7536e0077c351be2c93bc16f25ce9c93f58a41c83fb8f8", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/emoji_flags.xml", + "upstreamIcon": "emoji_flags", + "upstreamPath": "android/social/emoji_flags/materialicons/black/res/drawable/baseline_emoji_flags_24.xml", + "upstreamSha256": "ff8d90d94b39b5265cc9e405afd4135f53462c667c1e6e1432dbfa6ec3740488", + "localSha256": "c1c9d1240d0e9e310464790543f304808f753bfaf3c321087ba334fd34504e29", + "orderedPathDataSha256": "5bf31e06a9a8696c1ff7bbfd5dd92c4691c2df86e2ca078ad8fded67c2901bb3", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/emoji_food_beverage.xml", + "upstreamIcon": "emoji_food_beverage", + "upstreamPath": "android/social/emoji_food_beverage/materialicons/black/res/drawable/baseline_emoji_food_beverage_24.xml", + "upstreamSha256": "38e8095a9be8e0e9f1142ec1e7a6357f5d201f269ed499f31f0a51465ca7e355", + "localSha256": "4717a62a3ff71d601c8c7bea20fddfc6d6036a9e7cb43a102add6f3a567df214", + "orderedPathDataSha256": "a5a2275f0a16936165e86316fbdf9f44168d5b1f5038a79707d1d09af2134e81", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/emoji_nature.xml", + "upstreamIcon": "emoji_nature", + "upstreamPath": "android/social/emoji_nature/materialicons/black/res/drawable/baseline_emoji_nature_24.xml", + "upstreamSha256": "3a9b1976f92f0354a5861bab22cab5e096fb66882b0cdc0ded37ea95ff7f488a", + "localSha256": "6d6ab95cc43d36d4e31d9ae2064e45b48602c3a610ac672d117978e04d710a02", + "orderedPathDataSha256": "fe6f08431bd7143985501e15e02b560bef17cfed2204de668c20e5b9b5c61790", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/emoji_objects.xml", + "upstreamIcon": "emoji_objects", + "upstreamPath": "android/social/emoji_objects/materialicons/black/res/drawable/baseline_emoji_objects_24.xml", + "upstreamSha256": "481cca4f4de42b126175cb107d6870c39a2f8479613ebd5872a4aeeb97feca02", + "localSha256": "44a418db754c5354a15f411483e20e10f03f2e309b9058eb9c1983bae9855037", + "orderedPathDataSha256": "43f854f8ce97383036f7b56736526b42bcc64b706a272a4d8392d8bc8264160a", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/emoji_people.xml", + "upstreamIcon": "emoji_people", + "upstreamPath": "android/social/emoji_people/materialicons/black/res/drawable/baseline_emoji_people_24.xml", + "upstreamSha256": "6b3fb39b262d5bc6b020552c82550979559e184ab08652475603f146eee2aa61", + "localSha256": "819edf7936f32bff6764aefae5104cd748fbb446d30d48c186bdd28e7ed5535d", + "orderedPathDataSha256": "7ec23ba72dc526a70078a58b6f66afaf2dba715f2c9fa4ba5938d9bb05e7ef8a", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/emoji_symbols.xml", + "upstreamIcon": "emoji_symbols", + "upstreamPath": "android/social/emoji_symbols/materialicons/black/res/drawable/baseline_emoji_symbols_24.xml", + "upstreamSha256": "df43d56d87d03242eab02efe3fd5ae76bc7d26fed36c436d4e84aa30c05b23ec", + "localSha256": "0fb3331a1a86c2d1f956c6c8ebb2b9f6e95cd24c334cfb695c8ca5577dcb7635", + "orderedPathDataSha256": "f096ac60f5974c2d8c104e8527352d3c4476306f2d7fb4e0fa4b026813c28aea", + "originalGeometryMatched": false, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/emoji_transportation.xml", + "upstreamIcon": "emoji_transportation", + "upstreamPath": "android/social/emoji_transportation/materialicons/black/res/drawable/baseline_emoji_transportation_24.xml", + "upstreamSha256": "50bd5d8088fed657c7f3a5cef5672183d47035d523883a6fb7d8196dad59614f", + "localSha256": "11faaaf1874ac7e62822a18d41fd7937748bc2ab1f471ef86f6423028ad0c3d4", + "orderedPathDataSha256": "25e971d3e3584a636301e6c05a5ba2bdf089939b841b9fc1b2d6c13df4806056", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/energy_savings_leaf.xml", + "upstreamIcon": "energy_savings_leaf", + "upstreamPath": "android/home/energy_savings_leaf/materialicons/black/res/drawable/baseline_energy_savings_leaf_24.xml", + "upstreamSha256": "67b5c83944d26e908113f3f45eaaf8b204baed7b233884710fe9c345c423c0e8", + "localSha256": "4c77b1fe82034f4d891db965effc78bb45dc2c0d12b92e8ae7b44ca1d9be55d1", + "orderedPathDataSha256": "6f594e51846c2ae3e77aab7ffe112c01c1d2408a7c50de0f71392589789f831f", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/engineering.xml", + "upstreamIcon": "engineering", + "upstreamPath": "android/social/engineering/materialicons/black/res/drawable/baseline_engineering_24.xml", + "upstreamSha256": "7ffbdcc1bf78898908ff2f1ab9fb198ec76b7cf2a6aa619c0ee2b2b419281e63", + "localSha256": "aaadf01e69ab721882230fc72e9c3e156c26434764a7caa60dbadbdf2aa3d5fc", + "orderedPathDataSha256": "8f905e36643388ac364f552041d6f44d74f52b8828e3efb9787f906b19065fa2", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/enhanced_encryption.xml", + "upstreamIcon": "enhanced_encryption", + "upstreamPath": "android/notification/enhanced_encryption/materialicons/black/res/drawable/baseline_enhanced_encryption_24.xml", + "upstreamSha256": "fdb216abbef5fb4eb98464408c7157498375abad62d5dd9b583c4de345968b75", + "localSha256": "649df04cfe107eb30fed4194c9933d97aa7fa4ba6e5809cfc2d940c839d0dfa4", + "orderedPathDataSha256": "b2d2b4d242617c4062f4ad63b75d8617042760918dda7d78b8bdfd7a8466f2d1", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/equalizer.xml", + "upstreamIcon": "equalizer", + "upstreamPath": "android/av/equalizer/materialicons/black/res/drawable/baseline_equalizer_24.xml", + "upstreamSha256": "b8c491760c140015c2bb122d580894ff30ea2e809a7a880991417065cac6bdc8", + "localSha256": "0cb8968abc73d8588a1d986852a5c9b04a37e2c0a01c33fa0dc62ee2c59f85f1", + "orderedPathDataSha256": "c8ed88e6183ac6bcff0284e0d017806999397f60710189ca6192108453c8ba80", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/error_outline.xml", + "upstreamIcon": "error_outline", + "upstreamPath": "android/alert/error_outline/materialicons/black/res/drawable/baseline_error_outline_24.xml", + "upstreamSha256": "3fafc111cf8d394f98da15f726c4f9b467af01a660410e8474a0dc633449e84c", + "localSha256": "3140081d5d21a99b3d5f9626d45b0a2251c7e14d16330236e02823f3e6abc198", + "orderedPathDataSha256": "807f2f45795b0ee0b9a7cb641f727816e31a4906d97eeb85d299ca22bda22d8d", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/error.xml", + "upstreamIcon": "error", + "upstreamPath": "android/alert/error/materialicons/black/res/drawable/baseline_error_24.xml", + "upstreamSha256": "d429fbd76621070cfe81501967665de82cdf065c2ce032ee8f53627f8abb2bfa", + "localSha256": "ab2e53361be95f0d8e6eebaf8f9efd74a17465f007b07ae9a94d4126eae3f21e", + "orderedPathDataSha256": "a201e6aa64e1bc27c40d7da9b65004eeb83eec62a83fc44b45e29e4672d269c8", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/escalator_warning.xml", + "upstreamIcon": "escalator_warning", + "upstreamPath": "android/places/escalator_warning/materialicons/black/res/drawable/baseline_escalator_warning_24.xml", + "upstreamSha256": "eff98644ccb599396268649c99522e2336326561eb3a2f4335e1345ae8c28319", + "localSha256": "9f7bde81cea46b9a551e9d4451cd449d540d5280d732e8c460ed332db5464c49", + "orderedPathDataSha256": "efbcce8730a7ebab56939ba035481e0374ed2f0a5bd0b6260b55f65ba5160b52", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/escalator.xml", + "upstreamIcon": "escalator", + "upstreamPath": "android/places/escalator/materialicons/black/res/drawable/baseline_escalator_24.xml", + "upstreamSha256": "e398405c7bef3d3c1219c7708e463390cab2ed6c34dba7d09a644ca60d6a9663", + "localSha256": "430b4a39851402524e2f8fbaa686b4334c42c6d0957731a3bf305f8406c312f0", + "orderedPathDataSha256": "a28a3c23d9acb157079b2d8da76ed43942ff7be5edf71a5cd69afdf0e921dc72", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/euro_symbol.xml", + "upstreamIcon": "euro_symbol", + "upstreamPath": "android/action/euro_symbol/materialicons/black/res/drawable/baseline_euro_symbol_24.xml", + "upstreamSha256": "e96f24450211e079b0cd961d02a20e2975832a7f786824c345ca6a96277901da", + "localSha256": "d59515b177e6724cec2508d2ecc73915cd2be1a5241fa900612c6c6bd40bc9ee", + "orderedPathDataSha256": "387b89204d50e0b153d08359da2ec350be06d920ff902b75509172aa67280cf5", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/euro.xml", + "upstreamIcon": "euro", + "upstreamPath": "android/image/euro/materialicons/black/res/drawable/baseline_euro_24.xml", + "upstreamSha256": "f93b5f00ac4bbd5e4297f4ac31cf05f251db445c344a1e537717d4f3f6a1fec0", + "localSha256": "768cdc6010c4f89507575039ea1e101f93d6cfd3787e0186908d5f0621d70ae1", + "orderedPathDataSha256": "1833d8bffc454e19317e7f3153f907fa12945bab29150757e0996af53ef5ad5e", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/ev_station.xml", + "upstreamIcon": "ev_station", + "upstreamPath": "android/maps/ev_station/materialicons/black/res/drawable/baseline_ev_station_24.xml", + "upstreamSha256": "ff48a128b9d754c5f447f86cdb7920105a614f65cac49511c28a8c0a5ef84c10", + "localSha256": "f28d43e44b4d371e82e3727067b668626c7cde6956288f7275d54cdd85a0db19", + "orderedPathDataSha256": "0e1887c5df0d68fbfbe3dd0b803a447f2d98425d320225c1757ffd593261212c", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/event_available.xml", + "upstreamIcon": "event_available", + "upstreamPath": "android/notification/event_available/materialicons/black/res/drawable/baseline_event_available_24.xml", + "upstreamSha256": "6add1e98d655f7a09275112064ebdf62966e582283508a078c25cd8eb92fb8cc", + "localSha256": "124c780fc9cdc18ff4a51efea6aa08ba31c4459e9f80ae7c20ef4218bedc166e", + "orderedPathDataSha256": "a33fe0df67ade2cc66b746513324949df9289472a6f16fd752f2432aa1f964fe", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/event_busy.xml", + "upstreamIcon": "event_busy", + "upstreamPath": "android/notification/event_busy/materialicons/black/res/drawable/baseline_event_busy_24.xml", + "upstreamSha256": "511b05f26d4bb76962fa002fa6eb85ca12a906c206a0213d0e1fe37381db249f", + "localSha256": "09f4f90f7d33dd81f84a7e99a4e8e455bfdb8f21b91f5208dcfcabce059a828e", + "orderedPathDataSha256": "415d241c575be1a22a0c76732686d7f99439d1b2d6777e19f279d2354b48fe37", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/event_note.xml", + "upstreamIcon": "event_note", + "upstreamPath": "android/notification/event_note/materialicons/black/res/drawable/baseline_event_note_24.xml", + "upstreamSha256": "17f7637813ff476f4de52d8cc4bf692f1d839064df79bc8ca7e6c93977ff5908", + "localSha256": "0a94a859a226fa424fc2dd5819639609ea55d6f1cd64a769beb50d4660c9109b", + "orderedPathDataSha256": "58d1f25dabd268ae35b7dcf395cd1d336a0d63dd7240e264249c3b010fd1f1b8", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/event_repeat.xml", + "upstreamIcon": "event_repeat", + "upstreamPath": "android/action/event_repeat/materialicons/black/res/drawable/baseline_event_repeat_24.xml", + "upstreamSha256": "608a065f92ab450ea3948d5eef209edcf4134b58116ed5c374eddfaccd05fccb", + "localSha256": "1358626eb23d1174fd26c9b1de06f1b395188e9ce306c858f9a52d37c2f93b88", + "orderedPathDataSha256": "924e55147b352e20adcc2b049f4626a24af2d7827ac589dbd2db8f51288ef9be", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/event_seat.xml", + "upstreamIcon": "event_seat", + "upstreamPath": "android/action/event_seat/materialicons/black/res/drawable/baseline_event_seat_24.xml", + "upstreamSha256": "1abc2963ee24569db41bdd9e08f55d400d33d4a13077a0051cf6176cccf90880", + "localSha256": "2f4f90268fb8348c137d526adc536d3321117e905706fe96abb1940f0dfe5211", + "orderedPathDataSha256": "8142c6939dde1408b1f1c1bbb552c94208c1f7846127ae8d0cb071aa57ac766d", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/event.xml", + "upstreamIcon": "event", + "upstreamPath": "android/action/event/materialicons/black/res/drawable/baseline_event_24.xml", + "upstreamSha256": "a400bc04c566a56d65724337b825126bec6cc6d02cdcbcad90ccfb083c9a1341", + "localSha256": "1179b3e1ac58a1aaad2031043f23af416e7a33507d0694db69ccb492a9f4de47", + "orderedPathDataSha256": "8eb605cff2e0f7c201e6dc2a380df9695cecb08c4e7ed9c6a7c7c9940868084b", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/exit_to_app.xml", + "upstreamIcon": "exit_to_app", + "upstreamPath": "android/action/exit_to_app/materialicons/black/res/drawable/baseline_exit_to_app_24.xml", + "upstreamSha256": "707833b30ec8134e87866a369d611b92c343f7d5cffc551438c9ad4fe2d5e0e2", + "localSha256": "d87493eb2585c1120ec1bdc953441d7a730206bec316b108d7a097b6f28514b4", + "orderedPathDataSha256": "96ec6a74b0463a0c143c77783bdb19bf0200db5c5cb9d83cddf79306aeaa404f", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/expand_circle_down.xml", + "upstreamIcon": "expand_circle_down", + "upstreamPath": "android/navigation/expand_circle_down/materialicons/black/res/drawable/baseline_expand_circle_down_24.xml", + "upstreamSha256": "60e6235a31ca8460e3a45e0752d53b1661e0c9e78271d482a13525c2070b79f4", + "localSha256": "94af3bb97725039a3e3491503186a952e384bc129cde33373ff2492326d0f61f", + "orderedPathDataSha256": "e518ef76b38ff5d988ac66f01fb7659490f240a9833bd6a4737116298701d4b3", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/expand_less.xml", + "upstreamIcon": "expand_less", + "upstreamPath": "android/navigation/expand_less/materialicons/black/res/drawable/baseline_expand_less_24.xml", + "upstreamSha256": "45e41ae2dff48cd0cf4aa992ba7fd20961dfa3f8bab440d3dc82edb6dce63b32", + "localSha256": "8fe7f960e438f63b04fa617478a72a947c695526ec39dd8d04e8f2c6e7397887", + "orderedPathDataSha256": "4f749cb9a68b00141de63f493f8756ec167ec6e77c1cb3b74118ad432b149d09", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/expand_more.xml", + "upstreamIcon": "expand_more", + "upstreamPath": "android/navigation/expand_more/materialicons/black/res/drawable/baseline_expand_more_24.xml", + "upstreamSha256": "a8e7b4f7696d6961082b565488ade32c10243e4ce02302803aa1713fd855dbe6", + "localSha256": "a7d1d424457226e1eaaabe607d6a47dfee1093f2f7cd80994f02c91a83a7e25e", + "orderedPathDataSha256": "31e865041c6fb248b0e0a6c89176f14975fae00f8be821069c151dda99afacb7", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/expand.xml", + "upstreamIcon": "expand", + "upstreamPath": "android/action/expand/materialicons/black/res/drawable/baseline_expand_24.xml", + "upstreamSha256": "e8697dd989d3875da6510570f87ac0869009111b65dc9fb3f21ba54ce230778b", + "localSha256": "8b1c38c2fac4dd4c1a2c5e568c59b360e12494faf48eb50d756bdd565da74eaa", + "orderedPathDataSha256": "4f4011755ff9f72911fe6389bc73776ffaa39bf63b3a4495191ef230d0250b33", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/explicit.xml", + "upstreamIcon": "explicit", + "upstreamPath": "android/av/explicit/materialicons/black/res/drawable/baseline_explicit_24.xml", + "upstreamSha256": "603941aaf12cc7e8fe487ebf5ee363ed687d24f891dabf67647b3ba9432d2690", + "localSha256": "9bc285b976d033f9eca204172c7e65f85574ed69fc57ffa106dee4c64ba351a9", + "orderedPathDataSha256": "149f66dddad47eb20db9e806f40aa14cdeea6fd9c36cfa63816ed1c8c673e2d2", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/explore_off.xml", + "upstreamIcon": "explore_off", + "upstreamPath": "android/action/explore_off/materialicons/black/res/drawable/baseline_explore_off_24.xml", + "upstreamSha256": "d3bb72ccd32b616fe22ddb4c2cf1b8f9ab18388797262189eeeccc705214ee10", + "localSha256": "de889e9aeafdbb20781c8b6e32bbdb578465817be7052b69b73a828fde917e15", + "orderedPathDataSha256": "29d1b6dd259fe2727da25279088e586e8ec77ef09f6d262ea827832703e6cff7", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/explore.xml", + "upstreamIcon": "explore", + "upstreamPath": "android/action/explore/materialicons/black/res/drawable/baseline_explore_24.xml", + "upstreamSha256": "4dabe6710cfca5187dd1003413022ef71441439381d7f804e923812c9e099201", + "localSha256": "21e354672ba2d6af10ee8b0e099d08ff78d243209fc42d3a72b100c508c5114b", + "orderedPathDataSha256": "8affcde96e28b4dbf9d81996ea1ba31f0e73837f88b3b8ac74a018af7b680f2f", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/exposure_neg_1.xml", + "upstreamIcon": "exposure_neg_1", + "upstreamPath": "android/image/exposure_neg_1/materialicons/black/res/drawable/baseline_exposure_neg_1_24.xml", + "upstreamSha256": "4491f6e8ac0cb7fe0ca4df2b12e3641f08f8125a3d27a856ec95b5fef606a778", + "localSha256": "fa5dbdf01199ef318694610b1b6ea2ec702042532f6527c2f9ba3152faa34ab9", + "orderedPathDataSha256": "2837875ffcee7c2105546656b1a79fd565f94ce88e51ae633622dfeab0e82a1d", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/exposure_neg_2.xml", + "upstreamIcon": "exposure_neg_2", + "upstreamPath": "android/image/exposure_neg_2/materialicons/black/res/drawable/baseline_exposure_neg_2_24.xml", + "upstreamSha256": "5e7c49c9d1b2a91003dc62c0c0fa0d80db28dabdb82b1acfff534ec5de219b67", + "localSha256": "a4499ff52884509885b3f6d316477b711a061f1886633933cbe04a39430165da", + "orderedPathDataSha256": "15b4c7794c4300edfa44f3193596fcfbe54b2d359acead100ea38a46ca720759", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/exposure_plus_1.xml", + "upstreamIcon": "exposure_plus_1", + "upstreamPath": "android/image/exposure_plus_1/materialicons/black/res/drawable/baseline_exposure_plus_1_24.xml", + "upstreamSha256": "fdeaeca4da689c38d133806be225e0699e639e9eabc3bd7e21ccdef16e0dec17", + "localSha256": "5131064ec11153bb4464b4ba8a7c4e39997f690a72b27c2f9229e294a7faeab3", + "orderedPathDataSha256": "852a4e755cd0b0829116beb3d36dfa32b46842051594d1baa1e00effda799df3", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/exposure_plus_2.xml", + "upstreamIcon": "exposure_plus_2", + "upstreamPath": "android/image/exposure_plus_2/materialicons/black/res/drawable/baseline_exposure_plus_2_24.xml", + "upstreamSha256": "a3557066f0e8f74ca8cfd5be4d55262bf0389fb111a4eec80428db7e3324733d", + "localSha256": "3298ad1e6c05f49fec41cb2961e34764361af8760fe5eddd9d9f6dcd8987c003", + "orderedPathDataSha256": "341af42d6a855977d2f02365ffcd0d33f8c571948fd311021d9da04a28956700", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/exposure_zero.xml", + "upstreamIcon": "exposure_zero", + "upstreamPath": "android/image/exposure_zero/materialicons/black/res/drawable/baseline_exposure_zero_24.xml", + "upstreamSha256": "ebcfe11b9686dea97457cc0180749c8d9a6feaf8efcd77c2d937ad29da7fe5b1", + "localSha256": "79b0a9e6d82582e27f5f0c51c49c6024fad2d48f9a3ce33a6a5c407b9be455c4", + "orderedPathDataSha256": "dbaa995be05446a97bd3117e02e28fd7b3c396b866798c797ef0538ae742bf1e", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/exposure.xml", + "upstreamIcon": "exposure", + "upstreamPath": "android/image/exposure/materialicons/black/res/drawable/baseline_exposure_24.xml", + "upstreamSha256": "5c21df1d5f137336e1e1f5e324d3d1f13167fa51d33b93964249017cb3a52372", + "localSha256": "2fdb8f55fb3168153fe5fe00b2f72cb0f317b877a2bc8fe1c4deafd9a10ac95a", + "orderedPathDataSha256": "792f5b0c196a9d8a67ef6ce592a831c57116bbb9563b2f98ead1591b76fc0497", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/extension_off.xml", + "upstreamIcon": "extension_off", + "upstreamPath": "android/action/extension_off/materialicons/black/res/drawable/baseline_extension_off_24.xml", + "upstreamSha256": "c4dd610316fa089c2c6efc30adf2a49e3158d0474fd43f49e1392e188ea2b097", + "localSha256": "79be725665fb2184137a69cd00deb75ecb026c76a7dd40699091009f277efc35", + "orderedPathDataSha256": "c5a1884c3197466902d99814a30e0895906594ccf1d3693952d67967ba4e7b95", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/extension.xml", + "upstreamIcon": "extension", + "upstreamPath": "android/action/extension/materialicons/black/res/drawable/baseline_extension_24.xml", + "upstreamSha256": "19dd08adf417b3e56270644fa91c55c671c0bf58b3493c2df4bd7684651fc315", + "localSha256": "15146810c3facf2625d7e9995a21979aff1dbdda1c1d7c768e796d4f9a5ba2cb", + "orderedPathDataSha256": "f146996db9a4590af6e5b6890d7bdd5c1142dec0c4dc5960b0087b8e9c8a9eac", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/face_2.xml", + "upstreamIcon": "face_2", + "upstreamPath": "android/social/face_2/materialicons/black/res/drawable/baseline_face_2_24.xml", + "upstreamSha256": "26f8bcf0fd12ac7dfce349ff6fa631fdc3f1e57b8a063e623f96c882e8f0cf0e", + "localSha256": "a21015a30bd4c57c16a45d2c2182e8102c355c4f6b914a79628a51a3b2245ed3", + "orderedPathDataSha256": "255a4125af5e0ccc04642f2e552326637979dab73a0a0ed885d5d5ed04b9a515", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/face_3.xml", + "upstreamIcon": "face_3", + "upstreamPath": "android/social/face_3/materialicons/black/res/drawable/baseline_face_3_24.xml", + "upstreamSha256": "aaa4620dd10892aa3dfd0e416946b761dc86d2f6ac79fcf5e468bf5878db11e2", + "localSha256": "5cceff04511d155e08ad7ecbaed0c3fe22c7aa25dacee3aa9f60b4b14dfe5788", + "orderedPathDataSha256": "44d94d4fb9f37ed378661c36b861f885854ab1fc6805cc35897c11717d4d6490", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/face_4.xml", + "upstreamIcon": "face_4", + "upstreamPath": "android/social/face_4/materialicons/black/res/drawable/baseline_face_4_24.xml", + "upstreamSha256": "b6da9e0656c547aa21893de7943f50371b271233680de3b17e8220a0d8f2d20e", + "localSha256": "96d382357320c6d66c484df66b68f66d9b55d0ba7011d3ae04f15377b5c753e3", + "orderedPathDataSha256": "a30a88f16d91545b694fa23d2fb086a95ae20151fff5be6a87b0550ae8cde19d", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/face_5.xml", + "upstreamIcon": "face_5", + "upstreamPath": "android/social/face_5/materialicons/black/res/drawable/baseline_face_5_24.xml", + "upstreamSha256": "18df36095e07e038a3deeb8e3c195b463b2de0ffec40ee7322a9a13c90b1c979", + "localSha256": "335ee75a13e494791de2b358fe27ed982cec5d6e8e20c91b04905785a18c05fe", + "orderedPathDataSha256": "6ae39e4bd9e8383bf12728794518c8bdd5287211e9749c61d9faa20c8c9ce89c", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/face_6.xml", + "upstreamIcon": "face_6", + "upstreamPath": "android/social/face_6/materialicons/black/res/drawable/baseline_face_6_24.xml", + "upstreamSha256": "a78802eb1c62de3232464639816c354812bc030ca5d1d16989b632288261422e", + "localSha256": "004d754cdd753c0f37931bbc1f1f157581ab51d907425bb8c293bdbe2e954191", + "orderedPathDataSha256": "bfcb37c985386ce86020ddea04c6447f66a04207ed386a07efa2935226ef823b", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/face_retouching_natural.xml", + "upstreamIcon": "face_retouching_natural", + "upstreamPath": "android/image/face_retouching_natural/materialicons/black/res/drawable/baseline_face_retouching_natural_24.xml", + "upstreamSha256": "609f5948c596a7404d2833cf6a7caf93a4304923d8402b4dcab18164913dec70", + "localSha256": "141ac6d985634fa59d9cd0b6958922c32c53abed6cf965c962509dc3bf8f40f7", + "orderedPathDataSha256": "64cd705258f9e390322cb4a7029b2624619ebcf4da10a729cf40ccb421309e05", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/face_retouching_off.xml", + "upstreamIcon": "face_retouching_off", + "upstreamPath": "android/image/face_retouching_off/materialicons/black/res/drawable/baseline_face_retouching_off_24.xml", + "upstreamSha256": "c09cd4c03133375c8ba8046a5217d8259a0e0646b0aa108ea34c106fcb2f55d6", + "localSha256": "10923f1efa475e954b935130547611b37efbcde9e9d93cb492cd5d4de4727940", + "orderedPathDataSha256": "ef97c919c192c4f8122b7eea59345e35635e4972f800328de46b26c12571655d", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/face.xml", + "upstreamIcon": "face", + "upstreamPath": "android/action/face/materialicons/black/res/drawable/baseline_face_24.xml", + "upstreamSha256": "9ad87f04286fe909dfa119a4576f2a00329a64b3575da032228abdf88d6097ee", + "localSha256": "abc9ce37f48a9f201045e7f70b4b41f99f44a5e414629c9b10724b315e405f2c", + "orderedPathDataSha256": "390f0142a15854e1e64ec6904ba64c5f8ebed4547074875fbd3b4fb0e5849a64", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/facebook.xml", + "upstreamIcon": "facebook", + "upstreamPath": "android/social/facebook/materialicons/black/res/drawable/baseline_facebook_24.xml", + "upstreamSha256": "f695fc14d3f41a26203a327c4a8545aabffcef18bcfe4ee6c6354891f69e6507", + "localSha256": "9a371f73e9caacebac127fc5980d68caacd8195efa8cf141f302a39ea97faffc", + "orderedPathDataSha256": "1cab3a9fea157970b3f75827244f7713bd34f0cce3138c074ccd3a95eb1305dd", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/fact_check.xml", + "upstreamIcon": "fact_check", + "upstreamPath": "android/action/fact_check/materialicons/black/res/drawable/baseline_fact_check_24.xml", + "upstreamSha256": "048c4a5e4651cd578a8fbdac85d22dfc2819b6ec828e1960f70112eb9da977c1", + "localSha256": "fc9d5a5a75c67f25a786b33412fdcf3b5484714798c797c084e8b2bbcbb5b76e", + "orderedPathDataSha256": "9e0b15f29274a0924afc5bdde33921928494cdfb2325a56ff426c93145b9953d", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillType", + "value": "evenOdd" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/factory.xml", + "upstreamIcon": "factory", + "upstreamPath": "android/maps/factory/materialicons/black/res/drawable/baseline_factory_24.xml", + "upstreamSha256": "ccad5d50ed0ea3bebd60baf8c818cdc8cffac8db1286c5bf6f8e7a0117781226", + "localSha256": "02a0f31651daae5e10a9a7dd5e61dd643dad90bbb7879c559a97bf244eef2061", + "orderedPathDataSha256": "17870cb1324ad06dc15f81a5ef2dc4616c49fb926dee308df9bacea05742295e", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/family_restroom.xml", + "upstreamIcon": "family_restroom", + "upstreamPath": "android/places/family_restroom/materialicons/black/res/drawable/baseline_family_restroom_24.xml", + "upstreamSha256": "3bb03ab7da2508d2009c3f9a6b901e6035da119298439b5f095a78732c564d78", + "localSha256": "6ab8367bf151a58949e60760437b6e8cc7faa7bd1326564de5393fa7c1c1ec37", + "orderedPathDataSha256": "2e485b76c960a48cbf4bcf805967e81bc36b3b752a9aee2d436729bb8af800b9", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/fast_forward.xml", + "upstreamIcon": "fast_forward", + "upstreamPath": "android/av/fast_forward/materialicons/black/res/drawable/baseline_fast_forward_24.xml", + "upstreamSha256": "b01cfe5674f23334952cdf84e39ed07ea4f9713da19ba9e737fca9d7ede0995a", + "localSha256": "3363b7a15e84ee822edd200c1c533066f7648ae0fda4021c1abd5442738e80ed", + "orderedPathDataSha256": "d6a4ac56c5fa0ee6d551b645cc29fe89081f287c4f0a4207130774ef6bc8e28e", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/fast_rewind.xml", + "upstreamIcon": "fast_rewind", + "upstreamPath": "android/av/fast_rewind/materialicons/black/res/drawable/baseline_fast_rewind_24.xml", + "upstreamSha256": "dabde165cbb7582fb4f732728537630f3d1947f6fae02cc34ad0692fdaea43f2", + "localSha256": "f0867087319dcf5c639227945a5e7a2320d4f239816e840b12bc7c1b8d80eb46", + "orderedPathDataSha256": "01b83dc7640d666036ed431924d4b2098fcb8936e8c08032a817429cb9b3d279", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/fastfood.xml", + "upstreamIcon": "fastfood", + "upstreamPath": "android/maps/fastfood/materialicons/black/res/drawable/baseline_fastfood_24.xml", + "upstreamSha256": "9d1cbf622c2f9666b1c06fac91ab79f5d41b97776e1ea5a4d0672ee3d9a216c8", + "localSha256": "8673a87f00d08cec7cc69013602b2b9bb4ed6a8ee2ca3efe98ac9765d3b2cd28", + "orderedPathDataSha256": "1508b1dd178db5e3dfa805a0eeca40101ccea744dc4f3d60210596ca90360166", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/favorite_border.xml", + "upstreamIcon": "favorite_border", + "upstreamPath": "android/action/favorite_border/materialicons/black/res/drawable/baseline_favorite_border_24.xml", + "upstreamSha256": "89702e4b1f1d4b55b941f288bfff1d8b103a0466cf9d73863ad454c07ab3e3cf", + "localSha256": "de208edf96fa3ec353205977e6eeafdaf0671650efd4bf268a01dc5914bcc334", + "orderedPathDataSha256": "df40d6082d684a2057f981a79976f0c7fe1244e543799845d9704ab02d6ed1a6", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/favorite.xml", + "upstreamIcon": "favorite", + "upstreamPath": "android/action/favorite/materialicons/black/res/drawable/baseline_favorite_24.xml", + "upstreamSha256": "78998f71139eb2c0b057c0d1b33a6f4f6f3fa4e2309f89683616f24fd48962e4", + "localSha256": "690080802e79a6c074580a4978445c4bedc24bee85adebe810483acd250f4857", + "orderedPathDataSha256": "bb0852bb30c5a247acb0562c8962678f8b40a874c5016141026bfcc2693df375", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/fax.xml", + "upstreamIcon": "fax", + "upstreamPath": "android/action/fax/materialicons/black/res/drawable/baseline_fax_24.xml", + "upstreamSha256": "7d4fef341baca4fc7cdc1aac053143cb37abd24ad69a064afdc96fc2ed53beb4", + "localSha256": "400727c02076bc6b0cf7b93bca45f2f630b50e47d8ff978177de0a49e4e44c8d", + "orderedPathDataSha256": "e2e42a35acf4249e0f71a9d42421c0a8b6913318407cba4000c6a8f4ceb2b7a2", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/featured_play_list.xml", + "upstreamIcon": "featured_play_list", + "upstreamPath": "android/av/featured_play_list/materialicons/black/res/drawable/baseline_featured_play_list_24.xml", + "upstreamSha256": "96ba110aa020eb4e5267c84c96ad6aff3844a4053568a51489194ce5bb60ab0a", + "localSha256": "7d49dbd145266e083e7d52fac3a20be5707f8396117da38e1ab5fb87851952be", + "orderedPathDataSha256": "77255122d01c277e38f06580cb608ad0a45ae3d23de24a441ad06ae54715335a", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/featured_video.xml", + "upstreamIcon": "featured_video", + "upstreamPath": "android/av/featured_video/materialicons/black/res/drawable/baseline_featured_video_24.xml", + "upstreamSha256": "995faaf6170fe48f09cdff7df30edf7d087bcf0646916569f812b328cb3cdb6d", + "localSha256": "1ab1eba62a4c9b662e7b48a2ba8cbe84515fba70075c855e29e46d9f607b1fbd", + "orderedPathDataSha256": "68e6444b0d33aeef3ff1ca76d023a188a10ec0d0937521db4663e7cc34169d21", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/feed.xml", + "upstreamIcon": "feed", + "upstreamPath": "android/search/feed/materialicons/black/res/drawable/baseline_feed_24.xml", + "upstreamSha256": "311975abf1346ef81fc33444b2df8bc82c658c6719a32f759f28e1c68dfe1678", + "localSha256": "060278b4ff6c1444656a9f4217887e7cfad1d00a11e4d732189ed0d99a0b10f3", + "orderedPathDataSha256": "6902e85802a2f09a3520df6a0516e53ac85feb2b1ee9fa30dbad0a61bb8cc405", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/feedback.xml", + "upstreamIcon": "feedback", + "upstreamPath": "android/action/feedback/materialicons/black/res/drawable/baseline_feedback_24.xml", + "upstreamSha256": "2a25c4d85b762d7a199a8082baba38763b76aebb210cc5ae9073f99404babdcc", + "localSha256": "4b84ae42b8c578eb96c881005d928108e809230b29e6fe8e898c3c2b060146a6", + "orderedPathDataSha256": "293cb7716f342cca8c6e4dcd7f9f757a36096c7a67d22c4572cebaba15b94119", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/female.xml", + "upstreamIcon": "female", + "upstreamPath": "android/social/female/materialicons/black/res/drawable/baseline_female_24.xml", + "upstreamSha256": "0bac6b77d67defcd164bb19efcb98be368fd541a95ccae7fdbf330b6072493c6", + "localSha256": "e03463d4355134c3fa7b3eff030f5f9ea956d0b9e0dab0748d202cde3561fd90", + "orderedPathDataSha256": "5cfdeb33b1cf16f03ab7ff43d5d513e4bcdda39f7a83c2b84282c6ab1c74c7d4", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/fence.xml", + "upstreamIcon": "fence", + "upstreamPath": "android/places/fence/materialicons/black/res/drawable/baseline_fence_24.xml", + "upstreamSha256": "28d49444bf460aa4ffe932d1dbe87d2fd02e1b6beeced565948652947d79ca6a", + "localSha256": "045261b1c3a232cb4197aad66b00557bc66bad9c7e1d7ad29901157b8e420335", + "orderedPathDataSha256": "bbd6a9dfd2bbfc20aa39fc851f473ab018b4530c99baaeadac1bf92bcc8def14", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/festival.xml", + "upstreamIcon": "festival", + "upstreamPath": "android/maps/festival/materialicons/black/res/drawable/baseline_festival_24.xml", + "upstreamSha256": "8fa348b35a78f509bbd3ea83737e6e3f52cee021c3ee1e4f979d4728545b3bf7", + "localSha256": "a58745e1c22e35080f5883040ebf80cc06ec8d2f7cc75de6be8f2304194fc022", + "orderedPathDataSha256": "590a1ca255af31eed4b1179727e269adbb30ada982f10982ebfae14bcd8b23fd", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/fiber_dvr.xml", + "upstreamIcon": "fiber_dvr", + "upstreamPath": "android/av/fiber_dvr/materialicons/black/res/drawable/baseline_fiber_dvr_24.xml", + "upstreamSha256": "49d8c8faab5d460012098e856ef2e8c7b0374abc4fbd9ca5b6f1803c3b127e93", + "localSha256": "dc5619ce2ec0bc0d9f5d15960d24a63ac89c80966ae563c4f657e985f6b4b115", + "orderedPathDataSha256": "e989eded9ba7f0b466f20bc6c9623bc7742eda3e11f206acc212d04f8a7d0813", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/fiber_manual_record.xml", + "upstreamIcon": "fiber_manual_record", + "upstreamPath": "android/av/fiber_manual_record/materialicons/black/res/drawable/baseline_fiber_manual_record_24.xml", + "upstreamSha256": "8dd5dbaf33b351b591f9132079f9dc11beec8115eca1640f22ee8351e467bd04", + "localSha256": "57a5eb62dab31c30c6fd79d78b95b96908c03915aea8a0db4f775f214a00d642", + "orderedPathDataSha256": "4f4bbcb4d2b2962e743c8ba86874440135eaedb3cd7a1a1738545461f57ee1b8", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/fiber_new.xml", + "upstreamIcon": "fiber_new", + "upstreamPath": "android/av/fiber_new/materialicons/black/res/drawable/baseline_fiber_new_24.xml", + "upstreamSha256": "a183d649a3def91610440513bfbdc81054531536895b6c92075d023b9f827417", + "localSha256": "2616c8c67a8b11ad25d5d013dde961626e75116d68bd8e6bc183a0e93aa29dc8", + "orderedPathDataSha256": "ed169d5b888d79fcf96b4fa3a1cc94cd16273710f8948b6717e75a7400c22952", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/fiber_pin.xml", + "upstreamIcon": "fiber_pin", + "upstreamPath": "android/av/fiber_pin/materialicons/black/res/drawable/baseline_fiber_pin_24.xml", + "upstreamSha256": "44009e8554bac16df7f1bcdebc08eac1c85b9ec29cdda7f30688870e489bc1d3", + "localSha256": "c7db78f352c47ca0866a56967b1d7efc67c81c9140286d71a033247d998488de", + "orderedPathDataSha256": "21660acb0ab2fd529a4d3f8d779f60a1b0a3bb272c3a38b837edd3cc986a232a", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/fiber_smart_record.xml", + "upstreamIcon": "fiber_smart_record", + "upstreamPath": "android/av/fiber_smart_record/materialicons/black/res/drawable/baseline_fiber_smart_record_24.xml", + "upstreamSha256": "24bc2bff133ed9c8efa9dea650b0190af40d3370fa12dd89727c1b1b21fe4e97", + "localSha256": "970c26429ad4d99721c4bfbd62a415042c1225186d86dc0460ebc9decb9ca24c", + "orderedPathDataSha256": "ab26b0f242145f7be0fc3a90d686d79230b626365a73ac68c0a2947d12e90339", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/file_copy.xml", + "upstreamIcon": "file_copy", + "upstreamPath": "android/content/file_copy/materialicons/black/res/drawable/baseline_file_copy_24.xml", + "upstreamSha256": "87709a1da41508b73a0bad55a6741cd1835aaa2ec72012d354e9d86967fb44f3", + "localSha256": "0c038bc33c58dd0736d73203e6cb3bba7bb8f476465d1dc19d88faba32d9df79", + "orderedPathDataSha256": "3fee369e9ea687590e97bf8c6726dc987445ac6ee26816034f8b16d5ef7913bb", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/file_download_done.xml", + "upstreamIcon": "file_download_done", + "upstreamPath": "android/file/file_download_done/materialicons/black/res/drawable/baseline_file_download_done_24.xml", + "upstreamSha256": "ad9d6809370a419ed3d5ce3a88da1c553365f443dab686fd7ca40d283bae4378", + "localSha256": "f034d3355d63f73455d91ca27db15abf8eed2a405467c363430b8d9600004ca9", + "orderedPathDataSha256": "d382c1e67a9df1bfeb800520bbdcdcda2dedce6d72494ed6f4d15207d28a8faa", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/file_download_off.xml", + "upstreamIcon": "file_download_off", + "upstreamPath": "android/file/file_download_off/materialicons/black/res/drawable/baseline_file_download_off_24.xml", + "upstreamSha256": "de3cea7195e1a9bb6c243796ed511f65738afa7e6ecd9c58e79d278750b711ef", + "localSha256": "73b031b6ce666d4ee6f5aa8cd975132659546ca931a390601ebcff8c98d9343b", + "orderedPathDataSha256": "bcf63c196dcae5740ff41542e30b8fbe152f22ccc08d6552d45e22bc53451d4e", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/file_download.xml", + "upstreamIcon": "file_download", + "upstreamPath": "android/file/file_download/materialicons/black/res/drawable/baseline_file_download_24.xml", + "upstreamSha256": "06325b3f7ec9822a0b2a95e66f0b0d71d07cb3665a7126925a1728661d2d2c33", + "localSha256": "5a15b5c20341348b619858c07dcc996279d53f3703c1ee7850ed3fad91ed7de3", + "orderedPathDataSha256": "f27af47834e16512610a18ac94a0443b8934f6e09a4b657874819a9295ce0f3b", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/file_open.xml", + "upstreamIcon": "file_open", + "upstreamPath": "android/file/file_open/materialicons/black/res/drawable/baseline_file_open_24.xml", + "upstreamSha256": "dd59f837978b2230a8b4baa541fb6d82e3e61a9d980a98e67f212cf3f9d88f7f", + "localSha256": "bce7e14ae0af6903c45b0806442532fd5b9b4e059b2eccc67278c18ff95c67da", + "orderedPathDataSha256": "f3aa37488d5bf03af6445ef9af17a36cdb37c1e364f7a23102485f6d9b9015b1", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/file_present.xml", + "upstreamIcon": "file_present", + "upstreamPath": "android/action/file_present/materialicons/black/res/drawable/baseline_file_present_24.xml", + "upstreamSha256": "81b5d28f9882c5543e9d06e16b7a08bd37fe6b48e446c88221f66f46b56268ee", + "localSha256": "0d90c437fcd0cc97eada0700408f66c840b82acdc9253f820aec4f0e0bef81ee", + "orderedPathDataSha256": "7e9b49f5e4d69af0f3b439bac0839c1a686c707aa20a9c3617ed440f94d58f67", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/file_upload_off.xml", + "upstreamIcon": "file_upload_off", + "upstreamPath": "android/file/file_upload_off/materialicons/black/res/drawable/baseline_file_upload_off_24.xml", + "upstreamSha256": "6f024c26c1fdfe8c7e738404af11eb39bebef30630149abd02b5463d1019a08e", + "localSha256": "05ba2fac615a08a1136ec2a88268b2363480f74f130f50176d67e2c0226ce40c", + "orderedPathDataSha256": "e566f2666ec11cdc7c31b4509f0f3f3007de94c6d43ef5e06c13e1518e027a3b", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/file_upload.xml", + "upstreamIcon": "file_upload", + "upstreamPath": "android/file/file_upload/materialicons/black/res/drawable/baseline_file_upload_24.xml", + "upstreamSha256": "2eb0fd14fda07c23ca087c178ee2ec9657bee4af0ab49c4f277e6eadae39cf5e", + "localSha256": "fadb2cfe98cd25a7167ee29cec1efb5759e25351687b3350f941710d7514506f", + "orderedPathDataSha256": "564bd31bd0a7b2c5dc0e8f8f58e73e0ea4cba0dbb1a552bde06d8b07e4a03e18", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/filter_1.xml", + "upstreamIcon": "filter_1", + "upstreamPath": "android/image/filter_1/materialicons/black/res/drawable/baseline_filter_1_24.xml", + "upstreamSha256": "e4df372873c9b849f3775b955a1dfcecc12e19f2975079f6467a930db2430cd7", + "localSha256": "537580c66a54aa6fc3f63f1899c86d24e90c3af829692acebf41e871a9b0d5da", + "orderedPathDataSha256": "02abfc5ec68e35045d9de2a66d62d72cf3181976ef6523324224e738cb03c3c1", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/filter_2.xml", + "upstreamIcon": "filter_2", + "upstreamPath": "android/image/filter_2/materialicons/black/res/drawable/baseline_filter_2_24.xml", + "upstreamSha256": "deda1562c0e7b2db993fb08921e0c6e73227027179cb11a493823b5ee8c37274", + "localSha256": "e361650cba77bc95c9a784f69f24fe71a9666e212d0881c35b1558a31f16eb53", + "orderedPathDataSha256": "390cf34832a44a2ca5dd9e0a170bca963dcc6191952533524996bd300a6c4efb", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/filter_3.xml", + "upstreamIcon": "filter_3", + "upstreamPath": "android/image/filter_3/materialicons/black/res/drawable/baseline_filter_3_24.xml", + "upstreamSha256": "db12621f954d40f3be52bbfa9b2727f938be6e8404b178077f155c9010ae41ed", + "localSha256": "962dfe01241a37e15c1beb1c992282383af0d08d6853c21999f4ccf9b2a88984", + "orderedPathDataSha256": "17dde8b26a88e8240bbcd15a0ffea5a516573fd7572458ef6013bf023a57f675", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/filter_4.xml", + "upstreamIcon": "filter_4", + "upstreamPath": "android/image/filter_4/materialicons/black/res/drawable/baseline_filter_4_24.xml", + "upstreamSha256": "d31cf615bd74be2970e4d6842a8aa3dea19c0514614adba73864128298807967", + "localSha256": "fd5d009e949b6bcfe925331fb586f2969c29b0c2351568f9a2928e6ec9a178c1", + "orderedPathDataSha256": "b409ebe112070b755fab381901ac89bebfa043de0b230bf2c965ea49e669b115", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/filter_5.xml", + "upstreamIcon": "filter_5", + "upstreamPath": "android/image/filter_5/materialicons/black/res/drawable/baseline_filter_5_24.xml", + "upstreamSha256": "36a2a665770fe219b5d76431b161861135728c8b899be8b5f7a348e5603b88f3", + "localSha256": "94ab5b6a974b0325335c7fff901edb4675b684fb4a03ae40d14ffcd580ed4404", + "orderedPathDataSha256": "c5c8f9e03cd7697debdd2fa8fcfbc39aff3bebe8ef5eb7e3222b0d6486c7b6f3", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/filter_6.xml", + "upstreamIcon": "filter_6", + "upstreamPath": "android/image/filter_6/materialicons/black/res/drawable/baseline_filter_6_24.xml", + "upstreamSha256": "bed7ee73072ad17753f1abdc12f72e79099b150d00d410b4633bb1aab39dd7cd", + "localSha256": "0bab043342782078900834150816d46f2fffb70d02ad69329280b01a26f60b8e", + "orderedPathDataSha256": "3b96817c15caf8ec98eaff2890a54cffcad2fdebde4a9650e55528ae72e1fbf0", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/filter_7.xml", + "upstreamIcon": "filter_7", + "upstreamPath": "android/image/filter_7/materialicons/black/res/drawable/baseline_filter_7_24.xml", + "upstreamSha256": "ad8a6677e9f1b32d92ae4198604cb30851c7aa325386553246112088bc2348cb", + "localSha256": "ccbf0657875f426b1ef6b903bcbc4d8e407470785fbd8ab3abc40c00c8f02bd1", + "orderedPathDataSha256": "8ea4ef5ecc22c4cde8dd64b14b9011ba68a4e7ee081a67b11a9f529a2c937f9b", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/filter_8.xml", + "upstreamIcon": "filter_8", + "upstreamPath": "android/image/filter_8/materialicons/black/res/drawable/baseline_filter_8_24.xml", + "upstreamSha256": "f78d28faaa8b018852c0e5153e5286b21c2669fbb310cfb58e93a1d065fafdcf", + "localSha256": "849e8d45480f54828964a8877be9e68c0c2793c205a6924a6e0c0b952f16dcee", + "orderedPathDataSha256": "321bd98a9bf52d67a3a2dfbdf24f5ba88ff7faf1422de321f5dc4947bd091bc4", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/filter_9_plus.xml", + "upstreamIcon": "filter_9_plus", + "upstreamPath": "android/image/filter_9_plus/materialicons/black/res/drawable/baseline_filter_9_plus_24.xml", + "upstreamSha256": "581a7dc65e256b045e1e74edc3e175594423f89fbd3767d2bd7cb525c7722265", + "localSha256": "265c4c57f7ec17479be6a33a91b30c9208552c252dc19168e693f400cb26b386", + "orderedPathDataSha256": "c9a1769ac6e59fcf2ed484dc6c2717b6fe009d047763c84a22ab23310515f3a2", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/filter_9.xml", + "upstreamIcon": "filter_9", + "upstreamPath": "android/image/filter_9/materialicons/black/res/drawable/baseline_filter_9_24.xml", + "upstreamSha256": "94c478c20a73fb844e1d3d723aa9ce1773350514b5010a7352fc7668a09682a9", + "localSha256": "756419f16a30877792eecf1d53e03acb543066dcf4f65504aa127ef81c5a6490", + "orderedPathDataSha256": "9b993890e46795e974d22c88a08d94d0556c4657f4ccb39c90bc619abf636b1e", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/filter_alt_off.xml", + "upstreamIcon": "filter_alt_off", + "upstreamPath": "android/action/filter_alt_off/materialicons/black/res/drawable/baseline_filter_alt_off_24.xml", + "upstreamSha256": "7da915d8c080574b9f6527a80244af9246bb24a2d2d3b088b06da8f1e925ae54", + "localSha256": "fd3a9f125a6d88b84bc98b34a6aa76740330e95c8c84e5d72073865894b798f2", + "orderedPathDataSha256": "879bf236588adeb71c6bb78fb4a9831009c42a1c312fbb64d0e800745edec055", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/filter_alt.xml", + "upstreamIcon": "filter_alt", + "upstreamPath": "android/action/filter_alt/materialicons/black/res/drawable/baseline_filter_alt_24.xml", + "upstreamSha256": "64d14943a6d5c74ceb16577cf2930fc452afbe3867caa337eaa602d7661d3b7b", + "localSha256": "0e73ecce2c17d116adec9c954525fd58a0921cfda776467c7fc620f4866678f8", + "orderedPathDataSha256": "577b503fe9af9272934a2286f896bed5c3513b8bf1661fad0cf5a85aefea35da", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/filter_b_and_w.xml", + "upstreamIcon": "filter_b_and_w", + "upstreamPath": "android/image/filter_b_and_w/materialicons/black/res/drawable/baseline_filter_b_and_w_24.xml", + "upstreamSha256": "52b56645f5f788561e1efcbfd8f6de3b46edafe6ab874f000821ff09edb75eb4", + "localSha256": "165cc72ee5a4d3e5edbde4e73ce600649a8d66bba542c233bec6185ea602bac3", + "orderedPathDataSha256": "af2bd2cff59bbcdd2254a677740c980716566928b5ee2d806a439dcaa07313ef", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/filter_center_focus.xml", + "upstreamIcon": "filter_center_focus", + "upstreamPath": "android/image/filter_center_focus/materialicons/black/res/drawable/baseline_filter_center_focus_24.xml", + "upstreamSha256": "def9793d7c1ab966ea789fa5795fbe6ffa4e3ef058112939d393879ce22b88a8", + "localSha256": "e741d058137b3a229747c7df7065a815723582d310359e47dd0f134e390ff4e0", + "orderedPathDataSha256": "9b3083cb92978fe1de4d096bcb3097ea5fc717e9e27e87041cbd2ff0c8737890", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/filter_drama.xml", + "upstreamIcon": "filter_drama", + "upstreamPath": "android/image/filter_drama/materialicons/black/res/drawable/baseline_filter_drama_24.xml", + "upstreamSha256": "4fa9ee38bbabc1aa1cd1ace51fa7db208c5ea18a3a21f6086826c6da6b429dc1", + "localSha256": "6b0d8735055e27b7928e3df03ada4ddf44f7290f46cfffe1db47392e297b93fa", + "orderedPathDataSha256": "e255d21b0e7b94ab453f0251065133322675a0818398f633b16602813941c2fc", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/filter_frames.xml", + "upstreamIcon": "filter_frames", + "upstreamPath": "android/image/filter_frames/materialicons/black/res/drawable/baseline_filter_frames_24.xml", + "upstreamSha256": "6dd9d8e8e3eb391470f5755243bf8738f0e67b76e770843ff3d4604738aa8ec9", + "localSha256": "1e28d0ce30f6b6202840d4201d71b3eab0a6da1ba08abe1a4524d718e1e37853", + "orderedPathDataSha256": "84ed8a2ec83745b0d27642e1ff94d3a6020b784a837fec0c3dece1f2c31e3388", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/filter_hdr.xml", + "upstreamIcon": "filter_hdr", + "upstreamPath": "android/image/filter_hdr/materialicons/black/res/drawable/baseline_filter_hdr_24.xml", + "upstreamSha256": "e5065ce0ffd0587faf876c2fc79b6a64f144b6816693755957a7cd9f013d0e41", + "localSha256": "c6058f480bcdba9592dbc779687e34e2d57b5623f3d7d72294a61e337fcbd614", + "orderedPathDataSha256": "6ad7a00d57046a5e4decc4255e68931708d27e3f6b8d6fe1407130c95d1408d6", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/filter_list_alt.xml", + "upstreamIcon": "filter_list_alt", + "upstreamPath": "android/action/filter_list_alt/materialicons/black/res/drawable/baseline_filter_list_alt_24.xml", + "upstreamSha256": "eeefadb9ad833a2d10824900827a1d613ad7289380e7241272abce07be571649", + "localSha256": "ef040ace2d1af9e92e6a329dbaecd6caaa9681e471b38243404fc1cc3d2a9139", + "orderedPathDataSha256": "0f57898d3d58b7f2b485588e05a368e5b49259d51930cfa32d52ed97d486884c", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/filter_list_off.xml", + "upstreamIcon": "filter_list_off", + "upstreamPath": "android/content/filter_list_off/materialicons/black/res/drawable/baseline_filter_list_off_24.xml", + "upstreamSha256": "72c7f77b1731bdc96ba9eac730055884bab618891649876276b095548961b3aa", + "localSha256": "5a7ae7d4dde6a79ad041ecff4a9a73f6438ef4d918a12ae462792bff59e7a98a", + "orderedPathDataSha256": "f965d244d3b7e4ad100d437d3ecad80db8a58d8f306e6d5230f3d0f1c80a2b8b", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/filter_list.xml", + "upstreamIcon": "filter_list", + "upstreamPath": "android/content/filter_list/materialicons/black/res/drawable/baseline_filter_list_24.xml", + "upstreamSha256": "43050d2721e6fc5f2b93b406ddc40e18abf6414d18b06fe4708b555fc537a700", + "localSha256": "34e9a48a36643d4b10dccc5c1cb374af481c441a66b7d1093e00d05097914fab", + "orderedPathDataSha256": "8ceab339288c382ced2fe92ad58e8bc7e4d8e8e987b7201b742e07aa430f284e", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/filter_none.xml", + "upstreamIcon": "filter_none", + "upstreamPath": "android/image/filter_none/materialicons/black/res/drawable/baseline_filter_none_24.xml", + "upstreamSha256": "639c5e87144673c25c8c9ccc98d12b6082745c2d663a3194715e70a7b1be22db", + "localSha256": "debd1361c315a757fba1bf0b56bc7597956c27e2eb13d39d809be8b7783017ae", + "orderedPathDataSha256": "3899d34d188d52739577b63453c3eda1f6f24546e2d6d9a932892a5025421355", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/filter_tilt_shift.xml", + "upstreamIcon": "filter_tilt_shift", + "upstreamPath": "android/image/filter_tilt_shift/materialicons/black/res/drawable/baseline_filter_tilt_shift_24.xml", + "upstreamSha256": "b011edc09ebeb60203bc1fb78d9e56c222f11cc6e44b66b667059a356b94cb05", + "localSha256": "aa24d80b05454843e1a711e4c32c453410ee5146f23220f5d7b6b436964ce17f", + "orderedPathDataSha256": "ef3b6b1c8e4eda34028697bae8f5041cd650fe844fb4c58b357b043cceaafa84", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/filter_vintage.xml", + "upstreamIcon": "filter_vintage", + "upstreamPath": "android/image/filter_vintage/materialicons/black/res/drawable/baseline_filter_vintage_24.xml", + "upstreamSha256": "ac83f9bf1a469bef8a178330dd96245392066a0b93c7d8e3d3ca20e269c5f046", + "localSha256": "3b0987addc603b280f9b05638814d9afb5686ecb6af1d459e7b8ca52d972f655", + "orderedPathDataSha256": "a9ef98b25ae55a208c022e8a3d8566bb75ecd91d76862b626abcdd6167e8d0f7", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/filter.xml", + "upstreamIcon": "filter", + "upstreamPath": "android/image/filter/materialicons/black/res/drawable/baseline_filter_24.xml", + "upstreamSha256": "9b503b23789f6afb432edc1b1da8ea9bcf14b71ab436662b4842db7d1fed60e1", + "localSha256": "2bfdf4eff96b8ffc2cd66b083a261d7ca9aa9d72f4cba571295c36e584261fdd", + "orderedPathDataSha256": "a0a03dab0d0661f3b41feeab42594d716d70436e9810cec68834d308f62b4233", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/find_in_page.xml", + "upstreamIcon": "find_in_page", + "upstreamPath": "android/action/find_in_page/materialicons/black/res/drawable/baseline_find_in_page_24.xml", + "upstreamSha256": "fe92a08abe291bb9ec84bbcd29a9b4966e1817a6277ddc66cc3646089d95399c", + "localSha256": "5e627805cfe4a230ef6ed3e38bf9e809f8075584fb5960e49e34b4774706a6ad", + "orderedPathDataSha256": "b2a634fc51ebb8cb7870bb67b6d27e7b9e2fde55d675e890c4a2f96f65ace2e7", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/find_replace.xml", + "upstreamIcon": "find_replace", + "upstreamPath": "android/action/find_replace/materialicons/black/res/drawable/baseline_find_replace_24.xml", + "upstreamSha256": "12dbb843e410e5a759068592ad4b23962dbef67c8ce3d69b2eeac3e168b0c48f", + "localSha256": "e69041104655d7365c486e098b78cc29bb7141ea94554afea91c3a16b6550df7", + "orderedPathDataSha256": "dca6bf81bc9e14a12c9f3906948d8be496c9c5e195ac472a3be2faeec63f426d", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/fingerprint.xml", + "upstreamIcon": "fingerprint", + "upstreamPath": "android/action/fingerprint/materialicons/black/res/drawable/baseline_fingerprint_24.xml", + "upstreamSha256": "4d5242d02318525e35b9ab75ca2072294e92b7474d33206fc8bfca24351d197c", + "localSha256": "3fb283459b8df01f69e24b15b3ea5de74423ecb398e9c032b3cdd37aeabeb221", + "orderedPathDataSha256": "85e9df235831debc9d2fb80bd846ded5501e6286fd1ab9c8674e1fca3f6031d7", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/fire_extinguisher.xml", + "upstreamIcon": "fire_extinguisher", + "upstreamPath": "android/places/fire_extinguisher/materialicons/black/res/drawable/baseline_fire_extinguisher_24.xml", + "upstreamSha256": "c06aacf3b882aaf25112e2e2459814b3afa15f81a7e266748f4bb1d512def144", + "localSha256": "afd1d2ca798670f14e6ad2bd4f60c1b31089ee71f3f400a907e08d64f4e57eb0", + "orderedPathDataSha256": "d88270f5d1c4b368c773195caa8e2dbeb4a5a6ac44331e280d395914d330114b", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/fire_hydrant_alt.xml", + "upstreamIcon": "fire_hydrant_alt", + "upstreamPath": "android/maps/fire_hydrant_alt/materialicons/black/res/drawable/baseline_fire_hydrant_alt_24.xml", + "upstreamSha256": "fa138741c39b9830027a6afd07c101915c6aab768da3a54782da87e457aa2cb2", + "localSha256": "ac75f2e293c2549ac7328edec7501d72310f3ed10b56d2941f9a7bfdcf569149", + "orderedPathDataSha256": "6023ce9ea1559063bd1387c73cdab61529a30d0e24c3b08c5c2f15a4087919b4", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/fire_truck.xml", + "upstreamIcon": "fire_truck", + "upstreamPath": "android/maps/fire_truck/materialicons/black/res/drawable/baseline_fire_truck_24.xml", + "upstreamSha256": "a2ef14757904e77ecd4f49023f97e54a32cf59fe50e7b5238f28acf421a18a86", + "localSha256": "3d34da125c2aa763e8df14cd1ad280fafb1afea38c23c2b6b1b3e677d1ca66c2", + "orderedPathDataSha256": "5cbc40949cb26a120a5b4a4b08a0fae3aa94c565b2605efb68367fe950243e0e", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/fireplace.xml", + "upstreamIcon": "fireplace", + "upstreamPath": "android/social/fireplace/materialicons/black/res/drawable/baseline_fireplace_24.xml", + "upstreamSha256": "b444c70632f72d075eb8c0475726e622936e4af2d2d8697da3ff837fe4ebc031", + "localSha256": "aa6ab0515464daa23c32cc694469c097a56d9d313d22335f72f341859a8c9501", + "orderedPathDataSha256": "f09420649d3c7c2ab19f1c6756e38dc4b6f2b69164117437d4e4fcbddb82426d", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/first_page.xml", + "upstreamIcon": "first_page", + "upstreamPath": "android/navigation/first_page/materialicons/black/res/drawable/baseline_first_page_24.xml", + "upstreamSha256": "5e2553871dc8199531af8c016396ffa70256703e24c03da127112c9b8ee70d43", + "localSha256": "27af983943bb6a567eb610d6a6236f6846e11c88ad1740378166227500cddf69", + "orderedPathDataSha256": "1b2679eb9eda384076c607b61783258b3f6eb97f1df13c049e1fa6ee54decf17", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/fit_screen.xml", + "upstreamIcon": "fit_screen", + "upstreamPath": "android/action/fit_screen/materialicons/black/res/drawable/baseline_fit_screen_24.xml", + "upstreamSha256": "1be1602371636b423f270ecccb92d12751f4ce6ce565a23868fa45b66e754da4", + "localSha256": "f31032cdd36fc56b1ad4ecbd8a9c7afc3b635413e61e8a49c122c81a95f6a0ba", + "orderedPathDataSha256": "5c2309e9d064df931587c6b20d467578ee3ad6738bb7b46b27426c3c9e403f49", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/fitbit.xml", + "upstreamIcon": "fitbit", + "upstreamPath": "android/social/fitbit/materialicons/black/res/drawable/baseline_fitbit_24.xml", + "upstreamSha256": "c5aa7f5456bf0caaea8b884d57ba0d854e50b2208b8c67e0c0d48bdaf650306f", + "localSha256": "9a436f987941b5fc55164395b319c594b0f3efbcd7e8b400c0eca101722767d6", + "orderedPathDataSha256": "228c444f7d2b7679b77e9cc3b875e7bf17bbc748bd6be90dc20259d24ef9af49", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/fitness_center.xml", + "upstreamIcon": "fitness_center", + "upstreamPath": "android/places/fitness_center/materialicons/black/res/drawable/baseline_fitness_center_24.xml", + "upstreamSha256": "41b606ae3108b3651b68695260f2ed0251b1db07f7478760f861837e3d7de300", + "localSha256": "4e0c8b38453b8f2fbe02ee290db752750df11ca548bad93b438ad8705bf0d1d1", + "orderedPathDataSha256": "2fa5470f88679caf0f97bf03ed25f83d18d805d56ae1c8917f9c19b8eb830f88", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/flag_circle.xml", + "upstreamIcon": "flag_circle", + "upstreamPath": "android/content/flag_circle/materialicons/black/res/drawable/baseline_flag_circle_24.xml", + "upstreamSha256": "80410bb3ec3c65499376c5108af547ad97abe9f47e70d86ee373aa1f45660453", + "localSha256": "ef8f69f416684f7f9275832a20a539cc641b297c130805e6994cf65d3a4471cf", + "orderedPathDataSha256": "b2cb66dead77a4ff10897ed7c96e1dd09b45627858760020ef3a1f1b3dab32b9", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/flag.xml", + "upstreamIcon": "flag", + "upstreamPath": "android/content/flag/materialicons/black/res/drawable/baseline_flag_24.xml", + "upstreamSha256": "8e642329ab85bda6bc0092feedfd328e15d1f7ee45c07141bf15270fa549bf34", + "localSha256": "9bf8a571226595fca77ce3a9f1f2c0f05fe9f46121c258e98240a468a91b8fed", + "orderedPathDataSha256": "b549c7ef778e8c4ab20faa8d6a40e73b98d27c80ef66e3e75ca5c733bd36ef5b", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/flaky.xml", + "upstreamIcon": "flaky", + "upstreamPath": "android/action/flaky/materialicons/black/res/drawable/baseline_flaky_24.xml", + "upstreamSha256": "19ce9d3463c4213512e92de84a9a855332f07504546e85b69ca94c1b21a86a3e", + "localSha256": "7e18b56ac9c3f591f1430cf606975fd20c76182b4dd8e593318cdcc87f2633eb", + "orderedPathDataSha256": "f7a6f439bba3b96a8c3c0ff6964e74523251ff83a36d89fe5ee05662d2dd5dd3", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillType", + "value": "evenOdd" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/flare.xml", + "upstreamIcon": "flare", + "upstreamPath": "android/image/flare/materialicons/black/res/drawable/baseline_flare_24.xml", + "upstreamSha256": "f33511ed028633084e1f3ab37e64783d8118d6be1d186871f0db4bcb33de4dbf", + "localSha256": "66e16e72207369a5da1e3d100e7c7877e15935472c5b1d2dca7b082d92b3a2c2", + "orderedPathDataSha256": "d887fa3e8b7a8f0bff3daa622a32de8d8dacde29ec59519180d7a441ac2351bb", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/flash_auto.xml", + "upstreamIcon": "flash_auto", + "upstreamPath": "android/image/flash_auto/materialicons/black/res/drawable/baseline_flash_auto_24.xml", + "upstreamSha256": "9a9ca01b1b73a338ffe115c89da0ce3b6897ce9dcb38481c8b4216e7a0ddfa80", + "localSha256": "74169502fbf14c7a43ef1a4c1efd5be031a3cb4e3bfb8655a4d45256b2c74bff", + "orderedPathDataSha256": "382d9ab9007ebd12dc354b3277b463aea7abb4c413adb9e5db28edb3e456a775", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/flash_off.xml", + "upstreamIcon": "flash_off", + "upstreamPath": "android/image/flash_off/materialicons/black/res/drawable/baseline_flash_off_24.xml", + "upstreamSha256": "071dfc12e64484540645cc56bc8f8c1415a267f54a239e7bddc02455f98a56eb", + "localSha256": "1af1c5ca5599317163f3c414fa1b6245c7f7fde78dbe53e3656501fd7d8aa1d1", + "orderedPathDataSha256": "6315d2230cb190325bac179b47679fdb4ed036e3275f2db62094697931154a52", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/flash_on.xml", + "upstreamIcon": "flash_on", + "upstreamPath": "android/image/flash_on/materialicons/black/res/drawable/baseline_flash_on_24.xml", + "upstreamSha256": "9e58553a097b8ad52607f34c414312e2d929eff530f0d39c582b4feda6840f8d", + "localSha256": "cbeb1688ec059cddd7f19141f45f9413a87191dc15992405eb4a191ddc992976", + "orderedPathDataSha256": "994d874a5c844abedf3cd2b60fd04e81413b0433447a9e657d67aa3b3ee69540", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/flashlight_off.xml", + "upstreamIcon": "flashlight_off", + "upstreamPath": "android/device/flashlight_off/materialicons/black/res/drawable/baseline_flashlight_off_24.xml", + "upstreamSha256": "c1897ebb541771c680676250ac53c55056230e5f7d8b805cb305cd9f975bb9b9", + "localSha256": "ddf05fbabe9b0fb1eb7fb7f909ffd3bdc4b96feafeb33f4c593d24c4fad39f6a", + "orderedPathDataSha256": "6ac33f07569b22a3271d88e1fd617208044ab30ebbcbf59418f41dd73838912a", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/flashlight_on.xml", + "upstreamIcon": "flashlight_on", + "upstreamPath": "android/device/flashlight_on/materialicons/black/res/drawable/baseline_flashlight_on_24.xml", + "upstreamSha256": "259964d3049dfa9eec3d00747abfc2089d1625e20ce5d9c5f99b0dfd8ac7f2f7", + "localSha256": "7071df64941beedfb822b9a99ad1e7da1beedc55f40dcea5cfdf230e3ed77111", + "orderedPathDataSha256": "3a5838a545700c7c35ce56df83b342cf56f41303392fb40e3dea491f3d8424d9", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/flatware.xml", + "upstreamIcon": "flatware", + "upstreamPath": "android/search/flatware/materialicons/black/res/drawable/baseline_flatware_24.xml", + "upstreamSha256": "d3568d38be104ec34f52cd5aa108dc357201aa0338f31ab134ccb11a251bd831", + "localSha256": "404b68dd4c2008c4c2bc793790fb316ca292addb3da878338595747415cb414c", + "orderedPathDataSha256": "d3a60923f30e0082aef112edbb81c09532eadb08b44a9896772f93afef3a2a97", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/flight_class.xml", + "upstreamIcon": "flight_class", + "upstreamPath": "android/maps/flight_class/materialicons/black/res/drawable/baseline_flight_class_24.xml", + "upstreamSha256": "f404f8224cb921c67dc024f49df24e25903b599f469a3889918f169eba570b64", + "localSha256": "03e26c021351179e761af634a53531d7b1ca469e196b01902a13c3e01a363aa9", + "orderedPathDataSha256": "e99d5fb797e8382e882c862f5d4b392fc5899ae32988bb7831f49db51faddc7f", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/flight_land.xml", + "upstreamIcon": "flight_land", + "upstreamPath": "android/action/flight_land/materialicons/black/res/drawable/baseline_flight_land_24.xml", + "upstreamSha256": "a7c6d28c3e14347783d0a8c9c80de47277421095e2ad11a0a15c8e23b7f9281f", + "localSha256": "d2f3c4ef8196f83d9828fa859d0412d561da7fff55bd589cf8480182df0190f8", + "orderedPathDataSha256": "ae37452857b7b82efb7b42c4535e1f62e6710d527e96ea1d437ee35eab7f4c7f", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/flight_takeoff.xml", + "upstreamIcon": "flight_takeoff", + "upstreamPath": "android/action/flight_takeoff/materialicons/black/res/drawable/baseline_flight_takeoff_24.xml", + "upstreamSha256": "a31fcecf27199d93b0bc4ce22a7acc73bff64fcec024ea90331dbec03d96052a", + "localSha256": "78d7b211b30ceb6b326e87dd2b2d3679a8e96ae41d92c631463edd9dc09dbcbd", + "orderedPathDataSha256": "f208bcaead66e9ee8f86a564a5e7a127eb7d84a89adaa7ebabdef65eea10255f", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/flight.xml", + "upstreamIcon": "flight", + "upstreamPath": "android/maps/flight/materialicons/black/res/drawable/baseline_flight_24.xml", + "upstreamSha256": "df0f43e0622481206476a1903f0e7c321ef2b4efea55189fc87ef588f89f2de7", + "localSha256": "aed8ecd9c7bb99a5324e6e425654f5a5fc94ab1226c829975f4bea36a3b0e949", + "orderedPathDataSha256": "b7a7d45ae43bbbe4f3fbee0ae443ad1e2ddef65cc34961d5d6e261a392c2e842", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/flip_camera_android.xml", + "upstreamIcon": "flip_camera_android", + "upstreamPath": "android/image/flip_camera_android/materialicons/black/res/drawable/baseline_flip_camera_android_24.xml", + "upstreamSha256": "31df6b169ca6d98c82132d0956b9a6254f85816bf1cf88ffcc95ec589b7462bd", + "localSha256": "42e31233550280fd558674311c28b00d8bfecd83c77dd542e57e1d5a02d0fab9", + "orderedPathDataSha256": "c6f7c3dc7cb108d397056b6acfebd97dde1bd379b7f66a227a8e418970345b4f", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/flip_camera_ios.xml", + "upstreamIcon": "flip_camera_ios", + "upstreamPath": "android/image/flip_camera_ios/materialicons/black/res/drawable/baseline_flip_camera_ios_24.xml", + "upstreamSha256": "bff3f09ad0c5f000fba7313be272cff4cb491b00647c811977a9bd7f5c202eb2", + "localSha256": "ba929b148826c38562266c05a7613e81a55ee05a85c40d127cd0924a1cb124e0", + "orderedPathDataSha256": "2df1aacf0495337f53eb3be643065acff1a6bb52dd8468909e4f6c925b101ffd", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/flip_to_back.xml", + "upstreamIcon": "flip_to_back", + "upstreamPath": "android/action/flip_to_back/materialicons/black/res/drawable/baseline_flip_to_back_24.xml", + "upstreamSha256": "8f2540849d66d27a51c34e93f7e63e50a4386785470869a65ba07dc936165199", + "localSha256": "fe2d5e32c4afa6ad875ad997af22fd2420908444ebf2abd0ac4705d5ebf80199", + "orderedPathDataSha256": "5937d2a0873244b904b8fa767a6304e6e17106224a22be9b8504807aeb61e239", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/flip_to_front.xml", + "upstreamIcon": "flip_to_front", + "upstreamPath": "android/action/flip_to_front/materialicons/black/res/drawable/baseline_flip_to_front_24.xml", + "upstreamSha256": "9e312ac3557079d5e88b951af4a1c0cca13d640b9b67e8633eb55c0fe42c4396", + "localSha256": "a0be5176d4b336279420bed02b9058fbc8eaa8e4728df0dca1f98a936f4d5401", + "orderedPathDataSha256": "1a836db6155d21d17cd750780d631013335dbab2314a59a5dfed0dc8f65349a3", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/flip.xml", + "upstreamIcon": "flip", + "upstreamPath": "android/image/flip/materialicons/black/res/drawable/baseline_flip_24.xml", + "upstreamSha256": "1ba96d596066e91ab02939d357252c0325954d312fe7fc2e47280a9abda98b3b", + "localSha256": "2b26ab54180e0b3abe1e082794704a2ff58e1322ec48df7d9538b26f5f1eabf4", + "orderedPathDataSha256": "a8e133da56ea72fa7e1fcc69046742ebf2f485779228deafeaa35b6757e4341a", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/flood.xml", + "upstreamIcon": "flood", + "upstreamPath": "android/social/flood/materialicons/black/res/drawable/baseline_flood_24.xml", + "upstreamSha256": "28e83a5cfb00fef98c739474ec46b8bc52e4bed5303dd6fd26a5d5acf5fa75f9", + "localSha256": "41ee1d07f1f24d9bc0f3dad50d81746787ac8e76929dd4fc68ede90495e5ad34", + "orderedPathDataSha256": "1bb72d16a77452295f3034cd8134b9f4a585d7030247dbdc087c30328b5901f1", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/flourescent.xml", + "upstreamIcon": "fluorescent", + "upstreamPath": "android/device/fluorescent/materialicons/black/res/drawable/baseline_fluorescent_24.xml", + "upstreamSha256": "7c8c7c98a99e77cac43158c3cea7266f178d7ff6cfee5b7041d83e09d204559b", + "localSha256": "c95671b1068bf06216bf5b726e3a2720457ff2e1bb77161ae337cff147877eb9", + "orderedPathDataSha256": "b9f0544ea487f43dc057b2026a99954c7c0744eb9a429b755ea4baac7881e3ad", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/fluorescent.xml", + "upstreamIcon": "fluorescent", + "upstreamPath": "android/device/fluorescent/materialicons/black/res/drawable/baseline_fluorescent_24.xml", + "upstreamSha256": "7c8c7c98a99e77cac43158c3cea7266f178d7ff6cfee5b7041d83e09d204559b", + "localSha256": "c95671b1068bf06216bf5b726e3a2720457ff2e1bb77161ae337cff147877eb9", + "orderedPathDataSha256": "b9f0544ea487f43dc057b2026a99954c7c0744eb9a429b755ea4baac7881e3ad", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/flutter_dash.xml", + "upstreamIcon": "flutter_dash", + "upstreamPath": "android/action/flutter_dash/materialicons/black/res/drawable/baseline_flutter_dash_24.xml", + "upstreamSha256": "74c3b3e10473121ae0452cde0d74a7a358909e79bf7c879b4c569a2fe33d2112", + "localSha256": "7493525da534a80ed266d14e326babb5740a300ab3c212ffac365ab86f174c2f", + "orderedPathDataSha256": "69d85b293a30fe3cd7c2828e22f88c0fd806bfa1253e67f3841eab2e5710715e", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/fmd_bad.xml", + "upstreamIcon": "fmd_bad", + "upstreamPath": "android/device/fmd_bad/materialicons/black/res/drawable/baseline_fmd_bad_24.xml", + "upstreamSha256": "7fad604d8c422f7cd1c412c3e7b44fa19098209b3af47d393dcc09909db45ad5", + "localSha256": "c03187cb7b04091410122f4aaec4774d07ead0a568ef8ccefc699f2f6f19dbb8", + "orderedPathDataSha256": "6fd3c7b4398de44c67ee7aca2b61710089796ef2f502b3db10168097a37236dd", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/fmd_good.xml", + "upstreamIcon": "fmd_good", + "upstreamPath": "android/device/fmd_good/materialicons/black/res/drawable/baseline_fmd_good_24.xml", + "upstreamSha256": "39970b3bae44cecc838b48f73f2918eb8c50d17fd3f1f0b98c147e33b960eda1", + "localSha256": "76793dcd22d8e08c59d6cb69cb7e7d9faf166f8874693452d4546ab3ed2e7315", + "orderedPathDataSha256": "6376f6d9a940545a494d185a00390fcc395a67250e810ce58937dc10513225a3", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/foggy.xml", + "upstreamIcon": "foggy", + "upstreamPath": "android/home/foggy/materialicons/black/res/drawable/baseline_foggy_24.xml", + "upstreamSha256": "31df7c32cc11d72f4cd08ce387f8d819aac7ae853953d072ce3678151c30f930", + "localSha256": "4b546e4032696df3c3ed6f18f6205e3af71c43f02e05925c1a1f2ad063bf83e3", + "orderedPathDataSha256": "2a2c19dc85a8b5f46f838853f7e4ffec9693f4e7576d37837f33eecf0d64cd70", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/folder_copy.xml", + "upstreamIcon": "folder_copy", + "upstreamPath": "android/file/folder_copy/materialicons/black/res/drawable/baseline_folder_copy_24.xml", + "upstreamSha256": "f7badd1fe7b6b39f41239ee32f796dfc32eb0041624857530e9eb484701592ab", + "localSha256": "5e967063979e1face26e9b8ef3c40a20d06c393a19a7e42fa804a77b55ffb958", + "orderedPathDataSha256": "2d063abdd8e98d9df222e4ce08fdf905cc4a7cb8f73860e8690913dbd45deacd", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/folder_delete.xml", + "upstreamIcon": "folder_delete", + "upstreamPath": "android/file/folder_delete/materialicons/black/res/drawable/baseline_folder_delete_24.xml", + "upstreamSha256": "49e8fec05f763a28df042dafd0b3f1bc0596fb7436e6c54cdd318ac313c48c9a", + "localSha256": "6aae1e869e4f8bc21e260593339067187c3faede005df3b88d5251dd87b550bc", + "orderedPathDataSha256": "400f1b370391cbe75d1ed5745e8d61333e67dbe708cefb2953bec4b8436ed28a", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/folder_off.xml", + "upstreamIcon": "folder_off", + "upstreamPath": "android/file/folder_off/materialicons/black/res/drawable/baseline_folder_off_24.xml", + "upstreamSha256": "31b280b2e8c9f832f8bc6200964f52c74edfd87a881905701edc5048df4d5efe", + "localSha256": "2cfdaf8c425ebc1e7979adb3db4378c736ff96934ed2178851d3c5af83bfac0b", + "orderedPathDataSha256": "02358e03b8a42d1ed41be3ef6792b09ce3b56d62b80e468a030d81ddf8759ed3", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/folder_open.xml", + "upstreamIcon": "folder_open", + "upstreamPath": "android/file/folder_open/materialicons/black/res/drawable/baseline_folder_open_24.xml", + "upstreamSha256": "3fb343c1dd0025566c39b96a580ac041fdd0fe80b4c1fe9321fc48fa396e4c74", + "localSha256": "4777a3abce553fd078eebaa43528ef42bfc78a031edfe8102c9f7f89bcfe246c", + "orderedPathDataSha256": "7007a3162ab6e0383891ba5a5245ade5e79802ab010be8ae555cf1b794148afe", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/folder_shared.xml", + "upstreamIcon": "folder_shared", + "upstreamPath": "android/file/folder_shared/materialicons/black/res/drawable/baseline_folder_shared_24.xml", + "upstreamSha256": "99a6efce53b260ebacc96cc8c05405e1e5e8e3e2206207d6f4e54d4c1aaa1bc0", + "localSha256": "7006469306746ac3ba860333c2a0db880de63df5046ed68700432f4fb5b85df7", + "orderedPathDataSha256": "3cd38043e2042c7203b5a3b5623d1f0c31ea63e6843b3a25c7607db2d3f66881", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/folder_special.xml", + "upstreamIcon": "folder_special", + "upstreamPath": "android/notification/folder_special/materialicons/black/res/drawable/baseline_folder_special_24.xml", + "upstreamSha256": "59ea099a93f0aadaa8db70f41c0ceb893f0828636deac13c2f70186b59d5efbd", + "localSha256": "6dd61c61bbb29c151986931a008af2bcbad628e52469599a65b88a7db927f153", + "orderedPathDataSha256": "834d033deecc06ac519036de2d807db23543f9177f78c18bb012fa0d0f77ba74", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/folder_zip.xml", + "upstreamIcon": "folder_zip", + "upstreamPath": "android/file/folder_zip/materialicons/black/res/drawable/baseline_folder_zip_24.xml", + "upstreamSha256": "dbdbc2f629a2a5b8aa29b6ddc3fe3126e66e53ec0b4bb4d823573c11907b4c41", + "localSha256": "91e5da0e55c555a65f95b559deb09d625bb5e3effdc327fa85b3c3bae535e471", + "orderedPathDataSha256": "f30349948dbb78c8bd3086c5b01613c622530b9128348c89e3ca644a9b47db20", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/folder.xml", + "upstreamIcon": "folder", + "upstreamPath": "android/file/folder/materialicons/black/res/drawable/baseline_folder_24.xml", + "upstreamSha256": "50ba0d8fbe7fdbfa1fd39fb3f19fae1152a9e843c1e9f924adb3b4d972c9eb90", + "localSha256": "c5f7a8e2bc0c5c1d34967cf5591b5ac1efe452faf41fc2625542c28e756d8f3d", + "orderedPathDataSha256": "34644644dc3458ff760d6260ad6ad3fdbb152e7f8340743eaacee9badc126951", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/follow_the_signs.xml", + "upstreamIcon": "follow_the_signs", + "upstreamPath": "android/social/follow_the_signs/materialicons/black/res/drawable/baseline_follow_the_signs_24.xml", + "upstreamSha256": "48765d2c55663d7106bc58f0c35169e4b8ed9932bbc927f8e8b630dbab537b88", + "localSha256": "8ae54f9d7fb23bd82f933417daed46438ddaab60148f04f23cd4d92a63bbfe7d", + "orderedPathDataSha256": "2735a5ef855789d943fdceab80c41b267aece7e1ccb9b89fa2262192492b8a4d", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/font_download_off.xml", + "upstreamIcon": "font_download_off", + "upstreamPath": "android/content/font_download_off/materialicons/black/res/drawable/baseline_font_download_off_24.xml", + "upstreamSha256": "7db675fedcad3240f1d884958ae97d72a6a0ba12612ff79ad5acc7b60d46113a", + "localSha256": "e64e4b9d238a2d6febb98b4464c1fc496d7b6d7683e18a4c0c1da65ab0ce21a4", + "orderedPathDataSha256": "20327ca998780fb3bd3b40d6dfc23182179af6d1494ed70eb58ed3e122f80ea2", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/font_download.xml", + "upstreamIcon": "font_download", + "upstreamPath": "android/content/font_download/materialicons/black/res/drawable/baseline_font_download_24.xml", + "upstreamSha256": "22d679241f921a808b7c88a10e3472dbf0013610d2e5d247a3a922bbc4b24eca", + "localSha256": "d152801484211121f6369e7f65acf6a9921ffc9fff027edeeaaaeca2d7d4769d", + "orderedPathDataSha256": "27fb1e17ca12926bb1f5e002595c1264f46892d197be40f5cdb2ce536c99a5b2", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/food_bank.xml", + "upstreamIcon": "food_bank", + "upstreamPath": "android/places/food_bank/materialicons/black/res/drawable/baseline_food_bank_24.xml", + "upstreamSha256": "cbe01fd44b22de66d714f2dbdc90928cf08dd16a2ab457963c568bfce3b3a378", + "localSha256": "fa4a487ec84846f50bdae35fd6ec3fe0bc560c82dcdb02ba1d15b32efdb77dbf", + "orderedPathDataSha256": "832335bbd675c81aac4f954d301ab0fb245412d5ec278bade71843784b667ec2", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/forest.xml", + "upstreamIcon": "forest", + "upstreamPath": "android/maps/forest/materialicons/black/res/drawable/baseline_forest_24.xml", + "upstreamSha256": "08a749c5540e0de40f5d0eeb11b4c9482334139c0f602555800d511a45f0fff8", + "localSha256": "5214bc35a2cbaa5f95e8753e2e9abcd70e7a25284414d1e29b1e3b9bc23b24d4", + "orderedPathDataSha256": "51ff311ab9ba15b4574cf4ff257bf15ce884c508ba1590a7a1c56e8d9125d6aa", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/fork_left.xml", + "upstreamIcon": "fork_left", + "upstreamPath": "android/maps/fork_left/materialicons/black/res/drawable/baseline_fork_left_24.xml", + "upstreamSha256": "c23f0769a8afd4f28bd294fb1bcd5fae68854ba4666d51cad3c01135e71c881c", + "localSha256": "ff891bd79dc3de67d1f815af734d5ad9de77b7ea51c8b65bfd1d3a535b98501b", + "orderedPathDataSha256": "39ca3e9386056c8f2b84340f005f0218b40d66525df8a9670f027a2c7f6958f5", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/fork_right.xml", + "upstreamIcon": "fork_right", + "upstreamPath": "android/maps/fork_right/materialicons/black/res/drawable/baseline_fork_right_24.xml", + "upstreamSha256": "4e5c4b263d96321bda853b4813f1332dc91f46445e801b971206fb612fb98681", + "localSha256": "b693cb2a7669f7995ee73cbb69e1efc67f6df1923cbfadd972e9d1a61d92eeef", + "orderedPathDataSha256": "14abee2ad8caf157f2872813a282f4149c52379ae171e024caebaa041fe2a190", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/forklift.xml", + "upstreamIcon": "forklift", + "upstreamPath": "android/hardware/forklift/materialicons/black/res/drawable/baseline_forklift_24.xml", + "upstreamSha256": "6d6c8679f3cca88a6c22a084d7e8d2ee001f973b3e6799df368a365772a363eb", + "localSha256": "81021e5f99343f23b92282b75ada1b9981174bd4af2da585235655c40029c4ac", + "orderedPathDataSha256": "2d97b39a24cff94b6086e17e1e95390b45da8382074e6cbe5c1f5a08822c14d2", + "originalGeometryMatched": false, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/format_align_center.xml", + "upstreamIcon": "format_align_center", + "upstreamPath": "android/editor/format_align_center/materialicons/black/res/drawable/baseline_format_align_center_24.xml", + "upstreamSha256": "7f17e42754d3998bd8c502781762d99220a5e1d62cdb9b0c33550a1229a19d46", + "localSha256": "efe3fe505e92254f6945fbeb4689f5331021263ca46e096ff66628ee2393f05c", + "orderedPathDataSha256": "50429e3b0b19c4512e6522294cb8c4f4fc1eab1e92d6d17680082680c7d6081c", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/format_align_justify.xml", + "upstreamIcon": "format_align_justify", + "upstreamPath": "android/editor/format_align_justify/materialicons/black/res/drawable/baseline_format_align_justify_24.xml", + "upstreamSha256": "edc1aea58a07aa7b98690973f58427a3509e5ec3f5b1e9cead2f89d82597f24d", + "localSha256": "ff70e2054dce8eb336534238de82c17282a5846da6edcca23204a85460534c8b", + "orderedPathDataSha256": "1354f1196f299e5994ab87ebb9003b0c54fcf01d472a64e8aded45595010dd1d", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/format_align_left.xml", + "upstreamIcon": "format_align_left", + "upstreamPath": "android/editor/format_align_left/materialicons/black/res/drawable/baseline_format_align_left_24.xml", + "upstreamSha256": "eb2de186aeb1e37c0c60b223aefcbc236a93305ebc4994ccf1250e8c1b57962c", + "localSha256": "2f628974a37a9fb0e6b66bf16b564c152b6edaafc29c0d706590d360ac33b0fa", + "orderedPathDataSha256": "d1e1167b809edceabc7d0591fee65e7a8a9bfaac2d160d2712462dbb435750a8", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/format_align_right.xml", + "upstreamIcon": "format_align_right", + "upstreamPath": "android/editor/format_align_right/materialicons/black/res/drawable/baseline_format_align_right_24.xml", + "upstreamSha256": "f32f38d193fee64fb9f380c3a123db2af7404dc5fc323d7f72358cb97e369de5", + "localSha256": "85a55210bf035180744a8c645f7d0726f2f34ee108e99a36ed0de7b5ecdafd40", + "orderedPathDataSha256": "b8480242f14c051c1d49787018e6c89d0acf0ab500e06bcedbee34d64c2fc14b", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/format_bold.xml", + "upstreamIcon": "format_bold", + "upstreamPath": "android/editor/format_bold/materialicons/black/res/drawable/baseline_format_bold_24.xml", + "upstreamSha256": "83aaa8cffa5f800da20947bd88105e133631f624b93e02e6b133172a82512fd0", + "localSha256": "561fedd8c6c9271f770784b6085a421ea94b51d8300b40ea8c469725d53fe315", + "orderedPathDataSha256": "2cef511a436d3ed532e98e0d0462a62d3a44fb814bb8df003b40c58e0d69508d", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/format_clear.xml", + "upstreamIcon": "format_clear", + "upstreamPath": "android/editor/format_clear/materialicons/black/res/drawable/baseline_format_clear_24.xml", + "upstreamSha256": "0e48277563e3b98fb86777067640c58a70c1bb545b58a2312cf40b8579bcc7a9", + "localSha256": "7e6c1f47fe6201079f6f2367fe6da0e8472b3e946e50059dd997860965d08d11", + "orderedPathDataSha256": "6f3d9c836f7952a532c9c25de141310822641fe42603a7e3b7cd51bfff4ba013", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/format_color_fill.xml", + "upstreamIcon": "format_color_fill", + "upstreamPath": "android/editor/format_color_fill/materialicons/black/res/drawable/baseline_format_color_fill_24.xml", + "upstreamSha256": "89069ebaa455153c1226a5f7dee4a36d9ff732ede649b35fd25fb0e55cc1dbf0", + "localSha256": "421aa28466f4c574951688b977d924e0c65e51332573b688191c445633d0a32d", + "orderedPathDataSha256": "4dffc7030d1543c56288485e707b12b4120d48e8b9821cd62774cb197f19b156", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/format_color_reset.xml", + "upstreamIcon": "format_color_reset", + "upstreamPath": "android/editor/format_color_reset/materialicons/black/res/drawable/baseline_format_color_reset_24.xml", + "upstreamSha256": "83ded95f678497bd295defa64eaae3032b7c1ec7ad6bef71540b3221f0774570", + "localSha256": "ada8d3fc9fde6f421f28bc7e281b8e5f1a9a1d8ad1e97373f67869ebda1115f9", + "orderedPathDataSha256": "d5acf0cb047aaf68d8e04ec3971da9e46d3d022618d2e76dbaf67c809e645037", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/format_color_text.xml", + "upstreamIcon": "format_color_text", + "upstreamPath": "android/editor/format_color_text/materialicons/black/res/drawable/baseline_format_color_text_24.xml", + "upstreamSha256": "af9edf383f62cf63dd271cb0e84775418baec4a7d1b58919c3274e43667ec090", + "localSha256": "7d9167fd19c1f65029736c73be3c82c7a536538cfac8c42c293ec7d83b1cd0d9", + "orderedPathDataSha256": "2703f307ced0c12b99f3e725c46f8e4c07e487e048df06fee4fe5304eacb1de3", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/format_indent_decrease.xml", + "upstreamIcon": "format_indent_decrease", + "upstreamPath": "android/editor/format_indent_decrease/materialicons/black/res/drawable/baseline_format_indent_decrease_24.xml", + "upstreamSha256": "50a728c93916afda45898f7df1aa2a02dcb21e2426e6b919b3fc9fdabf341223", + "localSha256": "fa124c4afa8c9ba82f47b2affc4a45dc65be0ff801acf7f3da0b5878cbcb2aaf", + "orderedPathDataSha256": "27132b0c774071ab79f1069c6de7a6691989f30dd785f67dd4b2ae9a857b8364", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/format_indent_increase.xml", + "upstreamIcon": "format_indent_increase", + "upstreamPath": "android/editor/format_indent_increase/materialicons/black/res/drawable/baseline_format_indent_increase_24.xml", + "upstreamSha256": "b728f0a3cd834972c38367fb94378f7530d57a9191f30a0710c4f6a248e1a77f", + "localSha256": "87c61565b037e71bc6d278a5c4c7174082b06820c49a518c013844e29fa4f25a", + "orderedPathDataSha256": "56dc991a78ee4b650564d8104695ee7dc685f9078fb672327e3ce8de0aa1f46e", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/format_italic.xml", + "upstreamIcon": "format_italic", + "upstreamPath": "android/editor/format_italic/materialicons/black/res/drawable/baseline_format_italic_24.xml", + "upstreamSha256": "eae33303fc09e34442411ee12dd1232eb3e81f2666543ebc5fd38ca8084011bb", + "localSha256": "e161370a0a7892b2c0ca3e29e6ce173dea00753ee21703f13fee88440dd41d80", + "orderedPathDataSha256": "4c613bfaf00f626927a33127e118023e8026b24c59a2127e15bb5d58e8d18fc9", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/format_line_spacing.xml", + "upstreamIcon": "format_line_spacing", + "upstreamPath": "android/editor/format_line_spacing/materialicons/black/res/drawable/baseline_format_line_spacing_24.xml", + "upstreamSha256": "072b2c83487e36f3e12200e84bf49067d5ce354cb036394fcf6fd3cdb3893bd0", + "localSha256": "a700a6c0b390b0fd98d12a62df2f44c95ecbe379a6782dec0384439af6c32e7c", + "orderedPathDataSha256": "1e8e4a605a1d536126800030754cfd61ed179f083d53aa8a170192b5fa4034f6", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/format_list_bulleted_add.xml", + "upstreamIcon": "format_list_bulleted_add", + "upstreamPath": "android/editor/format_list_bulleted_add/materialicons/black/res/drawable/baseline_format_list_bulleted_add_24.xml", + "upstreamSha256": "5911ab0a5752defa55dc08497ca40d2a1515fe188006c235dcb9b440d4506ce5", + "localSha256": "8941b50410d186cc07429719862a3388d4601d13cd73303e581a51e55113447f", + "orderedPathDataSha256": "bedfa650ed785250a779bdd72509ba02c83c17ecc502aecec6b221af83a72371", + "originalGeometryMatched": false, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/format_list_bulleted.xml", + "upstreamIcon": "format_list_bulleted", + "upstreamPath": "android/editor/format_list_bulleted/materialicons/black/res/drawable/baseline_format_list_bulleted_24.xml", + "upstreamSha256": "5cd90cb8de668f0f4fcf3ab3549399c7d03c53610488aa0b3b7e451ef2fa24e8", + "localSha256": "53afd01384f5fc7f952e7d5e1ebd5c6e274bf9708bb7ce0009e8ec74f792444e", + "orderedPathDataSha256": "94f6c72464b937191061d128a20dba13a2342e3d22d864a2b0e705462776b308", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/format_list_numbered_rtl.xml", + "upstreamIcon": "format_list_numbered_rtl", + "upstreamPath": "android/editor/format_list_numbered_rtl/materialicons/black/res/drawable/baseline_format_list_numbered_rtl_24.xml", + "upstreamSha256": "54368a6385495633b1b2e5869a1f5561933d35b3c6cefb39f6358a842765a2e2", + "localSha256": "7f62df1850ae7c9f3aedbcd23bdf23de4f1ee4e542bfe9b0116d706c1dd28b31", + "orderedPathDataSha256": "3a2493a090e77505d9c0a8891cb08a91f9c1900b7a650151cb9e8b08c461fd51", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/format_list_numbered.xml", + "upstreamIcon": "format_list_numbered", + "upstreamPath": "android/editor/format_list_numbered/materialicons/black/res/drawable/baseline_format_list_numbered_24.xml", + "upstreamSha256": "349220392af3f421606d1cbd794a679793f2aaf4e0aebde2b4ef3d54f4e10ef4", + "localSha256": "871064f5f91f1b83ca35cf7a26af115c89ab5d70685db86b6bbf7b9ac317f2fe", + "orderedPathDataSha256": "9c31608ee5ec41bf0060dceafc7e8cab153c7e2366ac65cd707facd608a2e065", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/format_overline.xml", + "upstreamIcon": "format_overline", + "upstreamPath": "android/file/format_overline/materialicons/black/res/drawable/baseline_format_overline_24.xml", + "upstreamSha256": "52669f3bff3a0b6201fe99e632abf04de32acf02a1ab119ae5f8af0faa0fb64e", + "localSha256": "5f4f79d10f529b9bd5088258dd1fb00921c29d3d225d7c75a0f6695a776df89f", + "orderedPathDataSha256": "a92ecb8933d69bcb7f51b5bb59007b79969d1bf832ad7c56ae8ea4c5de8f7187", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/format_paint.xml", + "upstreamIcon": "format_paint", + "upstreamPath": "android/editor/format_paint/materialicons/black/res/drawable/baseline_format_paint_24.xml", + "upstreamSha256": "56a267d8789bca930e00569f8afd0fc815aadb8aab0d8e05e3f1255e002f067f", + "localSha256": "2de7b880455f43189f77cd9c6fd4fbfc3113c2cdab16865572cb20eeb0174b57", + "orderedPathDataSha256": "05ac97ebe6fad40f5f92b1450d43b8ce5d5d29252c383c37ca35f83cf442b7f4", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/format_quote.xml", + "upstreamIcon": "format_quote", + "upstreamPath": "android/editor/format_quote/materialicons/black/res/drawable/baseline_format_quote_24.xml", + "upstreamSha256": "7e7040463e9da907705a4931dca8b0c878918ae3061039862267b8c55b469ef3", + "localSha256": "48979b9d03fd8b02ae9c04260d4ab69b36216bc3140015e069a9e12d43b0347a", + "orderedPathDataSha256": "aa74aee59389f9627b59d252fced7e58acc3d47c0afe31058ecb0757bed99257", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/format_shapes.xml", + "upstreamIcon": "format_shapes", + "upstreamPath": "android/editor/format_shapes/materialicons/black/res/drawable/baseline_format_shapes_24.xml", + "upstreamSha256": "548ca20cc4150f7a2bd8fa0019a9d60ec8e0637702f4097bbea14c2c3f607717", + "localSha256": "a459c9b72c3e63b440f01c1c875a60ba57af4d347fdc11c8bd52876c38d0c93c", + "orderedPathDataSha256": "95a9942ba1da402b4a064fa9de79305f9b542ba7f692f54412c0c69d81a3a088", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/format_size.xml", + "upstreamIcon": "format_size", + "upstreamPath": "android/editor/format_size/materialicons/black/res/drawable/baseline_format_size_24.xml", + "upstreamSha256": "b25638f45c7781581cb6b18364a5c1df64c3a3f0012187451fbd5e97a1b5e3c9", + "localSha256": "2e715a23ffb5812c808214863cd447e808d3f43733a6306c7dff16ee370ad794", + "orderedPathDataSha256": "aa8b11356ba455f0571258a4ab35dff760f7595a848a17b505f693c4556410fe", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/format_strikethrough.xml", + "upstreamIcon": "format_strikethrough", + "upstreamPath": "android/editor/format_strikethrough/materialicons/black/res/drawable/baseline_format_strikethrough_24.xml", + "upstreamSha256": "d9c204fb08d395d9bdbfd6b5d0768767d46d4d0f75a74350833a95299f6fe8df", + "localSha256": "e9e2ed9796d8050279cffbe1aba054172ae0ad719a7283de92e3e909c98709ce", + "orderedPathDataSha256": "dafa5e311de430f387be8a388355493558b7129191374dd8138752964e48da63", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/format_textdirection_l_to_r.xml", + "upstreamIcon": "format_textdirection_l_to_r", + "upstreamPath": "android/editor/format_textdirection_l_to_r/materialicons/black/res/drawable/baseline_format_textdirection_l_to_r_24.xml", + "upstreamSha256": "9bc813fcd80f5c4cd0207a396559863485916324ece67822b241867afba4cbab", + "localSha256": "3d55e16d635680d721f440a7d89b76c2737c9750f00827643b971e697384bfe7", + "orderedPathDataSha256": "e325076036200f7bfe31e556fff2d6780a32c950928eecbe44804585175adda3", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/format_textdirection_r_to_l.xml", + "upstreamIcon": "format_textdirection_r_to_l", + "upstreamPath": "android/editor/format_textdirection_r_to_l/materialicons/black/res/drawable/baseline_format_textdirection_r_to_l_24.xml", + "upstreamSha256": "a61d56f5b9980e9fbf752f0a8faa482ccd08f62212bd25cd94bbec91efc971bc", + "localSha256": "69d43ddd96e84c17d619c89b37b1b049aae615755c0a1cec50f87714bb77f217", + "orderedPathDataSha256": "f993f5c25b8c1589e41a94f80723c1897b74c7a095525c1ec1d8823855a30ebb", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/format_underlined.xml", + "upstreamIcon": "format_underlined", + "upstreamPath": "android/editor/format_underlined/materialicons/black/res/drawable/baseline_format_underlined_24.xml", + "upstreamSha256": "aa7d6d8ff357fe43264c6c2a8dd5130fcd3f061bc32bff4072dee982656bd9fd", + "localSha256": "3cffb1cdd1024abad279fd487fcc513dff8bbead7bd32a189f1e354879df0222", + "orderedPathDataSha256": "24a89b18dca036f98706db6bd59d518ef630595122cb099c43d58b8220f45976", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/fort.xml", + "upstreamIcon": "fort", + "upstreamPath": "android/maps/fort/materialicons/black/res/drawable/baseline_fort_24.xml", + "upstreamSha256": "58726e2ae058af88c3fd59668c7e7f78b849fe4db815e9212685e8ee505a429e", + "localSha256": "3ef59e4711e245b9875b511aaa9e1d8b2c1779662de01d0332f6affdd240310d", + "orderedPathDataSha256": "fbf954f6b052898dab191db24e6f9a3858c4db1e91197d99b8dd77b35aebe733", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/forum.xml", + "upstreamIcon": "forum", + "upstreamPath": "android/communication/forum/materialicons/black/res/drawable/baseline_forum_24.xml", + "upstreamSha256": "2b7033ad87b1a4ac0fd248303adc95ee2c910c4745e9d57399ba18b1ca5ec678", + "localSha256": "c909511e1a2ce582c6bf0dfe34d653f40880c933b7e2306370f64d27bde22402", + "orderedPathDataSha256": "fd986c3f7b3632060d09b0742b36dfb99955204637440f6556671ff760192528", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/forward_10.xml", + "upstreamIcon": "forward_10", + "upstreamPath": "android/av/forward_10/materialicons/black/res/drawable/baseline_forward_10_24.xml", + "upstreamSha256": "fe24a51781cb7cafe490126f9620a6b9c4213e3cea263d6073d4320fa7e72c5a", + "localSha256": "0421022fad650956c48e46978d7b0446fd11099130f20a7b6b14f8e2edc3a6df", + "orderedPathDataSha256": "92c77b1b776176db76228d7582cc7b6056abc87f3fcbe77db640fb7c3a81ffc9", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/forward_30.xml", + "upstreamIcon": "forward_30", + "upstreamPath": "android/av/forward_30/materialicons/black/res/drawable/baseline_forward_30_24.xml", + "upstreamSha256": "649e51392d32c3b6327d5313173d81f81095e25d6394094f5701e865e0fe16d8", + "localSha256": "2836ef23550893b7d6c23c84f7c760f6569d27043eb122da4f53fae49a90de34", + "orderedPathDataSha256": "3997d316439fc37ff4d72d10981acd8153bd361f428fdc5b6fd7c3f045cd7f3b", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/forward_5.xml", + "upstreamIcon": "forward_5", + "upstreamPath": "android/av/forward_5/materialicons/black/res/drawable/baseline_forward_5_24.xml", + "upstreamSha256": "f99db848127a9301ab348f6a83705f7227277c3562d83042004fc4c0e3fc9cb0", + "localSha256": "ea1c8699c8091c31e848f98ce7a169e0ead40de326620000f91da482efcfadd9", + "orderedPathDataSha256": "c097f8c2df9326869ebacd4b879db9c345789937358f7a505d46a018cab7217f", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/forward_to_inbox.xml", + "upstreamIcon": "forward_to_inbox", + "upstreamPath": "android/communication/forward_to_inbox/materialicons/black/res/drawable/baseline_forward_to_inbox_24.xml", + "upstreamSha256": "b5c539b7f9c19acdfaee5138dcb092097ad0b7603e564d8e82c5c5557e675017", + "localSha256": "3c6bb6b339c927ced24096bc641fe2276d0f9e429ee697dd4dd511e15dabd13e", + "orderedPathDataSha256": "362e08396e839419d49fe2ab97c93275a5e0dd8d639a7a1ebff06c2d94abd0bf", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/forward.xml", + "upstreamIcon": "forward", + "upstreamPath": "android/content/forward/materialicons/black/res/drawable/baseline_forward_24.xml", + "upstreamSha256": "eca6b2b8062f773406b3f86c9bc722c53ac858e810d24153adc814945b92e0e3", + "localSha256": "f3ea51c3e6b6cb6cb63dd73e51294c1e88710bbbd150b82cbe0d23f668e78067", + "orderedPathDataSha256": "7a6075376cc91c215d1056ae26c201ba030b640982707c4ac6a89d380f17e609", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/foundation.xml", + "upstreamIcon": "foundation", + "upstreamPath": "android/places/foundation/materialicons/black/res/drawable/baseline_foundation_24.xml", + "upstreamSha256": "a186c349fa0e802acda27276bfaaed279389069c398960373566cf2a7a4568ca", + "localSha256": "3b776ed1183d7193495938b109e095ca470309215d8b983562bd4af42df96d3a", + "orderedPathDataSha256": "2160927bd284e78c5336f1b3fcac5950e562cf1fb6c60ec88338ef79952704ef", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/free_breakfast.xml", + "upstreamIcon": "free_breakfast", + "upstreamPath": "android/places/free_breakfast/materialicons/black/res/drawable/baseline_free_breakfast_24.xml", + "upstreamSha256": "f5b30d27264184f520c578b58721c681322cec933cf63c2b894a836d6ac3f250", + "localSha256": "5143bad294c1933431751ab66134dd247cae88845b44b95c553e6e2be1294637", + "orderedPathDataSha256": "7cb789299a597b29642d2a0d8400c33634d607077387aac026062bbbb1fec01d", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/free_cancellation.xml", + "upstreamIcon": "free_cancellation", + "upstreamPath": "android/action/free_cancellation/materialicons/black/res/drawable/baseline_free_cancellation_24.xml", + "upstreamSha256": "066c8cd759f573523aba0ad7cd5b050a92cf73550abdaebd5396124abfe2c468", + "localSha256": "7ecbe4fbddf360a4c648a380b44f427f0112c47b0ec314d71788cd7d4ebd5210", + "orderedPathDataSha256": "6ed7e0efe0e7a5955de915ac1434a581ec4bc17fc60872d480a36555662a6fdd", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/front_hand.xml", + "upstreamIcon": "front_hand", + "upstreamPath": "android/social/front_hand/materialicons/black/res/drawable/baseline_front_hand_24.xml", + "upstreamSha256": "0015b907a66b398b4b46bd942f1777f6968ffd645e355ddc967293f83a9dbf46", + "localSha256": "59bf092ebd2d4e069d7f5b284269afbb45b18c5462b2fba7c2d691291b5b2c12", + "orderedPathDataSha256": "82a7d375726d9c9b72bcc81468051447973ff1a28682941923584d6a424518d3", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/front_loader.xml", + "upstreamIcon": "front_loader", + "upstreamPath": "android/hardware/front_loader/materialicons/black/res/drawable/baseline_front_loader_24.xml", + "upstreamSha256": "e528eedb8a13d121e5cf1f7dae994baac698a1ca68527b137042ab928c62aa7d", + "localSha256": "e2bee1ad7da88f81a15b79d172cc3d8aa0c421cd2deca71b6acb7a44eecde219", + "orderedPathDataSha256": "8acced50d37b20921b82fc87d368d17402f09a2052f0a31c9daa60fa0b9351e7", + "originalGeometryMatched": false, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/fullscreen_exit.xml", + "upstreamIcon": "fullscreen_exit", + "upstreamPath": "android/navigation/fullscreen_exit/materialicons/black/res/drawable/baseline_fullscreen_exit_24.xml", + "upstreamSha256": "a28baf0422d0d181c28a416f54c1d63d37c5773bb79eef9d2da98e9a2ffd2e82", + "localSha256": "f921ebbb7e206831582072a1e687f5658251b9a2e9fc098892aa370cf4056b15", + "orderedPathDataSha256": "1a0a3af39e0042d8afa62f120e5ef6e87be7004257435500b26a70de65573ae3", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/fullscreen.xml", + "upstreamIcon": "fullscreen", + "upstreamPath": "android/navigation/fullscreen/materialicons/black/res/drawable/baseline_fullscreen_24.xml", + "upstreamSha256": "a07e261d5bfc69b035e4d2be28d6f7bbe1235189b6fa1ee231eb4501c302e6a2", + "localSha256": "e3397caa424b44507add5822de2e9fe77fe140333c090b190551287fb65c5c59", + "orderedPathDataSha256": "3d40d4ecdfd8939373f7b5491e4a3a4903dd18010170ebd90484aed023b23e91", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/functions.xml", + "upstreamIcon": "functions", + "upstreamPath": "android/editor/functions/materialicons/black/res/drawable/baseline_functions_24.xml", + "upstreamSha256": "76fa0be136ba6604ac9f31f12af34014d97622b41cac6dbc800282bc0aa23689", + "localSha256": "5cc3f7f75581fefe7312ecef7b90c4a7ca9037ae249037c584ba6b2e372e2ac8", + "orderedPathDataSha256": "5a0922eb41363846b679d5903c6d4ef154ca1da56dcf35b82cfd7ac3ba19f28d", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/g_mobiledata.xml", + "upstreamIcon": "g_mobiledata", + "upstreamPath": "android/device/g_mobiledata/materialicons/black/res/drawable/baseline_g_mobiledata_24.xml", + "upstreamSha256": "76c8d16b9f018a17eef06db20d2f69a0d62618b7ced2ab95965a2ff772d995ee", + "localSha256": "72bcfab02df94a162413b59af20ae1edb81e0eaed50264aa81d5db0fe646e4fe", + "orderedPathDataSha256": "9338606cfcbab0e85acc81b249bc35608c553ab408f1397e2c9cfbd2c2ce6df9", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/g_translate.xml", + "upstreamIcon": "g_translate", + "upstreamPath": "android/action/g_translate/materialicons/black/res/drawable/baseline_g_translate_24.xml", + "upstreamSha256": "5c6ef9e3bbae14a0939d21c084e52e0847d08e9a1d1e875c6f38f8e6438d5a11", + "localSha256": "7026870a62e0e63ad63a268afdbdbfebf3efff87f0bc63d1c39fceab14aca004", + "orderedPathDataSha256": "e2ebbb019b0308be0e891c4688669502e57c04a5a6d167e90ebf447c7ccdd189", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/gamepad.xml", + "upstreamIcon": "gamepad", + "upstreamPath": "android/hardware/gamepad/materialicons/black/res/drawable/baseline_gamepad_24.xml", + "upstreamSha256": "284e9c5674e7cbc0fd98010e4dae26c57a66d782aa14209f78154acb916f1a64", + "localSha256": "fcec63a9dd499b95649d5225499cb1c50989c12ace4eafb6df38d98f927d2eaa", + "orderedPathDataSha256": "a81fb71eee5e53b834ee272a50ba65d38ab52df5cbda835fe58c971870e9176e", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/games.xml", + "upstreamIcon": "games", + "upstreamPath": "android/av/games/materialicons/black/res/drawable/baseline_games_24.xml", + "upstreamSha256": "284e9c5674e7cbc0fd98010e4dae26c57a66d782aa14209f78154acb916f1a64", + "localSha256": "1a9558d573731c78bc45082b821a210704df2298cf426a3f36544be3082232e8", + "orderedPathDataSha256": "a81fb71eee5e53b834ee272a50ba65d38ab52df5cbda835fe58c971870e9176e", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/garage.xml", + "upstreamIcon": "garage", + "upstreamPath": "android/search/garage/materialicons/black/res/drawable/baseline_garage_24.xml", + "upstreamSha256": "42e7c968eebb7a508e5f87dfc815ea2490261692920079429ccf0c7cb8d3a4ac", + "localSha256": "a6372fe7737e67d9551805f913a50e7df8cff6fc0e3af160cf9db1a3c8c39f89", + "orderedPathDataSha256": "bba84b79ed99f5f6058116e11da74621ee325616ac185e3e81ba562b2998e0c7", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/gas_meter.xml", + "upstreamIcon": "gas_meter", + "upstreamPath": "android/home/gas_meter/materialicons/black/res/drawable/baseline_gas_meter_24.xml", + "upstreamSha256": "79b47e76550b4702232f931e4de90010cef019a059fe6eb96612c659cfb87b2e", + "localSha256": "5f6d5c9d1fe620fc7388a9ec603b41ab0067859f297796f8e17ac7781423dfd2", + "orderedPathDataSha256": "69f573038fccb9741b95aa248cbca2fa9e7981b4630b3edb53d2d2f1f589445a", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/gavel.xml", + "upstreamIcon": "gavel", + "upstreamPath": "android/action/gavel/materialicons/black/res/drawable/baseline_gavel_24.xml", + "upstreamSha256": "2bd24f955a5b860f583ed34e4958b0e0898d73154ece8acd07f23aa00c2a6f89", + "localSha256": "f4574f4ff7c85f6b1d2c8601c60a66b00c216a1371809c240e0e5f8d3c346263", + "orderedPathDataSha256": "6aabc4e7bd3ed7ef4c58d665f39cbb0808aeb3f6ccb799bc170e8a4ef8123c08", + "originalGeometryMatched": false, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/generating_tokens.xml", + "upstreamIcon": "generating_tokens", + "upstreamPath": "android/action/generating_tokens/materialicons/black/res/drawable/baseline_generating_tokens_24.xml", + "upstreamSha256": "5d069ac561f355bb5f90c4a33629b48858b89179ef3589c3ac3c3e7edf64d084", + "localSha256": "46b6bf6f78ea47ace31276f72d5ccca5a9361950a79dcd848d7bfaef0340199d", + "orderedPathDataSha256": "1a269999220d2a6f0b7c4dadb68c35e4ee282f769f5c6b6602d5fec71ebcaebc", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/gesture.xml", + "upstreamIcon": "gesture", + "upstreamPath": "android/content/gesture/materialicons/black/res/drawable/baseline_gesture_24.xml", + "upstreamSha256": "4544addfa3531d50f295d0ec4e770cfe366ec41afe5e411bb23d32fb4cb188ef", + "localSha256": "2832318e00f80e279a12cbf4dbe251d9e36c2e53f37649aad89f1939c89de376", + "orderedPathDataSha256": "25e37663ac9bcde1a6780041a34f88334f572619845e28508ae7ad41f2cc6f30", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/get_app.xml", + "upstreamIcon": "get_app", + "upstreamPath": "android/action/get_app/materialicons/black/res/drawable/baseline_get_app_24.xml", + "upstreamSha256": "06325b3f7ec9822a0b2a95e66f0b0d71d07cb3665a7126925a1728661d2d2c33", + "localSha256": "6872cd7ce6e8229bc8f61cc8bccefa9fb9270c3090545216d0ffc06b8bba4277", + "orderedPathDataSha256": "f27af47834e16512610a18ac94a0443b8934f6e09a4b657874819a9295ce0f3b", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/gif_box.xml", + "upstreamIcon": "gif_box", + "upstreamPath": "android/action/gif_box/materialicons/black/res/drawable/baseline_gif_box_24.xml", + "upstreamSha256": "655e769280e8f29d8d0758ff8285b40ddb586924418ac3462559671b1c5ecaf6", + "localSha256": "04d135dd91152f815d10731945894e2762157a2253559f84cdbd24424fdf7f78", + "orderedPathDataSha256": "7a9195cdc5b72d8d15a3eed400575b1444abc7be72862fbcaed958eba3560060", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/gif.xml", + "upstreamIcon": "gif", + "upstreamPath": "android/action/gif/materialicons/black/res/drawable/baseline_gif_24.xml", + "upstreamSha256": "68829e8355dd35eeec3f7366d44d962a5e564d6bc5e16433ed29f6d5fc2c7cc2", + "localSha256": "4b6e2918516f77650ac12ccfd4bba6546744d47c691dacb8cb445b9ee98a2596", + "orderedPathDataSha256": "c13691fefea7efa9003a1a7aa4b0ba8b5aa66a3e519915ea69ebb6766cb2115b", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/girl.xml", + "upstreamIcon": "girl", + "upstreamPath": "android/social/girl/materialicons/black/res/drawable/baseline_girl_24.xml", + "upstreamSha256": "3e032e27375b45ad7fd2858dc9920b225e06969008fff20b768ea1c0f2faf415", + "localSha256": "92a46f6731be07c757fa2bcae75b0ffde765499d805a242bcdc5d968ba9a7991", + "orderedPathDataSha256": "e06b5617106ff15e77c78e85c4ddcf93edfb267e0530a1485bab4e288844322f", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/gite.xml", + "upstreamIcon": "gite", + "upstreamPath": "android/places/gite/materialicons/black/res/drawable/baseline_gite_24.xml", + "upstreamSha256": "172cce9f3a34e11c0c30c5508ebb320a9cf8cf599050876b25eccc80791b3489", + "localSha256": "02c30fe097e70b614c60f383d1f564b62b83c57ac7248b7362a6829d3f48b42c", + "orderedPathDataSha256": "188940beecf9f20d309408578a457ec59b856a82713780f19e9af6b4d7b1e818", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/golf_course.xml", + "upstreamIcon": "golf_course", + "upstreamPath": "android/places/golf_course/materialicons/black/res/drawable/baseline_golf_course_24.xml", + "upstreamSha256": "964390e9c2518f384f8e13286170e0d2f7656dd2afabde3b8e8de3c575c5f677", + "localSha256": "38a7d369b7f3882534bc6eff2dabb805e6ba879a83791bbdc1c4141c48b24138", + "orderedPathDataSha256": "7969ad21c7a3a4e264515ea67f94f724525f39bd7dc02721dde18f99c9e0a669", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/gpp_bad.xml", + "upstreamIcon": "gpp_bad", + "upstreamPath": "android/device/gpp_bad/materialicons/black/res/drawable/baseline_gpp_bad_24.xml", + "upstreamSha256": "3586ef7b181229c6a0c3abf983acb9da666b5ddd94cba86161d12fdc81d8a098", + "localSha256": "92f8ccf94c938bdc831e2cb150e8260ae81c2d166536302b633eb2b3a44d5227", + "orderedPathDataSha256": "25c61d4e78f228e8f5f13d65c59415f84908e55747938653cbfea2a29addc5ee", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/gpp_good.xml", + "upstreamIcon": "gpp_good", + "upstreamPath": "android/device/gpp_good/materialicons/black/res/drawable/baseline_gpp_good_24.xml", + "upstreamSha256": "941af461d6ae5ef38c2d7128e5635859f68a79b681eb5b1de49a63271010c2d5", + "localSha256": "a0efea156b7c290b438df2e078180c4fcbabb5f15a6550f73a1525f1e5889c94", + "orderedPathDataSha256": "fdbf9f0f36b28b5275762d56387421068f874846ee90d35e656e7e1b33a13428", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/gpp_maybe.xml", + "upstreamIcon": "gpp_maybe", + "upstreamPath": "android/device/gpp_maybe/materialicons/black/res/drawable/baseline_gpp_maybe_24.xml", + "upstreamSha256": "418ee47200c9f4ff41eeb63fb65f015cde7d8f4c767b63036d038be11a86c0f6", + "localSha256": "6efea7e095ff9365be265768af06c81a93edd7345b127e5730a3a71ea2086c20", + "orderedPathDataSha256": "28e4556731d8b93933c3721055dab9e880e5b4d4cea42b4d38dc60f661de9a4c", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/gps_fixed.xml", + "upstreamIcon": "gps_fixed", + "upstreamPath": "android/device/gps_fixed/materialicons/black/res/drawable/baseline_gps_fixed_24.xml", + "upstreamSha256": "062d0b9b651cdbe31bb60f834178f705a5f496a27d22e20c1b138a86ddc87667", + "localSha256": "e562bcbd9d9d4ec9831ae1a2f1aac0431029d241a1a23d38d7d0e4776c9600f3", + "orderedPathDataSha256": "b9ad8d468f6154a2fd642a6527f2138bc5235ccbec24ec2a78f17b1b550981b9", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/gps_not_fixed.xml", + "upstreamIcon": "gps_not_fixed", + "upstreamPath": "android/device/gps_not_fixed/materialicons/black/res/drawable/baseline_gps_not_fixed_24.xml", + "upstreamSha256": "ed942d18ea3d3f3736b90bef1e4d99545bcfa89de9700c4027df4a16b9b0bedb", + "localSha256": "239b43634a6ed91fca58cc2565e5118eb726b668f7411ddc550ea4b41e4ebede", + "orderedPathDataSha256": "6ac69ceb42d80589f45e57790c05316a1219387b1e12c6b107d214a42ff4ae2e", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/gps_off.xml", + "upstreamIcon": "gps_off", + "upstreamPath": "android/device/gps_off/materialicons/black/res/drawable/baseline_gps_off_24.xml", + "upstreamSha256": "4c79cad95142e1052fb02927fdb23df048ebdd265320b9fbe6558327fec5e624", + "localSha256": "2c177e4a34225d5e6be2eeca40258e4b8d7d6156fa132aa38b8423911599f999", + "orderedPathDataSha256": "439e861a9bf07e6d93c3c74bb0cd34abc5f7515b66d4359d36b4297c02232402", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/grade.xml", + "upstreamIcon": "grade", + "upstreamPath": "android/action/grade/materialicons/black/res/drawable/baseline_grade_24.xml", + "upstreamSha256": "fd926a22880bd60f50981b28ee4b413a179709d35426c21939d08c96c4b4876a", + "localSha256": "b5ffca67a8d77afe2997c260ccc0ee33b77320510338f049916f254045d194c2", + "orderedPathDataSha256": "35324c992ba5c0dae9f64554ba7c17f5b196ed7b87567e1d919b382f776f9c5b", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/gradient.xml", + "upstreamIcon": "gradient", + "upstreamPath": "android/image/gradient/materialicons/black/res/drawable/baseline_gradient_24.xml", + "upstreamSha256": "3b37549430305b946dc9f54efa5141ec6d90ed5a294413ec2925cb7fd70bece8", + "localSha256": "b896ad7adac554d799b843e2e6cbeba469579509b87a3590b0a459e52513c0b5", + "orderedPathDataSha256": "09542ea8c662d9a148bea54c84e58a674a0f96d1cca5d7dfae270462102560b6", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/grading.xml", + "upstreamIcon": "grading", + "upstreamPath": "android/action/grading/materialicons/black/res/drawable/baseline_grading_24.xml", + "upstreamSha256": "e97371a2b18ae373bb3252a0f987a9afe0f94a20ec846de28db7d38977ca675f", + "localSha256": "42a5cb092b1f6062a00502af0fd93d3bbd7ff24eea53f87a2ca3cade0179263a", + "orderedPathDataSha256": "1874317ace42949c7e54a0478f598ea742e5b3d71c79e1d38c43a049b6752367", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/grain.xml", + "upstreamIcon": "grain", + "upstreamPath": "android/image/grain/materialicons/black/res/drawable/baseline_grain_24.xml", + "upstreamSha256": "e116c22b8f6f4211b34aef4642c01ab4e67ceb408cc41a17c87eb98e200247eb", + "localSha256": "722d209c71e7bfd3a29df667b19e72398384d3211b37f04eea599f41c61e1aec", + "orderedPathDataSha256": "6f43263381fa0011b53c37f25830462768897b99a4567fcbec2aa85834d023a5", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/graphic_eq.xml", + "upstreamIcon": "graphic_eq", + "upstreamPath": "android/device/graphic_eq/materialicons/black/res/drawable/baseline_graphic_eq_24.xml", + "upstreamSha256": "ca075067ebe004be1d47a626aca704fabd2604af9d059ed323ac2af7c502b3fc", + "localSha256": "702381ba5f10f0256ec1a685a966cec1dcdbd4bb79fb364dbcaab3aab2e4e8ea", + "orderedPathDataSha256": "7cb307c41ddb434996261b10f76f252820564612241770c3566c020a6629be2a", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/grass.xml", + "upstreamIcon": "grass", + "upstreamPath": "android/places/grass/materialicons/black/res/drawable/baseline_grass_24.xml", + "upstreamSha256": "09b60fc808439d9158b3061d50b1eda86d087a3101b0ade69c90ebcadf434dc5", + "localSha256": "a7705e9700510dff7e68635e686107056668dbd61878ede71ab2274b5b96575a", + "orderedPathDataSha256": "c8c6231fa89299260d780c80111f0a2c370537f6fe8358f8ed8d7eef23864508", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/grid_3x3.xml", + "upstreamIcon": "grid_3x3", + "upstreamPath": "android/device/grid_3x3/materialicons/black/res/drawable/baseline_grid_3x3_24.xml", + "upstreamSha256": "9be4dbd0070f453f4cefd3633a5294af57928664a161a0a4fe84795ec20c8538", + "localSha256": "8c3a8dd73f5b1ba58ca704da1b6d7746335aebb8601fa83de53aac6cc26807b9", + "orderedPathDataSha256": "b9945f22e9849bad2be6e7f046827885ec6baa2c2b7d393af34e91be15f4dcde", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/grid_4x4.xml", + "upstreamIcon": "grid_4x4", + "upstreamPath": "android/device/grid_4x4/materialicons/black/res/drawable/baseline_grid_4x4_24.xml", + "upstreamSha256": "6068832c156c1351bac569d399e92bbe184b6648078d6fcf1bb4ca56b241018b", + "localSha256": "07eee62daeb7cb00cd1e39cbcabcc51eeeba78c977734b9cbad01cd1b59fa6c3", + "orderedPathDataSha256": "93faf34a055bc20e9d610bd4ece696acebff1cd3904336a49fdbe84caeaeff12", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/grid_goldenratio.xml", + "upstreamIcon": "grid_goldenratio", + "upstreamPath": "android/device/grid_goldenratio/materialicons/black/res/drawable/baseline_grid_goldenratio_24.xml", + "upstreamSha256": "a49d4bef19202631c8603898c1580ec1cb18ea759dfde045f3e1e3e92f2a56bd", + "localSha256": "f1f27823a970818971e4012848798e10045b707409868f39ff0974613da8cb37", + "orderedPathDataSha256": "8d1500ef4ce8203ed8c509d5a161efc4bca99e01073f8801d271e89d37b5b636", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/grid_off.xml", + "upstreamIcon": "grid_off", + "upstreamPath": "android/image/grid_off/materialicons/black/res/drawable/baseline_grid_off_24.xml", + "upstreamSha256": "25f914af2cb18169fd8d6c0c985ddd491e9c35db306578c517a201c9d3247129", + "localSha256": "198aae4405fa61df00c54fa6a05010127afffaf2deb49aece5f464e9b4e3bbc6", + "orderedPathDataSha256": "09213be6db283ab4615b4e5faf4f225968b54cd85cd0af2b6b6db59f7fec948b", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/grid_on.xml", + "upstreamIcon": "grid_on", + "upstreamPath": "android/image/grid_on/materialicons/black/res/drawable/baseline_grid_on_24.xml", + "upstreamSha256": "af1313ea13a314e1662c62adeee5d6979a380379e336e362915ae6244839e973", + "localSha256": "064a8cdb53f4e3ca9198a167701ddfe121521b872c238a5f1a9bad0287254968", + "orderedPathDataSha256": "cf7035d4905902b738e3e2e009ccf5ebf9bf5d10ab564537e513a023d8cfa07b", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/grid_view.xml", + "upstreamIcon": "grid_view", + "upstreamPath": "android/file/grid_view/materialicons/black/res/drawable/baseline_grid_view_24.xml", + "upstreamSha256": "371f473b5dbecd2ce48a08960002398db8a634779b42d7c648f19885b02035a0", + "localSha256": "f81f55f0dbc3221e0ceb04c83151ac74832ff63fffa5cff4b099f10b0f963341", + "orderedPathDataSha256": "c4b2e71559da1d1e2b801e147a80265949ef7c1d018b6a4db13f9cc6adf14763", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillType", + "value": "evenOdd" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/group_add.xml", + "upstreamIcon": "group_add", + "upstreamPath": "android/social/group_add/materialicons/black/res/drawable/baseline_group_add_24.xml", + "upstreamSha256": "48a4a6490c08929c304e5b02b8e5d675206cd4511097aa064ebce65ed86d0aa9", + "localSha256": "e068eac97579059a3ff63a33b4d9505c2e0ee2767c6a6a51fa47d7b2c92398d2", + "orderedPathDataSha256": "afba6e7a9a0c64c21a48bb697ccc045105b69298ed5da660f9317fc284a4ea17", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/group_off.xml", + "upstreamIcon": "group_off", + "upstreamPath": "android/social/group_off/materialicons/black/res/drawable/baseline_group_off_24.xml", + "upstreamSha256": "8297196384ccdbaa5660137c7d66e51eeda281a577eb4d29553634e2efd6d3b8", + "localSha256": "2ef981930ad5333a0cc4b4b6fcc9bd3df3f91a82a16847e4308d33b6db84f559", + "orderedPathDataSha256": "380fc052fedd13d74f26c6fd3dbfdb5fd96df15beaefbaea00bfeb95690006a0", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/group_remove.xml", + "upstreamIcon": "group_remove", + "upstreamPath": "android/social/group_remove/materialicons/black/res/drawable/baseline_group_remove_24.xml", + "upstreamSha256": "9f4599e8ade962c3168b2acd1829683e8a54f90117f437606dc341bcee3d43dc", + "localSha256": "4bf181cd6e7ae07867192f3c3add0d63c2f27e0cdfb51ccfa0ff2f6783002419", + "orderedPathDataSha256": "18ad1b1d322debade9eb6298d574fbf206a83a9a19b1046ab22ea7fb1b53c148", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/group_work.xml", + "upstreamIcon": "group_work", + "upstreamPath": "android/action/group_work/materialicons/black/res/drawable/baseline_group_work_24.xml", + "upstreamSha256": "9fcbe36f8718b7e958a058dc3c2accea6ad28386a434f8258ce9f4d1892e925b", + "localSha256": "8a76a0730814921bc2b3ee0e8f4a67d19fdba40877ff83a7dc4afe40f6aa11e1", + "orderedPathDataSha256": "3c6884e98f23b90cf429761d5e23d322406dfd83ea0c92e8e5aead97ee79f74f", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/group.xml", + "upstreamIcon": "group", + "upstreamPath": "android/social/group/materialicons/black/res/drawable/baseline_group_24.xml", + "upstreamSha256": "67629d5cab1610e3fc934a1ad98d4a258d6b2af32827a7b2ccd3a88443a440e1", + "localSha256": "955d97632ff8ed36b7dfe69bc2e1eaa1dd156445a6a9d57b5b66c9b951b38b8a", + "orderedPathDataSha256": "76edb037ec69e5b6ec3bc70b2c6c967381b84b1c42a0135e11063a2b9d846ebc", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/groups_2.xml", + "upstreamIcon": "groups_2", + "upstreamPath": "android/social/groups_2/materialicons/black/res/drawable/baseline_groups_2_24.xml", + "upstreamSha256": "388a7f07f4328e10882438e727a7714851ae60c74ae4a7fc828b4ea41f4d3eb4", + "localSha256": "5498d1e8722da7aa1762cbbd85b04329747448107cb2a9df9124fb5a68cb511a", + "orderedPathDataSha256": "08f9176c98c4e3e4e619d6f86ec87bc0666d75f5d64e619112fcb22b1de747e3", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/groups_3.xml", + "upstreamIcon": "groups_3", + "upstreamPath": "android/social/groups_3/materialicons/black/res/drawable/baseline_groups_3_24.xml", + "upstreamSha256": "36c47d355b31bdf697a6fd497a7b93963f8d7d868c7efa8ab457e6cbff39a09a", + "localSha256": "4b815453ac9bcf62f74e9d85ae6cde726366773a625312eede1bcee2547abb29", + "orderedPathDataSha256": "500a1d752fa56e744b16c6ba453635f22576bf87529b2345ab09a6581dd15cc1", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/groups.xml", + "upstreamIcon": "groups", + "upstreamPath": "android/social/groups/materialicons/black/res/drawable/baseline_groups_24.xml", + "upstreamSha256": "186ce909f2651364aec4a30f01070f278ff32e98d214c35d75e73b768ee1d118", + "localSha256": "4b2f76ba434096fa7eea51bedf84e76d60d03713c6ad8389068c543718dfc942", + "orderedPathDataSha256": "c7f927cafa37ad9fa2587566bd9f1b940c947498a82a6a3bcb3a3a7258455682", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/h_mobiledata.xml", + "upstreamIcon": "h_mobiledata", + "upstreamPath": "android/device/h_mobiledata/materialicons/black/res/drawable/baseline_h_mobiledata_24.xml", + "upstreamSha256": "fa10cee421aeb685a18aa1e68a395e99ad20e62ef2effaba3e6a7269466c6f48", + "localSha256": "9a31e3f6a96ddf281609bca131e13daaecb7ceda82b4bc65c99f411be4ae2006", + "orderedPathDataSha256": "c385df023cac1dfbb89b60d9ccf9b3843e5169aecc418006fde35ba6b7c412d7", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/h_plus_mobiledata.xml", + "upstreamIcon": "h_plus_mobiledata", + "upstreamPath": "android/device/h_plus_mobiledata/materialicons/black/res/drawable/baseline_h_plus_mobiledata_24.xml", + "upstreamSha256": "2be315bba8a0216607c19e5e3038ecfb4ae43c8d885615ca8f5f05346880a4bf", + "localSha256": "f01a1487e867103fcd50878b9cedcf3436657cb185f99e4b5b5210e245c974ae", + "orderedPathDataSha256": "0ce5e773b3b89d1eb7c75fe9f4be1ec3d70b3c38de7cc2a8d6ea9b22d7c44886", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/hail.xml", + "upstreamIcon": "hail", + "upstreamPath": "android/maps/hail/materialicons/black/res/drawable/baseline_hail_24.xml", + "upstreamSha256": "a90489084ac2079e1887ebd8c732e010f1a341601c4eb8b6e97dee43dccbd182", + "localSha256": "1b6b7c151a55f0075a1676664f89808e39b2ee9946c571563cc109fa98e5e197", + "orderedPathDataSha256": "bcbdc422f321b2169b195801c3f394a8c1a677a5b7c05ab7a5261d401635d897", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/handshake.xml", + "upstreamIcon": "handshake", + "upstreamPath": "android/social/handshake/materialicons/black/res/drawable/baseline_handshake_24.xml", + "upstreamSha256": "3e4a6f7b847b23fb2755a7047d95826721d6f65f83a3ebe6ef0bdb17b9107511", + "localSha256": "35574b37fbafe5db92ffd71a727f25f95e87e52c63576974eebfe88039e90d38", + "orderedPathDataSha256": "15ced241daf60852adf22edb9f43efe6bbd8dddded6e68cc53da51ccc16852e0", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/handyman.xml", + "upstreamIcon": "handyman", + "upstreamPath": "android/maps/handyman/materialicons/black/res/drawable/baseline_handyman_24.xml", + "upstreamSha256": "be20ec23b6e04a0e7e1027fa803fb0dc15096b65dd5d2b91d48023fcbe4ca1eb", + "localSha256": "58aa0c534b4611aa3a394d84b3a8a1912c3e6b03373b4647858f69e6afab35ea", + "orderedPathDataSha256": "cbcdace576f7b04921d1a9009e41b9fb4fcc050269495dba4fa47d2ee91a358f", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/hardware.xml", + "upstreamIcon": "hardware", + "upstreamPath": "android/maps/hardware/materialicons/black/res/drawable/baseline_hardware_24.xml", + "upstreamSha256": "01671997662d5ebbcc483eb186e419bcdb7ea3dc5b9f713bcafc4ca4a33b1550", + "localSha256": "4aebb50a0731cdab2c7be50157d6dc3e92aa6c33c813064fca24cb029a846d99", + "orderedPathDataSha256": "bbff8d0833b93645742777a081679b424ff31cd510974d17c62b85ae756fc471", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/hd.xml", + "upstreamIcon": "hd", + "upstreamPath": "android/av/hd/materialicons/black/res/drawable/baseline_hd_24.xml", + "upstreamSha256": "9c5985ee7edb04c3bd163a90abe9fb301bb24e6fe148ad87d652d957bc7d3d04", + "localSha256": "426a10b2d944ad1d662a7e988c5bd1bcd81cfab75cd0537307ce9c8628a48c7a", + "orderedPathDataSha256": "63e061960de7dd4dc26bbcd821423b007c70db7dee0630605218f3faf8843072", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/hdr_auto_select.xml", + "upstreamIcon": "hdr_auto_select", + "upstreamPath": "android/device/hdr_auto_select/materialicons/black/res/drawable/baseline_hdr_auto_select_24.xml", + "upstreamSha256": "8f844f17903209450697c40173616b5d51aacff33ec2cfec2637b34e0ae34383", + "localSha256": "0690efa73823565e3d5cdb55cfd649514a93cb9d433d703ba873f94cf9bc053d", + "orderedPathDataSha256": "d88b3b718ac7c5b8ab89739f0ef69ef16a5326a1175acf1d5b1a08a65928efea", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/hdr_auto.xml", + "upstreamIcon": "hdr_auto", + "upstreamPath": "android/device/hdr_auto/materialicons/black/res/drawable/baseline_hdr_auto_24.xml", + "upstreamSha256": "ca4068b5c03c9440209f16c996b289aeeb3998237236fb39881df4ccc98f0f77", + "localSha256": "c96986f93f47356620f2f87a475aa339ec0bc1da186654fe6171590f1352b2f7", + "orderedPathDataSha256": "b1668ea1e6a9176a50ea87522e5b721469e992defa2ff154220bff1cea63cf81", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/hdr_enhanced_select.xml", + "upstreamIcon": "hdr_enhanced_select", + "upstreamPath": "android/image/hdr_enhanced_select/materialicons/black/res/drawable/baseline_hdr_enhanced_select_24.xml", + "upstreamSha256": "01b19663d201b63f31658631bdafc32878c8f97bc64984db20a56db85b234ed1", + "localSha256": "37cfcc4e37b33b17455bfa82230966f2fbc050e0635acffc2a8342b79de5fdaa", + "orderedPathDataSha256": "bf07c49d16fc01913c8c7f14dd164e7b49f79303316a566c777518d8296f883a", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/hdr_off_select.xml", + "upstreamIcon": "hdr_off_select", + "upstreamPath": "android/device/hdr_off_select/materialicons/black/res/drawable/baseline_hdr_off_select_24.xml", + "upstreamSha256": "9510489458c128eb7931ff0fe69d9efd4e4a2f7044a1c5c2476cef207e7289a8", + "localSha256": "01dbf243bad741e1730c6ef5abe68294c44172bc4096abd66b3fb523ba5ec35b", + "orderedPathDataSha256": "64ca341767a68e65afde9ada134d011e28c9ea472958c980a26c4a49269e4bdf", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/hdr_off.xml", + "upstreamIcon": "hdr_off", + "upstreamPath": "android/image/hdr_off/materialicons/black/res/drawable/baseline_hdr_off_24.xml", + "upstreamSha256": "db15c53d1d281a258b18923928bc36ce88b640fcd7ec425807d18ada9b6e8dd0", + "localSha256": "912933e7d2cf7fa67b0d0dc2140b8f2ce45ae056991614c5f0840fed09515f2f", + "orderedPathDataSha256": "6c8d753c834df41be8b19d3b4b8360701302e7c7ef0f0ec4d0f4f8ab26325bb3", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/hdr_on_select.xml", + "upstreamIcon": "hdr_on_select", + "upstreamPath": "android/device/hdr_on_select/materialicons/black/res/drawable/baseline_hdr_on_select_24.xml", + "upstreamSha256": "1247043f4e54e14b4f760c3596a86d60e53d977b35a39284047b5838fb162082", + "localSha256": "5abc69080fc6499cfbe878e8297d58b8a01c9b8ecacde1e5962ab98fdd3957e4", + "orderedPathDataSha256": "9484834ac1d0353711c5cb5637d31bd055175814fa0cfa6b70f2b376bb84f35d", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/hdr_on.xml", + "upstreamIcon": "hdr_on", + "upstreamPath": "android/image/hdr_on/materialicons/black/res/drawable/baseline_hdr_on_24.xml", + "upstreamSha256": "5c1dfe860662d37c1bc00279c2425314fb9ace9a9d6d7031f32a1436a7e5d7be", + "localSha256": "ee6bc0f5a189c432c47091722b40887c72c8fa05aaf35d4a01d9a2684e7052ed", + "orderedPathDataSha256": "5a268f08fa278ee07eed1453c7fcec9a0963a4253d164e24b1a3bbb87217145c", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/hdr_plus.xml", + "upstreamIcon": "hdr_plus", + "upstreamPath": "android/image/hdr_plus/materialicons/black/res/drawable/baseline_hdr_plus_24.xml", + "upstreamSha256": "1b2488ecd6e9687418856411a9933bc847e756b620ef73f2417cd0d50a6c349a", + "localSha256": "3fac9879e35e58af9e57a7b91819129491f1d81114788c9d52d50c8b02977e80", + "orderedPathDataSha256": "ea5476c2ec3e51aee62035404b464c7eabf65f026b3787234fe183f2bf1bb0d6", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/hdr_strong.xml", + "upstreamIcon": "hdr_strong", + "upstreamPath": "android/image/hdr_strong/materialicons/black/res/drawable/baseline_hdr_strong_24.xml", + "upstreamSha256": "320af31a6925c812ed86dd7ecae47b444157d7cd1b252a159bddb0c33a462055", + "localSha256": "7f38c649aae402807bd6fc461ff18ee17ddfaf93f2b3a4dc1c86ff0d6a61e8de", + "orderedPathDataSha256": "0a425dc6f53a48780ec295ef4c6465fbad33e734f9027f306efbd9cdf18e465f", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/hdr_weak.xml", + "upstreamIcon": "hdr_weak", + "upstreamPath": "android/image/hdr_weak/materialicons/black/res/drawable/baseline_hdr_weak_24.xml", + "upstreamSha256": "10033614ff82cc8c01c9d13b885448f355fb90ef362ae086e7e8d1d380b70221", + "localSha256": "e813708c9e51650ccba8ff2e5912bb0438ab1c55227b7f8b60a4358b185bb86d", + "orderedPathDataSha256": "abf808e9a3ee0fd907db711124f4f7bf8a4a94eaab9803756df68efa711f0f03", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/headphones_battery.xml", + "upstreamIcon": "headphones_battery", + "upstreamPath": "android/hardware/headphones_battery/materialicons/black/res/drawable/baseline_headphones_battery_24.xml", + "upstreamSha256": "e8e2ebc3d9f31121dfbed13c9631119699da02f62ee8bc94d81ecff3b9208e8f", + "localSha256": "4511250271b5fde5c14b95a4e2110e29721eeeb55727c98fe1f4bea5a22b5a75", + "orderedPathDataSha256": "c6d87b32b35416af20bdd7ae2999332261375b7882f90eb77a01d05222e89fe1", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/headphones.xml", + "upstreamIcon": "headphones", + "upstreamPath": "android/hardware/headphones/materialicons/black/res/drawable/baseline_headphones_24.xml", + "upstreamSha256": "7ddc2b7e96fcbda69e01ac27df624b2078722495f129791d031492cde589ced1", + "localSha256": "5a1a26a7719951ea00a5ad0d72828db9b07c78aa7e5fb72a27a4c0116c019b22", + "orderedPathDataSha256": "bcdf17a15bb712db9a48b3213c7bef08a522c8851acade68c2d3e473b8470e37", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/headset_mic.xml", + "upstreamIcon": "headset_mic", + "upstreamPath": "android/hardware/headset_mic/materialicons/black/res/drawable/baseline_headset_mic_24.xml", + "upstreamSha256": "b70dde3d0a486825d462522a87e441a6682a4bd5379d046d784a5f3242f46c00", + "localSha256": "795339a5393aee6db3faa2678a9a44646e7bf8401abaef96cc64345d70171578", + "orderedPathDataSha256": "85365914704f374866ddf0dd7740b51069ea980843768f60a71c38a57599a5a6", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/headset_off.xml", + "upstreamIcon": "headset_off", + "upstreamPath": "android/hardware/headset_off/materialicons/black/res/drawable/baseline_headset_off_24.xml", + "upstreamSha256": "c1c43606cd7f9adc0e8e038625a78c32960cd44429a4bc6921264ccf3084c3ef", + "localSha256": "8f8bf19923fd5aec39a84620fe224cd0fd8a46cce2e72089fa8d3889f89e1a6c", + "orderedPathDataSha256": "038896923e8589f8276374712ae9c43bb741f5aea2e15a258220b4e73f04d5a1", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/headset.xml", + "upstreamIcon": "headset", + "upstreamPath": "android/hardware/headset/materialicons/black/res/drawable/baseline_headset_24.xml", + "upstreamSha256": "031ff6ebba13ce285ae926e3d0737b5f084f493d1c1280df8dd2c6361d66e5cd", + "localSha256": "d68a84e2c5726cc8f91f17b99e9909c06bf7c6ea68b9b35cc166781d28e662b7", + "orderedPathDataSha256": "205fd8d71c208de49d620fd7b199a82e4b1d6105490345b2767bb1399adc9eb2", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/healing.xml", + "upstreamIcon": "healing", + "upstreamPath": "android/image/healing/materialicons/black/res/drawable/baseline_healing_24.xml", + "upstreamSha256": "e1f61c073e1f58ff1a9ca1f70e0c44e048999a020457dfac8d6f6e29b1508ec7", + "localSha256": "4bb633ae4d900e608d74af15f403208acd9ecf24a6ee8d0ccca366211b663591", + "orderedPathDataSha256": "370f8d7d7bff9904c1605f0f7901124e7bf250dff94b03dbaeeca3931af58af0", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/health_and_safety.xml", + "upstreamIcon": "health_and_safety", + "upstreamPath": "android/social/health_and_safety/materialicons/black/res/drawable/baseline_health_and_safety_24.xml", + "upstreamSha256": "e8073991942455bc63d981838231118aba110e7b570cedd8e69909cd063c3c9e", + "localSha256": "f03d68181ee4fda81cc94fa1f1945f22cffeaafbd08037ce0f80413991933780", + "orderedPathDataSha256": "a0227b17121a5fa68c5b422139f7e44c23a5eae2576211216664745ab73ed57d", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/hearing_disabled.xml", + "upstreamIcon": "hearing_disabled", + "upstreamPath": "android/av/hearing_disabled/materialicons/black/res/drawable/baseline_hearing_disabled_24.xml", + "upstreamSha256": "c6a68a52afc00519822bfb82457a9d0cf7eae82616eef375f0e14d4b6478ae08", + "localSha256": "0cd94e326e83456ddfcdf114984b13eb8f3276d0f5e1abc29c16ab73a735163a", + "orderedPathDataSha256": "235646fe44f686790553024c36887c09c484a6a550844d61763a20c59a7c0190", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/hearing.xml", + "upstreamIcon": "hearing", + "upstreamPath": "android/av/hearing/materialicons/black/res/drawable/baseline_hearing_24.xml", + "upstreamSha256": "1ef5f57ecce696d762a0227c31e9f3a50f04dc3296caf360e799afe708811a6a", + "localSha256": "118d9bf559bf3ebb5131c2dc01313b0219959dd14f98e5ec863bdbbac768f03f", + "orderedPathDataSha256": "19bf5154c89e6f336514a6a429cda9899366db9908ba215d5c9764580c69f426", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/heart_broken.xml", + "upstreamIcon": "heart_broken", + "upstreamPath": "android/social/heart_broken/materialicons/black/res/drawable/baseline_heart_broken_24.xml", + "upstreamSha256": "5c664566cca7445308b8c8e2d917ddb99fc5b54053064ed9d0f884844f6338ee", + "localSha256": "ac934cbbba6b56d6300a3369100896e3c6d025f4306a7097792c8f208622d91d", + "orderedPathDataSha256": "ee33008adc18a5e39917a6092a72c12de60b424bae8c49cc6a2a8767ca9969f5", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/heat_pump.xml", + "upstreamIcon": "heat_pump", + "upstreamPath": "android/home/heat_pump/materialicons/black/res/drawable/baseline_heat_pump_24.xml", + "upstreamSha256": "a620ea55a8b5a082bb03d6c06e6cb957dba08c14706fdfebd360a3c277166919", + "localSha256": "b21492783bf8f914788a687d780e87b931c21f33710ae0fa88c3530eed9c938c", + "orderedPathDataSha256": "e31ce16d6b10d2925275ad24678ca73d00f74be423c4883dcc7718bdf1915dea", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/height.xml", + "upstreamIcon": "height", + "upstreamPath": "android/editor/height/materialicons/black/res/drawable/baseline_height_24.xml", + "upstreamSha256": "fcbc51140d65911585898f341d5aab638135f3e2039d693059a9395d8069eab2", + "localSha256": "6267d8a512b49cbc9212f019ad5d59abde226e426e50e0e6e1967a58e556c944", + "orderedPathDataSha256": "23765dbd30d49628c40958d5f36d596eb7e1047fa831a72645a152d71cc90045", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/help_center.xml", + "upstreamIcon": "help_center", + "upstreamPath": "android/action/help_center/materialicons/black/res/drawable/baseline_help_center_24.xml", + "upstreamSha256": "1220f75be2d81005fb53bc10ad2e0d472a7fe2f28adf845a16928bb37d1516ce", + "localSha256": "ddcd1a6b9a0c10c480bac06b8068b7093c9cf6a17d4928574e397ea7bd1df79a", + "orderedPathDataSha256": "3b480ec75976aa33faad94a4759ea0b32303b86b9a53e6955d334bdd7de43f1d", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/help_outline.xml", + "upstreamIcon": "help_outline", + "upstreamPath": "android/action/help_outline/materialicons/black/res/drawable/baseline_help_outline_24.xml", + "upstreamSha256": "a907b32a68168e6a3078d7f3cb66c1312010990528e41f384b03eb84834efde8", + "localSha256": "bb7e4336a36d8fb2d1c6d4a70a5fd8b5ffe3b8605871c442847d3ba2a9be7931", + "orderedPathDataSha256": "1d367c31b9921d8426d01e45894fbc97fa5476a0785b78ce151e751108279657", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/help.xml", + "upstreamIcon": "help", + "upstreamPath": "android/action/help/materialicons/black/res/drawable/baseline_help_24.xml", + "upstreamSha256": "959aabfbd13cf8eb8b927ba0e8731f51312d1b060e8126621bbfe1a93adb88c0", + "localSha256": "95c0444e751efbb5603cc4ef13b86f4c0ad5890de4c2a6d7ded6889be065077a", + "orderedPathDataSha256": "7fb3351553c2076c1e5cb0bf316a1092aa7921ac019659e045c6b4ce4ebd3ee0", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/hevc.xml", + "upstreamIcon": "hevc", + "upstreamPath": "android/image/hevc/materialicons/black/res/drawable/baseline_hevc_24.xml", + "upstreamSha256": "f9841d061359246c4d8da166d897703553dfe63b41b0debd14c95b591e52740f", + "localSha256": "6b8e28b19f89ca1bc4d05d532cdb8c48e28e2b5bb8990c46818bf086f55053be", + "orderedPathDataSha256": "809f994af432fd4a24e2d52f58bf2552fb0ee411573aa94492db906f28301b2a", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/hexagon.xml", + "upstreamIcon": "hexagon", + "upstreamPath": "android/editor/hexagon/materialicons/black/res/drawable/baseline_hexagon_24.xml", + "upstreamSha256": "4d32460575111934f8cc8c134b9ab2a55170f2dfb434a3d44019885ba6bfb7ae", + "localSha256": "f088821fe3e5de39eb04219868109bc60bc8b5ab0ce3d294481f39e4a33397c5", + "orderedPathDataSha256": "93a31f227de41bb7d9a89641cae292143047aab0d8ee79d280645f4bc56775ef", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/hide_image.xml", + "upstreamIcon": "hide_image", + "upstreamPath": "android/image/hide_image/materialicons/black/res/drawable/baseline_hide_image_24.xml", + "upstreamSha256": "73ff8674dbd0e2e16d5d2a2368813176f86532797f26ed63cb74a52dc001657a", + "localSha256": "cd0ad02906d5dbeb578a7666419fe2e52aa349ba2b5511d732b8a472fed6e310", + "orderedPathDataSha256": "7cd7968a4eddad0b86a750d96ce26e9bcde29bd1731bbbf51e455d449aa13fd1", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/hide_source.xml", + "upstreamIcon": "hide_source", + "upstreamPath": "android/action/hide_source/materialicons/black/res/drawable/baseline_hide_source_24.xml", + "upstreamSha256": "794dac14715dc6fc8df7fff161c93be499203699bdecc0a7dd038688f8433414", + "localSha256": "5fc5ed5c80ffc910e6c11939e4e0921276b672927718a5df74fcfd7aafbcff25", + "orderedPathDataSha256": "2ba6a17ea09201482ba775a34993e46ba8da75186d88b2028b2eaa079d269040", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/high_quality.xml", + "upstreamIcon": "high_quality", + "upstreamPath": "android/av/high_quality/materialicons/black/res/drawable/baseline_high_quality_24.xml", + "upstreamSha256": "a0824319325d432768a83557145aa65d0b9ad610f8c60cd0022651707e19b774", + "localSha256": "aae869a3dcd0c9449ac88509209489b570aa205835c8cefc36f5a81a97d9a281", + "orderedPathDataSha256": "11c83b3db15a432af7f435face30015f0f81944cbe31853c72dee7a2630d533b", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/highlight_alt.xml", + "upstreamIcon": "highlight_alt", + "upstreamPath": "android/action/highlight_alt/materialicons/black/res/drawable/baseline_highlight_alt_24.xml", + "upstreamSha256": "46b2f9b127b9168cc2b20dba5129ba6d630e9a3948bb8b9a19e91fe0e561cc35", + "localSha256": "c77765bc1df169526d605b40fdce97e9ae4462c567584025b8819292f35fb94f", + "orderedPathDataSha256": "99c3a6922c57fcbfd77cc49f5a4b68c09b2d67dd9f7fa11765bc4f0f83fe290e", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/highlight_off.xml", + "upstreamIcon": "highlight_off", + "upstreamPath": "android/action/highlight_off/materialicons/black/res/drawable/baseline_highlight_off_24.xml", + "upstreamSha256": "47a94014790560b5036596533df0ea71e7ecdd3a5999740fe350f167cef53c85", + "localSha256": "5bee6d1a6bdd4bdf6ba4ed3a26eaffd5cd553cfc28341d32f793bc0755681ae8", + "orderedPathDataSha256": "5ae19b74b223f5dd5b40db6ef931b2daac0d2beec830a01ae9f6b5572fe8dc42", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/highlight.xml", + "upstreamIcon": "highlight", + "upstreamPath": "android/editor/highlight/materialicons/black/res/drawable/baseline_highlight_24.xml", + "upstreamSha256": "bce38607662d80379cba8a350ea69cee68041b9413770065a277ff91144c13ef", + "localSha256": "66262470ab7b2cd28481557de0768bde4f51de8552b7e351263cf12524ebfdbc", + "orderedPathDataSha256": "e5c9b6d1f54cf03b7cf6ce3ffb241f28bc8e8b397989e276ec8740af0e423413", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/hiking.xml", + "upstreamIcon": "hiking", + "upstreamPath": "android/social/hiking/materialicons/black/res/drawable/baseline_hiking_24.xml", + "upstreamSha256": "c208ebfe1904571351217e0f90e0186289a1c3b5f5155528782168fff0238e0b", + "localSha256": "78d717339dbc7fc3d9ae284456741de6acee2a28db816937079483e541b6212f", + "orderedPathDataSha256": "5fdc2634cb4006f2168e79c21cab29de7400dff8758b2d190861332d50ab00a1", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/history_edu.xml", + "upstreamIcon": "history_edu", + "upstreamPath": "android/social/history_edu/materialicons/black/res/drawable/baseline_history_edu_24.xml", + "upstreamSha256": "21a0dcc4a5e8e6f96b7698a8fcaf4892ee7c8e161cb5761362934921162ab2d4", + "localSha256": "400d517467568a4c078a9315485ebb863290ae05792bfd6748466229aa7e4b8e", + "orderedPathDataSha256": "cb39646b90da9d526ad541489c159f9b2f1820110c80c75cf3e4218f8b78f4b5", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/history_toggle_off.xml", + "upstreamIcon": "history_toggle_off", + "upstreamPath": "android/action/history_toggle_off/materialicons/black/res/drawable/baseline_history_toggle_off_24.xml", + "upstreamSha256": "52d3d1a5a1aacbfa5f6e009909bb82b1e3c158d31e146bea13513e070654b4e7", + "localSha256": "7646bac0b5d97cf675f515e2a7564be0ef5d78b6aee3d22c427300b079244787", + "orderedPathDataSha256": "92fc90b1e7e91e4a07a5b6af15e44341313cc6d6d14461bf16bcd6c67fe6b723", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/history.xml", + "upstreamIcon": "history", + "upstreamPath": "android/action/history/materialicons/black/res/drawable/baseline_history_24.xml", + "upstreamSha256": "a45be30e999d5205184145cc149b1e1282acdb6614ec32fad9c3f54810504047", + "localSha256": "3776382db5c2d8f10b720e9c942607ed7c40c0e17f83e7a13414a7d52780f3ea", + "orderedPathDataSha256": "74500b0eb3d997f34c1094583b4bd56e68aa048c3792edccfbbf8c6797a8c23d", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/hive.xml", + "upstreamIcon": "hive", + "upstreamPath": "android/social/hive/materialicons/black/res/drawable/baseline_hive_24.xml", + "upstreamSha256": "7a2d70d9a1f6c2bedde4303ff9fe60ce10c3a818eeb61b333805c86e07749c5c", + "localSha256": "0db9ea04eb0e04b903814d459c5195327500a76ac8271ebcc0432003391e20a2", + "orderedPathDataSha256": "aaecf31f64257e81ebe545f03908d94086d56f5522aa20b039319e6dc85ec8fe", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/hls_off.xml", + "upstreamIcon": "hls_off", + "upstreamPath": "android/action/hls_off/materialicons/black/res/drawable/baseline_hls_off_24.xml", + "upstreamSha256": "86f90dba0e3c75e4b4a09e4dabcc81171baf2e3dc6f99d5da1781c7755c37f14", + "localSha256": "cb204d310f112ab3e383c982b9b7792448140ecc9fb1fa7ce8a69bf177064a67", + "orderedPathDataSha256": "d921376a9041302e3869599c2b6ffe7b43f3ab27bd2dfc0d86d0fbf1c9ebc0be", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/hls.xml", + "upstreamIcon": "hls", + "upstreamPath": "android/action/hls/materialicons/black/res/drawable/baseline_hls_24.xml", + "upstreamSha256": "1b2f765d4aafb992c67dacb85e29db4402a8547f1382f55b2829945601d363ff", + "localSha256": "880512c5550c5cd8a9d444b1051f968e26518dbe3e9be76b4b47edbcfe180476", + "orderedPathDataSha256": "c67aa2d6f1e880a3f1fdf4ac997f08d8d0917f6a0076bf31b255f42596ff64d3", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/holiday_village.xml", + "upstreamIcon": "holiday_village", + "upstreamPath": "android/places/holiday_village/materialicons/black/res/drawable/baseline_holiday_village_24.xml", + "upstreamSha256": "7567f1a009671f7110067db28404d6e4f3f68e3ca8533718ca6b559912214913", + "localSha256": "697df8e7254fef6719e723b42f20c4b2c8d011001d77df46b6a2e0fdf1a3b7f3", + "orderedPathDataSha256": "489d2a5037b14cd387124c729cba92c2cde67de2f58f30b038feeac44e0727d1", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/home_filled.xml", + "upstreamIcon": "home_filled", + "upstreamPath": "android/action/home_filled/materialicons/black/res/drawable/baseline_home_filled_24.xml", + "upstreamSha256": "240642b00d2b6095f4768b7a07c5807af0a03af76db54460e12c2f6f1fe6cd15", + "localSha256": "5c2db5141dbf820a762245b024e7435e308e2aa48078f03289685681c8ccf0fd", + "orderedPathDataSha256": "5970ab86cbdf72fbe77d5f304f6ee55e03fe7851dfcf7fa238a8bbe68bef4ab4", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/home_max.xml", + "upstreamIcon": "home_max", + "upstreamPath": "android/hardware/home_max/materialicons/black/res/drawable/baseline_home_max_24.xml", + "upstreamSha256": "902b4ff5f2158e1b69f248939dc0e755266729a3b1252b6def82f483ec4a5d4c", + "localSha256": "78caf73e165503834580ffc4db80c6ad73fbabb83d86c6d88e17ff09496b110b", + "orderedPathDataSha256": "b3593647ddb00fd4bc1d3dfd5f9bcf931bfedad30fc53ca4a3373315771adcac", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/home_mini.xml", + "upstreamIcon": "home_mini", + "upstreamPath": "android/hardware/home_mini/materialicons/black/res/drawable/baseline_home_mini_24.xml", + "upstreamSha256": "ac882557196c67e3056fcf770f077130325d85bd42f95a930be545a22462e5e0", + "localSha256": "f8137f0f6483efefd3ee8a131961d020e6fb9b77e12782a11fb18f2e5a714fcb", + "orderedPathDataSha256": "1a7b1d305ae00f287275f91732f613a09c107e1c96c0b3eee5dd96d7389e20cb", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/home_repair_service.xml", + "upstreamIcon": "home_repair_service", + "upstreamPath": "android/maps/home_repair_service/materialicons/black/res/drawable/baseline_home_repair_service_24.xml", + "upstreamSha256": "cc4132ec90ec99c1d133dbf23c8a6bb925373e450de284b3636c3e921400beb8", + "localSha256": "289527ad5eafd99cc7f851053fd2108f63d8bb07d3d12673e13cee6159e51c7f", + "orderedPathDataSha256": "22ef8f522808542d50c5c72874774b8faa36bf853dba3a7d4fa2c32ffce72b22", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/home_work.xml", + "upstreamIcon": "home_work", + "upstreamPath": "android/navigation/home_work/materialicons/black/res/drawable/baseline_home_work_24.xml", + "upstreamSha256": "6ecd595821b280a0d0354ee8149b5a2bcf747dd069a3f0ff6bc67afe0a3f83a6", + "localSha256": "a31eeca6c567796d784339e97580ed9f7c154b08dd178dca536433cf9b6bbb25", + "orderedPathDataSha256": "ac25c35ec4bf00ea9c99ab2656aaa9316f53c230e6b871517cb5f55a8cdd6799", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/home.xml", + "upstreamIcon": "home", + "upstreamPath": "android/action/home/materialicons/black/res/drawable/baseline_home_24.xml", + "upstreamSha256": "532c8e5919e605626ff1d78b0da0319727158dc24bb7a3ed733edd17009969d4", + "localSha256": "d1d7c509ec0aaaf4adc8a19c7efdd0f6d4f10a0148dd7db1cdafea06b0c75bb8", + "orderedPathDataSha256": "8ebf9ac655486652a125e2914e0e63e649be896a137e77c52331fa9a8401f37b", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/horizontal_distribute.xml", + "upstreamIcon": "horizontal_distribute", + "upstreamPath": "android/editor/horizontal_distribute/materialicons/black/res/drawable/baseline_horizontal_distribute_24.xml", + "upstreamSha256": "495e52b97d8756d2dd17856fe5a12950b66f5cbd6b25010e805d3e34b4457eb8", + "localSha256": "6d870345c896960e6a763db85dc8c09d3df6f3c12234d2d57b5a7264c487c0b2", + "orderedPathDataSha256": "06472a0026098ba2beb3d31b50ef3be922522b6f6e3903ad20e0865861f5cb4e", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/horizontal_rule.xml", + "upstreamIcon": "horizontal_rule", + "upstreamPath": "android/editor/horizontal_rule/materialicons/black/res/drawable/baseline_horizontal_rule_24.xml", + "upstreamSha256": "b4a56bb8a5b6b88580050083a9ad76cb7028517fb483c9bae963b67a2c6995e5", + "localSha256": "3c8c15468b3d579871d392515e5402009ab7951b8594fcbd7a53af8108beae3e", + "orderedPathDataSha256": "31f6df6c0a8c17432f6570b7b07b0c7bb29d6e41b3876f0c46846d3d51c5d423", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillType", + "value": "evenOdd" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/horizontal_split.xml", + "upstreamIcon": "horizontal_split", + "upstreamPath": "android/action/horizontal_split/materialicons/black/res/drawable/baseline_horizontal_split_24.xml", + "upstreamSha256": "d2924b886e2bebbdd049609e31029f0e3f154e0fa54505f546a63cf86f216d6d", + "localSha256": "50e7d7e689559d316062a5879cae88df95ee4045445ec1dc55a6a6ed4339d2db", + "orderedPathDataSha256": "41aeb540da4be3b8e3b2241e782e9e057d4dd7cebdcc92d45d3fcf859df86332", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/hot_tub.xml", + "upstreamIcon": "hot_tub", + "upstreamPath": "android/places/hot_tub/materialicons/black/res/drawable/baseline_hot_tub_24.xml", + "upstreamSha256": "16e7c699059b093da1d3704dbd888502ccf38635930280c8ba7526320a2a3800", + "localSha256": "9a99bb09a836108c7fe27f221e2c86bd4fab6086e741c0d20f5bb6919819018d", + "orderedPathDataSha256": "6157558935674b3c08c1d741667857172a1f4719387f9337f79e54c9b838875f", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/hotel_class.xml", + "upstreamIcon": "hotel_class", + "upstreamPath": "android/action/hotel_class/materialicons/black/res/drawable/baseline_hotel_class_24.xml", + "upstreamSha256": "37b7d54dad6e5e7f62f59357712eb9f2009aee9ab60d441253509c3081b8161b", + "localSha256": "d5509ba176e7e5b1303d7a6800a58ce843f2991fb718a2ef13f4087a28a8f1b3", + "orderedPathDataSha256": "940cf0c896f2e90c1fd031ac361207a1d84f4a76cc65e981416b7342824d7b94", + "originalGeometryMatched": false, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/hotel.xml", + "upstreamIcon": "hotel", + "upstreamPath": "android/maps/hotel/materialicons/black/res/drawable/baseline_hotel_24.xml", + "upstreamSha256": "b88e3763413d4820af6f4c3f3ad8f9b00a3e2f9eb9a031264d24af282f850a9c", + "localSha256": "887da6c9b0e5ab66198b2f9b2d202db1ca507fe89125a4734df0f10a925495d4", + "orderedPathDataSha256": "b739deca92624ca2a772e3fdf87d09ffd35c9a36feaa9421d74a5f2dc3bea840", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/hourglass_bottom.xml", + "upstreamIcon": "hourglass_bottom", + "upstreamPath": "android/communication/hourglass_bottom/materialicons/black/res/drawable/baseline_hourglass_bottom_24.xml", + "upstreamSha256": "57f189dd60a4039d3fd68d239b24ecf7c15575ba67dab2123cc66b0fff8a5c39", + "localSha256": "e807bced03186556702ab7b487bc4ee9b509c3690630594d3f904f725e89ea20", + "orderedPathDataSha256": "4ae76db05bb7ac0b69845ba1f4f75cbe638c34c67f720876216613f0c3d725dd", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/hourglass_disabled.xml", + "upstreamIcon": "hourglass_disabled", + "upstreamPath": "android/action/hourglass_disabled/materialicons/black/res/drawable/baseline_hourglass_disabled_24.xml", + "upstreamSha256": "c28894fb64ffde5f5f490d91e0e56ff48acffff9dc8d1c75f6a9f97f2f04e305", + "localSha256": "77de579151c7c41c547d6858fa4a649c5b53228e29c147d3682b3bc9364d0b8e", + "orderedPathDataSha256": "d3b82f139a7f93cfaf270155bdba3e65f483606041854990814988e1da6958c1", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/hourglass_empty.xml", + "upstreamIcon": "hourglass_empty", + "upstreamPath": "android/action/hourglass_empty/materialicons/black/res/drawable/baseline_hourglass_empty_24.xml", + "upstreamSha256": "fca29de163a3f819e2cd492a46e531778c29666b4f47bef2f79cd0343f5f539b", + "localSha256": "f9b7d9cfd49026c11fdc6e85a1d5f1537c9fa05810f947711b2033b7dbe5958f", + "orderedPathDataSha256": "2954459d70acc9eb5f0297a3a68add08ba26b7319d4c1726f609a78637ff1015", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/hourglass_full.xml", + "upstreamIcon": "hourglass_full", + "upstreamPath": "android/action/hourglass_full/materialicons/black/res/drawable/baseline_hourglass_full_24.xml", + "upstreamSha256": "a2e3d0737668e01ed46d77c0409d5f0bc4410fc1d42dc6476ff44b6dfa4da7fc", + "localSha256": "ce571a849fef866b7d99b58140876630f3b307c4be570b23fc20a0e41619a637", + "orderedPathDataSha256": "d4267dda61ecd47b4d4995296fc4aa1f292a14aca5d11ba96e26a2c92245ae84", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/hourglass_top.xml", + "upstreamIcon": "hourglass_top", + "upstreamPath": "android/communication/hourglass_top/materialicons/black/res/drawable/baseline_hourglass_top_24.xml", + "upstreamSha256": "6ff4bc86d2d73ddc95788b62027a7b13b1fd70387e2f22d98d31bc0b1339a181", + "localSha256": "d39c38de564c6eb2f410cec97ed2357121b258971dc6b1fbf7aa79e66e9ddc50", + "orderedPathDataSha256": "234b640c066bd57ca7623cecb3c8c88119b1cfd1748a868f35132bf54d5d24a0", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/house_siding.xml", + "upstreamIcon": "house_siding", + "upstreamPath": "android/places/house_siding/materialicons/black/res/drawable/baseline_house_siding_24.xml", + "upstreamSha256": "8ced51b66a3ea8b46cecd3ee48866cf6054bcabd07922ad7db676f907a960b84", + "localSha256": "4feb01d172ad15968871242d198c2f8a2c8d68ca1e073dfe61492aa50678e0fe", + "orderedPathDataSha256": "cab197374d3b8bc557d575776467925e41aabf32e36a6cb7d3b1466e90ba37f1", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/house.xml", + "upstreamIcon": "house", + "upstreamPath": "android/places/house/materialicons/black/res/drawable/baseline_house_24.xml", + "upstreamSha256": "228ffef4088b17145386d0a3a35673ee009eaf1747bfba919520c58f37271397", + "localSha256": "5bcde0b094c3bf6c05197a89ff5283018f02e97a7285f84793364e23aefe4121", + "orderedPathDataSha256": "1c3f830d39937ca087085f117bb6f78f8c5fe6cc77cb70592196e03093611ac0", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/houseboat.xml", + "upstreamIcon": "houseboat", + "upstreamPath": "android/places/houseboat/materialicons/black/res/drawable/baseline_houseboat_24.xml", + "upstreamSha256": "973a55f2e49b7badd8e77f1040140f0cb7b19a051588f6305b9d5d094c4a48a4", + "localSha256": "b71500cf3e8e7b094662f140c5044671333f06bf80755d223f51c6285e71d81c", + "orderedPathDataSha256": "fae47ec07e514139441685d6fe1bb80a652d1adbbcf0b172c66b57c90619c26d", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/how_to_reg.xml", + "upstreamIcon": "how_to_reg", + "upstreamPath": "android/content/how_to_reg/materialicons/black/res/drawable/baseline_how_to_reg_24.xml", + "upstreamSha256": "22f6accc7e92a05eba0ff745baa44fa6f723f828d48271e82fd02d3a49e1b8f1", + "localSha256": "8954989e216f00ae3825b9bffe1a2f93d65f0ab5cc9d092492f8e5f9aa2dd693", + "orderedPathDataSha256": "9b8797204dd9a3732330272cb2a23894a171b395daa501608ca7d0f7adf21c5b", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillType", + "value": "evenOdd" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillType", + "value": "evenOdd" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/how_to_vote.xml", + "upstreamIcon": "how_to_vote", + "upstreamPath": "android/content/how_to_vote/materialicons/black/res/drawable/baseline_how_to_vote_24.xml", + "upstreamSha256": "7da4b668e227d9ecbba9cf2d57eef7e77a404a67752ce87873967f0e527f919b", + "localSha256": "6e16bb220ef11350cf8ab11ef6a5463f12af9190db3381d6226a0c214420283c", + "orderedPathDataSha256": "db723ebcadd54aab2cc1ed721ce41faf1d3a38dc485bd6a9b7b2629ad0d93174", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/html.xml", + "upstreamIcon": "html", + "upstreamPath": "android/action/html/materialicons/black/res/drawable/baseline_html_24.xml", + "upstreamSha256": "b9c5c1dd82b6f6c4fc1fe3efe4b1884f3a2de255dc5fcd88d28b9c0db03a8f24", + "localSha256": "c9783ca5dfc089a965d56e1c2f3e5e36581b7f09e68fba20f4c1ab09738e1082", + "orderedPathDataSha256": "5e755202f6b2ac2de1444bc7bb8ff0b3ab3c353adb274ebba0f42f173c6a729f", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/http.xml", + "upstreamIcon": "http", + "upstreamPath": "android/action/http/materialicons/black/res/drawable/baseline_http_24.xml", + "upstreamSha256": "dede7cea5a355ee574e839a706f6aeb4cef415aa5d6fdd7af571bbc7af3e935e", + "localSha256": "7c1b24ce03263fd429ab1e1afded3cb4b7ed991bb232e3b65f74d3347b0c7785", + "orderedPathDataSha256": "b48a6eb2679c88358f18857029bea619ce8dd61f63090e2682c50d9a3f83b39a", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/https.xml", + "upstreamIcon": "https", + "upstreamPath": "android/action/https/materialicons/black/res/drawable/baseline_https_24.xml", + "upstreamSha256": "50497b02f9af18c9dc248872bc0cc3381218526559674e3ffeb5957b0f2dcef9", + "localSha256": "08f8d2916e7c026f4b31f77c2517ae5e3053fb542ed215058cb63d468cbab03c", + "orderedPathDataSha256": "6bf734569dcb62cbac0da7273d8edb84aef3a06dfc0fe3c346affdb3ba9d16fc", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/hub.xml", + "upstreamIcon": "hub", + "upstreamPath": "android/communication/hub/materialicons/black/res/drawable/baseline_hub_24.xml", + "upstreamSha256": "a4906f5c5cb956321bf2956d70144cd6fbfe588fdf0c4ffc4df385126ddd3edd", + "localSha256": "447a16c4e70abe5a02101187f717332e2dad517d281f57a1409dcf29e4d54fbd", + "orderedPathDataSha256": "c8da9e4c0659e3bfc36a71bf42004f68c864a4865a1f9c9b0bc99883c274461e", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/hvac.xml", + "upstreamIcon": "hvac", + "upstreamPath": "android/maps/hvac/materialicons/black/res/drawable/baseline_hvac_24.xml", + "upstreamSha256": "1fb528b2b58ed70f1ae1dfebbd7ef2ca297f72d141756ba3059cbf88eafb94e6", + "localSha256": "31e118b81b6e59b0a1b47d0f9788fbb2567f7a45b7eb940a780f6795fae2e619", + "orderedPathDataSha256": "655f3feed405bb09aa3c2048549a5b5c0b189ca90c1b43399a86dca3169633c8", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/ic_broken_image.xml", + "upstreamIcon": "broken_image", + "upstreamPath": "android/image/broken_image/materialicons/black/res/drawable/baseline_broken_image_24.xml", + "upstreamSha256": "5941f1a9f7a8e708b5270210ba91a53b2749cf597a931e581b11b1b15e25808b", + "localSha256": "49619e8f1eaca19ce1dda60294f00b75b7b42c95dc7fd3551984f8e1a27d36b0", + "orderedPathDataSha256": "c11c5dfb6719fdaec536e084e921691f056e098f039921ba77922844de847491", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "tint", + "value": "#A9A9AC" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24.0" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24.0" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/ice_skating.xml", + "upstreamIcon": "ice_skating", + "upstreamPath": "android/social/ice_skating/materialicons/black/res/drawable/baseline_ice_skating_24.xml", + "upstreamSha256": "719ab8348fdea5c3631e88b1bed1d1218a46d5d8e87cfb2d77f2c3bdddb0772a", + "localSha256": "a6c8e3e613d846cf9f847d306468a28c88741a79f38cdc57a4a49b5463edffc0", + "orderedPathDataSha256": "3f39b9cbf7349573bdcb7f3f91d94f239cb7efdac881a243e6a5cb8768861757", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/icecream.xml", + "upstreamIcon": "icecream", + "upstreamPath": "android/maps/icecream/materialicons/black/res/drawable/baseline_icecream_24.xml", + "upstreamSha256": "487761cdc4a9fd6f625cacf5e90ef2dca6b6f745c686d5b83a66303f1f9e6fd8", + "localSha256": "af9a94e8aa81be5a025e24c1c7b3b28b5e22cbaab61514509b3e60ec61fb64b0", + "orderedPathDataSha256": "becc842269db4fe1aba86f84196eb55d98fa4a49a5b819a2c26199099c581cf2", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillType", + "value": "evenOdd" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/image_aspect_ratio.xml", + "upstreamIcon": "image_aspect_ratio", + "upstreamPath": "android/image/image_aspect_ratio/materialicons/black/res/drawable/baseline_image_aspect_ratio_24.xml", + "upstreamSha256": "574bf6756f9c9da4b48b4108a2103d9a3a6e904eca3cbec26f8ba5700954ba90", + "localSha256": "fda0a50f065ae5e4d6fdfcd01ea32dd15604ae684b0f4db738574625ddaaf765", + "orderedPathDataSha256": "d4047a3e4b8bdd6afd4c8c9d609a297510ee500e32223a4caa4974de2283b6e6", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/image_not_supported.xml", + "upstreamIcon": "image_not_supported", + "upstreamPath": "android/image/image_not_supported/materialicons/black/res/drawable/baseline_image_not_supported_24.xml", + "upstreamSha256": "2e2a6b4ce7d3e66234d09dbb5ba0f6dcdf16ea5986cabecace867644b1fc8be6", + "localSha256": "524c38f2ec1433ee0eaca92c00a3ca274e964c7164f513f9fedee8840dfaa479", + "orderedPathDataSha256": "73899e9406e78f12a362f500fa4078697c702d95e51f457f52e9ef4394cb111e", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/image_search.xml", + "upstreamIcon": "image_search", + "upstreamPath": "android/image/image_search/materialicons/black/res/drawable/baseline_image_search_24.xml", + "upstreamSha256": "a5a8adf50f23f44f5a5d0393220a32f9dc3026efc2030e09767fe3c56e112a69", + "localSha256": "3d35ce73803d36b2c6a27f4673f88acd161534a9fa717416d9c206bb6f8a09ec", + "orderedPathDataSha256": "1ff4ef9ded35ade7b6cc99e96ff468aa687caf49eed44be56d5c6485ca665a2e", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/image.xml", + "upstreamIcon": "image", + "upstreamPath": "android/image/image/materialicons/black/res/drawable/baseline_image_24.xml", + "upstreamSha256": "dac9f692691d4bcbea987c9f3d8cc5b21c002c16628d1ffc0a7e65cf0773bc23", + "localSha256": "f0abc706961a69b7e9b6d233348a563ce1f114df148008a48b0f9800ad3dba06", + "orderedPathDataSha256": "69a23aa4815ed09e5c0545f4dc9585d6e3a883223015b523680266abbc6d56e8", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/imagesearch_roller.xml", + "upstreamIcon": "imagesearch_roller", + "upstreamPath": "android/notification/imagesearch_roller/materialicons/black/res/drawable/baseline_imagesearch_roller_24.xml", + "upstreamSha256": "3ddb5b3ebc1b2d2724c23288f90c3d189b8c54058ba46465f2434d25c09dbec1", + "localSha256": "cb3438d849d55c6ada0703ad564806493d5e92bf7f3d42bf367ed8316ac35d49", + "orderedPathDataSha256": "1f8eb88c0c725347eefef0a7d6b17f1a9cb5618d3d6ca7d0b8487459109038ba", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/import_contacts.xml", + "upstreamIcon": "import_contacts", + "upstreamPath": "android/communication/import_contacts/materialicons/black/res/drawable/baseline_import_contacts_24.xml", + "upstreamSha256": "955a1a7f252ed69c679fc95a17c5b304e0d3b56933755d5a3ebda67848859011", + "localSha256": "aa80db268c2b61f0b3317f17d976b0fbeb41fa8a6a17b1cc46cbc903f8d42571", + "orderedPathDataSha256": "839926b866f200851aeea71dcbd34ce2937680d7da1f14688efb7718cd0cbeb4", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/import_export.xml", + "upstreamIcon": "import_export", + "upstreamPath": "android/communication/import_export/materialicons/black/res/drawable/baseline_import_export_24.xml", + "upstreamSha256": "dd64af1c1e19962bb74c1c8de5e645d2abd9e2d3eb06aee0793495521d04157b", + "localSha256": "4652be9a2dab25ec8858a9f6dc88e49ac21656fcbc6c3712b88ec5cb820d0cda", + "orderedPathDataSha256": "f261205c8c4bde7c656f0b33b472d1f922b32dc7ee141f4de4568e82e001b43c", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/important_devices.xml", + "upstreamIcon": "important_devices", + "upstreamPath": "android/action/important_devices/materialicons/black/res/drawable/baseline_important_devices_24.xml", + "upstreamSha256": "a6ff3f322fd2fb4a54976562d9f05e9b448647fa31dfd8058cea6ae249a11226", + "localSha256": "1aba86c352d28090abb290fa6b8eb08dc6ec3dcdabfb0533aecbee68df064d16", + "orderedPathDataSha256": "e68c93421cc6890c66626b16b4e5313f8c4c87f691acc550b9a0153cadb6cd6d", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/inbox.xml", + "upstreamIcon": "inbox", + "upstreamPath": "android/content/inbox/materialicons/black/res/drawable/baseline_inbox_24.xml", + "upstreamSha256": "a56ff7dd9888b5c7bae87c2906f258da200e2f098b31da147073c41aba491937", + "localSha256": "94a1ff3d6b1a481db45d2fce6a68043818d6afd9f0dd5ed0e25561f3a5fd4ff5", + "orderedPathDataSha256": "f26601e3ac5b83600c78023cebf989947018ca6e5c4c1ceec0782ec1214c2955", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/incomplete_circle.xml", + "upstreamIcon": "incomplete_circle", + "upstreamPath": "android/image/incomplete_circle/materialicons/black/res/drawable/baseline_incomplete_circle_24.xml", + "upstreamSha256": "4cb84e2a9bf42f8a93a8384e934d82d2ba4039041447667051dc3ce1d879cc2a", + "localSha256": "03ffa6214c97807a4cb384e1c28a8d7d75b448d532ae631968b46eb75ad4ef55", + "orderedPathDataSha256": "405ba2dea326078609a328afbad3781a6b64e38b62e5b6c60659eae925133550", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/indeterminate_check_box.xml", + "upstreamIcon": "indeterminate_check_box", + "upstreamPath": "android/toggle/indeterminate_check_box/materialicons/black/res/drawable/baseline_indeterminate_check_box_24.xml", + "upstreamSha256": "59408536e2f82ee6c7d909f8b74a49e9735299bfd12f5cbaf0c9343607d0ba1f", + "localSha256": "49bfbf64c9a43856c36b0eed3f3c9ff5e8a0ff175fd1e3337cfc73068a1ed183", + "orderedPathDataSha256": "0eb3e92aca4114cfa175176ee3096a3347264f0fd65e6ce1594bfb136053c7c4", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/info_outline.xml", + "upstreamIcon": "info_outline", + "upstreamPath": "android/action/info_outline/materialicons/black/res/drawable/baseline_info_outline_24.xml", + "upstreamSha256": "d4153e1dfca44479fc18925e54e31c8f67d188d54986f36219e961e3cb148ddd", + "localSha256": "ea6e78a57f956d758db5e8bb178393c3f560dfbe879fc280e54c8e1b80178ec4", + "orderedPathDataSha256": "76d7cae3a14357504985700cec5ec6efe3a11759e20090190f56878618bc6748", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/info.xml", + "upstreamIcon": "info", + "upstreamPath": "android/action/info/materialicons/black/res/drawable/baseline_info_24.xml", + "upstreamSha256": "d319b26b4100b6f6511867d47080e9bfbfaf828b1d1fa4c991cb1bf43467de10", + "localSha256": "f591535429d973e3627c8fd1247a56338491e96a363522b1a65c1e91cf6e89ff", + "orderedPathDataSha256": "10bea509bca80e48d764bacdfe7b413438a09ab4a45cadea932017bbd4dbf648", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/input.xml", + "upstreamIcon": "input", + "upstreamPath": "android/action/input/materialicons/black/res/drawable/baseline_input_24.xml", + "upstreamSha256": "cdd596331356fcb13b3ed2d28289725bb3bdee2f8becbe21114c2e612302e2b2", + "localSha256": "1ac2a388185d91e467b2a6c0d2fe84958b7c0e4461411d82897ea22c1d84eb92", + "orderedPathDataSha256": "35f2a247a5bc1df382f533612a462ae99155a2058bc50e2ddb775fc8fcd3db39", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/insert_chart_outlined.xml", + "upstreamIcon": "insert_chart_outlined", + "upstreamPath": "android/editor/insert_chart_outlined/materialicons/black/res/drawable/baseline_insert_chart_outlined_24.xml", + "upstreamSha256": "33201ff322b52574932ec4f6bb24b3b4f7ad86ca1b08ca3afb183aae0b8cbb43", + "localSha256": "bc54bb011161e8a55abc7d5fd246fa4aa0e0d557c8428fc4bd16b18dbaeeaa93", + "orderedPathDataSha256": "d00d02a26f5857245979e8d2d3c25a596b27696d823b0a49f8981486d17121cc", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/insert_chart.xml", + "upstreamIcon": "insert_chart", + "upstreamPath": "android/editor/insert_chart/materialicons/black/res/drawable/baseline_insert_chart_24.xml", + "upstreamSha256": "0e94ceb6a779575229de3f72871b35131d9e80696590ca7f43a469c5ec328324", + "localSha256": "c111968f5b23d3d9dee364486ad79277c4433d4ef7513c4ce543c0fa273c2fbc", + "orderedPathDataSha256": "0cfaad9b87c240933f6bcb31fda116b19adebaec8c530c3c724a6a3dc44f0c66", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/insert_comment.xml", + "upstreamIcon": "insert_comment", + "upstreamPath": "android/editor/insert_comment/materialicons/black/res/drawable/baseline_insert_comment_24.xml", + "upstreamSha256": "4a1cf1160c6b44dfd510d8f854a4aaa2bb374ce47691599c8b44d76af0a98003", + "localSha256": "f599d2433e714ddd8e01c5b0b9295cf318f1008e78263f46084e6366fc8b1dbf", + "orderedPathDataSha256": "388cea0e63c8ae8ab8fbf4fc2cc09be5fb699721a486e3b93b32eaf36ae0ecb5", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/insert_drive_file.xml", + "upstreamIcon": "insert_drive_file", + "upstreamPath": "android/editor/insert_drive_file/materialicons/black/res/drawable/baseline_insert_drive_file_24.xml", + "upstreamSha256": "e4052901f2a9b80c32eacb777d60660f3cc86843caef629a3ae3502d6f4eef30", + "localSha256": "60c7ef2118077cb2e918cbf493803da2350d897e1004ea1c1339d5a36d534919", + "orderedPathDataSha256": "1b2a598e4ec1f0c41af38f7e080b8525a073e596734403379288d33169b0e7e1", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/insert_emoticon.xml", + "upstreamIcon": "insert_emoticon", + "upstreamPath": "android/editor/insert_emoticon/materialicons/black/res/drawable/baseline_insert_emoticon_24.xml", + "upstreamSha256": "a4ccc0e5580fdf0d99e9b33700d20e10d42c48f65439b12d1542898b26c4fa97", + "localSha256": "83091acc43841e73c913d52ce52fb3719b96b0db95d2511e5381fdd8624abb37", + "orderedPathDataSha256": "5cc262b82e4615258d7d7c6e6f76bdb85c351d9a2ac223886ca63ef3a2b70344", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/insert_invitation.xml", + "upstreamIcon": "insert_invitation", + "upstreamPath": "android/editor/insert_invitation/materialicons/black/res/drawable/baseline_insert_invitation_24.xml", + "upstreamSha256": "a400bc04c566a56d65724337b825126bec6cc6d02cdcbcad90ccfb083c9a1341", + "localSha256": "34bee50d7ef54edca51e2e8da48469e17bac92b999bba98c3935c650f12ed415", + "orderedPathDataSha256": "8eb605cff2e0f7c201e6dc2a380df9695cecb08c4e7ed9c6a7c7c9940868084b", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/insert_link.xml", + "upstreamIcon": "insert_link", + "upstreamPath": "android/editor/insert_link/materialicons/black/res/drawable/baseline_insert_link_24.xml", + "upstreamSha256": "f631a74f395bcc7fb8867d2005747fe38c652f45034e4106fa70d0b388f2fc5d", + "localSha256": "894ea97f1171c82c8e18984057721cee0ba4cb1adefa93d11514272c0275fb8a", + "orderedPathDataSha256": "cfad14700f1593207a4fa681a050a5976ab1fabbb2319c80a5b880bbfcaf141a", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/insert_page_break.xml", + "upstreamIcon": "insert_page_break", + "upstreamPath": "android/editor/insert_page_break/materialicons/black/res/drawable/baseline_insert_page_break_24.xml", + "upstreamSha256": "4f2dd7c2ac2d1e4a4fadd2d8a2c0ae7f9375ee3fb34a8009d960619272e9e011", + "localSha256": "17c974d697f3f9641b9cdaaf2ec5c7f77b5372761064bcd1d646dca95dde6408", + "orderedPathDataSha256": "48fd25ccf0eb6e6460da1666f3df05995de0f5ed26d6bd4d331ca6f40ec0a73b", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/insert_photo.xml", + "upstreamIcon": "insert_photo", + "upstreamPath": "android/editor/insert_photo/materialicons/black/res/drawable/baseline_insert_photo_24.xml", + "upstreamSha256": "dac9f692691d4bcbea987c9f3d8cc5b21c002c16628d1ffc0a7e65cf0773bc23", + "localSha256": "18f3947af48b7dc99a8299bc9cd6547b66e4b78dfaa14b400b161ca4892e0ea0", + "orderedPathDataSha256": "69a23aa4815ed09e5c0545f4dc9585d6e3a883223015b523680266abbc6d56e8", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/insights.xml", + "upstreamIcon": "insights", + "upstreamPath": "android/content/insights/materialicons/black/res/drawable/baseline_insights_24.xml", + "upstreamSha256": "1c16d262f1cc4210924ed2a8e7bcf26bac6b3be05f7aac46eeae43cdd7b395a3", + "localSha256": "bfa6c0479a6fdff33127c0f188e5a17e5eb82b56b38e9f125dc358ddb2379003", + "orderedPathDataSha256": "1f2b3a919ff41513b7e0d7e8bf01f99cf5da17ce0fda4ac0b6de4b8d625d1536", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/install_desktop.xml", + "upstreamIcon": "install_desktop", + "upstreamPath": "android/action/install_desktop/materialicons/black/res/drawable/baseline_install_desktop_24.xml", + "upstreamSha256": "6a99b8a42aa59097936c018ecdc164691b29c04952dce6b3adae3d9da33bc720", + "localSha256": "d8cfdaaa65f8a82bb85c5da4ff8b71e0ade4a780b17835bb7802d1b99293ab9d", + "orderedPathDataSha256": "3174e203ab6491ec560a6cc6c7cdf45e48006d5cf05d5b434142e9b0c7c91011", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/install_mobile.xml", + "upstreamIcon": "install_mobile", + "upstreamPath": "android/action/install_mobile/materialicons/black/res/drawable/baseline_install_mobile_24.xml", + "upstreamSha256": "26125b79f178dcacbb55f5a71be7ab699200cf85921de0406e427048f2d375d6", + "localSha256": "2f0e4102fa01b874db8c5500b0edb0b356533003a7fb0873d494ad68ee25d2ad", + "orderedPathDataSha256": "b0bb7de7efa5e7916ba37887b9387dc8d4265fd534beb15955aef3cca640ab1f", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/integration_instructions.xml", + "upstreamIcon": "integration_instructions", + "upstreamPath": "android/action/integration_instructions/materialicons/black/res/drawable/baseline_integration_instructions_24.xml", + "upstreamSha256": "f0e3155b998536aff5eae53691075eebe5814a142a415d618c65b2329acccd35", + "localSha256": "13cc58d27c683a6bae4f1882ee24ef037b0b91f8091c3893c4b30f11e6ddd06c", + "orderedPathDataSha256": "1a3ad21362df327202966ea0ca68d13c377d3210f7c175862f806fb32a73a425", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/interests.xml", + "upstreamIcon": "interests", + "upstreamPath": "android/social/interests/materialicons/black/res/drawable/baseline_interests_24.xml", + "upstreamSha256": "5b07e6cfe999f51b3ba48719c19541bdaea567b2e9365524d6719a74a3eff967", + "localSha256": "1994546b4185158962fff3ff17855d6ee32c0d60bbfad18381b074430b6dffcf", + "orderedPathDataSha256": "e56211d6439759f040ee48ff9693d41839ef334c9dc2a6add7225bd914f9b197", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/interpreter_mode.xml", + "upstreamIcon": "interpreter_mode", + "upstreamPath": "android/av/interpreter_mode/materialicons/black/res/drawable/baseline_interpreter_mode_24.xml", + "upstreamSha256": "d124242b40aa817813282e557b2d3c414594f081fe1935faab8a5256c1010502", + "localSha256": "25eef773a6ff3ab2594a793a5bccbd46011aeba36b62ed6759aec5e8fc8ac7d5", + "orderedPathDataSha256": "44ea64b0c56c2160968822c1b3b05eaf5b4ba94b1c99256c5a56aa8480ee7f8d", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/inventory_2.xml", + "upstreamIcon": "inventory_2", + "upstreamPath": "android/content/inventory_2/materialicons/black/res/drawable/baseline_inventory_2_24.xml", + "upstreamSha256": "ca3de6794f8b00956518766ddddc8477e65350d17b739d1f8b2a85c4db136956", + "localSha256": "e8bc50ad9f0bd6c6ed325f10d5735ef91e89662890bb0a69f0323d497dd6fb81", + "orderedPathDataSha256": "5af3cab5c773239f6a87cf0a0b7f1efa9a1abe18f77e3d758dac56d178f5cc2a", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/inventory.xml", + "upstreamIcon": "inventory", + "upstreamPath": "android/content/inventory/materialicons/black/res/drawable/baseline_inventory_24.xml", + "upstreamSha256": "5acebc8f3cc7adf1a1e98a87d7bbe8c480e5ee49dd29f5f91dbf2e0bf7724465", + "localSha256": "e83d832edb75adf1b0d45778a9dca92d3474393a5db7dc73b1fce017a07d3e67", + "orderedPathDataSha256": "8035accfac70005dac3311346d326e063d32b3019426ffe4fdef2a7ae77cc98f", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/invert_colors_off.xml", + "upstreamIcon": "invert_colors_off", + "upstreamPath": "android/communication/invert_colors_off/materialicons/black/res/drawable/baseline_invert_colors_off_24.xml", + "upstreamSha256": "b95f95a4dc09e2a131ad43d455fe6baf25faf75d02df35fe0923eee4a5204268", + "localSha256": "0de051656326f97e6091222c7611aad982a6528c94a029f7137f1cea5b1adc2e", + "orderedPathDataSha256": "62d20523ba61175ec126af088904de4bc6f3ddc560cc150d2eb14d8987324b09", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/invert_colors.xml", + "upstreamIcon": "invert_colors", + "upstreamPath": "android/action/invert_colors/materialicons/black/res/drawable/baseline_invert_colors_24.xml", + "upstreamSha256": "0bf6a4a4e412703638b83e372a007d4f1ba2e65fd9e9561504b06bba52b80f22", + "localSha256": "ee80861fed1964ad416841319a4b7aa3a712787c913f30020b83cc46c2224bbc", + "orderedPathDataSha256": "f14953bc7cd5f1d1200e108de1af6e1d0df5e4c3dfd88337004abc821aa76a5c", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/ios_share.xml", + "upstreamIcon": "ios_share", + "upstreamPath": "android/social/ios_share/materialicons/black/res/drawable/baseline_ios_share_24.xml", + "upstreamSha256": "a9d7ade8c36b66f176031f9ac3b1d63f8dbb1eb2cbb88cae6c65ba0f97c3b8ab", + "localSha256": "d678a62ef7af2bc940ace160559416ee8e9587efae008c0e7849b17903723a48", + "orderedPathDataSha256": "8e226bfd49cba27fb2bc2831b3ba3093f4c415cea6d47d5f84452af30434ee84", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/iron.xml", + "upstreamIcon": "iron", + "upstreamPath": "android/places/iron/materialicons/black/res/drawable/baseline_iron_24.xml", + "upstreamSha256": "12894de42a6f5546810d507ac8fc566244e169c1093f16e641781fe946affa4e", + "localSha256": "35e59de3b867fb9654743de299966fb403818af374dd64be8ff899b4b49cf752", + "orderedPathDataSha256": "5c74ab4dd31c531e63245fa2bfce721bbffda61843d59cf20c3c63d8ee93b036", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/iso.xml", + "upstreamIcon": "iso", + "upstreamPath": "android/image/iso/materialicons/black/res/drawable/baseline_iso_24.xml", + "upstreamSha256": "fd17bee426dd9e9e7b0736e0f7d04349d067f724a46a4da3ef38b4cfc07e26ca", + "localSha256": "cb5c04e1a7225ff331b08d40871fe7da53afc5edb1a95963e2541be263887adb", + "orderedPathDataSha256": "e0733c12c2ab2ef9e3ed66086685e01efa17e9d81c0b543aba2fcff0c8f7a18d", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/javascript.xml", + "upstreamIcon": "javascript", + "upstreamPath": "android/action/javascript/materialicons/black/res/drawable/baseline_javascript_24.xml", + "upstreamSha256": "8e3e0a65ebf5242ff532e76c85454594a9be1afba1a59b560973b8346744a262", + "localSha256": "b68afee90e1a324e372c3374791bf3dcff2069691f2d850e2adaeecd115bcc69", + "orderedPathDataSha256": "0d8228862d52204965171df9ae2e91de24bbf97e712c20cc4ecc20b046472361", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/join_full.xml", + "upstreamIcon": "join_full", + "upstreamPath": "android/action/join_full/materialicons/black/res/drawable/baseline_join_full_24.xml", + "upstreamSha256": "64137484a07d4373b1e570d304e8d4ebf5a20fc392349caf59f2c89458aa0143", + "localSha256": "c522fcc98bf2b779ae9cc253929f70a960f63118a0d9ac5a580045b47aa71c3a", + "orderedPathDataSha256": "585b234e4c72a82aa5caaed62bb1eb445c14ac266082e4de329c35afa46b3e44", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/join_inner.xml", + "upstreamIcon": "join_inner", + "upstreamPath": "android/action/join_inner/materialicons/black/res/drawable/baseline_join_inner_24.xml", + "upstreamSha256": "171d300e566d3f0f41f829733966de0f82c7a6c4c703518b2640d7801b792b2a", + "localSha256": "252d1ad74232d54ee6e25a2a363d45019f83966f26fca05ac585576a319e796a", + "orderedPathDataSha256": "23ebba85b4d77f25db80add919bf925ba41d1a3417e9f05b52b34cc706baf3bb", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/join_left.xml", + "upstreamIcon": "join_left", + "upstreamPath": "android/action/join_left/materialicons/black/res/drawable/baseline_join_left_24.xml", + "upstreamSha256": "fa9932d4ebecf246f3b1322daa03dabe914b3a4f9361e0bab47feb9d161d2fe9", + "localSha256": "37414289dcec5813a415eb86689e064dbc561474bdfa43467c049f6773b5b900", + "orderedPathDataSha256": "b454523445b31f9da8220e15625d3b13c97e9ade33493b68dd7499ac5735b283", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/join_right.xml", + "upstreamIcon": "join_right", + "upstreamPath": "android/action/join_right/materialicons/black/res/drawable/baseline_join_right_24.xml", + "upstreamSha256": "dc5d3fee8346c39b3c65bc0088819757bea8d9f848b5385cf2e3a81e55f0edf7", + "localSha256": "4a766f7b3f1bfa5cc442fbba8a190a7605b3a252078b2ed70b6921dbbfd7ba93", + "orderedPathDataSha256": "443ee888d9b054967999e24c83232eb4bc121275a362c49cd098d2e8f6af2596", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/kayaking.xml", + "upstreamIcon": "kayaking", + "upstreamPath": "android/social/kayaking/materialicons/black/res/drawable/baseline_kayaking_24.xml", + "upstreamSha256": "d1e47afc5987812027d0a08e4cb6535f81e73f00994090ef6ff9797f3fa62aae", + "localSha256": "c2525e69c5da0071d046b504084953fb364af37addb3d36f4920d546827c84d4", + "orderedPathDataSha256": "b1d7fbd740f07e47764ae895c01fb0c0b3121f1a63d28f2d6873558ff1cb1f00", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/kebab_dining.xml", + "upstreamIcon": "kebab_dining", + "upstreamPath": "android/maps/kebab_dining/materialicons/black/res/drawable/baseline_kebab_dining_24.xml", + "upstreamSha256": "11af692fbb1ba9638173396cbf6733f478861055b34e4084ef1fff1e5a63b94e", + "localSha256": "75fcf2d44029423ed93d96e06bd2a9b419e1bf849ba33848b2f74b8fc683a365", + "orderedPathDataSha256": "0c7ceccb11c24dfb521dddac35d904cc825600babf416cc248a41cb22fd39433", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/key_off.xml", + "upstreamIcon": "key_off", + "upstreamPath": "android/communication/key_off/materialicons/black/res/drawable/baseline_key_off_24.xml", + "upstreamSha256": "e8bdaeb005c389040e4b4f225d399491081d6605b75a2596db0f153c1f51697a", + "localSha256": "1640a8e713809e86f23c99d779cc3303eb97580bf1c37990425a1f69bd716847", + "orderedPathDataSha256": "96337596fbb6f5761acd2a63b965763afca0d6526380941c2f098e11e79c596c", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/key.xml", + "upstreamIcon": "key", + "upstreamPath": "android/communication/key/materialicons/black/res/drawable/baseline_key_24.xml", + "upstreamSha256": "fa950b2cee2758875f4fd24b2603dfb6efda4bcb4ab81478b56c66e4eb0b6335", + "localSha256": "d0fd7e073bb6c67965910eb782db061696fb60b6af5b3e435c93af722e8a2371", + "orderedPathDataSha256": "313d9fd4b185df1c527d4ec54dd2ef3ae737283aa479006f074d8db648673368", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/keyboard_alt.xml", + "upstreamIcon": "keyboard_alt", + "upstreamPath": "android/hardware/keyboard_alt/materialicons/black/res/drawable/baseline_keyboard_alt_24.xml", + "upstreamSha256": "484c6b4366171a90ab2ce5300f7de677d539a5389a7bc8d4bdaf1af12c1a3eff", + "localSha256": "fb3989561d50479b9212c9d29a4faca5ef9359e7a4bb36305045c8c0b8af2c44", + "orderedPathDataSha256": "4f8475284c851919d739dd2127e0e4d3f4b4ac550fb5f92362de799f003b723e", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/keyboard_arrow_down.xml", + "upstreamIcon": "keyboard_arrow_down", + "upstreamPath": "android/hardware/keyboard_arrow_down/materialicons/black/res/drawable/baseline_keyboard_arrow_down_24.xml", + "upstreamSha256": "6d258e00189dc96db24235588d8e657a7a05d204d4a6e7a0093197c006b37483", + "localSha256": "4494dbd3b39e10edbae08af481f337d581b9af7055caae27b30af217005f5506", + "orderedPathDataSha256": "24adbe5de11eb7b9a06f8e4c54171cd9e87301461c493266ad8ccab01ddb7cea", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/keyboard_arrow_left.xml", + "upstreamIcon": "keyboard_arrow_left", + "upstreamPath": "android/hardware/keyboard_arrow_left/materialicons/black/res/drawable/baseline_keyboard_arrow_left_24.xml", + "upstreamSha256": "8a442960295c4402bb61a13aa1eda9fdf0e7726b2e6f87ee33a5239f12021549", + "localSha256": "4a4d6547f378f5ab50d52ae032a6f6f39389dfa0ee29bc67f38cf7f2cdcc8d3d", + "orderedPathDataSha256": "58671323226eddfcc1ed3589e346600d53001cdfe9ac289b8a291f653425f2c2", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/keyboard_arrow_right.xml", + "upstreamIcon": "keyboard_arrow_right", + "upstreamPath": "android/hardware/keyboard_arrow_right/materialicons/black/res/drawable/baseline_keyboard_arrow_right_24.xml", + "upstreamSha256": "694c1c710b889d530a08ba163ebcc2aefea34dfaff7c241cec2d2b158f9ccde0", + "localSha256": "28651a9e1d95de53a284238df96e8db3c80b3d36dbab23f463d8d49d5296ab8a", + "orderedPathDataSha256": "bab3cc5f379e880d635521eca7c907d09fd646d9450383e6c335af9c38b219c0", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/keyboard_arrow_up.xml", + "upstreamIcon": "keyboard_arrow_up", + "upstreamPath": "android/hardware/keyboard_arrow_up/materialicons/black/res/drawable/baseline_keyboard_arrow_up_24.xml", + "upstreamSha256": "e05e4904cf47eabe98ef12dd3ea1c4e8d1a1e99ed995822600dfdace937449fe", + "localSha256": "d73fb89a176d4e4ab9594cf3ad72ad75c5dd20e3d3c3cebcb787af00d7c09e1b", + "orderedPathDataSha256": "1e5206024f9a9939829880dbcceb48280a2459831458df1e19287a0c23d5bed3", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/keyboard_backspace.xml", + "upstreamIcon": "keyboard_backspace", + "upstreamPath": "android/hardware/keyboard_backspace/materialicons/black/res/drawable/baseline_keyboard_backspace_24.xml", + "upstreamSha256": "3f024727008163ec7e8e53ac151ce1c670555c951a20cbe90ec66d5f447c11ba", + "localSha256": "d43e2c24c1cb2dbc179223948a85ae32c77890f22acda3e64dd3864e797e2471", + "orderedPathDataSha256": "aacd35a3dc2f15a6e28829ffc07c07f88d6a73410bf98a848bbd9cf0e5db025e", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/keyboard_capslock.xml", + "upstreamIcon": "keyboard_capslock", + "upstreamPath": "android/hardware/keyboard_capslock/materialicons/black/res/drawable/baseline_keyboard_capslock_24.xml", + "upstreamSha256": "db831308dedd0c7b6beb5de446b6092f3af881b8d6fb8052195c4f4430e70e92", + "localSha256": "6188bcb8df09c75c71dd5643efcf1218555e54e573c99482cae8e91fb5f177cf", + "orderedPathDataSha256": "1899084e608ed9e680b4d664122c6388ef1b31ab230746b2f865b62aa92e1000", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/keyboard_command_key.xml", + "upstreamIcon": "keyboard_command_key", + "upstreamPath": "android/hardware/keyboard_command_key/materialicons/black/res/drawable/baseline_keyboard_command_key_24.xml", + "upstreamSha256": "49cccc7e02d2694bb0e37aff428a75f12ec7bc176848dd9ea48ccd49cd6cb4d8", + "localSha256": "bcd28b5890b6aadcf6a4737801e77b9be758187e758966951ca2640736ef0147", + "orderedPathDataSha256": "a3138845c94f774d7ed5801212cea044ed41c261dd0599c84bbb9d2c4fa64ef1", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/keyboard_control_key.xml", + "upstreamIcon": "keyboard_control_key", + "upstreamPath": "android/hardware/keyboard_control_key/materialicons/black/res/drawable/baseline_keyboard_control_key_24.xml", + "upstreamSha256": "167d04cf01dcab8b76a776a51e2dd905155fbf41d57813b28d9be1f8d069d584", + "localSha256": "804aa96e742aaa2e1655186a6cd5f69ae207294fba71fdc8fe7d504140b481e4", + "orderedPathDataSha256": "990cf8cf387528e582f2604d7eb573fe43e3fd9a4eb13fccb5245a5dcb69a028", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/keyboard_double_arrow_down.xml", + "upstreamIcon": "keyboard_double_arrow_down", + "upstreamPath": "android/hardware/keyboard_double_arrow_down/materialicons/black/res/drawable/baseline_keyboard_double_arrow_down_24.xml", + "upstreamSha256": "27f94983d3df6f766779de25fde2d2ecf119f9743d1982a6d227790aef53b81d", + "localSha256": "0bf64fc2fb1d15914ded7573826e54e33d945635186c796bcbebebcf3fe13c23", + "orderedPathDataSha256": "68ef3ea60a44d1a6ccac10c60a8240fd5bee622105432e2b51c2f1d9e65f4440", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/keyboard_double_arrow_left.xml", + "upstreamIcon": "keyboard_double_arrow_left", + "upstreamPath": "android/hardware/keyboard_double_arrow_left/materialicons/black/res/drawable/baseline_keyboard_double_arrow_left_24.xml", + "upstreamSha256": "210b4868f50c6cfa5ff9f0a67306883d7fe5d15a9c77167eeb0c4b60ae3b4aac", + "localSha256": "a3f3e157e14b9a557898fe7c7efe05e7f83eaf7674b933052a613214516d2876", + "orderedPathDataSha256": "5c81b040be620ddc36795e98c0a592ef8d3fe69a020798b5f63b03b3c5d81aaf", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/keyboard_double_arrow_right.xml", + "upstreamIcon": "keyboard_double_arrow_right", + "upstreamPath": "android/hardware/keyboard_double_arrow_right/materialicons/black/res/drawable/baseline_keyboard_double_arrow_right_24.xml", + "upstreamSha256": "19114800923e61b30da86192d2cc7aad584ab5899fcd467f51a6cb69e2874d1a", + "localSha256": "6676d846d5aec3f84e81dea084faf9b79be7424343e70f8d66a626b42838856f", + "orderedPathDataSha256": "a8847a16f61885fddf19e76f3de75bfe8f7b4c7bdd22ec280f36a9bc89742a15", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/keyboard_double_arrow_up.xml", + "upstreamIcon": "keyboard_double_arrow_up", + "upstreamPath": "android/hardware/keyboard_double_arrow_up/materialicons/black/res/drawable/baseline_keyboard_double_arrow_up_24.xml", + "upstreamSha256": "e5a5c953652700763ee6cc4e63df41cbca04a9e725847e36bcc7435833c6441a", + "localSha256": "8fadc732ff2e00d38f2f3c514884ea85b07073b630443c04ebcc9490df38e723", + "orderedPathDataSha256": "0fdbe29eec266d54a5d2224cd80fb430e3dc75cbf41d36cc9dddf465bf99220c", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/keyboard_hide.xml", + "upstreamIcon": "keyboard_hide", + "upstreamPath": "android/hardware/keyboard_hide/materialicons/black/res/drawable/baseline_keyboard_hide_24.xml", + "upstreamSha256": "cd0d9664c163bcb08a966c481d4d58ab62b184579e536720304fa7bf2f6a9601", + "localSha256": "a0b60233a2736ed56a19d29e829c6eb8e47b9055f5d8da8f915799c75c12c72e", + "orderedPathDataSha256": "159ab13d84451780da2dd64da747f92030ce5a509d38952353c57a9d5f872e13", + "originalGeometryMatched": false, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/keyboard_option_key.xml", + "upstreamIcon": "keyboard_option_key", + "upstreamPath": "android/hardware/keyboard_option_key/materialicons/black/res/drawable/baseline_keyboard_option_key_24.xml", + "upstreamSha256": "fe600736306c85e16ef5828ce4e69651177b0cbce5569ddbcaeacac5a55e6474", + "localSha256": "1757dedf808411b3e9bf185d31523e679bfc8150635579e51212145794bf11b3", + "orderedPathDataSha256": "2447d21180556191dc5837422d3c3dce98694bdc9233faf8eb1ddcf28a249e7c", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/keyboard_return.xml", + "upstreamIcon": "keyboard_return", + "upstreamPath": "android/hardware/keyboard_return/materialicons/black/res/drawable/baseline_keyboard_return_24.xml", + "upstreamSha256": "f69828f1119973ab694a8d4e864ff077f8937328f9028601c9e734ce129eff27", + "localSha256": "94604ab832747c02fc3a9e173cbbb66e82a39b32d904f05f5cb9cad011d46cdb", + "orderedPathDataSha256": "5b9f34423f0af859d85a79f7d15b3db923cd9d3dbabae94b04daaf4b06239ebd", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/keyboard_tab.xml", + "upstreamIcon": "keyboard_tab", + "upstreamPath": "android/hardware/keyboard_tab/materialicons/black/res/drawable/baseline_keyboard_tab_24.xml", + "upstreamSha256": "1299ea46f76c6677a7769f3cedc83c92cb5bd0de54f0de2e7e2827a86edb8e7e", + "localSha256": "e457d8718184a558208d42b5b752fbfa011753a02455206c2f7743008a09ebe9", + "orderedPathDataSha256": "005bea9bfc6418a998b9c808394e45142b7fe874a911a1769ba737c1688af562", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/keyboard_voice.xml", + "upstreamIcon": "keyboard_voice", + "upstreamPath": "android/hardware/keyboard_voice/materialicons/black/res/drawable/baseline_keyboard_voice_24.xml", + "upstreamSha256": "8d8a8af148734de8e6c1a4e056f4a45af3c1f9f740a9f4d93dbab4ac3e7b9141", + "localSha256": "3053825d25526931d20f59c8f74a9bdb53c6639963506d18d35c379a49b2c140", + "orderedPathDataSha256": "b30aeff72088ccb414bf90404929477dff67107b325e5842882c3fd67f4e3b55", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/keyboard.xml", + "upstreamIcon": "keyboard", + "upstreamPath": "android/hardware/keyboard/materialicons/black/res/drawable/baseline_keyboard_24.xml", + "upstreamSha256": "e164c66df7d3ea8b04dcf4d09ca853ad8180f26177fc945c33720e2f9e6f96b5", + "localSha256": "e7c5c12036d840ccc72b9865407cdc2468bf302a6070a58a9bf6fe316788d541", + "orderedPathDataSha256": "466ffa437d8221289e5d6e5c3c39ef3f8368f37c3c924131c39fc257249fc846", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/king_bed.xml", + "upstreamIcon": "king_bed", + "upstreamPath": "android/social/king_bed/materialicons/black/res/drawable/baseline_king_bed_24.xml", + "upstreamSha256": "087e3d782504917f67c89d6b6234cbe10d6b86be4531bd0b61f7a49cd6ae635e", + "localSha256": "54049dc832753efdb5a73f13e771989386c7c9295ff38938dc937d3273250bc7", + "orderedPathDataSha256": "66532e3ec22c70d188a74121e37dcface5840f6a8a5a952b887a99d5c1764bac", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/kitchen.xml", + "upstreamIcon": "kitchen", + "upstreamPath": "android/places/kitchen/materialicons/black/res/drawable/baseline_kitchen_24.xml", + "upstreamSha256": "3151b6ccb688bcc8ddf2001d55d2fbd3dbbdd814ada49dca9fbf5697a1e7a829", + "localSha256": "3352cf3464e2bbcbc1f68e9e4cd89e9e9da900002f1372693b9229c6c02885e2", + "orderedPathDataSha256": "2ef3b5781db09c5b4aa8bdb22754c95340c6df727d8ef38548ac2ef6881a2cea", + "originalGeometryMatched": false, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/kitesurfing.xml", + "upstreamIcon": "kitesurfing", + "upstreamPath": "android/social/kitesurfing/materialicons/black/res/drawable/baseline_kitesurfing_24.xml", + "upstreamSha256": "c2b1ac51a60f84a4cbe5cf136ff12bb01bb5e1ee91b68e04580be47dc979095e", + "localSha256": "8d2f84cfb076f981d194899c26805677d0cdc870383ea230e4e6ba1ac9222c41", + "orderedPathDataSha256": "99829a737642389d6419d2d0558776214195bc15d0f62c465071e1960d086602", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/label_important_outline.xml", + "upstreamIcon": "label_important_outline", + "upstreamPath": "android/action/label_important_outline/materialicons/black/res/drawable/baseline_label_important_outline_24.xml", + "upstreamSha256": "6e7aa6035f4ccb98934056d018a351392445caf8bc11bc94b2ca0a8146910d07", + "localSha256": "9a8c66c5837912aef15165e19113e05058f13eac61c8c31b41a423d80abb049d", + "orderedPathDataSha256": "f07fd4aff93fdbf489398f00ae7550f1f36f817a87f166dfbf001a3302b5acb9", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/label_important.xml", + "upstreamIcon": "label_important", + "upstreamPath": "android/action/label_important/materialicons/black/res/drawable/baseline_label_important_24.xml", + "upstreamSha256": "83f7dd22ea28002739610690b1415e1eba10eb286983f08822fd2562ef1e3044", + "localSha256": "c94397c5373a544a09e33ea4380359a084dd6a269e35898f99887f189b61c1bc", + "orderedPathDataSha256": "894e357dbfe6e7909204666b36654c6ed4617ef5e368d905968fc918c065ec33", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/label_off.xml", + "upstreamIcon": "label_off", + "upstreamPath": "android/action/label_off/materialicons/black/res/drawable/baseline_label_off_24.xml", + "upstreamSha256": "f4d8329b09ded47f3093196df782a629a6ce359d30dc63b6147245dad7c92619", + "localSha256": "37204702c61ea3e04fc0e7c93f4c74115d5600b0b661c1049af1336fb1af0e38", + "orderedPathDataSha256": "3bcd6767d2a44b92430ce0e98fba44cff93ca4f14c8ab869cc0c95c40dacb49b", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/label_outline.xml", + "upstreamIcon": "label_outline", + "upstreamPath": "android/action/label_outline/materialicons/black/res/drawable/baseline_label_outline_24.xml", + "upstreamSha256": "fb832900b83c4ad9885c7acb00b5e3e9cd565f7d271b905221b45a90a6179bf8", + "localSha256": "778ea7f35a930388fa3cdc67a74ecd80cf5592ca8f7eeb57f83437db719edd5e", + "orderedPathDataSha256": "a353b5564782dbda95fba61b16dc815533b39920e731463defab207ac7580fda", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/label.xml", + "upstreamIcon": "label", + "upstreamPath": "android/action/label/materialicons/black/res/drawable/baseline_label_24.xml", + "upstreamSha256": "6b8ead077d018428782a766b8508c1ed6671c3db952bf03d41aa24feedfde0ba", + "localSha256": "1d63a4701347aac9c47cea916b749f8858dc51e42c4dd1ba4796b29478a4bb28", + "orderedPathDataSha256": "d69bd8d6ec55a9881eaa21d978ee28f014be89ff1b1ba5f8a93a52dc69320b12", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/lan.xml", + "upstreamIcon": "lan", + "upstreamPath": "android/device/lan/materialicons/black/res/drawable/baseline_lan_24.xml", + "upstreamSha256": "edbc48680058cdfb2363a0982062de843aa814b3a2e50c9d7c93399ff5c443ab", + "localSha256": "d7809c4bbcaf025ff4a2a67129508d884b1445f60eac64338b474b6db27ac1fa", + "orderedPathDataSha256": "1a139e835879648414ffc4bc2155cfbb60f278900bca319125188c51385e3902", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/landscape.xml", + "upstreamIcon": "landscape", + "upstreamPath": "android/image/landscape/materialicons/black/res/drawable/baseline_landscape_24.xml", + "upstreamSha256": "e5065ce0ffd0587faf876c2fc79b6a64f144b6816693755957a7cd9f013d0e41", + "localSha256": "6fb8955fa7358fb77aac0344f67ce9fe3688694db126b55f6c943795642e812d", + "orderedPathDataSha256": "6ad7a00d57046a5e4decc4255e68931708d27e3f6b8d6fe1407130c95d1408d6", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/landslide.xml", + "upstreamIcon": "landslide", + "upstreamPath": "android/social/landslide/materialicons/black/res/drawable/baseline_landslide_24.xml", + "upstreamSha256": "d255cbec76730fdf35fc19c17f16755b2a184a67e8c9e290e1e47ed67579c0fd", + "localSha256": "3edfa64d564f0b0cd8c17268a01e8537348f875a8190a1512d78c7ea8d48338a", + "orderedPathDataSha256": "99e97c6722c29817501a0a107f9f66dc0db706fc0ba859eccdb0678154cd9980", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/language.xml", + "upstreamIcon": "language", + "upstreamPath": "android/action/language/materialicons/black/res/drawable/baseline_language_24.xml", + "upstreamSha256": "9fda2c9ceec7916b1ac8ca5bafced73c53e7a3c8b09cf23daaaaa5103077e97b", + "localSha256": "72d6c00e4dc5a5187bd8a7598e33a4a0fbde4b934947d982e1f82e8d1836d606", + "orderedPathDataSha256": "5bd52e5ec3688c217c2fa887a8e8f5b9559f01c36ea484416b2ac3d6f19dd510", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/laptop_chromebook.xml", + "upstreamIcon": "laptop_chromebook", + "upstreamPath": "android/hardware/laptop_chromebook/materialicons/black/res/drawable/baseline_laptop_chromebook_24.xml", + "upstreamSha256": "8171620487de4a6a169f87eac7b9703341fc16c53ea5a2b27802d760239c647f", + "localSha256": "db67ac846a0b111d96fed34a48f79d5e232a01b5c25afffa624017b34247c9e0", + "orderedPathDataSha256": "59888d19fb8924095605239986f0d6d2b1f690cb8434601ad70bc101db6c8728", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/laptop_mac.xml", + "upstreamIcon": "laptop_mac", + "upstreamPath": "android/hardware/laptop_mac/materialicons/black/res/drawable/baseline_laptop_mac_24.xml", + "upstreamSha256": "58c3acce08f0af150701e37d02a5c829748534f60bdc5ffd442bd7e927b961ba", + "localSha256": "a37474ae5b3e39abf31d2f5c60979daf06f346b0e2f57cd630b0167bed2ed2de", + "orderedPathDataSha256": "8b576f1bf63655931404769f2b91768710e708bcf46a0ba59ff2a988ac16ed4f", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/laptop_windows.xml", + "upstreamIcon": "laptop_windows", + "upstreamPath": "android/hardware/laptop_windows/materialicons/black/res/drawable/baseline_laptop_windows_24.xml", + "upstreamSha256": "8ce1690cc1b90818cd5b8c14604a1fcad65a228dc70226b8f2f9f5241fdc46b4", + "localSha256": "531536e7d6ebbfc47002beddb542b3cc2d9b36c9dfa22e6baa643bec066b324d", + "orderedPathDataSha256": "7e822b7e180ee88fe2663a6aeef2c49fa2a80109fb05258bd4f2d019b9e661aa", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/laptop.xml", + "upstreamIcon": "laptop", + "upstreamPath": "android/hardware/laptop/materialicons/black/res/drawable/baseline_laptop_24.xml", + "upstreamSha256": "e9f45ed405ba9fbc14841e7b393dd7e27a3d1cc0b5b168650236ce4491aabd7f", + "localSha256": "9fc14aff1c4b29587e29003220d6d7da68bc70489d033f6a429ee2223c5319fb", + "orderedPathDataSha256": "dfdc8d7efadc19378529c7c9714c43439000041208af630ea2f149ca77681192", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/last_page.xml", + "upstreamIcon": "last_page", + "upstreamPath": "android/navigation/last_page/materialicons/black/res/drawable/baseline_last_page_24.xml", + "upstreamSha256": "61dfdc8211265bc64146149609eb149c42e08b3c76a66961107e7830921d4590", + "localSha256": "8929ae91f7a0005e07be70c31bbf6e2ab987d1aeae516a17062b8d61e4239cc8", + "orderedPathDataSha256": "d37c9fc076198054aa309f9c6e351dd800ccae9eb61718df3a8b0fdeb7de92fd", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/launch.xml", + "upstreamIcon": "launch", + "upstreamPath": "android/action/launch/materialicons/black/res/drawable/baseline_launch_24.xml", + "upstreamSha256": "d455e802583f13ed0dbef6c3ed72d8fd4a5b9e403ab83f3a75a2cc1465b3ff5c", + "localSha256": "f66c9450861735f2ec95831feef93c7ef3c9a6fc7170d3e507ca2f5c0e813ac3", + "orderedPathDataSha256": "3786455efe5d11b08e1c3e8a24d4b1657094e2c2d1fab63d8c48bee6ecd50455", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/layers_clear.xml", + "upstreamIcon": "layers_clear", + "upstreamPath": "android/maps/layers_clear/materialicons/black/res/drawable/baseline_layers_clear_24.xml", + "upstreamSha256": "68d9c2a78a22fae0cf6e95ca70ef85fa84e003eb398c9158dab32c9dd55f6933", + "localSha256": "a1be69ec91cf54bee0a4c7737f26cd83bfc72e014f452ce67c90dd33fecc1c3c", + "orderedPathDataSha256": "a9ffc5ba323c9cefb53eed31f5b4d4682715758f18297978111b94368bb09b32", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/layers.xml", + "upstreamIcon": "layers", + "upstreamPath": "android/maps/layers/materialicons/black/res/drawable/baseline_layers_24.xml", + "upstreamSha256": "ac04a5446f80163ccb05bcba5eaf89a073d146a621713efb6216bbca3748e81c", + "localSha256": "7bcbd025d2bccdbd1907f125996d64957e4d9d389ac3ee35bb42daa9c6eb30d4", + "orderedPathDataSha256": "d4cbb510a217015d05a46b74ca9c026abb4b93a23b6da50e0a8b7128db879da5", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/leaderboard.xml", + "upstreamIcon": "leaderboard", + "upstreamPath": "android/action/leaderboard/materialicons/black/res/drawable/baseline_leaderboard_24.xml", + "upstreamSha256": "8d293be9e740c96a4900824dece0e770d617056d35badc983a2c823989897c6d", + "localSha256": "9470d281eb72e8a91568cd068ab5494889b159659154919bc9f418f690b73ee8", + "orderedPathDataSha256": "a62abf684d62b249f77125268ed8faff7f07ba4c3c78a074d311b55f3320c084", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/leak_add.xml", + "upstreamIcon": "leak_add", + "upstreamPath": "android/image/leak_add/materialicons/black/res/drawable/baseline_leak_add_24.xml", + "upstreamSha256": "02dcfdbb043ef043fb8e879bc0272845bab17c0a4e495513a4dd827ff34aa9b4", + "localSha256": "130f87a17a341e5aea315470a7c72fffa6cf4a10eacc4cf66e3e79953747f5fa", + "orderedPathDataSha256": "46366d47a4d32e9ecfbca7a81ed09a859d48b8599fafe7640d8bb76a42182789", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/leak_remove.xml", + "upstreamIcon": "leak_remove", + "upstreamPath": "android/image/leak_remove/materialicons/black/res/drawable/baseline_leak_remove_24.xml", + "upstreamSha256": "a0b573704f5cd4572d60bbce5b83bb73025df0b500b577fa51cc0f9534d17eb3", + "localSha256": "391620a17150d5112aa2869cc2b3de4698e04764cdb1b94def456bcdf3960d5e", + "orderedPathDataSha256": "f31c81b2076ac36f2f36275e08da211c6a300b6b5e61868f06f12507df93d505", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/legend_toggle.xml", + "upstreamIcon": "legend_toggle", + "upstreamPath": "android/navigation/legend_toggle/materialicons/black/res/drawable/baseline_legend_toggle_24.xml", + "upstreamSha256": "bf01a2348bf7d958d7c1b0d29903447d94a2115bdc902fd1dc62a52581ef3e47", + "localSha256": "da20662504657bd8ede5dd1022104f994b75a811db29a8f239242b06e5c39211", + "orderedPathDataSha256": "0eac487eeb1c40bb9b7945629f1ae6913fdab684c8455385d00381f98eadc870", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/lens_blur.xml", + "upstreamIcon": "lens_blur", + "upstreamPath": "android/device/lens_blur/materialicons/black/res/drawable/baseline_lens_blur_24.xml", + "upstreamSha256": "e065b0f2e07237e8b9ebc1ec43bd950fd5ef6c0eeed330f4e8ec79f847412aa1", + "localSha256": "23d518616d0e57a492d6c94b2ae6f41a3392af8c94b6725748c08b8024cc9ce4", + "orderedPathDataSha256": "c6dc424a7f9c7623bf373e302dee5fca4b958c480f2f4241e96818a336502ade", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/lens.xml", + "upstreamIcon": "lens", + "upstreamPath": "android/image/lens/materialicons/black/res/drawable/baseline_lens_24.xml", + "upstreamSha256": "2237198973b9d1a23d8ecd944c7a2eea923bf8543921495118fee081e7b314d1", + "localSha256": "75ae522da5f1ca733278bcaeb1e4742c9961718a504e9064515a9291f4f3771e", + "orderedPathDataSha256": "3e066131dec84bf1e6f150224f46eccec41e26591223d869322ea5651cfc2019", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/library_add_check.xml", + "upstreamIcon": "library_add_check", + "upstreamPath": "android/av/library_add_check/materialicons/black/res/drawable/baseline_library_add_check_24.xml", + "upstreamSha256": "5fc9fce858525000bc475528c671ca5d471acf66cc5dca222dc939515049f39a", + "localSha256": "e4ccf57ba454108f40e53ad697cc75870f225cdcec6c004e40173e75378308b9", + "orderedPathDataSha256": "a9814b56ec18944eb1d6db6727c5f0cdc6c3a32fecb3220c4cbdac9952d4de0e", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/library_add.xml", + "upstreamIcon": "library_add", + "upstreamPath": "android/av/library_add/materialicons/black/res/drawable/baseline_library_add_24.xml", + "upstreamSha256": "e5aba84818bacfff0a77dccc94e5af0aaeda9e3486e627458e33bbf6f2ffce1e", + "localSha256": "d16f5dd04dfc8e5e6491db9ddb46e9049feb4b6d8e635779d0b7159491b20e7b", + "orderedPathDataSha256": "8d3086d102d2b4b7c5fa3c371c812aff886b1e8c1b7bb9fab383836da449c5fc", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/library_books.xml", + "upstreamIcon": "library_books", + "upstreamPath": "android/av/library_books/materialicons/black/res/drawable/baseline_library_books_24.xml", + "upstreamSha256": "186633edb9778c40904e7a0d60b9a7440a77a39a7b2a9bc10bb6e1dfe5c11ecc", + "localSha256": "7ca556801e5a6c1cebe7b54f6947f2356ee9d3a8d446bdb842a4c242d524b216", + "orderedPathDataSha256": "8f2be7df89a8f23fb3262f0edc6bab1d55117a43429b028b2c85eb77109d15ed", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/library_music.xml", + "upstreamIcon": "library_music", + "upstreamPath": "android/av/library_music/materialicons/black/res/drawable/baseline_library_music_24.xml", + "upstreamSha256": "062067f57ea0e7431725418e1ff2c4cd73f60d23149a839b9d14ab28965735f9", + "localSha256": "d3769a718ac86506bb3d8985aa94c813ed936d414cc055c3d01fb35407078ccc", + "orderedPathDataSha256": "29d10827e578573487d04aedf73e35daeff6e38d8ce2df841440cfe79e1aee5d", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/light_mode.xml", + "upstreamIcon": "light_mode", + "upstreamPath": "android/device/light_mode/materialicons/black/res/drawable/baseline_light_mode_24.xml", + "upstreamSha256": "f642867cf2271c1de4849760586e29cc17f82d341e1487b4ad7630bc89006cef", + "localSha256": "8f2f483ed69529ab23bbf93a5846999062d5961c417a9bd32989c8dc4ce10d4c", + "orderedPathDataSha256": "e06cc783dbc45666e91f95ee70da86db33a9eced4cf0edc3ce65d32cf4402371", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/light.xml", + "upstreamIcon": "light", + "upstreamPath": "android/search/light/materialicons/black/res/drawable/baseline_light_24.xml", + "upstreamSha256": "b99976637eef3ae2197abd9bf91d424ed526f74fcbed8188340c5f10475d8946", + "localSha256": "0d76d70cab9c6a4b776d878d6fcb9aaee5a8b6f649772e298299f2ba64434c42", + "orderedPathDataSha256": "ec2473c3f58594a4d651a715afac78c28daec0b7cad80ae141683998ce000e15", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/lightbulb_circle.xml", + "upstreamIcon": "lightbulb_circle", + "upstreamPath": "android/action/lightbulb_circle/materialicons/black/res/drawable/baseline_lightbulb_circle_24.xml", + "upstreamSha256": "d2f5016fd99ef4ad3324ee9907984401c40455fe4318e00cfdb594c994ed1904", + "localSha256": "688c7057683da1b5e179abee0581a8dd843a6dbd5e982385190b31a8ca607c0f", + "orderedPathDataSha256": "5df2e611afac04756066d343ebf89fd03a54d54825310116b653ac51c1086186", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/lightbulb_outline.xml", + "upstreamIcon": "lightbulb_outline", + "upstreamPath": "android/action/lightbulb_outline/materialicons/black/res/drawable/baseline_lightbulb_outline_24.xml", + "upstreamSha256": "ee9b6509f325e0904ff2b68653766056bf83cef0b25b77bf809acc1becc65404", + "localSha256": "5baf32a81eeb8708b05ad277868e82d137c2895a9b49c8ded9ec33a2dad9305d", + "orderedPathDataSha256": "2cb857b7e1d5ed4c6f0d54ba3540851e66bcb8fc1f2d158d97b886e38590cd2c", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/lightbulb.xml", + "upstreamIcon": "lightbulb", + "upstreamPath": "android/action/lightbulb/materialicons/black/res/drawable/baseline_lightbulb_24.xml", + "upstreamSha256": "92d1cc149f7710b8546af61e38b5017b43d606d0ab4a17c71fa7b9660e5a669d", + "localSha256": "a0ec775b429656a3786a35ddf4c17595152e1e4fdceed9d26a3ddd21e0a2846b", + "orderedPathDataSha256": "f8969ae591c956b3f15a14ef8b2f066af76bd503adde6732c39340ff5c7c65fe", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/line_axis.xml", + "upstreamIcon": "line_axis", + "upstreamPath": "android/editor/line_axis/materialicons/black/res/drawable/baseline_line_axis_24.xml", + "upstreamSha256": "4336befe5c0da44e9e4ac006c2782b65f73a0a7e7df6507287a26ac1d87da5a2", + "localSha256": "aeaab05912ac5ca4db5f7fe15686c0769c3220b16254cdde25a5abbf5e27533f", + "orderedPathDataSha256": "01d4db183ea7ac16c47cc3096430b9fab9ef14d8ac5caa80ab7bff9d76959542", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/line_style.xml", + "upstreamIcon": "line_style", + "upstreamPath": "android/action/line_style/materialicons/black/res/drawable/baseline_line_style_24.xml", + "upstreamSha256": "017c48601e87ae055ba3ff9ff69304341054429c7b999dca21a6351c171c13c6", + "localSha256": "0d435dc3132230aa7f07109f6b9a035900ccc0509b17c9e887cffb4ce045fca1", + "orderedPathDataSha256": "5472a3d5202ee986f211dded6e2994396daeeefea07dab06af55164c378470e6", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/line_weight.xml", + "upstreamIcon": "line_weight", + "upstreamPath": "android/action/line_weight/materialicons/black/res/drawable/baseline_line_weight_24.xml", + "upstreamSha256": "f5732b76434398e75b33f00dc53f9dfa169d8f21caa6cce513fc2dfd050f68a4", + "localSha256": "5878c140bb613275a0ec07bbc66ab6398e97b80042421af0be3f676ca24ea08e", + "orderedPathDataSha256": "2b9fa73abb48e04f857b4e518f3c12ba8f82517069c321517de2d863461cccca", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/linear_scale.xml", + "upstreamIcon": "linear_scale", + "upstreamPath": "android/editor/linear_scale/materialicons/black/res/drawable/baseline_linear_scale_24.xml", + "upstreamSha256": "0c617168affc8cc213afb43b92eb1447361ef18b6959e49f712cfab2418f095f", + "localSha256": "7069e27050c4f79786f5f5bf9be3e7fbff83a266227199fd9f0c08a39c528b3b", + "orderedPathDataSha256": "02ea9b7e63e48d5dd9180c258ff6a81963979b20c1aebf74dbd82c644217893c", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/link_off.xml", + "upstreamIcon": "link_off", + "upstreamPath": "android/content/link_off/materialicons/black/res/drawable/baseline_link_off_24.xml", + "upstreamSha256": "15bee215a33772e46bae9356ba632772b72708a7dd4da8e3acee733001d0519f", + "localSha256": "96b48849b8e9c51ab717acf14817b8806454e9d9d50b4d3fae0e108991c3c96b", + "orderedPathDataSha256": "c0ef39b85637d68676953466cdb83d94961c73b19d538278985f920c736b52cc", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/link.xml", + "upstreamIcon": "link", + "upstreamPath": "android/content/link/materialicons/black/res/drawable/baseline_link_24.xml", + "upstreamSha256": "f631a74f395bcc7fb8867d2005747fe38c652f45034e4106fa70d0b388f2fc5d", + "localSha256": "c21eb77a82c1d31e2ef7cb537b69037c0af5becbfa651ce05fad2e7455a3d3f8", + "orderedPathDataSha256": "cfad14700f1593207a4fa681a050a5976ab1fabbb2319c80a5b880bbfcaf141a", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/linked_camera.xml", + "upstreamIcon": "linked_camera", + "upstreamPath": "android/image/linked_camera/materialicons/black/res/drawable/baseline_linked_camera_24.xml", + "upstreamSha256": "aeaf0b9f5750591eda4b95909f1837f1a7e2f578aad9714831fbaf83f3772774", + "localSha256": "f8a372faf3a83e5d4db53c5cbeda6531df73200da0a66007eee21ec6182fe60e", + "orderedPathDataSha256": "7137ab56f85e862592622a2578381905f118d35fb23b9f22db40536ea56ef9d0", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/liquor.xml", + "upstreamIcon": "liquor", + "upstreamPath": "android/maps/liquor/materialicons/black/res/drawable/baseline_liquor_24.xml", + "upstreamSha256": "98689fbca0f9619ec0d9f97ee38e5af68951233b22830d98dc44dbf464de8dc0", + "localSha256": "a7bd7f832e9c3062248e6d3cb95247c211e89aae69c4fc8a8b147b166546dd5b", + "orderedPathDataSha256": "f1ca65dd8ff6771bcc0855a7e3d591a6b6736c54d31662e20e025888f5ace508", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/list_alt.xml", + "upstreamIcon": "list_alt", + "upstreamPath": "android/communication/list_alt/materialicons/black/res/drawable/baseline_list_alt_24.xml", + "upstreamSha256": "64af1cdf1bdc7c7c21de58e082c42d0667f3985c8457c1e9bd946ff97961f43d", + "localSha256": "7fad144a1ebf99af9d2d1d104475eebd4565ab1398fcefe4bbca1388f556ea40", + "orderedPathDataSha256": "449b7e61d9f91bdfea7c9d08d63a4ca30553a361ae00d5343422e67cfd479ec4", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/list.xml", + "upstreamIcon": "list", + "upstreamPath": "android/action/list/materialicons/black/res/drawable/baseline_list_24.xml", + "upstreamSha256": "e788e1354f41c21dd1ab0f247a4b3e8461727591d17cd280c2f14c45cf864c1d", + "localSha256": "4db77298d2943609d41a94c967fe92aecf9cb46c4723e9b0df92e41e14c14bd0", + "orderedPathDataSha256": "d580670dc6afef4d5f6bfeb1948e15bd41639b4103908b14deffedcaa4de0a11", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/live_help.xml", + "upstreamIcon": "live_help", + "upstreamPath": "android/communication/live_help/materialicons/black/res/drawable/baseline_live_help_24.xml", + "upstreamSha256": "de404a8a438f9ac09a56541f8870abfe4d4212b6c7acc0b41a7067b0ad828bae", + "localSha256": "9b64e82896f33de3f8d28ec2d72c3aa9e490183f1db46e2325a94c2dcdba35d7", + "orderedPathDataSha256": "4ff89dbadd46ccfba24e2dd2cfbc7643d83c546138049a563a572d1f0df782e1", + "originalGeometryMatched": false, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "vector", + "attribute": "autoMirrored", + "value": "true" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/live_tv.xml", + "upstreamIcon": "live_tv", + "upstreamPath": "android/notification/live_tv/materialicons/black/res/drawable/baseline_live_tv_24.xml", + "upstreamSha256": "a6cc7c90254895725108284ef29a4dba0aa3463f0d4accae3f4e23a0b89eea82", + "localSha256": "6534db92517c7654ccc129a9297f101895e6c19e68be35898969b69b78742eb0", + "orderedPathDataSha256": "69f89037de1e529439fd52c585298db3f427e4489f2126b75b60711bd43ee431", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/living.xml", + "upstreamIcon": "living", + "upstreamPath": "android/search/living/materialicons/black/res/drawable/baseline_living_24.xml", + "upstreamSha256": "564f3f2bb2e0f90c3f19170b48d480a72fffa391faaeea0841fc8ee018ef7f4c", + "localSha256": "3f8c20955accef74d190bcdc9bb33eb9cdbb35e9ae8408efe3131165e1b14c2d", + "orderedPathDataSha256": "010ef434f6900829216af61f3b864f8255ae929566cd7702b746121ead93e712", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/loading_img.xml", + "upstreamIcon": "hourglass_empty", + "upstreamPath": "android/action/hourglass_empty/materialicons/black/res/drawable/baseline_hourglass_empty_24.xml", + "upstreamSha256": "fca29de163a3f819e2cd492a46e531778c29666b4f47bef2f79cd0343f5f539b", + "localSha256": "f9b7d9cfd49026c11fdc6e85a1d5f1537c9fa05810f947711b2033b7dbe5958f", + "orderedPathDataSha256": "2954459d70acc9eb5f0297a3a68add08ba26b7319d4c1726f609a78637ff1015", + "originalGeometryMatched": false, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/local_activity.xml", + "upstreamIcon": "local_activity", + "upstreamPath": "android/maps/local_activity/materialicons/black/res/drawable/baseline_local_activity_24.xml", + "upstreamSha256": "7df61e565d65ff34a0467b8e3e7672a078d6220bd57e62290f4314244858581e", + "localSha256": "97313a444e26d7c3235dabcf6d97c82556e45dc789f3f043c1800154c54ea6a1", + "orderedPathDataSha256": "88014033f3d1a22aa3283d6e9ae445e5431d3fd6a92be0047ffb28284c45b88c", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/local_airport.xml", + "upstreamIcon": "local_airport", + "upstreamPath": "android/maps/local_airport/materialicons/black/res/drawable/baseline_local_airport_24.xml", + "upstreamSha256": "9a5645ebd202351bbcbc577150dddb448e02681f5f2e67024b7d2426b96a0cf2", + "localSha256": "28b672810ed6462bddba73c564fa8708a04f12071e6501a9159ad92c388e2c3f", + "orderedPathDataSha256": "2a4db9a5d6ce5e95751943fe72413639d88f8135308c5f819a4f8c5e4b48f48e", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/local_atm.xml", + "upstreamIcon": "local_atm", + "upstreamPath": "android/maps/local_atm/materialicons/black/res/drawable/baseline_local_atm_24.xml", + "upstreamSha256": "34dc54d010ad0810ffdd215551769fe8245685f4ad352c41097375ba0049e2ba", + "localSha256": "5571ac75dabf3153aa3af01faea3e5e9b05e4eff1c929dd65f528315c5892bd7", + "orderedPathDataSha256": "ad25282a9b41cb69bffed6a4b9e02662fb90222099670d4957e9b6d8fb45cd27", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/local_bar.xml", + "upstreamIcon": "local_bar", + "upstreamPath": "android/maps/local_bar/materialicons/black/res/drawable/baseline_local_bar_24.xml", + "upstreamSha256": "425670403bc709281fa954f2870752b7fa904ef4d334181c126205ef58ff9c16", + "localSha256": "ff83d47f6a66cb5a7e0c369aba3f1ca77e76727e65a885f595d4538b2895d6ab", + "orderedPathDataSha256": "7148775882f07fcf558e624f171a18fdc80ce92da2b3e642249ca3d6c78b9756", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/local_cafe.xml", + "upstreamIcon": "local_cafe", + "upstreamPath": "android/maps/local_cafe/materialicons/black/res/drawable/baseline_local_cafe_24.xml", + "upstreamSha256": "f5b30d27264184f520c578b58721c681322cec933cf63c2b894a836d6ac3f250", + "localSha256": "564c3dd3e8c931834231f6e3a2eae59780fca4bd59eda4ed4f9ea6b64adedc30", + "orderedPathDataSha256": "7cb789299a597b29642d2a0d8400c33634d607077387aac026062bbbb1fec01d", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/local_car_wash.xml", + "upstreamIcon": "local_car_wash", + "upstreamPath": "android/maps/local_car_wash/materialicons/black/res/drawable/baseline_local_car_wash_24.xml", + "upstreamSha256": "ad16156c1f5908fe3412d21dfec4dd558726c0ae44d363e26782ec5c3dc4d369", + "localSha256": "3bac4009e3d8d269fba176bb27744ed7601264036393a4095da2e412bfe1f1a0", + "orderedPathDataSha256": "b5890d82d6025fce0070acbe5c0a85ffa4e28cbdc392090a3658049d07414962", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/local_convenience_store.xml", + "upstreamIcon": "local_convenience_store", + "upstreamPath": "android/maps/local_convenience_store/materialicons/black/res/drawable/baseline_local_convenience_store_24.xml", + "upstreamSha256": "3bb4d851f70764a2931d538d658eec1ac88bc45e1a8c9319177b09dcd46c4c56", + "localSha256": "c95e6410295da5afa81f254112b26c818b5a22ba403fca47442092f1356ad2a5", + "orderedPathDataSha256": "6f6ddc770f39465806313bc9185b628d1f0cadd4da6074c35d4fb16adb01b335", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/local_dining.xml", + "upstreamIcon": "local_dining", + "upstreamPath": "android/maps/local_dining/materialicons/black/res/drawable/baseline_local_dining_24.xml", + "upstreamSha256": "f827cffff52a136dc3ee3245d4151eb7a54f7f9ca3df2b7bcaad3cf1deb189c5", + "localSha256": "5785b18954930863d5b4df6230e949a1397a81659b1526d4985481be19564099", + "orderedPathDataSha256": "eb62ab978699570edb38e1cbd3f99b7bacc39929451250ca8cf1206eb5db2b81", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/local_drink.xml", + "upstreamIcon": "local_drink", + "upstreamPath": "android/maps/local_drink/materialicons/black/res/drawable/baseline_local_drink_24.xml", + "upstreamSha256": "f654abd96a4a8e2352d73dc9de1545c7a039d67f1bb0cd9f5a0315985a6aa4e4", + "localSha256": "c51976db8e98c5e7ee4c542d1daaef3ac3f671dd2b5ab32742985107f547edf8", + "orderedPathDataSha256": "02a4f22592cdbf784898209a3571e26884e3e120b149ae910b3109cc2b30f4cf", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/local_fire_department.xml", + "upstreamIcon": "local_fire_department", + "upstreamPath": "android/maps/local_fire_department/materialicons/black/res/drawable/baseline_local_fire_department_24.xml", + "upstreamSha256": "c969691b4ba119eb260aff27906eabe461468b720b6348d8191429917eb88859", + "localSha256": "eda76e66b4a7980085c812bca4e0c42a2bab98a8bbe3e8614db4ffe25bbe896e", + "orderedPathDataSha256": "1254fdf183c4bfa4639205f1d8adc6d3a509bf546345ba6fb99f0bc40d9f5567", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/local_florist.xml", + "upstreamIcon": "local_florist", + "upstreamPath": "android/maps/local_florist/materialicons/black/res/drawable/baseline_local_florist_24.xml", + "upstreamSha256": "6ce6c36bff39f9b5718e49498c15a51de3ff30bdb0ba287596b0cc5542c52dd3", + "localSha256": "1f662e96a43a4badc33391fae8cfda448bd79c756560175bf62ca2c5ee01fd60", + "orderedPathDataSha256": "3cb99c0695b253170c731359aad1745d60ff7b4b94a4cf530b1ef95be9a40830", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/local_gas_station.xml", + "upstreamIcon": "local_gas_station", + "upstreamPath": "android/maps/local_gas_station/materialicons/black/res/drawable/baseline_local_gas_station_24.xml", + "upstreamSha256": "b58525d01ab8f2c8bae97c4bbf0a5f07cb31c3dceb53c562d13511653bd2b36e", + "localSha256": "66e13e561bca22c4c057a559b3d15431f7127d9638d80f026670a813451bddb6", + "orderedPathDataSha256": "d96d22ab7267c3f34e85a8d8cf58a5d983925b8b3c65866be9a65a4a4d739681", + "originalGeometryMatched": false, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/local_grocery_store.xml", + "upstreamIcon": "local_grocery_store", + "upstreamPath": "android/maps/local_grocery_store/materialicons/black/res/drawable/baseline_local_grocery_store_24.xml", + "upstreamSha256": "458a3c5727c73dc99d3a672bc3e0a6d8296e66ba9bc7b87881e54fe5072baff9", + "localSha256": "3e2311212a56734228a3f71cae248ac433734c79204384f41ad8127bd20d8781", + "orderedPathDataSha256": "7e0532c170b8c1d53f9d6909ec64fb5f316c9b8d3a78adde669a3489c326611d", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/local_hospital.xml", + "upstreamIcon": "local_hospital", + "upstreamPath": "android/maps/local_hospital/materialicons/black/res/drawable/baseline_local_hospital_24.xml", + "upstreamSha256": "6600266689340df7085c1e94d9e87249eb635ec29d7aaed8737c07b6dd1683fd", + "localSha256": "fd8baffa644e23a8a2b2ee5a57195d2ff408a1c4b4aad2acdd4bc888574f5614", + "orderedPathDataSha256": "be0aacc09b7c7552bd4c5742dd8467f376d828f580496c62c5b1b768f4b73fce", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/local_hotel.xml", + "upstreamIcon": "local_hotel", + "upstreamPath": "android/maps/local_hotel/materialicons/black/res/drawable/baseline_local_hotel_24.xml", + "upstreamSha256": "b88e3763413d4820af6f4c3f3ad8f9b00a3e2f9eb9a031264d24af282f850a9c", + "localSha256": "bf3c33a65767de3e7c3f47bc9baaf03e19216f5821649a0f31c17f0c9ccaee04", + "orderedPathDataSha256": "b739deca92624ca2a772e3fdf87d09ffd35c9a36feaa9421d74a5f2dc3bea840", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/local_laundry_service.xml", + "upstreamIcon": "local_laundry_service", + "upstreamPath": "android/maps/local_laundry_service/materialicons/black/res/drawable/baseline_local_laundry_service_24.xml", + "upstreamSha256": "a6a8a313ae0526abf5a27719fd32f10769f0558e9c9381e7177997d5d2682aca", + "localSha256": "409ce882afede4e3a9fad29d0c92ecf90a69ff6512d7a0b4f4ed7f4bf9db5714", + "orderedPathDataSha256": "31eafdfa5ea39fc0c21fc57bc7771ad79a9dcb525c4d1a4dfbb77adfa76a6a61", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/local_library.xml", + "upstreamIcon": "local_library", + "upstreamPath": "android/maps/local_library/materialicons/black/res/drawable/baseline_local_library_24.xml", + "upstreamSha256": "64fcbd0bf4cfd0d5a6db4a45ffdc692546acdbcc0ce37a2b93bf0ceeba1016ea", + "localSha256": "79ec633596fd495e2e1fbe4f90b2f7171aa50f7aa4ace2a352922ec28d39086b", + "orderedPathDataSha256": "a2ffe4d4504a8ae4d53f50a10c58b5e97a53164def86854b5918df6b89f6fc2f", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/local_mall.xml", + "upstreamIcon": "local_mall", + "upstreamPath": "android/maps/local_mall/materialicons/black/res/drawable/baseline_local_mall_24.xml", + "upstreamSha256": "b073a41e2f583ee3463e00c359c8634f44dc49561655dfd75c79ea0c186c1ac8", + "localSha256": "2878dad9baec6ca1d3da811c5886468664695db4d759662544800a5a8e93e1b2", + "orderedPathDataSha256": "cdf0019dbfd74efe87c14dff72a9f4edbdae9e3de9e06bb9572734384af57cc6", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/local_movies.xml", + "upstreamIcon": "local_movies", + "upstreamPath": "android/maps/local_movies/materialicons/black/res/drawable/baseline_local_movies_24.xml", + "upstreamSha256": "4a43cf2e09e72f0c4d7e1c6c0a47555c975aba2b52f31b78a3b69177aa3a37af", + "localSha256": "72d0e87dc3333068c2ab637ea3b80af16258858ce0e280438e0090ae33c44793", + "orderedPathDataSha256": "09bf1b40a9df866363a871d996fceddd1a8d01eadefdd4d720bdb9da116e7e4b", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/local_offer.xml", + "upstreamIcon": "local_offer", + "upstreamPath": "android/maps/local_offer/materialicons/black/res/drawable/baseline_local_offer_24.xml", + "upstreamSha256": "bb05f78e44281adab11d286d5586a986cb43e3e777c3c5ec82ad0a55bf33223c", + "localSha256": "b6859bd12322529b92f16e061389cc1ed6980373b75af3da122cdd50bbd3e22c", + "orderedPathDataSha256": "2a2eb808cb577977135817ec49f4be16d6aec52ee02e5b385131e6e12be4e238", + "originalGeometryMatched": false, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/local_parking.xml", + "upstreamIcon": "local_parking", + "upstreamPath": "android/maps/local_parking/materialicons/black/res/drawable/baseline_local_parking_24.xml", + "upstreamSha256": "0e10333dd8acd87bcd60be1868992791c7f27859b554b0615e6b91988fdc63a3", + "localSha256": "e74f0c698b68894c485b4c69bd36a76a70948dfa1e43937231da168d4f19f255", + "orderedPathDataSha256": "cd5361068074b1e50a8d97ee0602a11e47eea2d4e94c84f16a3ca911c97d7d51", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/local_pharmacy.xml", + "upstreamIcon": "local_pharmacy", + "upstreamPath": "android/maps/local_pharmacy/materialicons/black/res/drawable/baseline_local_pharmacy_24.xml", + "upstreamSha256": "05b1a93d96526f1df293cb87d561d689076523c475332fbe0b02e27c85f4ef6c", + "localSha256": "b682619a98d25d866b14b36eaff9e6ffe1821e2ba78f87effd49cf0634f2b287", + "orderedPathDataSha256": "dbf3972603c2ca5f693c146223aabaa0f3a015b4a2bb12f76bd662ca666c6ca0", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/local_phone.xml", + "upstreamIcon": "local_phone", + "upstreamPath": "android/maps/local_phone/materialicons/black/res/drawable/baseline_local_phone_24.xml", + "upstreamSha256": "743ef320c7fa9dd3517fedb43a68ba5d7574316d1a26e5c40c8466f6f5e950e9", + "localSha256": "f348078b0a3e1f792105d0cc40e8546fe8a1ceeccbdcdc3e2ce6034b4964ccd2", + "orderedPathDataSha256": "969d7195087c44d0b7a08d00f1bbdd911958561a146b77df232f90170705e174", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/local_pizza.xml", + "upstreamIcon": "local_pizza", + "upstreamPath": "android/maps/local_pizza/materialicons/black/res/drawable/baseline_local_pizza_24.xml", + "upstreamSha256": "80a61ec330f8efd5efd232ed4bebe40d908243be4b8582d53b74e3e3ba4b9254", + "localSha256": "9d0d9081c2026689b600eedbc7387fa85fd0e24923ff7d91fa28ffdc6136de95", + "orderedPathDataSha256": "79bc8dc79117ad7c4b2d3c09af854460e9a4b274ded83824444d6ee10827e1fa", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/local_play.xml", + "upstreamIcon": "local_play", + "upstreamPath": "android/maps/local_play/materialicons/black/res/drawable/baseline_local_play_24.xml", + "upstreamSha256": "7df61e565d65ff34a0467b8e3e7672a078d6220bd57e62290f4314244858581e", + "localSha256": "8d6b110dc3570d1134aeaf13820058f4a5693b68a60a4430576b16ba5188e035", + "orderedPathDataSha256": "88014033f3d1a22aa3283d6e9ae445e5431d3fd6a92be0047ffb28284c45b88c", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/local_police.xml", + "upstreamIcon": "local_police", + "upstreamPath": "android/maps/local_police/materialicons/black/res/drawable/baseline_local_police_24.xml", + "upstreamSha256": "85a4db0554684922aa6eb86aa80097b0951248e3194bb2944b83a153bdb84223", + "localSha256": "54dcb06ff42d3982c7855e4b625ea5d815ee9c7542b57e54e1356253317bb24a", + "orderedPathDataSha256": "8568e969fb777a4409894a735175389653f97018f53b001454ebd355413bacb8", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/local_post_office.xml", + "upstreamIcon": "local_post_office", + "upstreamPath": "android/maps/local_post_office/materialicons/black/res/drawable/baseline_local_post_office_24.xml", + "upstreamSha256": "9e90ebb0f59ff59fa85239762edfbc627a0c5b50a8e6485d3104c2304996a3c4", + "localSha256": "37204e2052fa7381a0ff2a84ca09a063f99ba99bc2c6d040d27214114fdebfea", + "orderedPathDataSha256": "331777901ea3aa8b3e42d95fef1280a1b7a5bcc64beef81c3bf95abae3d21190", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/local_printshop.xml", + "upstreamIcon": "local_printshop", + "upstreamPath": "android/maps/local_printshop/materialicons/black/res/drawable/baseline_local_printshop_24.xml", + "upstreamSha256": "81a23be72af693d09bb847785fda0fdb16303fa4a33c392cc7a2c51b7fa8aef2", + "localSha256": "d458cb5c325bbf8238614eed8b8ad13ccabd0790f8167cd4f1f6936ef1003620", + "orderedPathDataSha256": "d93bc182afd820e7753909de022888699fc606e2e879156f62446974ca22f548", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/local_see.xml", + "upstreamIcon": "local_see", + "upstreamPath": "android/maps/local_see/materialicons/black/res/drawable/baseline_local_see_24.xml", + "upstreamSha256": "0976ddaeb4144665433a3840295f48bce05a7d70f8e09a3282e20dbdd72da291", + "localSha256": "30791caccbd9048a89b53c0de64f7f09d5c47c146a972a61a9e690a46f99513e", + "orderedPathDataSha256": "8532e25ecb7bf8eb37c3b87779a6e8cdd5cea2f2c55e8dc4de035accb046bcac", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/local_shipping.xml", + "upstreamIcon": "local_shipping", + "upstreamPath": "android/maps/local_shipping/materialicons/black/res/drawable/baseline_local_shipping_24.xml", + "upstreamSha256": "962a142898aee10bc0a0f43b8c0cac69d24476fb326ef199ca1a90f4b567c4ef", + "localSha256": "c8256d24b4a39546f679655efbd71b66793a55f22a17e70348ab0e1d8dcd1c4e", + "orderedPathDataSha256": "2161ede62dca254128e3a91f7aa326e85f896a7278bd31c5b29d63ab908644dd", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/local_taxi.xml", + "upstreamIcon": "local_taxi", + "upstreamPath": "android/maps/local_taxi/materialicons/black/res/drawable/baseline_local_taxi_24.xml", + "upstreamSha256": "a0117c3b43d830ef179d41f1c5d1152d50ec1af192f794d81228267bbc63d5e4", + "localSha256": "59e90b2749d91eedfafdcc63f601f1c5ac4c6800563935d9d41c86593cd75337", + "orderedPathDataSha256": "f38db28cdd0b59c3b0b154ff08eec23b8b37ade7303511636cb96be1bbf69695", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/location_city.xml", + "upstreamIcon": "location_city", + "upstreamPath": "android/social/location_city/materialicons/black/res/drawable/baseline_location_city_24.xml", + "upstreamSha256": "0dd736ab7a209b1ec6a78cdd3177b2b1bafe4e188d7d092b364f67e8d869641e", + "localSha256": "362522441e96e19b7c0c0ce89a28f77e98e387fa9971c119fb70ab7c95ce70ce", + "orderedPathDataSha256": "06d25bab008bf0429f853a33d1087d07f63f53252464a041b6036cee474df3a8", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/location_disabled.xml", + "upstreamIcon": "location_disabled", + "upstreamPath": "android/device/location_disabled/materialicons/black/res/drawable/baseline_location_disabled_24.xml", + "upstreamSha256": "4c79cad95142e1052fb02927fdb23df048ebdd265320b9fbe6558327fec5e624", + "localSha256": "92bc3dd3b4a60957cef5bad052bb851d9e8b94d3806576b90601d4b92887e8c3", + "orderedPathDataSha256": "439e861a9bf07e6d93c3c74bb0cd34abc5f7515b66d4359d36b4297c02232402", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/location_off.xml", + "upstreamIcon": "location_off", + "upstreamPath": "android/communication/location_off/materialicons/black/res/drawable/baseline_location_off_24.xml", + "upstreamSha256": "e9f5b3274c16e6bd68a3b11d270610f7f9b9880d4950a88d29653feaa1771874", + "localSha256": "cd23db26a0816c2a4034c0a64734ce50a6fd85261258b351ab9466ddb790c398", + "orderedPathDataSha256": "bb8beb77d099da8393e21e6f16a876bb20c0df1d27367476f226ce302e465209", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/location_on.xml", + "upstreamIcon": "location_on", + "upstreamPath": "android/communication/location_on/materialicons/black/res/drawable/baseline_location_on_24.xml", + "upstreamSha256": "470ae3c3d612ac3c7db3586431c6783154e54d309428579026e48b79bc196317", + "localSha256": "5f2768d5f05dcf7a8bbe00e006419f368b66c1335538eb10e6d405ac621ba1f8", + "orderedPathDataSha256": "5f62b0d8c48e250a38478e2ef48351be60bfdf071406eca08a6e99deb736d0a6", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/location_pin.xml", + "upstreamIcon": "location_pin", + "upstreamPath": "android/maps/location_pin/materialicons/black/res/drawable/baseline_location_pin_24.xml", + "upstreamSha256": "59ecef67bd2c574da5a02310ec7a7b2f83219bf9c455831c870aee14dd39ed6d", + "localSha256": "84b95a40f0183da17dee0decd9390f1ccf895a553e78e40dc26b1a70d8cb2dbb", + "orderedPathDataSha256": "790997d83981d49c4e1d970594b497cee8da974515d8e4076992559e4728f509", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/location_searching.xml", + "upstreamIcon": "location_searching", + "upstreamPath": "android/device/location_searching/materialicons/black/res/drawable/baseline_location_searching_24.xml", + "upstreamSha256": "ed942d18ea3d3f3736b90bef1e4d99545bcfa89de9700c4027df4a16b9b0bedb", + "localSha256": "a2e45b929d4656c1d72f5c486638b82346fd61fd3f1dd58b29f2ea3a9d6f3da2", + "orderedPathDataSha256": "6ac69ceb42d80589f45e57790c05316a1219387b1e12c6b107d214a42ff4ae2e", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/lock_clock.xml", + "upstreamIcon": "lock_clock", + "upstreamPath": "android/action/lock_clock/materialicons/black/res/drawable/baseline_lock_clock_24.xml", + "upstreamSha256": "3cedd3f1d0b06ec59a7521a4417562102abde4ecef8e28f9ae5b17e92f0c673f", + "localSha256": "8b4139bc8121e696dd0a8c42bf94e88746e001a4a720128197382f8a4170d1b5", + "orderedPathDataSha256": "30f20df96f98a17c6252ae85119b71e273a03e07874dbccddf95f35713fb967c", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/lock_open.xml", + "upstreamIcon": "lock_open", + "upstreamPath": "android/action/lock_open/materialicons/black/res/drawable/baseline_lock_open_24.xml", + "upstreamSha256": "2d1a9f2d6d5b644733c9e653b0562bde22321627e9b468984ba8aab494a9716a", + "localSha256": "c118858f8621c3ae321c984da37e6c38e2dcc8935baf3e724ea03d643351df14", + "orderedPathDataSha256": "830eea1b5367fc510cc807a89f74907bc80d393ae882ad960353b317c5039028", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/lock_outline.xml", + "upstreamIcon": "lock_outline", + "upstreamPath": "android/action/lock_outline/materialicons/black/res/drawable/baseline_lock_outline_24.xml", + "upstreamSha256": "7732f34a59d7b42e3694577479107022f269a9f2989780ac47a44005a8837cac", + "localSha256": "6bea9c6a9e065ac71b017fee4606bd7128dbc7c2ad033739985270c87d34c697", + "orderedPathDataSha256": "b357d244b56c672019cc93acf4ac42b9c539a18eb1d8a76313e62ba384188e7a", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/lock_person.xml", + "upstreamIcon": "lock_person", + "upstreamPath": "android/action/lock_person/materialicons/black/res/drawable/baseline_lock_person_24.xml", + "upstreamSha256": "fbc8583122ae829c4a110e606df20b3caffd228a96b2d70d72489076c382de0b", + "localSha256": "cb92378e28f3ef2f85da656e99cfa4643c6c3393d8d782b5feba203a332c180e", + "orderedPathDataSha256": "1e9295f76c27e93dfc59a278a2b0c94227cbc134f743bb504fd5732accf5c1ca", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/lock_reset.xml", + "upstreamIcon": "lock_reset", + "upstreamPath": "android/action/lock_reset/materialicons/black/res/drawable/baseline_lock_reset_24.xml", + "upstreamSha256": "a6d6ff5622e479f15b2fd139a8744f66fd9b467c014202e5d87b61728b53f6fd", + "localSha256": "c93538c04fa17830105497210b53e0a8db2bbe2ccd344bea7fa419f32b0e6d14", + "orderedPathDataSha256": "3732a593a23f3ae36dfc0a757642b7ca00ffe20ff51029224443d4d5c803eeb7", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/lock.xml", + "upstreamIcon": "lock", + "upstreamPath": "android/action/lock/materialicons/black/res/drawable/baseline_lock_24.xml", + "upstreamSha256": "50497b02f9af18c9dc248872bc0cc3381218526559674e3ffeb5957b0f2dcef9", + "localSha256": "02f68b24306a59d46333d04fabd478589778caa90c5b23d9f41b4b04b79df320", + "orderedPathDataSha256": "6bf734569dcb62cbac0da7273d8edb84aef3a06dfc0fe3c346affdb3ba9d16fc", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/login.xml", + "upstreamIcon": "login", + "upstreamPath": "android/action/login/materialicons/black/res/drawable/baseline_login_24.xml", + "upstreamSha256": "d3cf1340d18a5a5ee9e72eaf2818ba2d175924d0021f38627e6109b73c507c87", + "localSha256": "0e83659b432481965d724b2818041739bd53ce0a77b80d61289c241a6ca1cdd4", + "orderedPathDataSha256": "0f401e822f94f01b4d000fcc5ca819c1cfb12935034bc495fceb395ccc49ca34", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/logo_dev.xml", + "upstreamIcon": "logo_dev", + "upstreamPath": "android/image/logo_dev/materialicons/black/res/drawable/baseline_logo_dev_24.xml", + "upstreamSha256": "2ca9188d1a9c02195fa473bb292b49819c5ca4d7e4031e7b4415e7996de788a4", + "localSha256": "c326680020bcb782a8696d5c7c8e4f60df409fe40ec1a4b5b317e208a36d3fe1", + "orderedPathDataSha256": "facb77f4cb40517cd20936e15e00aeb88cc0ec4d11df69e853514c6614b61f7c", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/logout.xml", + "upstreamIcon": "logout", + "upstreamPath": "android/action/logout/materialicons/black/res/drawable/baseline_logout_24.xml", + "upstreamSha256": "54716590223618b7b6023a4de8b6dc7b43aeddaaf7566830beb2bea63044912d", + "localSha256": "58087b9a289ad24962b7c310c7303e852b9ee8baa0d81b78714a80c86ec0fc51", + "orderedPathDataSha256": "d40e5ba8c48b71a689b8a8b0e20e1bc74816e32f7506ad26594629e0872e3f3b", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/looks_3.xml", + "upstreamIcon": "looks_3", + "upstreamPath": "android/image/looks_3/materialicons/black/res/drawable/baseline_looks_3_24.xml", + "upstreamSha256": "c80baff43add35d568aeb17f6ebad807fa6fbf522a10cdf32b459071dd5fd712", + "localSha256": "63eb3d3fad3d1627f58ca08214a48546074450e8f9d72e594a17e37e84f1d4e0", + "orderedPathDataSha256": "90914a732515e677ea30e077877bdb2b025049974f293cab80ac534d4224bc25", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/looks_4.xml", + "upstreamIcon": "looks_4", + "upstreamPath": "android/image/looks_4/materialicons/black/res/drawable/baseline_looks_4_24.xml", + "upstreamSha256": "f455efbfb2e70447b51aa31eb7953bb94c990bbe9bad7354229ab7a2b62311ad", + "localSha256": "311132b25fc43ff7c6b000180dacef11e17267c0a4098dc16948c3da1ff4c70e", + "orderedPathDataSha256": "41b6eaf7cba465e7a00947925ddc1e59a93ef2620e8a4d8bd78ee9e508e62199", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/looks_5.xml", + "upstreamIcon": "looks_5", + "upstreamPath": "android/image/looks_5/materialicons/black/res/drawable/baseline_looks_5_24.xml", + "upstreamSha256": "67dcdd27c2a670e26300dc72483516b75bb8166ae6aca96b9d6ca4c5627953c6", + "localSha256": "5047c5f6274b63321d6420884152234dacaa5c9deeae48b2e8ceddbb2d55e168", + "orderedPathDataSha256": "24db85deef256fef8c1c38c4ea98b8a0a2deef273b9c1d90d688c11cd53008b3", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/looks_6.xml", + "upstreamIcon": "looks_6", + "upstreamPath": "android/image/looks_6/materialicons/black/res/drawable/baseline_looks_6_24.xml", + "upstreamSha256": "c042b56af51f0ef2882fcba36983bbea28d05a8cd6dffb1f686edeab75bf0ae2", + "localSha256": "9c20b2fc650467989bbe3e2d392ac5fd9bee58a6e4b916651d4e59f1c99835ac", + "orderedPathDataSha256": "cbfaadf9f481c209f49c19ee767b6c3cd5e414d62aa5cb9b4c0fdd6b5f6759e1", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/looks_one.xml", + "upstreamIcon": "looks_one", + "upstreamPath": "android/image/looks_one/materialicons/black/res/drawable/baseline_looks_one_24.xml", + "upstreamSha256": "623139c566cce99d1b172e6804360e036cb01d123d38dad75c02e776b2a588f4", + "localSha256": "d82341324968b0f58f151265cba4692c3e7ec3a0c8a9995d07f7fd878ff02416", + "orderedPathDataSha256": "bdc93244d118086ec76520dc22c5a32c6a7cc0351b68ea068d8dd8d2c489ba61", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/looks_two.xml", + "upstreamIcon": "looks_two", + "upstreamPath": "android/image/looks_two/materialicons/black/res/drawable/baseline_looks_two_24.xml", + "upstreamSha256": "23bf090ec81a7bff42fcc284b8184689ec3bb23cbef351f348c5026b53d589b2", + "localSha256": "153297f627109a7c0534ea082a3931dab7e5e36906590a6bb9b5c6554d91e913", + "orderedPathDataSha256": "5f04f14164d4c0c6cad5f7c0629a47a0c95577b27312a0da6af6ac273f247071", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/looks.xml", + "upstreamIcon": "looks", + "upstreamPath": "android/image/looks/materialicons/black/res/drawable/baseline_looks_24.xml", + "upstreamSha256": "2c41d27df4c81f8aafbd09630d954f214c87b3156893430107d046c453e0161d", + "localSha256": "7d2c6b0f89837afd45136008797ebed5d83acade5dcdc4781f0570f684267f58", + "orderedPathDataSha256": "2df13f5f2c6550cb2cc7f4aadfea36a9ce02af55304cf73d71ed4ab49f6b7f3b", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/loop.xml", + "upstreamIcon": "loop", + "upstreamPath": "android/av/loop/materialicons/black/res/drawable/baseline_loop_24.xml", + "upstreamSha256": "8db3d2ab521cdd9ae90d7507fee96566f9142bf985d170a5cd5b281244cc3e93", + "localSha256": "f00b0dd20b301f9f58d5a125320e8f668e805077fd89b7b7aba8c2db020da57d", + "orderedPathDataSha256": "e11256bdb90ec5464f8ddad6f29513730d880a26b4dad3621a40393ab2bef2e4", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/loupe.xml", + "upstreamIcon": "loupe", + "upstreamPath": "android/image/loupe/materialicons/black/res/drawable/baseline_loupe_24.xml", + "upstreamSha256": "ce024bb0f2bfa5f6e8656f240dc5f1825ee00f925e005441dda99ef5f34b76d3", + "localSha256": "c8900f944471324dc0dde1e0c1fa72defcaa4cda945ce1e2324ac140100e1ed0", + "orderedPathDataSha256": "d0bae359f8ea3d3aadf4940057294980ab900ac12cda1fcba99342f9640a7989", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/low_priority.xml", + "upstreamIcon": "low_priority", + "upstreamPath": "android/content/low_priority/materialicons/black/res/drawable/baseline_low_priority_24.xml", + "upstreamSha256": "b23e8d36f03687045d2d1777aee3f7f0ddc1e83c83cb3d8294ae631591707288", + "localSha256": "af7c1cc046171a880075482cb8802e524f885624866b36f3901db8694d7fe360", + "orderedPathDataSha256": "47d84b66e061a4027ddf2db7684b43d40ecc1442e7b5876442ff58c22458b0fa", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/loyalty.xml", + "upstreamIcon": "loyalty", + "upstreamPath": "android/action/loyalty/materialicons/black/res/drawable/baseline_loyalty_24.xml", + "upstreamSha256": "6ce8fa14bfc798670a87a48d389ef1d7251da823ba460202e76f7158855106fa", + "localSha256": "3e16ecf0273ba4e617c593c5f667072aa8631652214664ecf6d7a0e5febf45fa", + "orderedPathDataSha256": "421d792aba94f887d8c0014f5e0634b0cc710c26bce2264e77b42376a5cf4945", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/lte_mobiledata.xml", + "upstreamIcon": "lte_mobiledata", + "upstreamPath": "android/device/lte_mobiledata/materialicons/black/res/drawable/baseline_lte_mobiledata_24.xml", + "upstreamSha256": "d5bdba28c9daa2a998de8a93591ac2ae6497198f2503c6e3b952fea35c226bc8", + "localSha256": "6498e09757c2ceb508c0667bf59cf461ceec153f6c8e1fdfdca65ff7a1bb799d", + "orderedPathDataSha256": "528c358a28e0b8ec53fb3b1df5522be4435d49d443ae52d0c2b873b9e878bb9d", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/lte_plus_mobiledata.xml", + "upstreamIcon": "lte_plus_mobiledata", + "upstreamPath": "android/device/lte_plus_mobiledata/materialicons/black/res/drawable/baseline_lte_plus_mobiledata_24.xml", + "upstreamSha256": "3f239b3ade93f18236fa7d4a92116386e7a3aabc0876d58c16bf5b95a3db179a", + "localSha256": "d638f840a40218e0e80fcf8614f960ad6d03931d774c90586a2cc170d0352c2c", + "orderedPathDataSha256": "cbbf7bc1c0e48751932300fec7f210629de1859ac5c5b1e1816570234c2bd7f0", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/luggage.xml", + "upstreamIcon": "luggage", + "upstreamPath": "android/social/luggage/materialicons/black/res/drawable/baseline_luggage_24.xml", + "upstreamSha256": "5f5af62393ea4d100b62c5204386ac92baaa0fcef3d452e31a74237f5713a604", + "localSha256": "5fbae9c94d97075e79a88ac90c37c74c2e76d6c9fe83403bdd712cbdabf6b06a", + "orderedPathDataSha256": "7177e73eaf49c5b3a20914163cdcc3c8e6d19ef459a8c0b3156543757cd5a487", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/lunch_dining.xml", + "upstreamIcon": "lunch_dining", + "upstreamPath": "android/maps/lunch_dining/materialicons/black/res/drawable/baseline_lunch_dining_24.xml", + "upstreamSha256": "93b07e776385494837b1e7416e0ca1feeea7f408073f965f277c096e42a40df4", + "localSha256": "70df3854ae27751c53c93d34015df570f46ae050eccc3d99cca55f0f9d6356fa", + "orderedPathDataSha256": "3f71fa32a2a1385c66fb6024c549ff73c570e124e081a6591308e7c51227d5af", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillType", + "value": "evenOdd" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillType", + "value": "evenOdd" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillType", + "value": "evenOdd" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/lyrics.xml", + "upstreamIcon": "lyrics", + "upstreamPath": "android/av/lyrics/materialicons/black/res/drawable/baseline_lyrics_24.xml", + "upstreamSha256": "67362f8c97f5dfdfd6d01d5a79887fdcae237b2e438910f53854a3beb94e9663", + "localSha256": "5d04f2e7bb0f478d0dd7135b8582881583bbba4cdb6f7312419b9105284d4fa8", + "orderedPathDataSha256": "45c4345becdb3d1318fe7d49b9f616495d08a56b2626cae075398ae0a370091a", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/macro_off.xml", + "upstreamIcon": "macro_off", + "upstreamPath": "android/device/macro_off/materialicons/black/res/drawable/baseline_macro_off_24.xml", + "upstreamSha256": "a74eb2c3b3abbb32d0250d4bb75134f4f1fc0d3c27486119352720b02038d1fe", + "localSha256": "c23f5aaa147b81d2c6e112301f3ba8accf554126a01b242bc2b0cf2e682e742a", + "orderedPathDataSha256": "a89077af62c63de156c2709d87059907f0a7471b2963185daa7c7c02f820e084", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/mail_lock.xml", + "upstreamIcon": "mail_lock", + "upstreamPath": "android/communication/mail_lock/materialicons/black/res/drawable/baseline_mail_lock_24.xml", + "upstreamSha256": "560c4c0799e01b06ed8d2a5548c000a01dddee7ed1b27df0789366290eba3bb9", + "localSha256": "49dc90e254f22f7a77eebe1902e4b314d31e8685f6cc11f7f774636565cd8373", + "orderedPathDataSha256": "046e30a837809200e841ea8f5cfec6b1645b64eda3b40ba8ca5b59c60dc9525d", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/mail_outline.xml", + "upstreamIcon": "mail_outline", + "upstreamPath": "android/communication/mail_outline/materialicons/black/res/drawable/baseline_mail_outline_24.xml", + "upstreamSha256": "50eea41e8a0ce2e724b7758599423602ccfdf068654673688709a17179f75871", + "localSha256": "c0d44e139d6a8e48b1f17b3d36ed7c90a8ce04e790f4bb269a831287e8209b8f", + "orderedPathDataSha256": "12c30f7026b09c045a6e0b17c872711d321c2f3991fb72c2e3d6107e6eec992d", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/mail.xml", + "upstreamIcon": "mail", + "upstreamPath": "android/content/mail/materialicons/black/res/drawable/baseline_mail_24.xml", + "upstreamSha256": "9e90ebb0f59ff59fa85239762edfbc627a0c5b50a8e6485d3104c2304996a3c4", + "localSha256": "ceb370e9e0778c3059eb4559a4a85c8ae7bb566eb520b94170120cfca3e6a96a", + "orderedPathDataSha256": "331777901ea3aa8b3e42d95fef1280a1b7a5bcc64beef81c3bf95abae3d21190", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/male.xml", + "upstreamIcon": "male", + "upstreamPath": "android/social/male/materialicons/black/res/drawable/baseline_male_24.xml", + "upstreamSha256": "868550651904a78a50c5416da4ceb25e4c0adbf1db59fbc6f159ecac8d0ee2e5", + "localSha256": "a6813e3ea473b44ae940b35e3fd2822dbaaed0af870c9934187e1f76d245c3cd", + "orderedPathDataSha256": "47d60294915baa28709e87a2dec6f1c6396cd739559f108e48bfbfa26828e95f", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/man_2.xml", + "upstreamIcon": "man_2", + "upstreamPath": "android/social/man_2/materialicons/black/res/drawable/baseline_man_2_24.xml", + "upstreamSha256": "69fc0a1943e1a2bc596f1d20f09acaf095c845c01d44edcc6d7472c9ed3fcbd4", + "localSha256": "3c280c6abe4c12ee4edaf2f7226c674a4acba2a43b82d7091db67ed6ff7bd804", + "orderedPathDataSha256": "b0b69e47fd1c6a374086770742e7c173c3fdd0d83f4ab101b81f59fcb829e99f", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/man_3.xml", + "upstreamIcon": "man_3", + "upstreamPath": "android/social/man_3/materialicons/black/res/drawable/baseline_man_3_24.xml", + "upstreamSha256": "2ed2b3b2701474a7f69a4e29338360ee3d9c7dfcc554a9892679b5dcc7edf9f8", + "localSha256": "05e349516e4c4af1a0a4d34a33ee85cd97a6d12337c69dfaebc2cfae7c81b82a", + "orderedPathDataSha256": "459b49341f2eb519d2e8b0a9ff0002e87e3442ded16c20d09dc0405093707d2b", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/man_4.xml", + "upstreamIcon": "man_4", + "upstreamPath": "android/social/man_4/materialicons/black/res/drawable/baseline_man_4_24.xml", + "upstreamSha256": "f5fa8a83c41a94774b0fd3cf428c4b1e008fe4eb6b02412afb5acee6dfb53e4b", + "localSha256": "08b19a790924153da5b86f8c80c08948748a5305343d5d8d17761ac49ee41f38", + "orderedPathDataSha256": "6c151ba8ebdcd79dcb4b7162d2cf925aa0af2517e56e8ba552ae30e484908f11", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/man.xml", + "upstreamIcon": "man", + "upstreamPath": "android/social/man/materialicons/black/res/drawable/baseline_man_24.xml", + "upstreamSha256": "ee82fd9db5006c1a84dacbab5713306e313e210ffa1790ae5dd22f60ac059a34", + "localSha256": "03a8bbbf3d307238a3512f5fcea0f3315a4e4207de18618b3513666b0f32201c", + "orderedPathDataSha256": "2d4123e7b12e1ed47bd25c84dd43bb6c3b91e50c125763cdc0162a40d76375aa", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/manage_accounts.xml", + "upstreamIcon": "manage_accounts", + "upstreamPath": "android/action/manage_accounts/materialicons/black/res/drawable/baseline_manage_accounts_24.xml", + "upstreamSha256": "83b2bdc86e9b46bf15b09ab5598451bfd4ea5ab08a3c9237b25607aa1ecbab0d", + "localSha256": "91eedf7e578feb0afa3bf44809498d28f38d82f6fa057597d72e5abc99527607", + "orderedPathDataSha256": "355b10a4cdafdfa982e1df470a75833cb72116952853ac378947b4ae6e87b096", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/manage_history.xml", + "upstreamIcon": "manage_history", + "upstreamPath": "android/action/manage_history/materialicons/black/res/drawable/baseline_manage_history_24.xml", + "upstreamSha256": "f22b60542baa47d153d690fc19f24e7be1ed79fa23e97a63129ea47c5caaf77a", + "localSha256": "9ed66a5c3d5b09add6f891e7231c0a0d42a653504e75cf26f273a54f549b27ae", + "orderedPathDataSha256": "ffb805076212f5a772c82b0f4c49f3790ad9fb0d5dfa82ec31f931707cc65122", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/manage_search.xml", + "upstreamIcon": "manage_search", + "upstreamPath": "android/search/manage_search/materialicons/black/res/drawable/baseline_manage_search_24.xml", + "upstreamSha256": "db941d449cb908764a09517e8f8fb4b41386af3664780524f813ffbd4942f8bd", + "localSha256": "810906adf0cb52d46e4a901dc20e020190bec9181e254fa8313de69409d00377", + "orderedPathDataSha256": "88602db063da2db95f34b0f9eb5be9acf02d6f5d7a298c05565c7dfd30de489a", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/map.xml", + "upstreamIcon": "map", + "upstreamPath": "android/maps/map/materialicons/black/res/drawable/baseline_map_24.xml", + "upstreamSha256": "f040e3f9e3a3a97d1f0f94aa48b4297b2ae21928e34da3caffac8259497d18ae", + "localSha256": "8c715ce640034ea18c632b74d549dc6d9283b1d2a1d289073f1dd4a9fcac5d3c", + "orderedPathDataSha256": "353179360d12e31369fabb2447eabac02da3bece9ab5e2bed71d80ea7ce52ca1", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/maps_home_work.xml", + "upstreamIcon": "maps_home_work", + "upstreamPath": "android/navigation/maps_home_work/materialicons/black/res/drawable/baseline_maps_home_work_24.xml", + "upstreamSha256": "6ecd595821b280a0d0354ee8149b5a2bcf747dd069a3f0ff6bc67afe0a3f83a6", + "localSha256": "b328e0ef680187214845e165b9fcca0c6072a08372e06241b6a233984492457f", + "orderedPathDataSha256": "ac25c35ec4bf00ea9c99ab2656aaa9316f53c230e6b871517cb5f55a8cdd6799", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/maps_ugc.xml", + "upstreamIcon": "maps_ugc", + "upstreamPath": "android/maps/maps_ugc/materialicons/black/res/drawable/baseline_maps_ugc_24.xml", + "upstreamSha256": "1649405bf49e11b7cfcb0c709ba9d5777ec265667f4697b565db8f51e31e149a", + "localSha256": "08593366784bc42f793142916b910a33330d8d4c9c707217917a7bd18c862034", + "orderedPathDataSha256": "b234f2389d255273bcc43a5ac880eae1cc640b4116a268df2e272abd7d7f9a09", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillType", + "value": "evenOdd" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/margin.xml", + "upstreamIcon": "margin", + "upstreamPath": "android/editor/margin/materialicons/black/res/drawable/baseline_margin_24.xml", + "upstreamSha256": "d4ca2d30e4764a9664942fd52fae4f2827f162e11835493fc1aeacd7896d293f", + "localSha256": "dfc35d8f82aebde039f26341f040541ed92087127c55161f70afe3159936c65f", + "orderedPathDataSha256": "1480833cf1502b3209816c3f307092ad16b1c3519c5c698203529039c1cd4e1a", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/mark_as_unread.xml", + "upstreamIcon": "mark_as_unread", + "upstreamPath": "android/action/mark_as_unread/materialicons/black/res/drawable/baseline_mark_as_unread_24.xml", + "upstreamSha256": "a63fa864267854362a656bf750a7c2d75e1ca89ebf074e8af1c22bc789dd4b98", + "localSha256": "416e98ccae19206d91eb03585b307323f77976504ac2264ccb557726aba56876", + "orderedPathDataSha256": "f07e6474922d7dd990d1ed168a3e0a2a767db70393ca9e642bb743ce5cb2a151", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/mark_chat_read.xml", + "upstreamIcon": "mark_chat_read", + "upstreamPath": "android/communication/mark_chat_read/materialicons/black/res/drawable/baseline_mark_chat_read_24.xml", + "upstreamSha256": "8ba2ca21c3e89f5c35d3545124c7f0a7110973e81bb3e4c388a4d07c1747c993", + "localSha256": "0516638eb260bed47f1ada2df8396c0768de834e7da5197ab5888fbf83b99e69", + "orderedPathDataSha256": "9abc1947613ceb33043da92c7a8a960a678784082aa2e6e66c3865e17f54a344", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/mark_chat_unread.xml", + "upstreamIcon": "mark_chat_unread", + "upstreamPath": "android/communication/mark_chat_unread/materialicons/black/res/drawable/baseline_mark_chat_unread_24.xml", + "upstreamSha256": "7dd05e8845fa8cdbc35084395e3375487efab56d13c8330fdefead57425c0fc0", + "localSha256": "387d52210074eb2be7c878fe4aa8bf988a5c4ee1d7db43ece91d14143e98779b", + "orderedPathDataSha256": "709eeba0ec6ed4bf679f6199858fdc83bb0f4bb132d9959d24a18354a18e362f", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/mark_email_read.xml", + "upstreamIcon": "mark_email_read", + "upstreamPath": "android/communication/mark_email_read/materialicons/black/res/drawable/baseline_mark_email_read_24.xml", + "upstreamSha256": "342b8fccf2f6d146b52e3ea277a0d46e5bfd107e14f5562675145b8f7b6ccaba", + "localSha256": "a5a7e82f01e16c33bf27bcc91765a0ae90d9e848495ea1e30609f4d9ca3a6921", + "orderedPathDataSha256": "4ca44ab5abf1e57fb94cef6c19c08e94f81216b0eed46e61add92ffd2e2b2821", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/mark_email_unread.xml", + "upstreamIcon": "mark_email_unread", + "upstreamPath": "android/communication/mark_email_unread/materialicons/black/res/drawable/baseline_mark_email_unread_24.xml", + "upstreamSha256": "94af10ddf5db7609f5cc25e0d275a67ba4882d4459b7c44c35b300e56bfae2b2", + "localSha256": "b3c351aed47c1b4b02b4a426ec0240ae685ab65d92a42d2c0520afdd64b1872f", + "orderedPathDataSha256": "8e5a491796039ca9177fd7f0217190772c1bb998e3c83afb73abb660ecf1070f", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/mark_unread_chat_alt.xml", + "upstreamIcon": "mark_unread_chat_alt", + "upstreamPath": "android/communication/mark_unread_chat_alt/materialicons/black/res/drawable/baseline_mark_unread_chat_alt_24.xml", + "upstreamSha256": "f4476380080c0c6700cfa2f588d0a99f67021216cbb611f510f88ddfaca0b623", + "localSha256": "e5ecfd69c5312204bec95d7b700bdff854cc5bcff0491a427b880ab6b4286260", + "orderedPathDataSha256": "3e95a850413312d6901ff04fbbe28ac347b222e37a4f0ca75b8bbfb3aa633eeb", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/markunread_mailbox.xml", + "upstreamIcon": "markunread_mailbox", + "upstreamPath": "android/action/markunread_mailbox/materialicons/black/res/drawable/baseline_markunread_mailbox_24.xml", + "upstreamSha256": "d79a1b88ddcaa93def6bef0d2d5f8e03103650d22a741df12df50a7b5d7c9baf", + "localSha256": "9e95b3a0ba4ecb859ad3f176c20ab5aa2233550c1700f06c944db9a5fb70fca7", + "orderedPathDataSha256": "31b0c329c8f530fef13f80d2c5a49e5841d273d0b2c47830c087e0efafe4eb82", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/markunread.xml", + "upstreamIcon": "markunread", + "upstreamPath": "android/content/markunread/materialicons/black/res/drawable/baseline_markunread_24.xml", + "upstreamSha256": "9e90ebb0f59ff59fa85239762edfbc627a0c5b50a8e6485d3104c2304996a3c4", + "localSha256": "fc2a712f8adc8c87b2235114ab6f7cf4202247508f868e41e004cf30a8724d37", + "orderedPathDataSha256": "331777901ea3aa8b3e42d95fef1280a1b7a5bcc64beef81c3bf95abae3d21190", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/masks.xml", + "upstreamIcon": "masks", + "upstreamPath": "android/social/masks/materialicons/black/res/drawable/baseline_masks_24.xml", + "upstreamSha256": "828e1f5ae6d0498abcbe9d2d4f198477aa894c3611d4d1b439f4f666062a6f00", + "localSha256": "6a6225557bb3736d5557502510d141acc5678afcd296053447584e5ab2886995", + "orderedPathDataSha256": "fd66c9e540b84fde693add35e5e32d9eed953e23a548b8d7ed80d927d8f3dd1d", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/maximize.xml", + "upstreamIcon": "maximize", + "upstreamPath": "android/action/maximize/materialicons/black/res/drawable/baseline_maximize_24.xml", + "upstreamSha256": "a903429cb455de10797c5df80f6f59eacf5ee69a0e1f68589d226fc3e9b3590d", + "localSha256": "7857cba7217aabbbafb099a07645919ddbe09f53cc257245342c9e05aaa7baec", + "orderedPathDataSha256": "c169f5badefbe7204c82a3f6a81bd6f568821d2f3b23ebc8b15b3c41ad384ad1", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/media_bluetooth_off.xml", + "upstreamIcon": "media_bluetooth_off", + "upstreamPath": "android/device/media_bluetooth_off/materialicons/black/res/drawable/baseline_media_bluetooth_off_24.xml", + "upstreamSha256": "139b0d16b506fd19ef81ed4ba21d99c12ca1941e95ea238cb98917813735b530", + "localSha256": "b604accbbd02cfd734ba010d76f42ceb263f56653831c394fe4b602cb6f78d9c", + "orderedPathDataSha256": "53b81cc4cc94e639147b77b281743733abad48df05dae7753f332b2d7b3cb91f", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/media_bluetooth_on.xml", + "upstreamIcon": "media_bluetooth_on", + "upstreamPath": "android/device/media_bluetooth_on/materialicons/black/res/drawable/baseline_media_bluetooth_on_24.xml", + "upstreamSha256": "a29c612cdedfe567dd8579043a8594cf3f816eb8cc6e538275e63ea068423f9a", + "localSha256": "5c8d218468c431ab144a3907d797e286b26783b554507da67ee144beaea715e7", + "orderedPathDataSha256": "01112afafa791fa96328cb9fe81653e4e06ff6f709ba8e08008cb1b308d8a978", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/mediation.xml", + "upstreamIcon": "mediation", + "upstreamPath": "android/action/mediation/materialicons/black/res/drawable/baseline_mediation_24.xml", + "upstreamSha256": "f59aa310cbb51069773ef203f04c313d1a07e7f71b0db058d8fe04e9c0223443", + "localSha256": "e5c2fec123dc01cfed0952c69835f11ae3aa0c8076a779fb9f879f53d3d0f127", + "orderedPathDataSha256": "dc3ae74ccb8a2be69f01aecfd67399ef442abecb44beb0c0d0198ee6313866b3", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/medical_information.xml", + "upstreamIcon": "medical_information", + "upstreamPath": "android/maps/medical_information/materialicons/black/res/drawable/baseline_medical_information_24.xml", + "upstreamSha256": "c70c25ae17a22be8a88211d0e1d56f068e7d01152c61a6d47166cbbf6e924bde", + "localSha256": "26d15e05fcb62e917fde4ba1e79517c0e32a7dc9b81d5a6b0de387ffe12eeeda", + "orderedPathDataSha256": "b45b2b48f64c150ce50b651e2e209d5f2f3d365181dfecfe12a0a4e720e90835", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/medical_services.xml", + "upstreamIcon": "medical_services", + "upstreamPath": "android/maps/medical_services/materialicons/black/res/drawable/baseline_medical_services_24.xml", + "upstreamSha256": "53146d4bf3d016b8f066a36b8f59174bfe39574ead18bc3df60645d9f49c90b8", + "localSha256": "422e5f853e2825068ec27c0b745c20c1e2ec95e4d57ff7f6562f0058ed9a5261", + "orderedPathDataSha256": "9cfe88ab03de79f14128ab8b5ddb88d8868e699876564af7dc259c3edb4d173b", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/medication_liquid.xml", + "upstreamIcon": "medication_liquid", + "upstreamPath": "android/device/medication_liquid/materialicons/black/res/drawable/baseline_medication_liquid_24.xml", + "upstreamSha256": "3fb0dbce26b25f1ac6c75be39386ed51ddad5997f20b29d55f22bc499384b27b", + "localSha256": "4d3871de70f3adf1dd9edd0958cf8e2fcc73fdf102f0e4d3e2a5dce3bb372f05", + "orderedPathDataSha256": "9d924712fd1b814539e03d3fe3f3c27a1bfe69103cf6a44a1542f3431feaf2c5", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/medication.xml", + "upstreamIcon": "medication", + "upstreamPath": "android/device/medication/materialicons/black/res/drawable/baseline_medication_24.xml", + "upstreamSha256": "4c299cfff85f2a50541b6f52c848cdbacd63ce0d2044740bf65391b72d0999c4", + "localSha256": "f01ab4022b98b6fcb291da96ed5913ee812166ac441a3a47d741d17a6d623795", + "orderedPathDataSha256": "98fe6caf5b3ba848f76065e885a78014f241790eeeace35a0eb7143fffa60a00", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/meeting_room.xml", + "upstreamIcon": "meeting_room", + "upstreamPath": "android/places/meeting_room/materialicons/black/res/drawable/baseline_meeting_room_24.xml", + "upstreamSha256": "d5efbcdad9b9461b851d728e4f78715903cef14f4d3140aa2978d5f10ae8206d", + "localSha256": "d16723ad40b5f86ad5d9dcf47adc4590bef8d2372126a85096d626151a33413f", + "orderedPathDataSha256": "50845fe800af9211ffd66aec3eb3fdb582e34a1980b0909803792b51abad377d", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/memory.xml", + "upstreamIcon": "memory", + "upstreamPath": "android/hardware/memory/materialicons/black/res/drawable/baseline_memory_24.xml", + "upstreamSha256": "57346cf09e228c5ca2546332e8602f6b5867bbdf6ccd0eabb9380b88a38990d7", + "localSha256": "bf503866def8ac8dbd4e24ddd2e65cd31b01870d461badc28fca75a8260f50f8", + "orderedPathDataSha256": "d0d41009f93f92407d4e5a1090b7e931cc4cfe6dfe0551ddc00d1a6c62f9c83a", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/menu_book.xml", + "upstreamIcon": "menu_book", + "upstreamPath": "android/maps/menu_book/materialicons/black/res/drawable/baseline_menu_book_24.xml", + "upstreamSha256": "a16fe377175fbd64027924a710e4388c6ea4504f506d9925b9e9917ce5696f0d", + "localSha256": "183019dc1c43e76450deeadc23a8cf1097d2d2c555483c4b888b5abba6fa3364", + "orderedPathDataSha256": "bd939af8f0dfa956e235b69f303ee31ef69ac1f18284f96e5b7eb6e5f1c56c2c", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/menu_open.xml", + "upstreamIcon": "menu_open", + "upstreamPath": "android/navigation/menu_open/materialicons/black/res/drawable/baseline_menu_open_24.xml", + "upstreamSha256": "e519423783ed39f4c2cfa8356ef1ade7dab2060fcec242a0de0bd10d2924910b", + "localSha256": "2ed0dfe1bfa53363cab0230427eda41276b0d56ebee9f23f43399ea37915b584", + "orderedPathDataSha256": "bf5548bd65e43c2382f72d5cb0d107e6492d65b7cfc45e8f4904f6f14bdd19fe", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/menu.xml", + "upstreamIcon": "menu", + "upstreamPath": "android/navigation/menu/materialicons/black/res/drawable/baseline_menu_24.xml", + "upstreamSha256": "483fc0c50ec1347c263e93f197ee906fa41a9199ac4948fff6e45937f4e84d68", + "localSha256": "2c3c71c57da226c5010e4c6b1f0c9f598296e9b69568b77eff85f21847400f60", + "orderedPathDataSha256": "0cceaf6429cb2c1dcfabdcc474a41de79788224eae1d19fbb3cea97077d33e91", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/merge_type.xml", + "upstreamIcon": "merge_type", + "upstreamPath": "android/editor/merge_type/materialicons/black/res/drawable/baseline_merge_type_24.xml", + "upstreamSha256": "0f519d541d625ef84a817582516ee55c9abe83ca25428867c9d7f75ec7fb433d", + "localSha256": "9f579f4e1d20c6f4e9361e8edfadc4b4c9a40fe6acd46f3086f739e6c34141af", + "orderedPathDataSha256": "49351cbe496ffedc21c2a121e87802d0fdd3f075b50da67ed8cccdea949582f5", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/merge.xml", + "upstreamIcon": "merge", + "upstreamPath": "android/maps/merge/materialicons/black/res/drawable/baseline_merge_24.xml", + "upstreamSha256": "f5aa4a604ca529aa60d09566b075a66e95f8b4e51feb03171ba176525700459c", + "localSha256": "51f08ec991ae548ce4a9712558b674722f3eb856b62c6b40c98731ab0fe10f07", + "orderedPathDataSha256": "9a424f5f6845112d028137f5fbd0e5321b68fa931183f0a0d4da306215aba167", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/message.xml", + "upstreamIcon": "message", + "upstreamPath": "android/communication/message/materialicons/black/res/drawable/baseline_message_24.xml", + "upstreamSha256": "65149361dbbcd028eb8241e84c96ef7820269b151f66ef14dc024b8a8eee8472", + "localSha256": "5560eb0b1e30db3af96b835575a292486371754589016f0c6c808ef9deefb179", + "orderedPathDataSha256": "bbac483d39e3220262e77e71b6993602cba35021b16ec26096ff4f816f9112d6", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/mic_external_off.xml", + "upstreamIcon": "mic_external_off", + "upstreamPath": "android/image/mic_external_off/materialicons/black/res/drawable/baseline_mic_external_off_24.xml", + "upstreamSha256": "94a2dea1d50d2b5bc22ea3fb313e87e4384982a871cef06c96fe5b67d6e6c8aa", + "localSha256": "e7ef3be5f6340589a85230ae21c2d9ff156bd3086f6821a7bafad66147ec3734", + "orderedPathDataSha256": "2acd275f8a03bae59c5e7fd0d18a31facdcc94580b96a309112eee022834722f", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/mic_external_on.xml", + "upstreamIcon": "mic_external_on", + "upstreamPath": "android/image/mic_external_on/materialicons/black/res/drawable/baseline_mic_external_on_24.xml", + "upstreamSha256": "e84e30f8a1eea7a5e1057929ddd061c8cd7dbf2bfd52c841cc83e96597823ebc", + "localSha256": "08cc9570e9c204af8b7edc6eeab86848e08e8bfa1938b3dac5cc48533cc7e7d1", + "orderedPathDataSha256": "0d7f721be64a61c42bbe525cf8f2ff0336e088a0a78d69f3cd79379a7d5ba230", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/mic_none.xml", + "upstreamIcon": "mic_none", + "upstreamPath": "android/av/mic_none/materialicons/black/res/drawable/baseline_mic_none_24.xml", + "upstreamSha256": "351262999c0a38d486a980ee850d9e5a94e9c363902bb8f6218e04be6e8e3091", + "localSha256": "19807ecdf7a9c99977f8e27603565cdfa768cb9aaca87f96564f6160e6943c0e", + "orderedPathDataSha256": "f87a009a98ee89f18020afe30359001de0bb09b4ea0466f0aa5ffd2d9c3f25c5", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/mic_off.xml", + "upstreamIcon": "mic_off", + "upstreamPath": "android/av/mic_off/materialicons/black/res/drawable/baseline_mic_off_24.xml", + "upstreamSha256": "cdc4c53d9bf3b607be656b8ec3217b700646a748c5f4503baff80b88e1e7dafd", + "localSha256": "db279b7f377a2aa3cc1fc38dc31262b771e221d8dd7e63a6f8a0a71904502e91", + "orderedPathDataSha256": "965fecec2602147cf6b59e3e3cb47d86c64b471c77b9a31de432509a59e2736b", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/mic.xml", + "upstreamIcon": "mic", + "upstreamPath": "android/av/mic/materialicons/black/res/drawable/baseline_mic_24.xml", + "upstreamSha256": "260ea0ff2afd7df64fa48226e76670850d7c6823f42eb5c78893d1eb080e8631", + "localSha256": "81ffc844b9c3a096042bece02125ee0ab16a6c26ae9cb84c54b0cfa6c2865f09", + "orderedPathDataSha256": "bb5c26773be2251828bc9d493ce4e0cfda9957b0b36f784bbbebbfc5055eefa7", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/microwave.xml", + "upstreamIcon": "microwave", + "upstreamPath": "android/places/microwave/materialicons/black/res/drawable/baseline_microwave_24.xml", + "upstreamSha256": "6468dc5b8445abf3caa1cb379948206e2ae5a7f902a7e00950432e28130b175d", + "localSha256": "49a8159e220ebdbe221367b54c32fa1058906bd8df4d864210cb4f10319b5297", + "orderedPathDataSha256": "5afcf623169e0f4511f3dd42859b99e368a2a164f41dcf877b8e01b2e2050bdd", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/military_tech.xml", + "upstreamIcon": "military_tech", + "upstreamPath": "android/social/military_tech/materialicons/black/res/drawable/baseline_military_tech_24.xml", + "upstreamSha256": "2ffd834584bce5793ce3e011f531c7abd4b9a798f69624d4ba4c752493d74dec", + "localSha256": "e35bf18cbea3b963361900fa2ac71dcea34c6bbb194014b113b087ed45c75b39", + "orderedPathDataSha256": "d8e41d59866f15cf91bec1a2faae04f2efc5a9543a4ec525b865a6ea7032610b", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/minimize.xml", + "upstreamIcon": "minimize", + "upstreamPath": "android/action/minimize/materialicons/black/res/drawable/baseline_minimize_24.xml", + "upstreamSha256": "c2aa1be9ced8f2993febc415c5caac85856fb301c5506c31e5e5ba68209894ce", + "localSha256": "f341ec04d093dfe99cfc555d088c295694d4850dc454bfa1cb64bbd54e1862d5", + "orderedPathDataSha256": "04791a77bd848e7f19beb78f7f5aaa0790f5c4d604756440e8fc6e8bd4af8bec", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/minor_crash.xml", + "upstreamIcon": "minor_crash", + "upstreamPath": "android/maps/minor_crash/materialicons/black/res/drawable/baseline_minor_crash_24.xml", + "upstreamSha256": "004fa33d21c5d0ccb18170d3001e89cba1efcc709cd86e5dfff7b3db8c6572c7", + "localSha256": "a8b043cb3ff7f711494bb2315b39593059f016d528630e7e0272d6e6a495806a", + "orderedPathDataSha256": "78f7b689709a332d7dea86aadd87f84ef0a39dd31b7f52c08166c788a377e4d1", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/miscellaneous_services.xml", + "upstreamIcon": "miscellaneous_services", + "upstreamPath": "android/maps/miscellaneous_services/materialicons/black/res/drawable/baseline_miscellaneous_services_24.xml", + "upstreamSha256": "346de9bf3d9c42fdd6005b42ad759ef2290eae012782132d8c861100ad7d60f0", + "localSha256": "e2a175fbb6d81e2c569648e12e3ebb6b30caf090d68af92861316348c319036a", + "orderedPathDataSha256": "2dde594f6ef02ab416ce0432b5eec1bbdc465a3dbe92bd9cf0df919be265e5e9", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/missed_video_call.xml", + "upstreamIcon": "missed_video_call", + "upstreamPath": "android/av/missed_video_call/materialicons/black/res/drawable/baseline_missed_video_call_24.xml", + "upstreamSha256": "ef37f4ef7b01b058cb23aabf6cab0ce688759a0154bd6e83ad22180b0a1ec85f", + "localSha256": "c703e4a5b067f7bf543dc6519601abf8ad0912f8b28c953d91c2b11296a83667", + "orderedPathDataSha256": "3a40c029ff8e51715b932db9ba202d4ff36359dadf019ba9bd50e5fdd3e24e64", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/mms.xml", + "upstreamIcon": "mms", + "upstreamPath": "android/notification/mms/materialicons/black/res/drawable/baseline_mms_24.xml", + "upstreamSha256": "55d471ed8ed93536e52d2225d5fe3d570415efa803e763da7020a000cba1f224", + "localSha256": "96ae3726da4e07de334b0ad420c13cb45dc29953379d6a209e5f772f486b4a0a", + "orderedPathDataSha256": "7ada847b69f283840d8ea790fbb5ccf7c7f57caf7583556a91d71017c85b2b9e", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/mobile_friendly.xml", + "upstreamIcon": "mobile_friendly", + "upstreamPath": "android/device/mobile_friendly/materialicons/black/res/drawable/baseline_mobile_friendly_24.xml", + "upstreamSha256": "6d010f1da832ff0a82065acfe543a136ae7ec6625add8057374b9ac74cb35a8c", + "localSha256": "88788d7d8d63727423719ace6a8ca7c854d8aa2e8e6c91c94d0bf8a002172651", + "orderedPathDataSha256": "d55ff4fe2059d0bd36a640466eb0e2e913e4f0945cef84b48c39c072e8f90f3d", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/mobile_off.xml", + "upstreamIcon": "mobile_off", + "upstreamPath": "android/device/mobile_off/materialicons/black/res/drawable/baseline_mobile_off_24.xml", + "upstreamSha256": "10681ccd24f996f41836c40488b9306256620e87b9f63ae7ae38d95a07dfe8cf", + "localSha256": "bae038928944cf98cdc56dc2e2d84cc49ed7058cdfe8bb2216411716a95c3f3d", + "orderedPathDataSha256": "924119b50aeec8e0696e0265c49dfe904683a8f6aaa445ba91f0a883fbe090d1", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/mobile_screen_share.xml", + "upstreamIcon": "mobile_screen_share", + "upstreamPath": "android/communication/mobile_screen_share/materialicons/black/res/drawable/baseline_mobile_screen_share_24.xml", + "upstreamSha256": "57bf3c8ab88aea9e6c36cbbde208aa117acb7f0ac9fbd7cba7763d9cdc0300f4", + "localSha256": "8b595956c0e9fb52134e19a980b6eef1057593735e4ead1cfb823b2207833712", + "orderedPathDataSha256": "cac8786c68255ab83cb963ad4a2c96b3ddac78c87b7d90370508d907c4649aa7", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/mobiledata_off.xml", + "upstreamIcon": "mobiledata_off", + "upstreamPath": "android/device/mobiledata_off/materialicons/black/res/drawable/baseline_mobiledata_off_24.xml", + "upstreamSha256": "64a2d9816dbb8868a733c766ec46626e83f572b1128c78cfb802e4f17e068660", + "localSha256": "bf341862b80a4cb8c9da5a083fe3e45385bdc9cd8bea53922bbc39ab99d8ae74", + "orderedPathDataSha256": "5b892bce8fc72815a4349cd93ad0b7ea9c236e8e342b5b30ce7a283f84afa2d3", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/mode_comment.xml", + "upstreamIcon": "mode_comment", + "upstreamPath": "android/editor/mode_comment/materialicons/black/res/drawable/baseline_mode_comment_24.xml", + "upstreamSha256": "7eb18ff54f7a7790d5faca80954c5213fd7916fa32a72604d82a2228ae4fe41f", + "localSha256": "2406d2f11f1b5ed2231cbee8f5e20018f641a5b6c961de133572204834e7c923", + "orderedPathDataSha256": "0f71bbcb92b25f90825fc9ee9161dd788adacf694df75ef712cdf7864846ed4e", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/mode_edit_outline.xml", + "upstreamIcon": "mode_edit_outline", + "upstreamPath": "android/editor/mode_edit_outline/materialicons/black/res/drawable/baseline_mode_edit_outline_24.xml", + "upstreamSha256": "782028542fe144af6d32ffeda08744fb8b4c49174d2f92974390bfe692fbc26a", + "localSha256": "35d367b11f96731a140e2a75f16f1269a6e3d07e5a7f5c72f17ecaba5f907e95", + "orderedPathDataSha256": "d0db66798cafcf5f8783373260c68231b32e3dd56c78324f91d32b6606ce53b0", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/mode_edit.xml", + "upstreamIcon": "mode_edit", + "upstreamPath": "android/editor/mode_edit/materialicons/black/res/drawable/baseline_mode_edit_24.xml", + "upstreamSha256": "6dafcab0f0efe423057c0e888e5289f4afcd71398160b80d590b79e4ea8c9a15", + "localSha256": "d49ca25e0f6a8cf187365ab78c49a0e168d63b804b55eaf2c2461f6d1a3a6577", + "orderedPathDataSha256": "07dde6bfc5cde03816252478751d2f87cfce698223b50bc351eab71d7fa19502", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/mode_fan_off.xml", + "upstreamIcon": "mode_fan_off", + "upstreamPath": "android/home/mode_fan_off/materialicons/black/res/drawable/baseline_mode_fan_off_24.xml", + "upstreamSha256": "44109721045d4e98ac7e821bf5b18de36050227ea1148752de6e23d9faaa85ea", + "localSha256": "cce51cc3258df20a00ec5e7666b0befbed13ae937a2378e6e6c7ae4f7f436524", + "orderedPathDataSha256": "a5ffd1e2be6418d8c9b32064c3f328cf84db98aa32a0f79e8785ed328d1811e5", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/mode_night.xml", + "upstreamIcon": "mode_night", + "upstreamPath": "android/device/mode_night/materialicons/black/res/drawable/baseline_mode_night_24.xml", + "upstreamSha256": "ac8ac8c58731086e4ddbbed6444ca685a82aaa1539d74f4a7644b17899cd5167", + "localSha256": "465ba6e19eec0796c3bc575171d538318fb1cfd6703d44dc38129f55e1882b40", + "orderedPathDataSha256": "2e738c9de8bc8755ae3a916a92c6ceed75c540e53ed899032b4dd35163ec9042", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/mode_of_travel.xml", + "upstreamIcon": "mode_of_travel", + "upstreamPath": "android/maps/mode_of_travel/materialicons/black/res/drawable/baseline_mode_of_travel_24.xml", + "upstreamSha256": "cd8cd19e620c45943b0128105234efeb400902436e707e0a91aa635337df01d3", + "localSha256": "db12a81c5cb6de44251f6c1d562b1cb34eecae752edf078cc7ed92296b605b50", + "orderedPathDataSha256": "dc325eb73a09de3dcf96c79bbaa538ebcf16180d59e98ee56f4e4058b965ac11", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/mode_standby.xml", + "upstreamIcon": "mode_standby", + "upstreamPath": "android/device/mode_standby/materialicons/black/res/drawable/baseline_mode_standby_24.xml", + "upstreamSha256": "28cdc446afadead2a8ffffc9ad8fde4b4c5200ef8764d5043628933ed86cb032", + "localSha256": "a0bdaf67d884d15497c49625debe52348a51000b57bc320bedb5efe5bd4b9000", + "orderedPathDataSha256": "d1224900cce80f1a80799015c6ace3b09e70a565caf4e16e32772a216d6c27b6", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/mode.xml", + "upstreamIcon": "mode", + "upstreamPath": "android/editor/mode/materialicons/black/res/drawable/baseline_mode_24.xml", + "upstreamSha256": "782028542fe144af6d32ffeda08744fb8b4c49174d2f92974390bfe692fbc26a", + "localSha256": "3f2a69291d4c21193d429fa7b5dd53bb5596494676e779a0714bb4392ada2499", + "orderedPathDataSha256": "d0db66798cafcf5f8783373260c68231b32e3dd56c78324f91d32b6606ce53b0", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/model_training.xml", + "upstreamIcon": "model_training", + "upstreamPath": "android/action/model_training/materialicons/black/res/drawable/baseline_model_training_24.xml", + "upstreamSha256": "8fcbaab7fa1d0333fcaae36ff4288533da857f494b3d67b751a590cc1a1dc61d", + "localSha256": "4a7389bd8b90eefb064b2a95740dc3d4cfa8d333e68243cefe9f353e8c74a439", + "orderedPathDataSha256": "40d7e3d4544b1fcd58bcc47caec4a7b78c85fb98b2ba7448f2b4e8199cb1cef2", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/monetization_on.xml", + "upstreamIcon": "monetization_on", + "upstreamPath": "android/editor/monetization_on/materialicons/black/res/drawable/baseline_monetization_on_24.xml", + "upstreamSha256": "3160766f65d217a8a3461e91e5cc24b55804afa798c7004ee47dfb4641d14d52", + "localSha256": "e070ac5da8a6d758e7e3f15aa417965f02b3eab3086848f8e75d2d30cb4d7fdb", + "orderedPathDataSha256": "c928b7d44b0e6ffc263a83c14c37ffdf6b75142199c1df954748d468c65f02cd", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/money_off_csred.xml", + "upstreamIcon": "money_off_csred", + "upstreamPath": "android/editor/money_off_csred/materialicons/black/res/drawable/baseline_money_off_csred_24.xml", + "upstreamSha256": "dd117d43c9339f4eeb43841f1d276d7eee4ed148b2345433cc38795c8f941296", + "localSha256": "0ae6b21f5ee0b2bdb9187ab3706c879ff55240caecc8d47168ee93a270aa088e", + "orderedPathDataSha256": "0057203a7412df8c52a1e3accb6b5d89d8e55ab7dc0102b70d61dc392ee41331", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/money_off.xml", + "upstreamIcon": "money_off", + "upstreamPath": "android/editor/money_off/materialicons/black/res/drawable/baseline_money_off_24.xml", + "upstreamSha256": "9a217eadeb6f077e1c2713e6e915781a0f40115ae0bbdebe4f73e66740182465", + "localSha256": "a26bfd0b4fd153e558720774c500fb8c9ee9e40fe941cc13cbaadcd29179c2e4", + "orderedPathDataSha256": "9b9fe4b95805dcbc6b62d5676c32f7f5fcad375978c5167d21f5953429811d9d", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/money.xml", + "upstreamIcon": "money", + "upstreamPath": "android/maps/money/materialicons/black/res/drawable/baseline_money_24.xml", + "upstreamSha256": "55a1ab3e01b73dfef28c45672731004ac78399757b09dc20c673b25e42153e25", + "localSha256": "abc179721cb49918c31944741a9adccb64a4c644661dbf449b30fc7a0a0e1369", + "orderedPathDataSha256": "bdc129101a0455d6ee6d29ccbecd92e74ee27665ae5daa620d7e57ad1facb3f2", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/monitor_heart.xml", + "upstreamIcon": "monitor_heart", + "upstreamPath": "android/device/monitor_heart/materialicons/black/res/drawable/baseline_monitor_heart_24.xml", + "upstreamSha256": "d4bfaaa4232688366c7d5d50af3ef5b0be0b27f9689bd1114cfbacf01441e48c", + "localSha256": "34829b88b9403eaa3bfb5612b275a6c5211a8640409260ba752f9d6ad5ad3e60", + "orderedPathDataSha256": "dd9065f2c05b804e3d3ffc84058a3d9fc16a60e3490760f3b383fb550bedcae7", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/monitor_weight.xml", + "upstreamIcon": "monitor_weight", + "upstreamPath": "android/device/monitor_weight/materialicons/black/res/drawable/baseline_monitor_weight_24.xml", + "upstreamSha256": "059ef458a776b2f27ed5ea5bf309a5dc14cbe321bbfde3937ecd989fc65997ae", + "localSha256": "aac6b2bf55bcd307897199a9a7a4297db6ac38558d5bdc3391ecc2e6ad9c6d53", + "orderedPathDataSha256": "4a00ba01925cdb3bfce208fe761526c1bf2783ae7cb6c4e80ade857bac9d2004", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/monitor.xml", + "upstreamIcon": "monitor", + "upstreamPath": "android/hardware/monitor/materialicons/black/res/drawable/baseline_monitor_24.xml", + "upstreamSha256": "bb37816f71eb536e3a99640b7936e968e7e8145c851c9f47b834d464ab5edfc6", + "localSha256": "3d8bebe3fc3c6c3a9b8b86388284569882b995307097efd172b9e7775e4cf3fd", + "orderedPathDataSha256": "5a1fb2a00baf385b7263091dfe15fba52838657b33d968ab4ecced598da54637", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/monochrome_photos.xml", + "upstreamIcon": "monochrome_photos", + "upstreamPath": "android/image/monochrome_photos/materialicons/black/res/drawable/baseline_monochrome_photos_24.xml", + "upstreamSha256": "4afea9fb1e7d16e93a62bfd34d5580afb66df4bf9f5d3f1473ed1c2e261addda", + "localSha256": "137c209aed1ffbb49e472d2310db43accba1d8ac7cf1286b5cdc9a8c6f046084", + "orderedPathDataSha256": "bf0caf6a8b7944a2083ba0408d9520c5083e5e93ded7836f4ff29a7ed3326f7d", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/mood_bad.xml", + "upstreamIcon": "mood_bad", + "upstreamPath": "android/social/mood_bad/materialicons/black/res/drawable/baseline_mood_bad_24.xml", + "upstreamSha256": "02332ec1e6a7c25a35f0fda24bc4cb743d7a964b1f066ef1e0bfec82873ed7bd", + "localSha256": "f7c5727c6b117e3073ad3626ad3d1e4fa8b2e8b3c1df2a332d68267c541225c9", + "orderedPathDataSha256": "bf419c5102ed68601fa10ce3a5aa81a4cd971053d671a5ef50dce0e55c398b1d", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/mood.xml", + "upstreamIcon": "mood", + "upstreamPath": "android/social/mood/materialicons/black/res/drawable/baseline_mood_24.xml", + "upstreamSha256": "a4ccc0e5580fdf0d99e9b33700d20e10d42c48f65439b12d1542898b26c4fa97", + "localSha256": "df3977f4a5d2fe5c6014e8c8c757269f4f909883c7b4af3c2d43de80c53c5a5d", + "orderedPathDataSha256": "5cc262b82e4615258d7d7c6e6f76bdb85c351d9a2ac223886ca63ef3a2b70344", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/moped.xml", + "upstreamIcon": "moped", + "upstreamPath": "android/maps/moped/materialicons/black/res/drawable/baseline_moped_24.xml", + "upstreamSha256": "3d5911c857d5a257bf452ca153a3112caa60ddfc3b3ec431e36a4882ff425bf3", + "localSha256": "6be5fc53661080d485acad5657de3376fcf5faf071a16f36462c13a7f87acd4b", + "orderedPathDataSha256": "a9e7c4566f8890a4609027fddd03efb0d7421e95103353b4607e32548e544181", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/more_horiz.xml", + "upstreamIcon": "more_horiz", + "upstreamPath": "android/navigation/more_horiz/materialicons/black/res/drawable/baseline_more_horiz_24.xml", + "upstreamSha256": "c8e566f00ea93bb76e3d4d2c0f39253dd5ce811dcd3a8bcb30f81c2a5b323022", + "localSha256": "c66735c8510ef976eb136976b723e6522bcd3d7fdfc4b6ba0f9490a260c67588", + "orderedPathDataSha256": "7ac9ead29a8dd526533124c8e11d22554b7c15f23b646a0cf97c22873defdad3", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/more_time.xml", + "upstreamIcon": "more_time", + "upstreamPath": "android/communication/more_time/materialicons/black/res/drawable/baseline_more_time_24.xml", + "upstreamSha256": "b8335fde62d13bf4c56212519fd6e83b4aebfd1fd66ba93c4524aec96ec9cc2b", + "localSha256": "605f43ff2a785d6b9f28c52c9a3586d9ba911a17712f810e0a47dc9f5606b6ec", + "orderedPathDataSha256": "642b9476430c337ff4a1a76ced7169916c99de35bd924908696ec8a0e48fa4d7", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/more_vert.xml", + "upstreamIcon": "more_vert", + "upstreamPath": "android/navigation/more_vert/materialicons/black/res/drawable/baseline_more_vert_24.xml", + "upstreamSha256": "94be369f6fd110d81635630bc67d82d35f42ec581a25435fa33b340a114e3c82", + "localSha256": "bf7bd7e5e3888e623b1fc1417054ba26bb123a6d32befc5545785d8534f1d677", + "orderedPathDataSha256": "548a5d1875dafb8308254a9cdb3b85ccede6cad4f7f1054e59934e66e54e732b", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/more.xml", + "upstreamIcon": "more", + "upstreamPath": "android/notification/more/materialicons/black/res/drawable/baseline_more_24.xml", + "upstreamSha256": "2c0e24950a6e1a72c5ec08794e0aa42cd8c83be46ecb30f5609ec4a957ad4580", + "localSha256": "9731f0a82a02c7c9ffa4353e098fb7c46b2675251857e3004317373fcf539f33", + "orderedPathDataSha256": "d0219ba4913d8afab01b96880953b0e4d2d84a2f361e4311f5943c3e8cb5851e", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/mosque.xml", + "upstreamIcon": "mosque", + "upstreamPath": "android/maps/mosque/materialicons/black/res/drawable/baseline_mosque_24.xml", + "upstreamSha256": "975358e2bbe2d3e9c644b85332dd3efcaa0e6982adc15b5e3a222fd6101ff80e", + "localSha256": "012d30ed6c68461e082438ab4acab4eae89e90413c722f587ab9970dda6c91d2", + "orderedPathDataSha256": "3d00c847eff085b41aeec1daad65cafedeb741b08e9e85175b5788b2bbbb07ca", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/motion_photos_auto.xml", + "upstreamIcon": "motion_photos_auto", + "upstreamPath": "android/image/motion_photos_auto/materialicons/black/res/drawable/baseline_motion_photos_auto_24.xml", + "upstreamSha256": "907d3fbc5ead45c36089b129ac5c9e5b5d8991fa31d1fbe3bd9f263e355516d0", + "localSha256": "9382cbdef883274de4365549e64757fffafa3cd401107d217b427ea6ea933d85", + "orderedPathDataSha256": "750f63a146055d998101d18feed51714b8faf3c6966ce694e1a8209fe693e259", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/motion_photos_off.xml", + "upstreamIcon": "motion_photos_off", + "upstreamPath": "android/image/motion_photos_off/materialicons/black/res/drawable/baseline_motion_photos_off_24.xml", + "upstreamSha256": "1701dec5005f40971afc38b646e0097a3a3929fe9cc9a2e4ee912632fe1249a0", + "localSha256": "f23651855dadc6b80c28403723997e58ce9d15453227b6d1d229bef731db7b18", + "orderedPathDataSha256": "d60828ec71bb93dfe6e868f7acd705a8ca5cf80f97e867dcf01b1b38c39d9ec8", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/motion_photos_on.xml", + "upstreamIcon": "motion_photos_on", + "upstreamPath": "android/image/motion_photos_on/materialicons/black/res/drawable/baseline_motion_photos_on_24.xml", + "upstreamSha256": "9d058b8c3e27fdce48c66949318a5dd3d022474ed590a7a6f20dec65ed9460a0", + "localSha256": "e447db098ebc7b0162017273c5665e4312213e79b7ed9a850033116ef48d2792", + "orderedPathDataSha256": "bb31c1be933d719682e1d4e3da3b210138847276a7b8db80b8101a9f19c7b83f", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/motion_photos_pause.xml", + "upstreamIcon": "motion_photos_pause", + "upstreamPath": "android/image/motion_photos_pause/materialicons/black/res/drawable/baseline_motion_photos_pause_24.xml", + "upstreamSha256": "417a596ee516925864452d05e58ddacfe8a1f0b9d94552c8deae388e0b8e171f", + "localSha256": "32b2f9e3e1b16ceea2b52a6246f0222516de2bbb25cb47b796576e71d0c8a42f", + "orderedPathDataSha256": "f547e08953ae633a1e929a06a5def72a3065eb251e1da8575e3de76df9a8472e", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/motion_photos_paused.xml", + "upstreamIcon": "motion_photos_paused", + "upstreamPath": "android/image/motion_photos_paused/materialicons/black/res/drawable/baseline_motion_photos_paused_24.xml", + "upstreamSha256": "e3cfe2efd1ea09e00bacc596b8624cd73c6b5374fd26d5281d371188432561af", + "localSha256": "9457397e8ade2b44b81c55c201039a58d2be14dd33ce7af239b4e02e72406289", + "orderedPathDataSha256": "70d2706faf771c91fd53e427c75e2afc901dc2a21516c9e2d5775773fea212ed", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/mouse.xml", + "upstreamIcon": "mouse", + "upstreamPath": "android/hardware/mouse/materialicons/black/res/drawable/baseline_mouse_24.xml", + "upstreamSha256": "e24d788c257d2164292e1ca0b7981400edd0106df5afc14aaf860d879a58341f", + "localSha256": "d3b60e462ab09000744922381166bac8ee3598c31e2d356370366d5c3d0629dc", + "orderedPathDataSha256": "659d2840338a79551fe50cf0a2ac22df6e5e52d32d98bd296f0b0ff283edbc5c", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/move_down.xml", + "upstreamIcon": "move_down", + "upstreamPath": "android/editor/move_down/materialicons/black/res/drawable/baseline_move_down_24.xml", + "upstreamSha256": "ac23d4bc2f77c9d4167e1b4be2b3d954bc73f989c3d4f0e247213bc64ecaf12a", + "localSha256": "819f7c42ee3fb207149abb7344795937fd0d15de87ed6a9ac28aec033db97661", + "orderedPathDataSha256": "86c3cdb77886782bea937ee32e78135908006c50749f2f4de5d70c96e7932924", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/move_to_inbox.xml", + "upstreamIcon": "move_to_inbox", + "upstreamPath": "android/content/move_to_inbox/materialicons/black/res/drawable/baseline_move_to_inbox_24.xml", + "upstreamSha256": "e370549ca3037432cabfad16deadf66cda7a9f6ccb68dcb699c9108d132f37ce", + "localSha256": "f1f4ff593ce85da5c18c48b4ed78978ab63978be6154c464e29524b5f245f56d", + "orderedPathDataSha256": "8a84df1a3a433599ce706b689bf27ad2667358bbdb4adab917d8ac95637fb775", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/move_up.xml", + "upstreamIcon": "move_up", + "upstreamPath": "android/editor/move_up/materialicons/black/res/drawable/baseline_move_up_24.xml", + "upstreamSha256": "29b604939fb277ac5e08572bfaca34c1c3710d7495cfcac972d21fd7e857430e", + "localSha256": "dd0b93ff9b8e277149dd91dd2911a9b00dced736d2a86e79d4a6899e97ca777d", + "orderedPathDataSha256": "02807fa6516ebeb30c0052f164b753fdbd062f935aa85a608418ce4201b95b21", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/movie_creation.xml", + "upstreamIcon": "movie_creation", + "upstreamPath": "android/image/movie_creation/materialicons/black/res/drawable/baseline_movie_creation_24.xml", + "upstreamSha256": "61e9b1ddaf11036ad87796363c9af3befd1f96d58c19a723c81cb095455f3e8a", + "localSha256": "309d0faffa6c221ca342fe34d8fb6cb3be327676e1a99a32b0e62a9513565c9d", + "orderedPathDataSha256": "f93e3856abca6c56c0cd51a7d847a2d37258d4ce808e042749640eaa922ab875", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/movie_edit.xml", + "upstreamIcon": "movie_edit", + "upstreamPath": "android/av/movie_edit/materialicons/black/res/drawable/baseline_movie_edit_24.xml", + "upstreamSha256": "ed08bf6d1fa697fcd303fcd3992072fb9db4f60e678a76be52dde0c5d52762a7", + "localSha256": "799594dea907f3af46e4bb915b2a2ce86a955cb6d7ef2c85b287764ce69c91ac", + "orderedPathDataSha256": "c689f2d790fa3e812ed6f4fe3fc8da8d03e878be10ea5d597d63051dbd818ab6", + "originalGeometryMatched": false, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/movie_filter.xml", + "upstreamIcon": "movie_filter", + "upstreamPath": "android/image/movie_filter/materialicons/black/res/drawable/baseline_movie_filter_24.xml", + "upstreamSha256": "b38eb441015d1ce4a1c9a1c1f16cbe7f384ea06a9933d47b3dc2c8f05226b25a", + "localSha256": "e8be6d53f6c5a8f0d0ce35f338f8bdfbba9aa7c8e00e30cd007e3c2a771ca944", + "orderedPathDataSha256": "45c49a0959ddfd7a73f0e31d4ab7413d78d970c760d5f942884403d9e074a835", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/movie.xml", + "upstreamIcon": "movie", + "upstreamPath": "android/av/movie/materialicons/black/res/drawable/baseline_movie_24.xml", + "upstreamSha256": "61e9b1ddaf11036ad87796363c9af3befd1f96d58c19a723c81cb095455f3e8a", + "localSha256": "14f303b325d06263d33316d90fc443ada8f266f25e6d05d2b9d8a743ff36ce9c", + "orderedPathDataSha256": "f93e3856abca6c56c0cd51a7d847a2d37258d4ce808e042749640eaa922ab875", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/moving.xml", + "upstreamIcon": "moving", + "upstreamPath": "android/maps/moving/materialicons/black/res/drawable/baseline_moving_24.xml", + "upstreamSha256": "7437b06ce5a07271d9f8238bde3d5e416fd8a5bf0985074918ef1443fcf2ca39", + "localSha256": "4cefdea7dd285e5c3f3d4bcc2a32a41a6cf1e0061780fee7fdeec815e1b94cdc", + "orderedPathDataSha256": "6b11245b00280e5320957938d7955a1ca3f8ce3c14a386f2439027c78d77b86b", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/mp.xml", + "upstreamIcon": "mp", + "upstreamPath": "android/image/mp/materialicons/black/res/drawable/baseline_mp_24.xml", + "upstreamSha256": "191a2dca8fe529e0e01f1d44d5748954e902790cf476efed4446eee48bc7d6cc", + "localSha256": "9cf5b62a237ffa5780bdd41fc0fcc146fa22ba6e82e385763fac3b06531247b6", + "orderedPathDataSha256": "32e6798b559f45f3dbc6645f343b239ed75044fb10384b428132ecea76ea7b66", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/multiline_chart.xml", + "upstreamIcon": "multiline_chart", + "upstreamPath": "android/editor/multiline_chart/materialicons/black/res/drawable/baseline_multiline_chart_24.xml", + "upstreamSha256": "9600a5f5807244462b64032c68a8f9788987ebaff86eefb1cb603fb377f5d61f", + "localSha256": "2e0ade0b98eb72f6d345364d21e189c26f384bf654155b73cc76ed4b794a91c1", + "orderedPathDataSha256": "8081df0860cf0c6170b3bbb26f85bfe173507f8a39b9115d6fac16cea700d2ec", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/multiple_stop.xml", + "upstreamIcon": "multiple_stop", + "upstreamPath": "android/maps/multiple_stop/materialicons/black/res/drawable/baseline_multiple_stop_24.xml", + "upstreamSha256": "4a8d51375cdb81d5286d95febd1652eb5ddc29cd4eb2abd55320722ab17bb6e0", + "localSha256": "954ff7a8cea774dc7b6e3adef285304d78f090224638472ce9c5653df2c29cb6", + "orderedPathDataSha256": "e45cd7c2a2cacba738ab87013e8cb8cf61ed00cc38d8acb58063fcce4224359b", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/museum.xml", + "upstreamIcon": "museum", + "upstreamPath": "android/maps/museum/materialicons/black/res/drawable/baseline_museum_24.xml", + "upstreamSha256": "b097824a35063634e5fb1d7a88c848d9d9d4bead971b00225c548bbadd1b76cd", + "localSha256": "4251c363d3aafa12d60ade6800c5747e5317e85bd5c98a827f92c1425371d115", + "orderedPathDataSha256": "eea298c25107ed7b1bb1e1d2faa060c63c5f23380e436e526c59e3835aa20d31", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/music_note.xml", + "upstreamIcon": "music_note", + "upstreamPath": "android/image/music_note/materialicons/black/res/drawable/baseline_music_note_24.xml", + "upstreamSha256": "93a4dc8cc876da6da761d0b2bf98fb183cf40e6de5827e0ef6720e96071e5436", + "localSha256": "d342c8dc7b2ae53c2c516f4e50f318d0889228da6c8a4029f14aa4115547b730", + "orderedPathDataSha256": "ba15eb922c8bf12c86bb63b8f616fc077078efcc6cae59a8d0f11aecc1607832", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/music_off.xml", + "upstreamIcon": "music_off", + "upstreamPath": "android/image/music_off/materialicons/black/res/drawable/baseline_music_off_24.xml", + "upstreamSha256": "a16f68d525752135af840143d0e647c94bc8e407c67ddbee019ab493077e1a34", + "localSha256": "11fc6aeb266e77dd435f9f070532bdd7952aa5b86cd90bde03a9f32b05171cb2", + "orderedPathDataSha256": "b6baa18c33f33a71037c67185953f262e34b60f75e5f8ccda6b6083d812e905d", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/music_video.xml", + "upstreamIcon": "music_video", + "upstreamPath": "android/av/music_video/materialicons/black/res/drawable/baseline_music_video_24.xml", + "upstreamSha256": "4251b8eeca21cc7c24005e8e4d387a1e68a671d819ca79e9b72179a40aea5aad", + "localSha256": "4b6cb82b5ec54415922695f784223e95820c72bebd2bd9e870290292c2acead1", + "orderedPathDataSha256": "bb9a4b56928e5a41dcfee35683118f7c19abfdedd68cd44c94f8fee86b993849", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/my_location.xml", + "upstreamIcon": "my_location", + "upstreamPath": "android/maps/my_location/materialicons/black/res/drawable/baseline_my_location_24.xml", + "upstreamSha256": "062d0b9b651cdbe31bb60f834178f705a5f496a27d22e20c1b138a86ddc87667", + "localSha256": "a2f5e99229b502b0b7b32ab420fcb1253e33e85eb990ea5307b171e4624992b9", + "orderedPathDataSha256": "b9ad8d468f6154a2fd642a6527f2138bc5235ccbec24ec2a78f17b1b550981b9", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/nat.xml", + "upstreamIcon": "nat", + "upstreamPath": "android/communication/nat/materialicons/black/res/drawable/baseline_nat_24.xml", + "upstreamSha256": "395db0213cfa71fb76b409c6b6e162d0e09f612b34c3647fb7204cf62cea7a09", + "localSha256": "090f3f6f54e76dbbe0f5a16cddc1bfd89c6be79fdeb37b561c6e35f1f9560ced", + "orderedPathDataSha256": "c8bbdf4d2432cbd5b749026e2a75f0716eeac613b5ba6d43501a1ba294dd3b65", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/nature_people.xml", + "upstreamIcon": "nature_people", + "upstreamPath": "android/image/nature_people/materialicons/black/res/drawable/baseline_nature_people_24.xml", + "upstreamSha256": "31b54b067d7d04cc9266210bf70b8ed5dc3febf6a5d4aa02c7f82b49fce0c237", + "localSha256": "6c6be8e0a9e269966886760d8985332533cbb88f0d7948ac268f007db36c571e", + "orderedPathDataSha256": "ebf9b798ad729bf6b5c27b59b1b6bb09a96d82e17bbd2ad07d8978362236f466", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/nature.xml", + "upstreamIcon": "nature", + "upstreamPath": "android/image/nature/materialicons/black/res/drawable/baseline_nature_24.xml", + "upstreamSha256": "5c521e62b4196442f033cf7441346c4538510627e024307bc980716f5e9496b7", + "localSha256": "cc3c4ba27b28e1235e1cd52a39370597c069f33743b5b349ad5800fa009a2125", + "orderedPathDataSha256": "effcd506d842dfaa11cb62c7ce25cec97f4f10514d30280f5b258318c46ad220", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/navigate_before.xml", + "upstreamIcon": "navigate_before", + "upstreamPath": "android/image/navigate_before/materialicons/black/res/drawable/baseline_navigate_before_24.xml", + "upstreamSha256": "2c17edebd996a1543e4753bebc51613df7f5c863dd899a2c4eb744db22b757da", + "localSha256": "b71c5e0409eed15a725b7144c5de7afe65e3861191ae928400bcea1407064e8c", + "orderedPathDataSha256": "6362814502f3cebc12db1db023d53fa2ab235b85dbd9c6b1d50e4c226ba3b80a", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/navigate_next.xml", + "upstreamIcon": "navigate_next", + "upstreamPath": "android/image/navigate_next/materialicons/black/res/drawable/baseline_navigate_next_24.xml", + "upstreamSha256": "befb82b8912e7208ddd07afcc8dc047eca2e80764221e9743e2384314dbd1a5a", + "localSha256": "a05453877cd7de8a0d0547164b3c7940e8d5afd3f5c81ae2fd820c690af9f516", + "orderedPathDataSha256": "25db7c5772252a6fafae5f7d0a79d4c93cd78089e53c0146b9f89b47b55f5747", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/navigation.xml", + "upstreamIcon": "navigation", + "upstreamPath": "android/maps/navigation/materialicons/black/res/drawable/baseline_navigation_24.xml", + "upstreamSha256": "fcc0e7b0856a887d1793fe69366bd63f65c189b2b4ab31e6c11535c0f342f642", + "localSha256": "f37a6b8fc9851cbca514925933933aca6d9f3384bbb8cbdf6576e0f0a4d6b1b3", + "orderedPathDataSha256": "03df8c8b68508847f888d36fa4cdc43d076582d14fac638e2acace561eb0db66", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/near_me_disabled.xml", + "upstreamIcon": "near_me_disabled", + "upstreamPath": "android/maps/near_me_disabled/materialicons/black/res/drawable/baseline_near_me_disabled_24.xml", + "upstreamSha256": "6c7a4370a6ac388c497e15f9dec3aa09f04d4cc33b3f8d9487a3c3bc0be58184", + "localSha256": "a6bafa4e99f1eba288eaa910c2052eb3458df0747ed0cc7ff06a2cd92224ed3d", + "orderedPathDataSha256": "590c507ba24c1ceabf509a48b1c07a5e34c875d6572046d4a5f9ee02cbd1024e", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/near_me.xml", + "upstreamIcon": "near_me", + "upstreamPath": "android/maps/near_me/materialicons/black/res/drawable/baseline_near_me_24.xml", + "upstreamSha256": "fdf10bb13e2a8990f736f85fbbf4ed8a04b6aa1be0a7ec307edac261c362542e", + "localSha256": "6800a753592aae856d7c6a555beedd951f815b11becf0fa2014c1bda52b009a5", + "orderedPathDataSha256": "ee1e091ea52e2877682fdb68f09510298614d3ea21cd5de524c2fe99f115970c", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/nearby_error.xml", + "upstreamIcon": "nearby_error", + "upstreamPath": "android/device/nearby_error/materialicons/black/res/drawable/baseline_nearby_error_24.xml", + "upstreamSha256": "208c4bf7098a851fbe8c3cdb2baf495ef3274c265e6a57cdd00ed4688561600c", + "localSha256": "ffbc2cf5657fcdb51127a62501252c8e433a4bc6e32b5a07a3abc765e18aec3e", + "orderedPathDataSha256": "4ab1528c761140ccc8da1f81d78be727ca977e22044a8c37bf676fe7dfbdc42c", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/nearby_off.xml", + "upstreamIcon": "nearby_off", + "upstreamPath": "android/device/nearby_off/materialicons/black/res/drawable/baseline_nearby_off_24.xml", + "upstreamSha256": "3a817b66c53da8cd6a83134135fbd3270f57bf71aed9cb3570ff40a46044d18a", + "localSha256": "84c2ffd02f9e202b01d3ada29ceb5b725e81ebe6b56459f2e4890fc06d7fc85f", + "orderedPathDataSha256": "8a132b4807d66cbca7190eafd07647832d6ed42dd3b44099a0b4515daf03f332", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/nest_cam_wired_stand.xml", + "upstreamIcon": "nest_cam_wired_stand", + "upstreamPath": "android/home/nest_cam_wired_stand/materialicons/black/res/drawable/baseline_nest_cam_wired_stand_24.xml", + "upstreamSha256": "4492a6d11afcc61ad9bc7654ab756bd92d01460d20be3c482354fb6c3ecd8213", + "localSha256": "f54b87cd7319a97eedaaf7e5596e8bf2ee6403f372119104d3a242cb5f5624e2", + "orderedPathDataSha256": "9c6cd0f0ea960a3675c5d62b9e5c74df72410a50fa3cb3c1699d2be1115cf1a2", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/network_cell.xml", + "upstreamIcon": "network_cell", + "upstreamPath": "android/device/network_cell/materialicons/black/res/drawable/baseline_network_cell_24.xml", + "upstreamSha256": "0147e981a9e8d3c380eeb3401c0825a848c422572d6a0b647b9160999665b1e7", + "localSha256": "c6e237b9794b3c33c3e5a8a09091e06ffaf2aac752290e3e77f543ef599ba097", + "orderedPathDataSha256": "5ffc4bab968d3eeadb81d5d74bd64ab7e7b106d0c48d2bf2fc0e6f976e53eb2c", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/network_check.xml", + "upstreamIcon": "network_check", + "upstreamPath": "android/notification/network_check/materialicons/black/res/drawable/baseline_network_check_24.xml", + "upstreamSha256": "8955f94c18abce99dfa854fd6ee30690b83725a4bd510de2fc3abaeccd78b5d1", + "localSha256": "15068c716228c17a9734d77730f543ec84390195278d9aca5fcd4bc0d58cb789", + "orderedPathDataSha256": "24c99067e1dc25e7e34fd1d16b290abdf0e71282e93e07337a915003652b2225", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/network_locked.xml", + "upstreamIcon": "network_locked", + "upstreamPath": "android/notification/network_locked/materialicons/black/res/drawable/baseline_network_locked_24.xml", + "upstreamSha256": "42136208fdd9ef022822849e09492ba7de934c040efd443273524639782ef307", + "localSha256": "e3119376ef0f9c22f7e8ff1201c0a20c38316320b51558eec847afdc5d52425e", + "orderedPathDataSha256": "21bc9779d364e2b48d247ed0eb8188104fddb1e35f2382ecad76152b1d251331", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/network_ping.xml", + "upstreamIcon": "network_ping", + "upstreamPath": "android/action/network_ping/materialicons/black/res/drawable/baseline_network_ping_24.xml", + "upstreamSha256": "cb41da2bb06099396682bfc6d969d2003a645bc5ef6ef3a25eebcad7ef077c58", + "localSha256": "94bb274c2619a7eccaec9c933c4908d305838a4308ead3e6de00d2867b7ac1df", + "orderedPathDataSha256": "54c42e4e8b382d39b2c86be1b1db08c586cd9168546501154d9e957640c6ce7b", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/network_wifi_1_bar.xml", + "upstreamIcon": "network_wifi_1_bar", + "upstreamPath": "android/device/network_wifi_1_bar/materialicons/black/res/drawable/baseline_network_wifi_1_bar_24.xml", + "upstreamSha256": "5e58bf7d13bbb646edcb3a7a1285eb4c4ee85791e3043bacce6b260722d1b482", + "localSha256": "6f88a6c1f6f357248d8bcf707e1c5010d44a7c3ddcb9f1154468ce24a1f6df8d", + "orderedPathDataSha256": "343d48ae4af43f3abc1c5e7c2311f578b32afcac08d5b056763561829bc26bb7", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/network_wifi_2_bar.xml", + "upstreamIcon": "network_wifi_2_bar", + "upstreamPath": "android/device/network_wifi_2_bar/materialicons/black/res/drawable/baseline_network_wifi_2_bar_24.xml", + "upstreamSha256": "46f2c6219aa47b91e6c5033f4befad40ece2b09406721af1c5cb6d386472a118", + "localSha256": "564b35514da799ccdb05e812a4f002c009ea778e896bbe7b1507b455b3f37d39", + "orderedPathDataSha256": "4c207f268b262b15625db3065d9453d4bad5dcb5bce75eb7142bea47472669c4", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/network_wifi_3_bar.xml", + "upstreamIcon": "network_wifi_3_bar", + "upstreamPath": "android/device/network_wifi_3_bar/materialicons/black/res/drawable/baseline_network_wifi_3_bar_24.xml", + "upstreamSha256": "9bda432098bf8710f835b09dd427f1c497e1a9376cb44de9df14a0476496ed66", + "localSha256": "e5b6597805915c962b768440531f98243f0a6ca081dd78e466e38ed4c339e694", + "orderedPathDataSha256": "69aa1e87a3b32800d52fb0be510fbf8aee167bd30880d90e8bbfed354a298a34", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/network_wifi.xml", + "upstreamIcon": "network_wifi", + "upstreamPath": "android/device/network_wifi/materialicons/black/res/drawable/baseline_network_wifi_24.xml", + "upstreamSha256": "e9ade5bb340cb85dfecf587beb842bbf4e27eb14392e89386ec6459cde584e9e", + "localSha256": "c368a6ed7e59194ae2507e480ac2fd7076bc93930f9dfec8b99146ff2146e077", + "orderedPathDataSha256": "849b3e94c770679daf856a282d217bc0cac6915aa9a6029eeacaf3da4f8f95bb", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/new_label.xml", + "upstreamIcon": "new_label", + "upstreamPath": "android/action/new_label/materialicons/black/res/drawable/baseline_new_label_24.xml", + "upstreamSha256": "e94a3fc97ce3aa06b507f842d9dbac4208804aaa35f5b20c1df4ef3739179e07", + "localSha256": "3a257baa15ee0e95351a82bf68503444c5fcef800b1c43a58a65e4eb17e953aa", + "orderedPathDataSha256": "96674662e7035ab78b0ac4378d52d124afeeb5fbbf42c150c394d447844270e2", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/new_releases.xml", + "upstreamIcon": "new_releases", + "upstreamPath": "android/av/new_releases/materialicons/black/res/drawable/baseline_new_releases_24.xml", + "upstreamSha256": "c180b8e257f4bcd9a2c7fac248277bcce8185c00dbda62401226ba9bf11c5b31", + "localSha256": "ee240d41d1c6cb95381f8819b817cbc4e5fde70c02ba729765656e66274bf865", + "orderedPathDataSha256": "cdb59b43a4dd69c43c74da3c2886b0adbcde1162a810a850727bad024750c494", + "originalGeometryMatched": false, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/newspaper.xml", + "upstreamIcon": "newspaper", + "upstreamPath": "android/file/newspaper/materialicons/black/res/drawable/baseline_newspaper_24.xml", + "upstreamSha256": "7a469b712d5fb506f07dc3d527ec173efd5fe57d802c61d5b986166682ef51af", + "localSha256": "dda1738ff6ef6462f858cc97629b616fe1899f34e1b5fb66bf5af7cbbd13dc56", + "orderedPathDataSha256": "5656de422e997ed827acaa7018688e44e5aa4201cf883b86bd502a6b9e312ffb", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/next_plan.xml", + "upstreamIcon": "next_plan", + "upstreamPath": "android/action/next_plan/materialicons/black/res/drawable/baseline_next_plan_24.xml", + "upstreamSha256": "46141cdd1b26debf1f0dbf0e301c5feda8a7dcc8ecfa4fc5db3cc0bc13b18897", + "localSha256": "1cad1939fa8b957d988aff69de1a553e958ea3a99374c61f1af2086f7c9a5a3e", + "orderedPathDataSha256": "df69b05bc7697c295c768e5e478ee97bf6ae8f96463dfa3a0494f7de7e5a2dce", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/next_week.xml", + "upstreamIcon": "next_week", + "upstreamPath": "android/content/next_week/materialicons/black/res/drawable/baseline_next_week_24.xml", + "upstreamSha256": "0d8dd157633397cfc57dd1fbb6d6288f9690ecfba47d700793501f2baed5a709", + "localSha256": "5c3aa3596df06bb0748e5391b6356698f0551cbee39438aa9ca6c19bfc0a9345", + "orderedPathDataSha256": "e15e1f49da8d1de5df5c6bd7beda76aa7a85f6eacb9a2f5164973693abf90aba", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/nfc.xml", + "upstreamIcon": "nfc", + "upstreamPath": "android/device/nfc/materialicons/black/res/drawable/baseline_nfc_24.xml", + "upstreamSha256": "d1b51506c6aaca56672e7b05242769692fd2f20b4bc27a9d7aad36141d569811", + "localSha256": "956ce7444df5ffc64b0ba2ff9cc625a7742a13d6fd4396f21554fbfc222e417e", + "orderedPathDataSha256": "1a9debae13ee3041fe54ace5c8682681941a321b9dddbc12abc786fefbbd5989", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/night_shelter.xml", + "upstreamIcon": "night_shelter", + "upstreamPath": "android/places/night_shelter/materialicons/black/res/drawable/baseline_night_shelter_24.xml", + "upstreamSha256": "956ef4c27747a5fa949080ff9423604d002dab0151aadd8caf4bbc8fe8096ce4", + "localSha256": "73574ec8b4a4206b26988fd0548cf1abaedc7181eff0877d09956642299f5fc0", + "orderedPathDataSha256": "c09b5c934158076e8c9c18eb20e27793216d890013d1d6ef406f53a2fac6c1fa", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/nightlife.xml", + "upstreamIcon": "nightlife", + "upstreamPath": "android/maps/nightlife/materialicons/black/res/drawable/baseline_nightlife_24.xml", + "upstreamSha256": "4f97014e23b4efc41f2f821aab8e43105f7137ca2801f5a34bda18f86ed751ee", + "localSha256": "f072e4571a53b2ba0e53881d19b9b9f16ada14e75c00609c037469f6ebf79a3f", + "orderedPathDataSha256": "b4e58ea846df11bd763f2296497373e05736a656bebe55a120bca03071ebc0b0", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/nightlight_round.xml", + "upstreamIcon": "nightlight_round", + "upstreamPath": "android/action/nightlight_round/materialicons/black/res/drawable/baseline_nightlight_round_24.xml", + "upstreamSha256": "a7de74fe2fd8767e1861db61efeea892dc6d9b6d85468cb5eb0c9b51a5c5d03a", + "localSha256": "eb4fbea32aedf790839de5949596ff38f15fcef661539339c81fce57cb40d569", + "orderedPathDataSha256": "4578c532c81ce5f6b89d2752527118ba1e6dfbdad447f73e0fb6b21297391e08", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/nightlight.xml", + "upstreamIcon": "nightlight", + "upstreamPath": "android/device/nightlight/materialicons/black/res/drawable/baseline_nightlight_24.xml", + "upstreamSha256": "9a58b5c8d1c10b8fbd9a5efc13eb798ea7b4ca7de1fbb8ddc29a3aa45820b1b6", + "localSha256": "0681610316925ea47cb54a08b4eb96ccaff618da8b2eec1e894edc0eab1719c2", + "orderedPathDataSha256": "9b83006669149300d9b7bd13e5d96dcb238945459ed2764c2c4b01b5e935b099", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/nights_stay.xml", + "upstreamIcon": "nights_stay", + "upstreamPath": "android/social/nights_stay/materialicons/black/res/drawable/baseline_nights_stay_24.xml", + "upstreamSha256": "022e5b552476be1367dc9dcfdab365d691d98e4da41b45403505c0d372f3bb3d", + "localSha256": "a2e48de9473edcf4f8962e0aa544e8cad090e1a557782fca4b3dd2a410cd0626", + "orderedPathDataSha256": "5f1380217e1a5cb7fa502344262269ae39544211b42bcdde201fdec2e0be8552", + "originalGeometryMatched": false, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/no_accounts.xml", + "upstreamIcon": "no_accounts", + "upstreamPath": "android/action/no_accounts/materialicons/black/res/drawable/baseline_no_accounts_24.xml", + "upstreamSha256": "9a703ea4015764b9c137d34dc375d520579bf38758b2ec201f52b973ddc96cb6", + "localSha256": "679e54d59a8dab63d92a849f334164f962175585522afd0babed0cc4ae85554f", + "orderedPathDataSha256": "232bf670953c8ba8529b8e333d0155af36cb726746d762e19c4c2c2377eaf8c1", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/no_adult_content.xml", + "upstreamIcon": "no_adult_content", + "upstreamPath": "android/social/no_adult_content/materialicons/black/res/drawable/baseline_no_adult_content_24.xml", + "upstreamSha256": "66bb1c41ca6b4b8d9c1938e18570bf54d1dd0b967ec8c76ad0f1e536b93e85ec", + "localSha256": "090dfce8d3845a371956a67b24aee6be32cc9cf5d239a541bf863d55d7f4641e", + "orderedPathDataSha256": "96b91dd93062efa668085bea924c595b584ae5031e94dc01351c2f9472f0e83f", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/no_backpack.xml", + "upstreamIcon": "no_backpack", + "upstreamPath": "android/places/no_backpack/materialicons/black/res/drawable/baseline_no_backpack_24.xml", + "upstreamSha256": "82865008ab38a30f7b646202c30c71339656ff9e25c6cab8aba674f6c115d2ee", + "localSha256": "5dcdece102253a0c7cebcce3efd152a554375e623883672acbb2f56e8beee4c4", + "orderedPathDataSha256": "de71218cb7ef7e1529af585252d773dab2d78163ed1019e7493fba60953fab54", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/no_cell.xml", + "upstreamIcon": "no_cell", + "upstreamPath": "android/places/no_cell/materialicons/black/res/drawable/baseline_no_cell_24.xml", + "upstreamSha256": "297a52a31f455dfdd5b611dcfc00101d23cf7ddc9a174abaa503c7b6f790c6e4", + "localSha256": "4ee5357c901ede7c0d216d3f5820c6b219f7c0a1eb4acd56d287ab583afe84ed", + "orderedPathDataSha256": "3810fe1339098339ea933f6b28b885b310f4a9daa85167120baa18ff6fc32f1a", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/no_crash.xml", + "upstreamIcon": "no_crash", + "upstreamPath": "android/maps/no_crash/materialicons/black/res/drawable/baseline_no_crash_24.xml", + "upstreamSha256": "201039325f3697535a374dd0ddd9281d3615382712c1aa4fa75a69b25101707d", + "localSha256": "1610b7c5913a40e57acc7132035fe458f5101c132688f527797f381f129b4000", + "orderedPathDataSha256": "39650db3b6d34a5065d3bd09563bbfa2547f336d621a5f03861a2502ea59b950", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/no_drinks.xml", + "upstreamIcon": "no_drinks", + "upstreamPath": "android/places/no_drinks/materialicons/black/res/drawable/baseline_no_drinks_24.xml", + "upstreamSha256": "c35890669dec9e8358dc4dfc8597f38d0c533a5a3c61d1510cb8f0c762f8ce45", + "localSha256": "4c3d07e68bfb3597130cebeeb4e2b8e15f6da091e2027efc8be2ff3af69aeabf", + "orderedPathDataSha256": "183fbc2491ea8de38fdd20f4ef2cc9cab6f6199da318c61a312c9ab0de46be59", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/no_encryption_gmailerrorred.xml", + "upstreamIcon": "no_encryption_gmailerrorred", + "upstreamPath": "android/notification/no_encryption_gmailerrorred/materialicons/black/res/drawable/baseline_no_encryption_gmailerrorred_24.xml", + "upstreamSha256": "300699079185321099bc6d301fa9ed1ba36c61c2979a8c80c20a8054efdc9656", + "localSha256": "d0874d6afacf86f1ed5b0bfcbc5250a025ec52ce8c694f60350aa93536a32344", + "orderedPathDataSha256": "13e46173d2cd7e1d5e1024ba9237169c76b977f51ea47c24bcef6247f22bfe25", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/no_encryption.xml", + "upstreamIcon": "no_encryption", + "upstreamPath": "android/notification/no_encryption/materialicons/black/res/drawable/baseline_no_encryption_24.xml", + "upstreamSha256": "6c6cac64899b2701d81782021b27d900a07370e255f2a7ae84efac807acc8ba5", + "localSha256": "d4cbfb10d8055671786a6580014adfc10d5a04ffdc1414dee6dc336da2af5ab3", + "orderedPathDataSha256": "daa838609efcaf9d2222c43732a089bd73f25b10759251be0b60c2c161f1c0ec", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/no_flash.xml", + "upstreamIcon": "no_flash", + "upstreamPath": "android/places/no_flash/materialicons/black/res/drawable/baseline_no_flash_24.xml", + "upstreamSha256": "2ef27aeef42d94c648c554381c3ec8ef248cc9a531e2ee180b8bc59d78e13cf8", + "localSha256": "3a2211d820cfaaab7333704ce84783bfae158003f3672c4602aa3dcd44f2e9a8", + "orderedPathDataSha256": "73a2351504abf9fd9690e28ab614c1bb25755e7256c5d053d9f06013c75b2894", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/no_food.xml", + "upstreamIcon": "no_food", + "upstreamPath": "android/places/no_food/materialicons/black/res/drawable/baseline_no_food_24.xml", + "upstreamSha256": "ba9cb832fb072df1de709f4c43b5b2386a65aa0629304f97f10d70faebfbf05e", + "localSha256": "0a57bb0098d894b4c4435e91fd2b80680ae5fb1dc4f804574168affc040edd20", + "orderedPathDataSha256": "eabb624365aeaa75b8f2fb07ef850642d1da4b99f70d40e125d2bb60798b886d", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/no_luggage.xml", + "upstreamIcon": "no_luggage", + "upstreamPath": "android/social/no_luggage/materialicons/black/res/drawable/baseline_no_luggage_24.xml", + "upstreamSha256": "7188df9ef03f61a39ccda15faa8a636b079e02e817a8d0d585b217963b7046f9", + "localSha256": "3975755b461204f46744b3f0e5d054000f774415012e0e69cb52276cf7d7480f", + "orderedPathDataSha256": "0d319ab10e276a1bedc37f37d544db5574f46c538ddcf0e3a581a6276e65cf8b", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/no_meals_ouline.xml", + "upstreamIcon": "no_meals_ouline", + "upstreamPath": "android/maps/no_meals_ouline/materialicons/black/res/drawable/baseline_no_meals_ouline_24.xml", + "upstreamSha256": "52593194a650d5c366375043577e743d8b904d65915f9627c91475ed569a27f4", + "localSha256": "24db5e6ac9a83a94d91c3096dde729bf38c1a2c0c423ff240705847d8e92b603", + "orderedPathDataSha256": "84144386e210547c80440cd33099a253feb1d519ba4722b4c04a0ceb06375b57", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/no_meals.xml", + "upstreamIcon": "no_meals", + "upstreamPath": "android/maps/no_meals/materialicons/black/res/drawable/baseline_no_meals_24.xml", + "upstreamSha256": "52593194a650d5c366375043577e743d8b904d65915f9627c91475ed569a27f4", + "localSha256": "f72bb1a51b656fd6f95adb1a708cebf23b3034c247622b9bf8f50b9aa5513c05", + "orderedPathDataSha256": "84144386e210547c80440cd33099a253feb1d519ba4722b4c04a0ceb06375b57", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/no_meeting_room.xml", + "upstreamIcon": "no_meeting_room", + "upstreamPath": "android/places/no_meeting_room/materialicons/black/res/drawable/baseline_no_meeting_room_24.xml", + "upstreamSha256": "55c49f0bec188c5b2417071949814a068fdb0350828e082b2be9abba3c360f12", + "localSha256": "d4d94bd6e29d0b48392b3598bce37937d137e890ab539ae01a8a0e1626eb0bff", + "orderedPathDataSha256": "28b057a3f90d8e873bd71b6af5a026a19e9f065bfae68ccc40f01501779b5047", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/no_photography.xml", + "upstreamIcon": "no_photography", + "upstreamPath": "android/places/no_photography/materialicons/black/res/drawable/baseline_no_photography_24.xml", + "upstreamSha256": "fe3d977b8410caea8eb5f5d9ebb72696a72fe36e6ad96513346ef5fbfc70d6c5", + "localSha256": "16f3ae40e867aee1b806668d82e031a401a1ad44050d40d6125f1ce076ab5da8", + "orderedPathDataSha256": "144d92b58658893fc822d416ebdee5be03be1bac355a267e209f192fce59aa89", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/no_sim.xml", + "upstreamIcon": "no_sim", + "upstreamPath": "android/communication/no_sim/materialicons/black/res/drawable/baseline_no_sim_24.xml", + "upstreamSha256": "ca8609678d51624c7be871c7093221d5178409475fb43c09f4012561b581d7c6", + "localSha256": "fa6dc39f903461e8af0e0b923a649d13b8fe5c440f3089136f9eefa2f4c1fb6c", + "orderedPathDataSha256": "2ad31986d4a78e7d9a80c57d31b2d648f3c506e31c483a9b294bbdb2fce6cc40", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/no_stroller.xml", + "upstreamIcon": "no_stroller", + "upstreamPath": "android/places/no_stroller/materialicons/black/res/drawable/baseline_no_stroller_24.xml", + "upstreamSha256": "4f7899c2a5b85345546e4e12a30e705101eaacca82f7a9863c8f0609d9cf1c6f", + "localSha256": "61455b7cb5295ba6d9eba0de38ad6ee9ee09ce3137f193fbc6b4346263f924fe", + "orderedPathDataSha256": "5199e5656c180da3dc26d3a7631847a12e9e1acba34561a705b0c3987242537a", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/no_transfer.xml", + "upstreamIcon": "no_transfer", + "upstreamPath": "android/maps/no_transfer/materialicons/black/res/drawable/baseline_no_transfer_24.xml", + "upstreamSha256": "b4df4502046a734ccf4c5f0e45c95f0e39ff4a12044074113ca1698c530f7789", + "localSha256": "d933af2652db120ce2adeb3e7617b3a79f38d090a558474ffc5d60c563238e1f", + "orderedPathDataSha256": "7d61223798e93c374900c4d3bf0aa77eafffd2a92ffe82d25a3f9e73fdc78f11", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/noise_aware.xml", + "upstreamIcon": "noise_aware", + "upstreamPath": "android/action/noise_aware/materialicons/black/res/drawable/baseline_noise_aware_24.xml", + "upstreamSha256": "412c26c7173efd0bbce67d72f8a1b7d1672f460043d7b0662f51ba90b6d1d234", + "localSha256": "65b5d779e6cad32edfee676e699d8670e8bb86efbcafa858d0ce46acaff6b35d", + "orderedPathDataSha256": "d7dc2d4436e9b673220c60e4d7cbb3bdc74fb9dd5a5f27d49e0bb80610a9973d", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/noise_control_off.xml", + "upstreamIcon": "noise_control_off", + "upstreamPath": "android/action/noise_control_off/materialicons/black/res/drawable/baseline_noise_control_off_24.xml", + "upstreamSha256": "06bd1b4fe02530f073a6fbbe50d9e3b088014287d38bc2940f02f24b2caaae10", + "localSha256": "b8fb75d4a1f5a0ee9c7ea248f4d925e428cb9bd75f11035224b7e0b7ec70fb11", + "orderedPathDataSha256": "f3c5d52156ca4ccee34d56b526bbfc798dcd6de590f90b2633272dadf11b1ba3", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/nordic_walking.xml", + "upstreamIcon": "nordic_walking", + "upstreamPath": "android/social/nordic_walking/materialicons/black/res/drawable/baseline_nordic_walking_24.xml", + "upstreamSha256": "e994cbaac8ded6e805ef374f88d9cee332f649e0632ce91aeba14f6da4ce3c68", + "localSha256": "915c4ac2cab23b01a4c934287fd33bb24fe96af12c198dfa5723c78e1c0350c2", + "orderedPathDataSha256": "0c813deebb0459d119cbd8e93315b4c8ed98f29156786c9884aa3d962ee284f9", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/north_east.xml", + "upstreamIcon": "north_east", + "upstreamPath": "android/navigation/north_east/materialicons/black/res/drawable/baseline_north_east_24.xml", + "upstreamSha256": "a13a69a252a078f05e8c8bbac961693ff56b1396283da04ce7770dc06e3cb074", + "localSha256": "e0f6ba1355dfc79752f2b1a288a72325a374887c6f2c8f9eb7c6933a6dfebb1b", + "orderedPathDataSha256": "80883a43fa36fb216deeaf5d4b6fa2d578d03ccebdb7e335ba232da3d0dc9025", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/north_west.xml", + "upstreamIcon": "north_west", + "upstreamPath": "android/navigation/north_west/materialicons/black/res/drawable/baseline_north_west_24.xml", + "upstreamSha256": "384fffeb52a9c9a3f9441d3aa68c489511d4a6c7eaeb13270e2ad1d4ab671d5e", + "localSha256": "12bac4b0c9fbef4860674bfced7b3a461c22cb7af7ccbba9ec7e60b3b77b3035", + "orderedPathDataSha256": "a3a54c659e249e6971c0518f93946fdd781b08fd7d972fcb43b270ae31cec4c1", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/north.xml", + "upstreamIcon": "north", + "upstreamPath": "android/navigation/north/materialicons/black/res/drawable/baseline_north_24.xml", + "upstreamSha256": "33a678976325af704510c153ab9eed41940bed380ddf5545124e9324d2b84c68", + "localSha256": "eb40dcc84ff918abd4f0e33f467ca03e82c8ecc3578c54ae49ce9628d5a4d098", + "orderedPathDataSha256": "00be9649a974b32fdac4000aefd85bca513c3cab997786b1d6854289741b2433", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/not_accessible.xml", + "upstreamIcon": "not_accessible", + "upstreamPath": "android/action/not_accessible/materialicons/black/res/drawable/baseline_not_accessible_24.xml", + "upstreamSha256": "7b38e3928d026f7b427173936ecc897b7d62ceeb931054f17f17a9084357a739", + "localSha256": "581e0050dff3a6ee4b5f832f64af37bba7a3b5ad332d1ce07c42c05bbd90992f", + "orderedPathDataSha256": "4d2f3348c3f9e8beda188ec7f973ed5ef0ca494b656e2b688c3a2dc0fee08bb2", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/not_interested.xml", + "upstreamIcon": "not_interested", + "upstreamPath": "android/av/not_interested/materialicons/black/res/drawable/baseline_not_interested_24.xml", + "upstreamSha256": "e3ae82644d7872282dcf4cade6134adf65f61148ef73c446c9719336821867be", + "localSha256": "19d6f76b93c88c45dd01c2042bc99a34c8bab83edc75214f34f19c58803e8b52", + "orderedPathDataSha256": "38de4af27a5ed4443cbb861ffafab183e269bc38aa41af46b53e57439d17e5a6", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/not_listed_location.xml", + "upstreamIcon": "not_listed_location", + "upstreamPath": "android/maps/not_listed_location/materialicons/black/res/drawable/baseline_not_listed_location_24.xml", + "upstreamSha256": "180efcc50d8ebf907ad350e6af6d3597729cda6d3dcdeb7a001ddf20089587f1", + "localSha256": "a899e2e4e88ee38f356791e7d62bb42bd0852578f991f01066c543af41f35ea5", + "orderedPathDataSha256": "193025ea3d01e6a9fccdf3e732787074f5cfd1a111904cbf2ec26c46cb965fc2", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/not_started.xml", + "upstreamIcon": "not_started", + "upstreamPath": "android/action/not_started/materialicons/black/res/drawable/baseline_not_started_24.xml", + "upstreamSha256": "6d23248ce6520211e42c26aa70122bb933df21a8d0502a2806b9b1ddac3a2ca7", + "localSha256": "344c6c2c9e50f3802ddd85e44f0844eda98a59b6db0afe7721feea58b9fec784", + "orderedPathDataSha256": "7079f9b7c7607a96de19828f9703534ee61d695cf0410286d8a18d98e688c625", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/note_add.xml", + "upstreamIcon": "note_add", + "upstreamPath": "android/action/note_add/materialicons/black/res/drawable/baseline_note_add_24.xml", + "upstreamSha256": "f4524a6f38affa2f7017c127a93ffe0c7635d4c1accfef66a09c64cba54ace12", + "localSha256": "c62520bfc3db0c745aa18aa6cd3d15dc049d37e37b06679156c0ef48492be21b", + "orderedPathDataSha256": "1865c113ab335eb505c250964d63e46bdde84bfc55f372638b67485a7a2577ed", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/note_alt.xml", + "upstreamIcon": "note_alt", + "upstreamPath": "android/device/note_alt/materialicons/black/res/drawable/baseline_note_alt_24.xml", + "upstreamSha256": "fc5e7a414b5c715d1b28016575168f3cc946d773929bde147df22458bf626984", + "localSha256": "8f46da214ea0ec9f1bf35018a100fde7379205d74dab84a59d12a9645bcf3e93", + "orderedPathDataSha256": "40dbaeb55e5a29bb41070fd13fbfbb01d6951d1a58ef5809dbe6fd1f513e11cd", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/note.xml", + "upstreamIcon": "note", + "upstreamPath": "android/av/note/materialicons/black/res/drawable/baseline_note_24.xml", + "upstreamSha256": "081fd28c5852cd4d7cbdb13dffc50dd55a803721f354d9de4338a4b0cd6920ab", + "localSha256": "bebd161e89028ce47723ba2c4972453b95d3198f2eba7056b3918322dce12bc2", + "orderedPathDataSha256": "1bd8abbf81f1342992670ac867adec1d68d5f854aee51ea6d76406b42402c61f", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/notes.xml", + "upstreamIcon": "notes", + "upstreamPath": "android/editor/notes/materialicons/black/res/drawable/baseline_notes_24.xml", + "upstreamSha256": "24cf5434d9e49afa750b96a15581e5c6267e34f42579d2be6de9ae3c6484eb40", + "localSha256": "8cc8fab68318933a1fb55d41b9827628f9601a3471df3dc458f52b2996b96f64", + "orderedPathDataSha256": "4e5c3b3128114dbb6c7ce52e1b5ed2d1c075da82b2d50d54589ffd99d10fa4c3", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/notification_add.xml", + "upstreamIcon": "notification_add", + "upstreamPath": "android/social/notification_add/materialicons/black/res/drawable/baseline_notification_add_24.xml", + "upstreamSha256": "7750a728c37af2cc2e49dc8028eb5f8f5ac29badb78c9417e3a7861a3cf8755a", + "localSha256": "66ad390cff744a45bb2855457d3df7099fd2e187ae22f270ca20dbad378922ad", + "orderedPathDataSha256": "04208356d8bd215462cdc15db3aa8bf63e85e14dadf91a746dfbba30a89fa908", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/notification_important.xml", + "upstreamIcon": "notification_important", + "upstreamPath": "android/alert/notification_important/materialicons/black/res/drawable/baseline_notification_important_24.xml", + "upstreamSha256": "d7df6cb53f7a4e5ef507ac475f687a9d95e23aa38947209a55ccf57286328ca6", + "localSha256": "8b62846a28ea6baad91d58926106a3f966c640415fd9b9465ac6984f65adfadb", + "orderedPathDataSha256": "cddf7cf18e8acd6aac8a26b9b81373536dde5a325d929b234c0248e40371ce2e", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/notifications_active.xml", + "upstreamIcon": "notifications_active", + "upstreamPath": "android/social/notifications_active/materialicons/black/res/drawable/baseline_notifications_active_24.xml", + "upstreamSha256": "13ab3030af78800ec2fb748ab092e986f8c43ab8d6f8eaadaac6e71de13bff3c", + "localSha256": "3dc25975f8d4531b2aad2132c249ae72d3d1af1f957e3c5346222a08ee121557", + "orderedPathDataSha256": "33498090d7c97054dd36f914b8510faa5709b9916f01a18a81ab310877dcc070", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/notifications_none.xml", + "upstreamIcon": "notifications_none", + "upstreamPath": "android/social/notifications_none/materialicons/black/res/drawable/baseline_notifications_none_24.xml", + "upstreamSha256": "f00795334b71ba6d011af85f1f889c963a4a61bcbfc04a5f34553f3e494cc0ae", + "localSha256": "471641cb8ced4ae654355fc5160f77975340c992ce417b7810e129c23edbdde9", + "orderedPathDataSha256": "e4bdb1f3d88b9a8fcc8024497c872e62d8a00b65b3c5590e05694076a55f2cf0", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/notifications_off.xml", + "upstreamIcon": "notifications_off", + "upstreamPath": "android/social/notifications_off/materialicons/black/res/drawable/baseline_notifications_off_24.xml", + "upstreamSha256": "eaccbbf803d269f49636fed3dffab375d4e909edd1ce3280de80b11a65f50a54", + "localSha256": "e7d40b24e16233debb6bfefa663c85ed2011f06b24158d868f9eb671d7bf78c4", + "orderedPathDataSha256": "f4e52f2c777f6a1463180c4635677a6c18c0f9726a478cfb0bcde526a5383ca7", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/notifications_paused.xml", + "upstreamIcon": "notifications_paused", + "upstreamPath": "android/social/notifications_paused/materialicons/black/res/drawable/baseline_notifications_paused_24.xml", + "upstreamSha256": "d2c88176f52879fd1ccf8a49ba87e7486e7e83aff3d4b3b9a221a7bb375c1c21", + "localSha256": "eec7908156c35cf8fdc67fee7873fa3e3338a23ff93899f459e963014b2e1ec1", + "orderedPathDataSha256": "39f0cc81d86073b809b59c0f34cf87292988494dbac3ac3d19907b7468ddae08", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/notifications.xml", + "upstreamIcon": "notifications", + "upstreamPath": "android/social/notifications/materialicons/black/res/drawable/baseline_notifications_24.xml", + "upstreamSha256": "04202b9654a5c49f21d4d3307a3e49621abd83ad0251cf8e2e9fd95d64a76df6", + "localSha256": "5973bda2d01b140b560a73bdc6512e27ea45840150ca46bf55c97bdcf54f286c", + "orderedPathDataSha256": "ec534acdd29ed0084ecc50063fc2c8bb67632e625fadf0d6d6a084e74b8ab5d3", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/numbers.xml", + "upstreamIcon": "numbers", + "upstreamPath": "android/editor/numbers/materialicons/black/res/drawable/baseline_numbers_24.xml", + "upstreamSha256": "77db3f53cd95d18b4f415cad9bc6b5673b7a079700dba9c83dc8fdb730ac16d4", + "localSha256": "fe0aa9436de79807dcf5494028ea00691a2feb073f1bc37ababf56c7730273ca", + "orderedPathDataSha256": "7ee20a9dc32f4924991316cfc4ccb972259c1a1744d77ab047b7f73300312b5d", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/offline_bolt.xml", + "upstreamIcon": "offline_bolt", + "upstreamPath": "android/action/offline_bolt/materialicons/black/res/drawable/baseline_offline_bolt_24.xml", + "upstreamSha256": "1ff4a7eb3db33e00556620bb2bc8b97978d47852beafcb0372c693c9ecadd4dd", + "localSha256": "798238a933a7c9f66ec30cd1afa39538344ace9599c14ecccc232f5ca1c40d2d", + "orderedPathDataSha256": "9d2f37a268f67e25c33da7233efb12b23516c3fc1ec3ac0dd4c3c69a9f359809", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/offline_pin.xml", + "upstreamIcon": "offline_pin", + "upstreamPath": "android/action/offline_pin/materialicons/black/res/drawable/baseline_offline_pin_24.xml", + "upstreamSha256": "77d6b7e4877e7af5eb59f57a95975e0753d170877b769701a8269113c462e628", + "localSha256": "573c0772ac2e362cea6c0dfde35b77d07293fa5d40eb7b7046afbcfcbda83a86", + "orderedPathDataSha256": "ade8ea7f2924d095011664da6bca28bcd909eacd413100032fcb2af1acc3000f", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/offline_share.xml", + "upstreamIcon": "offline_share", + "upstreamPath": "android/navigation/offline_share/materialicons/black/res/drawable/baseline_offline_share_24.xml", + "upstreamSha256": "780037f80253c0d4528f830bc6a0e6a28d5b7953116a42045de3c8e6fe8407bc", + "localSha256": "d2002951d4c6db58a25aaac7343bd04a873df402005d86f631f8987b037f88da", + "orderedPathDataSha256": "e0be40e4f993f7585d67dcb4a30655c2f2f55066d603683b556dad4c00b1b405", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/oil_barrel.xml", + "upstreamIcon": "oil_barrel", + "upstreamPath": "android/home/oil_barrel/materialicons/black/res/drawable/baseline_oil_barrel_24.xml", + "upstreamSha256": "d615559a7ce480f417a61664d0a927ce679a97bac894af7b4cef6e62ccbd3094", + "localSha256": "5e7e20d1d55041f925064eb15c866e97e6383ae4b8cb819d62e5adf1b75bad09", + "orderedPathDataSha256": "7cabf30887239cb2c5e73e1018d1efe0670379a921372f0d28b245f04fcbe17d", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/on_device_training.xml", + "upstreamIcon": "on_device_training", + "upstreamPath": "android/action/on_device_training/materialicons/black/res/drawable/baseline_on_device_training_24.xml", + "upstreamSha256": "48110b0b4e033668222554e6bd12dbc9dac5c66f6a3f33c0e4c429d56bfe0cde", + "localSha256": "eb92a2bbf346b0104ee03ca003259f685d0061b02e59412ecbf4db58d0012887", + "orderedPathDataSha256": "2998318951ce925ca77eaf79aed49feb9341a3ce52a0d2c01593acdc9af71adb", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/ondemand_video.xml", + "upstreamIcon": "ondemand_video", + "upstreamPath": "android/notification/ondemand_video/materialicons/black/res/drawable/baseline_ondemand_video_24.xml", + "upstreamSha256": "0ed241643bec6e337900fabb3958600472eddf72336853bdae3ccd48afd08cc7", + "localSha256": "b1a5ab4b9e2e3b735ae0d24a4594888e0de51340c4ab684677c99f52ef1b9d2d", + "orderedPathDataSha256": "2636f9e3e374d544e70e4528d24fc53035366f82db488ae78df76b301bcb4ecb", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/online_prediction.xml", + "upstreamIcon": "online_prediction", + "upstreamPath": "android/action/online_prediction/materialicons/black/res/drawable/baseline_online_prediction_24.xml", + "upstreamSha256": "a281280487d511865d2fefad01b6a2c76906d6ca1fb80623e50730adb5796147", + "localSha256": "2d949e4f19aa9550c1e56cf7e57c5c16753ad4a7691f7063f22fea954db472d9", + "orderedPathDataSha256": "abd79546a1a46f9424129d16e7d5d6d16feeed5b5bbaecb722ceeaf1eb0373f4", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/opacity.xml", + "upstreamIcon": "opacity", + "upstreamPath": "android/action/opacity/materialicons/black/res/drawable/baseline_opacity_24.xml", + "upstreamSha256": "3f39d660c8d485d65568f801ef0abba88d49206a7a26e3a3983144b7d06288e6", + "localSha256": "61b6352ff5c450c7c8b7b405d0d79190cd899ad9f6de28f66ccd888ce9789f4b", + "orderedPathDataSha256": "0fb95b01447642686b94f0c71c05bd455724d470f575230dc841d5c145451b97", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/open_in_browser.xml", + "upstreamIcon": "open_in_browser", + "upstreamPath": "android/action/open_in_browser/materialicons/black/res/drawable/baseline_open_in_browser_24.xml", + "upstreamSha256": "9289c0ea60f4ecaeb7eb5183a32d890b0d137efbcf592966b606f81ded1faf06", + "localSha256": "a9eb492ae0d25c4ec47ad94074019dc532f6c80d43f3c247939fea8becf6686d", + "orderedPathDataSha256": "059b65ab22ec5a0af5b8b62641a71f2c08115c1e11a0e8e62cee9d500e26c745", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/open_in_full.xml", + "upstreamIcon": "open_in_full", + "upstreamPath": "android/action/open_in_full/materialicons/black/res/drawable/baseline_open_in_full_24.xml", + "upstreamSha256": "f1b51ad147c0e2de4aa55f4f6c6db46f47dd582b5a2aa8dbb692d6cd3e844f61", + "localSha256": "881340950c79c0074fe9d769e0f1e840bc260ade20e75af7902746cb346be417", + "orderedPathDataSha256": "d89d35f779ee130f530ad7464bc3037b995898ed74b51a68c76ead519c9055b8", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/open_in_new_off.xml", + "upstreamIcon": "open_in_new_off", + "upstreamPath": "android/action/open_in_new_off/materialicons/black/res/drawable/baseline_open_in_new_off_24.xml", + "upstreamSha256": "515f13a2fd948bd8db20eacc7aba356ba43a14b20c2b5a41e1fa903ef139207e", + "localSha256": "a42e04e3937f75a40b3bd2d291c5809c67296753537545e2eadd1a6b59189ca7", + "orderedPathDataSha256": "9983f4bced8e242bd35c68d0427e261053b1c59688f7bc45afcc39f72c855d99", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/open_in_new.xml", + "upstreamIcon": "open_in_new", + "upstreamPath": "android/action/open_in_new/materialicons/black/res/drawable/baseline_open_in_new_24.xml", + "upstreamSha256": "d455e802583f13ed0dbef6c3ed72d8fd4a5b9e403ab83f3a75a2cc1465b3ff5c", + "localSha256": "749bff20c9511246f3473100ff021bcff1ea6b2e9685d13cb8e4abe8c068320c", + "orderedPathDataSha256": "3786455efe5d11b08e1c3e8a24d4b1657094e2c2d1fab63d8c48bee6ecd50455", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/open_with.xml", + "upstreamIcon": "open_with", + "upstreamPath": "android/action/open_with/materialicons/black/res/drawable/baseline_open_with_24.xml", + "upstreamSha256": "fd36b477de4c8893601824868e4f41e3a5a7a62c48a28dc28da413b7a6162c3a", + "localSha256": "6b45aa377c483e229a4d4a97973f423002d8c469948e71d1047997f4a6f4b051", + "orderedPathDataSha256": "c0e4a63038be7ba719a0fd8c2ed1540bb7a17a80ddec10912ddd06b57ef31668", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/other_houses.xml", + "upstreamIcon": "other_houses", + "upstreamPath": "android/places/other_houses/materialicons/black/res/drawable/baseline_other_houses_24.xml", + "upstreamSha256": "27c79f865dca90c06a79216e92ddbbfcaef40802436bd1c95ae7af80688051c8", + "localSha256": "91855ebdb4772aedbb92dce687772d8e6c71f1c85658ebe78d13d5878fc4d409", + "orderedPathDataSha256": "ccaca1fe6fe296c6b3791166889f71eee0ec731e606001f7d8962f9ab197f105", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/outbond.xml", + "upstreamIcon": "outbond", + "upstreamPath": "android/action/outbond/materialicons/black/res/drawable/baseline_outbond_24.xml", + "upstreamSha256": "70b6f13b26bc79ee34b9c8c905687279ba408b112b19d62ae2d4b65925088e69", + "localSha256": "ad7d1f3ee4dae031fc1e29c22bc25b1e9aadc9a87df73ce3760d806b69f3c8d4", + "orderedPathDataSha256": "80a7fd4eae159fe66edc4bbf79a53ba33c0ce5eb046cbd77252f14a0f0ea3477", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/outbound.xml", + "upstreamIcon": "outbound", + "upstreamPath": "android/action/outbound/materialicons/black/res/drawable/baseline_outbound_24.xml", + "upstreamSha256": "e86da78e65b90cfdff6411e9698c0c8b44fe16a37c1789857993929a7cd20a79", + "localSha256": "1846b282b0a03f02b534d2a27d4d725a5dbea5a12829441362012519c6107623", + "orderedPathDataSha256": "80a7fd4eae159fe66edc4bbf79a53ba33c0ce5eb046cbd77252f14a0f0ea3477", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/outbox.xml", + "upstreamIcon": "outbox", + "upstreamPath": "android/action/outbox/materialicons/black/res/drawable/baseline_outbox_24.xml", + "upstreamSha256": "6c0e2979e4f743a6d30b37fdb6b4c6bdf866d66f1f3dee335671eb3911c0a3ed", + "localSha256": "6a03c466d904599daa9286353cf80ac9312a71f27ace0fc20045f44f5864880c", + "orderedPathDataSha256": "a79c907d4e9383fa33cf07dc1bc88c5d3c043122c504be7784f79dc4bd6a111d", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/outdoor_grill.xml", + "upstreamIcon": "outdoor_grill", + "upstreamPath": "android/social/outdoor_grill/materialicons/black/res/drawable/baseline_outdoor_grill_24.xml", + "upstreamSha256": "966f73ffb7904349443d5a73056ca4175a477e4aff91428dd51b8223b75c6acd", + "localSha256": "aa32cc58759f758763c3d81b985dcdc5d971e84f4fc113ccae9677cee2c39557", + "orderedPathDataSha256": "8d478ad1929375c50c6052a5d42e9a262a04440a9fccc14a464cdb75a8a6e506", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/outgoing_mail.xml", + "upstreamIcon": "outgoing_mail", + "upstreamPath": "android/action/outgoing_mail/materialicons/black/res/drawable/baseline_outgoing_mail_24.xml", + "upstreamSha256": "3b6895a07203d5dbfa01518421fa1dd829ec3c697d0aaafdf9b67cc71f35b4a6", + "localSha256": "4c84fd3359c36d4a156026db8aeae81d0819245f1fbcce093e0043abe984a51f", + "orderedPathDataSha256": "c2bbefd372629eea8dd46e3851adb210d0d7e855be9895b8456a5b6857ee9b68", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/outlet.xml", + "upstreamIcon": "outlet", + "upstreamPath": "android/action/outlet/materialicons/black/res/drawable/baseline_outlet_24.xml", + "upstreamSha256": "1451b935a18b4ce17bcbe1641248c1c9b7b7a18703ec6dacdbbf7edd6aef4442", + "localSha256": "0ea59a4262062f2f3d2fb64504fde269d6569c93e471e0a5a1ab447bbfee8499", + "orderedPathDataSha256": "4c57f2911a396123a9836b99657aff59c90ba7ad61faee8bef95d9ccfab730b0", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/outlined_flag.xml", + "upstreamIcon": "outlined_flag", + "upstreamPath": "android/content/outlined_flag/materialicons/black/res/drawable/baseline_outlined_flag_24.xml", + "upstreamSha256": "522e05977910d38772110e3a6cb7013614eff5a42b56e008579a10b9aa1253df", + "localSha256": "805d185a2177590e179234fb9be454b96c8228186e369fdf947e1cab3a4fe93e", + "orderedPathDataSha256": "da065e1b66f144e3139ccd01048be2cafcc77d90fcd7bf7bdcd4217e9fad9f4b", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/output.xml", + "upstreamIcon": "output", + "upstreamPath": "android/action/output/materialicons/black/res/drawable/baseline_output_24.xml", + "upstreamSha256": "db85f59164a5b06d01c3d2ecac91bd05bfc1756eb0283d42b8ae0eb796c14808", + "localSha256": "1714a4f057b82dd5a280b7733700669adba268d97c52395ce0e678be92c1f03f", + "orderedPathDataSha256": "f6c51c6f275617980798cf82bf94950707d20f90a1ba15801bece3963b7a4d8a", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/padding.xml", + "upstreamIcon": "padding", + "upstreamPath": "android/editor/padding/materialicons/black/res/drawable/baseline_padding_24.xml", + "upstreamSha256": "17cbdb8a66fc6b72c15eab598b08577a94ec793e8ce50c008d110fb3c5eff916", + "localSha256": "54c83f1ef74c660a8fc1a63b18510e16804f80a0f8541c3a06df6acc13c2a17e", + "orderedPathDataSha256": "52f9fb756a32c358570ff270c510736a7770deb557fda0ce76adc621078e4254", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/pages.xml", + "upstreamIcon": "pages", + "upstreamPath": "android/social/pages/materialicons/black/res/drawable/baseline_pages_24.xml", + "upstreamSha256": "558829ed9b74d98b867d6681f4afa882bb6c6c339ca44bc900d9f2ae3239a4ee", + "localSha256": "15d0d0f03d16b3bfaac736dccc01fa2d939de19e33e35862eaed5fcbabdd60ab", + "orderedPathDataSha256": "9adcb45a7592781dc10985c6d983c030e9f9de3bfc4e4259eda62ff31e31c471", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/pageview.xml", + "upstreamIcon": "pageview", + "upstreamPath": "android/action/pageview/materialicons/black/res/drawable/baseline_pageview_24.xml", + "upstreamSha256": "86967ba51b7517d5dbb12bfd79ca4eb1382db692bf2dda99c3be496b6ccbc492", + "localSha256": "a705cad240d3b40927aabf4b7862e0c2ee0aed48081153d99281cb12233e99a6", + "orderedPathDataSha256": "30a1df701f7050c44b07cf2845e7880afa6f302fc8d57139de7f9e8e9d7b099e", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/paid.xml", + "upstreamIcon": "paid", + "upstreamPath": "android/action/paid/materialicons/black/res/drawable/baseline_paid_24.xml", + "upstreamSha256": "36e0b1afe3b00eb38779e851b87c677435d77a41f59800ea8bb61700476fcdd0", + "localSha256": "936c243cce7f3115d96b597203678d3db83fb6761005dc8f48e1a46f97965758", + "orderedPathDataSha256": "06c681f2b75ce6f309f61a186403a17e431312de206caf536bb6324f168a2f76", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/palette.xml", + "upstreamIcon": "palette", + "upstreamPath": "android/image/palette/materialicons/black/res/drawable/baseline_palette_24.xml", + "upstreamSha256": "b899fc94a3b6decfe1d0cf13561ecfc1b238039a8604df47b6ebe823f39fcea3", + "localSha256": "90f10987ec9bbaf9db04fa2971b6b2291eda2315f84266737e4664dec42b00b0", + "orderedPathDataSha256": "899f0504f1a2f0beae54dd8f8f7502ce8f066659fb72f9f2ab8271b08be90122", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/pallet.xml", + "upstreamIcon": "pallet", + "upstreamPath": "android/hardware/pallet/materialicons/black/res/drawable/baseline_pallet_24.xml", + "upstreamSha256": "becd0f37e986b07512839f9972c825e756ab936edb2398aaf5ea02849b0956a5", + "localSha256": "b1fb7d81ab41e4837d301a7906fc7b2712f0ef1633689e8d2cddfddaaf105ddc", + "orderedPathDataSha256": "62a75c363dfd8c76293c546fa24d987fd5e28214f4ffd286566c43837fd03a38", + "originalGeometryMatched": false, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/pan_tool_alt.xml", + "upstreamIcon": "pan_tool_alt", + "upstreamPath": "android/action/pan_tool_alt/materialicons/black/res/drawable/baseline_pan_tool_alt_24.xml", + "upstreamSha256": "cfac8032044c58797c76a7812c76f02ceea960f2fb7e0a93df9db63e6eeaffd2", + "localSha256": "7e6a6763e26ed89ab1d6392461cc0209e454cb44766e8391cecfe19e63f8d6dc", + "orderedPathDataSha256": "dc12567b0ed4cdbd119f475713f9f03189630a2e156f1f03398e48c3eea52155", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/pan_tool.xml", + "upstreamIcon": "pan_tool", + "upstreamPath": "android/action/pan_tool/materialicons/black/res/drawable/baseline_pan_tool_24.xml", + "upstreamSha256": "3cc5e77a80c131d55570f19a89fd755202f9d534038b768d8530cba4f24b7fd2", + "localSha256": "bf40ca85ac6f24d70a21bc109f5c5372ad7d65f9dc3559a432c058c5e0d2a57a", + "orderedPathDataSha256": "26244531b90c573f9a1d7a0874c5765770e66101b27de044b014c810987d1821", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/panorama_fish_eye.xml", + "upstreamIcon": "panorama_fish_eye", + "upstreamPath": "android/image/panorama_fish_eye/materialicons/black/res/drawable/baseline_panorama_fish_eye_24.xml", + "upstreamSha256": "e5df1ff6103aebce6b8b193ebbe20eec3c690bdafdacea95471b68f22ec04280", + "localSha256": "413d64f541eb1c4b7a0f6b526bba60c8d6daa85c27574ce2f1d70fd85fb18d55", + "orderedPathDataSha256": "93192974a2f89bb659c2fd59e69156a64c26c6bad3222eab8e5fb05c2ea7398c", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/panorama_horizontal_select.xml", + "upstreamIcon": "panorama_horizontal_select", + "upstreamPath": "android/image/panorama_horizontal_select/materialicons/black/res/drawable/baseline_panorama_horizontal_select_24.xml", + "upstreamSha256": "a46ad8b9ef9d76a22f5fa328ca96f3faa800f46be2215d80dd1cfff16bd9f5db", + "localSha256": "2bb611e8fe94846b3e530e78be6ee0489de28716b2080a8eb297f5bcc7d81281", + "orderedPathDataSha256": "50d659c17d68ac05107b77153d0b61b1f419bca581485edae2260dbfc33af2b9", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/panorama_horizontal.xml", + "upstreamIcon": "panorama_horizontal", + "upstreamPath": "android/image/panorama_horizontal/materialicons/black/res/drawable/baseline_panorama_horizontal_24.xml", + "upstreamSha256": "fd5895ca771043376bb31f537ab5aebf85e91a285d85c214b87f6f821f9b05fc", + "localSha256": "e6b49f15c7d7afcf6b43c3320baa6e83d38d5846f4fcf618ab655adb3caeb9fa", + "orderedPathDataSha256": "1eb83dc79f57e1788a8b33dec2bb09e04db5573b8de6fac188685097b2980bae", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/panorama_photosphere_select.xml", + "upstreamIcon": "panorama_photosphere_select", + "upstreamPath": "android/image/panorama_photosphere_select/materialicons/black/res/drawable/baseline_panorama_photosphere_select_24.xml", + "upstreamSha256": "5ede3f42e9d65ba9534fa2c96bde9406432d9183fa3fd405dc55a60588af24f0", + "localSha256": "553d7fe105a5ac64d0bd1e00cc5fce43525898bcc4ce64fd13546a8ebb733fbc", + "orderedPathDataSha256": "56986efc9447cd752706ccfd39fa023f5bee95beb633d86e369e1057a6470458", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/panorama_photosphere.xml", + "upstreamIcon": "panorama_photosphere", + "upstreamPath": "android/image/panorama_photosphere/materialicons/black/res/drawable/baseline_panorama_photosphere_24.xml", + "upstreamSha256": "b370a362390506c7b9dde18d63fad09535f33d03e623359320c5412bd2f8b490", + "localSha256": "f7005cd33254edcbd57836a681b7d817dc398e2d56024ad4bfac453970759568", + "orderedPathDataSha256": "b19304f53e01fca576d9fb7e1d665d873cf5f59115e10d0b73408d70e01e11d6", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/panorama_vertical_select.xml", + "upstreamIcon": "panorama_vertical_select", + "upstreamPath": "android/image/panorama_vertical_select/materialicons/black/res/drawable/baseline_panorama_vertical_select_24.xml", + "upstreamSha256": "a8a5683960a570f7018d0eb096e17b86ae09666feb66a32023462b6d869bd774", + "localSha256": "41ea5a0afa4825b0e9d5c442358e632eb44f616ba8ab08f2ec93f0b26dc5c276", + "orderedPathDataSha256": "a3ba20040a8954a3e748dc9698045a149804b5912fdcaa5c99d0fa2c2fc98f73", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/panorama_vertical.xml", + "upstreamIcon": "panorama_vertical", + "upstreamPath": "android/image/panorama_vertical/materialicons/black/res/drawable/baseline_panorama_vertical_24.xml", + "upstreamSha256": "7f28c8cdd83b0ac9234edd963fe35e1c5f56c80afa3923d26b3a3ddc438592aa", + "localSha256": "39fd3e07e96b88fe9dbf19a593eaf8c8d5eb5abb927a3d0169f6c24bda00307d", + "orderedPathDataSha256": "aec07a1d8fa58414cb0abdabd41e5ea01f6a54a365c5b5551ff77436bcd39882", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/panorama_wide_angle_select.xml", + "upstreamIcon": "panorama_wide_angle_select", + "upstreamPath": "android/image/panorama_wide_angle_select/materialicons/black/res/drawable/baseline_panorama_wide_angle_select_24.xml", + "upstreamSha256": "5fcc5e7a9cb5e4d1f23d6cf5392fff8fb78fffe804e22775798b6f0073a0521e", + "localSha256": "7e9fcec81333f7a93b10891b467cf1fd348376f59a765839aa54b80888b6d05a", + "orderedPathDataSha256": "636af3e635558a3c64d5207486d2e4572effd1c2c477908e93fbe79e90449a22", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/panorama_wide_angle.xml", + "upstreamIcon": "panorama_wide_angle", + "upstreamPath": "android/image/panorama_wide_angle/materialicons/black/res/drawable/baseline_panorama_wide_angle_24.xml", + "upstreamSha256": "e82350e805efe9f8d12dbccc54b5ae69a9b0bc94ab63f8e5e0e14de039a3d541", + "localSha256": "236d6c37fa23be0144e430d98b6965641b00d5a985e74a8f478628a81f321f5e", + "orderedPathDataSha256": "f159d29d1ded68885f07db4b6468e6932695f8257a9dc6227821281232934120", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/panorama.xml", + "upstreamIcon": "panorama", + "upstreamPath": "android/image/panorama/materialicons/black/res/drawable/baseline_panorama_24.xml", + "upstreamSha256": "34ae3c90ed50e01c78bed13e71d0be087ace4435271c679c33af26a364c4f506", + "localSha256": "4029f86b7478401a000b4b192a377fae0e0300d0bc739f8820f70e71f0c647f5", + "orderedPathDataSha256": "8d593eec8b6addd3343ae7b1f1db2eb00bbbaee37f621e8bab8a2d0cb55f8a07", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/paragliding.xml", + "upstreamIcon": "paragliding", + "upstreamPath": "android/social/paragliding/materialicons/black/res/drawable/baseline_paragliding_24.xml", + "upstreamSha256": "2df7de6489cfe7b22d378cec88effd327aa6fdc0ca84eac0c96e0d91e2e0727a", + "localSha256": "74324f315e219b89630fea17eaa537dbaf0b90944ea3075d8c05e0101927d8db", + "orderedPathDataSha256": "9797fe8c74dd2ca6a468295cdfb357c1fd53d231b7e4b7880ca4020283862ec3", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/park.xml", + "upstreamIcon": "park", + "upstreamPath": "android/maps/park/materialicons/black/res/drawable/baseline_park_24.xml", + "upstreamSha256": "fc73389bb8b628bc0318976c72688c2922349626f0a426345c1f7d70963aaedd", + "localSha256": "9ea1cacd901822d0dfe1a83d4d0d85fb41e17328aab7a9e4dd73b240eccebaa2", + "orderedPathDataSha256": "050bf80bc64b61b696aa14035477ad8abc137ab840eebafba8265d1ef8fbd137", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/party_mode.xml", + "upstreamIcon": "party_mode", + "upstreamPath": "android/social/party_mode/materialicons/black/res/drawable/baseline_party_mode_24.xml", + "upstreamSha256": "e2d148206f2580637bd608baa44c032c47276b8870ac51264c0544952007ca92", + "localSha256": "ef23cd67435193b9d86405be6215187f6a108a866516866c8b0e687a4c1996cb", + "orderedPathDataSha256": "2a15078240083426dc1dc0079e9092076563c91bc976e3416c54e7bf1ad88382", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/password.xml", + "upstreamIcon": "password", + "upstreamPath": "android/device/password/materialicons/black/res/drawable/baseline_password_24.xml", + "upstreamSha256": "6bfff829e5c271582f6534e15926061275a92cc340ff84eab0f533a0ab97e2f6", + "localSha256": "25d2b1df245408e755b1a36d78a3b419af5450b7e30d595e34954428348fe431", + "orderedPathDataSha256": "199813bbcaf1ea75b173bcccb3db805bf6a9e193ab65f7e9725439b8beb71e68", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/pattern.xml", + "upstreamIcon": "pattern", + "upstreamPath": "android/device/pattern/materialicons/black/res/drawable/baseline_pattern_24.xml", + "upstreamSha256": "f5d0f9a0267b184f5a9bf758af8fe07e947a4b7ef454bb4f2707c40e0c49c3d5", + "localSha256": "14927280066e8b130e31fc57c1ef725ed4268d48ff3190c3ac478f775ff02d36", + "orderedPathDataSha256": "c3c598cbc90cd15d5b8d82f734c35b04de997f42021d4c22904d2f47fff8d660", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/pause_circle_filled.xml", + "upstreamIcon": "pause_circle_filled", + "upstreamPath": "android/av/pause_circle_filled/materialicons/black/res/drawable/baseline_pause_circle_filled_24.xml", + "upstreamSha256": "804e7ef6b4e05f6cba286115ef9043e697bce3676b33e908a64ef0710861d1ec", + "localSha256": "806d453ce010a085c350b9dbad0296ba5a0f8e304869b179128a534c7dc3d6ca", + "orderedPathDataSha256": "756b71df7a4d80ab5cbbf90695506139051f22dcb1945d7d1ede5326a32b29c3", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/pause_circle_outline.xml", + "upstreamIcon": "pause_circle_outline", + "upstreamPath": "android/av/pause_circle_outline/materialicons/black/res/drawable/baseline_pause_circle_outline_24.xml", + "upstreamSha256": "825858be6f1d557bcd01d9d817186d291f050cd1a0202a623ca4f97c64216934", + "localSha256": "3412faa593b44cb2a6ec153f002fc805998345f39ba8a85270f2e86e810c8166", + "orderedPathDataSha256": "d00e16f3375ea21fa8f208b448f93e91eab5df5aaeadab21c06388fc5e746dca", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/pause_circle.xml", + "upstreamIcon": "pause_circle", + "upstreamPath": "android/av/pause_circle/materialicons/black/res/drawable/baseline_pause_circle_24.xml", + "upstreamSha256": "14815ab2d1a1f4bf8bbc4fb5705c997ed3da4dd408a163d21b258c621c3f3114", + "localSha256": "34c3247fbebd36eebf49030f8d6999041d376576fa6ba5f200c1e2948730f92f", + "orderedPathDataSha256": "150ef5da3b0b5e658d70cf56771b29c1e5e1ea728386483c1c7dad2ec55a35a3", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/pause_presentation.xml", + "upstreamIcon": "pause_presentation", + "upstreamPath": "android/communication/pause_presentation/materialicons/black/res/drawable/baseline_pause_presentation_24.xml", + "upstreamSha256": "6a5264bd731ea2f4866873c60fa5dcdd8a09cb4d040068751ef02e3c40e1c118", + "localSha256": "1f1515d167eafb07e1741e841c5997a4660ff38dd598507a90dd6b20719b0109", + "orderedPathDataSha256": "a2d14244d0bec24bae516677d188865b0ad451bf55689988c51cfd81b6427b81", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/pause.xml", + "upstreamIcon": "pause", + "upstreamPath": "android/av/pause/materialicons/black/res/drawable/baseline_pause_24.xml", + "upstreamSha256": "464af7751d0f67a1c900ce4809a308c41fbe4c585543b31f3227b21f94893b2f", + "localSha256": "a9b47c9b1e1d3c965a6e4a605ae8b30e91732b4e0765d5c3462a41744025d22b", + "orderedPathDataSha256": "0ba516ec1475f8f8908619090cdd9f1b5923756712155c657570bcdd9adcf610", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/payment.xml", + "upstreamIcon": "payment", + "upstreamPath": "android/action/payment/materialicons/black/res/drawable/baseline_payment_24.xml", + "upstreamSha256": "06ac77bf8d9c1cdc0563b3c4a13c1479630d702d0378cb23ea5cb960caa78c98", + "localSha256": "36675d63adece6ecfaf8247d38aca204e03cfef7dfebeb65363255b5d2a9774c", + "orderedPathDataSha256": "7e0d75beb2530bc72c5b830b7371d0012c36857e994e1a6aac524cf4ab01c1da", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/payments.xml", + "upstreamIcon": "payments", + "upstreamPath": "android/navigation/payments/materialicons/black/res/drawable/baseline_payments_24.xml", + "upstreamSha256": "8fe46c2f5403cbba8dec62ad18a9859ffde4d0a9ff40f25c9a44ecfa94457e4c", + "localSha256": "2c3f8b9b82877df51c30fb9da5f795718441ccac1c43ec82da111bddadb4b56c", + "orderedPathDataSha256": "3ae57f2eeeab13ffd45ea5043879805288785af195074568813b1f3e061bc0e3", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/pedal_bike.xml", + "upstreamIcon": "pedal_bike", + "upstreamPath": "android/maps/pedal_bike/materialicons/black/res/drawable/baseline_pedal_bike_24.xml", + "upstreamSha256": "bcbc77a17986dc75a87dbdfbf69b213f3678187e6ab70400fe151977db29711d", + "localSha256": "5cd490012bef30cfc9a6d811090ca016a6bc4135d5ae0fce040a815462fce222", + "orderedPathDataSha256": "0be457c1db6afc7a381a47b5690118ded8b4aa0e75cf7ff153be1d38f8ea270f", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/pending_actions.xml", + "upstreamIcon": "pending_actions", + "upstreamPath": "android/action/pending_actions/materialicons/black/res/drawable/baseline_pending_actions_24.xml", + "upstreamSha256": "fb00643626972f35c4075fe3fb70ec54ad4af7e25fba44cdf9d16d4222f37f9f", + "localSha256": "be0ee5cbc87288fa95f7c9a893364f8b1dc699c155a0fc1536dd050bcf800f3f", + "orderedPathDataSha256": "137c9cb0121623a13b5ee1cbe696a8e7576ffc46d0d0dcdeab4b7db45c5f1edc", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/pending.xml", + "upstreamIcon": "pending", + "upstreamPath": "android/action/pending/materialicons/black/res/drawable/baseline_pending_24.xml", + "upstreamSha256": "0fdd16cfe11cafad29aa14d8e4c2ed5cc8160f1988c4783aa3259eda2df44442", + "localSha256": "3b7029fb8e767560ced94ac5bd48522074c3bc1b684f5f6a339a3119f01c7b0e", + "orderedPathDataSha256": "4c69a1ce1a61a8158f9d0e6c89ff1749b0be42137ec9fbb5b495e9c9b229ecfb", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/pentagon.xml", + "upstreamIcon": "pentagon", + "upstreamPath": "android/editor/pentagon/materialicons/black/res/drawable/baseline_pentagon_24.xml", + "upstreamSha256": "6c3739d1f636caf0aa002d41bde333f88153f6e25d1cb35aa81b2e5f7846635f", + "localSha256": "eb8f4e6d69e07dc694bc4b1987f3cf6e9a59fffc9f197d46751425492e55dfc4", + "orderedPathDataSha256": "6ccc0e8ed10fd765daf246716e6085fc1cffd7914f70b4e078d8bb9948d80d9d", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/people_alt.xml", + "upstreamIcon": "people_alt", + "upstreamPath": "android/social/people_alt/materialicons/black/res/drawable/baseline_people_alt_24.xml", + "upstreamSha256": "e3c2eec502f08e989bca84c18bc19ca6deef41ef946c74af7ac55d5064abcb10", + "localSha256": "faa86b48a7bb1baf28f9413ae4398f73522be586fd15aa4c9c1121f96bfd4a43", + "orderedPathDataSha256": "922c8a233726085c00b07ce69d2b937c374cc2428011c11d2f390aa2dd452d65", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillType", + "value": "evenOdd" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillType", + "value": "evenOdd" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillType", + "value": "evenOdd" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillType", + "value": "evenOdd" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/people_outline.xml", + "upstreamIcon": "people_outline", + "upstreamPath": "android/social/people_outline/materialicons/black/res/drawable/baseline_people_outline_24.xml", + "upstreamSha256": "6b945b8458fd141ae7122c27c734300a5d145c8645786be0600c4528c75da214", + "localSha256": "6352b56c100cd8e6c29661579ae9f6703a378e8f026fd9820b42b77975923583", + "orderedPathDataSha256": "922f03ebb8f4c1df0f9f916e40af22eebc079600d953643bb8bcf6e816eb023f", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/people.xml", + "upstreamIcon": "people", + "upstreamPath": "android/social/people/materialicons/black/res/drawable/baseline_people_24.xml", + "upstreamSha256": "67629d5cab1610e3fc934a1ad98d4a258d6b2af32827a7b2ccd3a88443a440e1", + "localSha256": "f2a25c42d05b74d0fbdfe014b52e76e7a05e7805923cfbad0f008978dd4e2683", + "orderedPathDataSha256": "76edb037ec69e5b6ec3bc70b2c6c967381b84b1c42a0135e11063a2b9d846ebc", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/percent.xml", + "upstreamIcon": "percent", + "upstreamPath": "android/action/percent/materialicons/black/res/drawable/baseline_percent_24.xml", + "upstreamSha256": "a622e0a2b17090285eee7f3b3f505d0cc99c985c954abc9cb45ecca0b39dd9d7", + "localSha256": "287e4dd5188b87267711e582c48ee54d73e4feaff8b31d535c46fcf18eecf35b", + "orderedPathDataSha256": "58b1231cee49e6cbf8f70f52be161e5f3cef48caf8b326e6af34b6b26755740a", + "originalGeometryMatched": false, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/perm_camera_mic.xml", + "upstreamIcon": "perm_camera_mic", + "upstreamPath": "android/action/perm_camera_mic/materialicons/black/res/drawable/baseline_perm_camera_mic_24.xml", + "upstreamSha256": "cbb606299b60d57862928ca6d8dfb1d7c10286640ee25b57e0c62156b725d9ab", + "localSha256": "ba32067e3b2008587e15c6a7efc25aae05c408d38b8632dc5cfd2773fed31bb6", + "orderedPathDataSha256": "4637e7fd2b2390bf882fb25c55be2615793b48c41fcce2bd4dfb8d969779717d", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/perm_contact_calendar.xml", + "upstreamIcon": "perm_contact_calendar", + "upstreamPath": "android/action/perm_contact_calendar/materialicons/black/res/drawable/baseline_perm_contact_calendar_24.xml", + "upstreamSha256": "74396bd2a869af135bc93b257bc400a7b5906c403787c6beca4e0f0a1b00232e", + "localSha256": "549e83ba8958be5f05cf150ad5b0d130e20f6a888050291117048a05002ae6cc", + "orderedPathDataSha256": "59bc670e6423e834bd440ff06f94fb6cfbbdbf94033efe3eca775ccea2cd3fa5", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/perm_data_setting.xml", + "upstreamIcon": "perm_data_setting", + "upstreamPath": "android/action/perm_data_setting/materialicons/black/res/drawable/baseline_perm_data_setting_24.xml", + "upstreamSha256": "b54e570f5aa6a32820a38ef6780b157aa726d5e3029c2129bcfd0a58c67e3fff", + "localSha256": "ef4fe3daf58ff6f64fbdb1be2fc79d4bba31dc3812af61248f07b632c597d2a0", + "orderedPathDataSha256": "70187df8595c393ff15d4d617bbfd3a5a23fbda36054968a7ff24b1da4d8788c", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/perm_device_information.xml", + "upstreamIcon": "perm_device_information", + "upstreamPath": "android/action/perm_device_information/materialicons/black/res/drawable/baseline_perm_device_information_24.xml", + "upstreamSha256": "bdd0fddc2f08d6157b175b2b62730951cd604c3099a56682474dfe13cdae96d1", + "localSha256": "f2ec3666d10886672e54f48a70dbf6ec0a41207dd7a34edc6a589779db0e4470", + "orderedPathDataSha256": "c4c07db8e310c0fea91add7abbce79ca893ea61b79dee48766e8d2a4dd817d46", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/perm_identity.xml", + "upstreamIcon": "perm_identity", + "upstreamPath": "android/action/perm_identity/materialicons/black/res/drawable/baseline_perm_identity_24.xml", + "upstreamSha256": "eb16d96adb730a32f197f11f9351b7eebc107673c4da686fb7a123bd3e4a82b6", + "localSha256": "8e2c11fbf2049e392fd8add61c9de9909b89605c44fadfc6feefb4962b430143", + "orderedPathDataSha256": "492e1ed5c46308b1a80c641611c87d67f8f23c0bfe9dd654c0760bcc183ef4c1", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/perm_media.xml", + "upstreamIcon": "perm_media", + "upstreamPath": "android/action/perm_media/materialicons/black/res/drawable/baseline_perm_media_24.xml", + "upstreamSha256": "382a53c5e2310690be3a29e490d3b30b707cfc4891ee2d75f8ccccc65d9b47f7", + "localSha256": "dc9c8f08f81d82b17ee0628e6c32e2e9eca82b655899dd51bde5d69db5bf55d2", + "orderedPathDataSha256": "9af94ab3f39ba13fac2634baa3d6bb047aa4c52e175c9dd490a4041edd9a3e79", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/perm_phone_msg.xml", + "upstreamIcon": "perm_phone_msg", + "upstreamPath": "android/action/perm_phone_msg/materialicons/black/res/drawable/baseline_perm_phone_msg_24.xml", + "upstreamSha256": "b32cc4b906725eaba0d12ad54968cd628c15ace55c571ca9ccb39089b69d9ef3", + "localSha256": "c395d7316722a7365633a83e216d086b8155388093924cce478168b6c0563202", + "orderedPathDataSha256": "d572e1f335f170db49bcbed455a146b1c8573c33fda3636529f5acbeb07ff4b9", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/perm_scan_wifi.xml", + "upstreamIcon": "perm_scan_wifi", + "upstreamPath": "android/action/perm_scan_wifi/materialicons/black/res/drawable/baseline_perm_scan_wifi_24.xml", + "upstreamSha256": "27dd250b54d5f744c2ce631783cd397e7ac2601fba6429ac642d676710e5201e", + "localSha256": "be5e51261ebe819ee59c9acfc13ea498029f16b4de96198ad0fceb8004bb9e4a", + "orderedPathDataSha256": "b9fa373f83ee6bcb818dadb21f940651eacd5d538ebac2fd8d1d7b8044c6ca68", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/person_2.xml", + "upstreamIcon": "person_2", + "upstreamPath": "android/social/person_2/materialicons/black/res/drawable/baseline_person_2_24.xml", + "upstreamSha256": "180f0f6aab2c7161bdde069f9f977ac42e60c3c044c039626a8ff2dd9e7f00ce", + "localSha256": "d97bdac3c3dc70363a1e3bba0f9040d016eba9af3154608a681e10db24a86fb6", + "orderedPathDataSha256": "7fe27eaf7530268b7adbdde6ea53bfb27b0d9900629fb43209bf6b6a435ab6b8", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/person_3.xml", + "upstreamIcon": "person_3", + "upstreamPath": "android/social/person_3/materialicons/black/res/drawable/baseline_person_3_24.xml", + "upstreamSha256": "495e3fb9d1aced134bfde5a370cad949178d92165b47e1a38049ca70bf58dfae", + "localSha256": "7ec27b28097b9d482a9b7e21585875b351b3e4853089f44c4311161cea416383", + "orderedPathDataSha256": "48b6fa8d75947b677ccc540bf54333dcd5e397c7deaaf75025bb54b58f886f9d", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/person_4.xml", + "upstreamIcon": "person_4", + "upstreamPath": "android/social/person_4/materialicons/black/res/drawable/baseline_person_4_24.xml", + "upstreamSha256": "e5fabac0d38cb31595b300e68f1fcb3390f5fb980103af2fc89f0b5b881c6061", + "localSha256": "6ba3702c56002735d6a4374275671f7abd48075fc91c393a09837382d19b333a", + "orderedPathDataSha256": "1bf95f8a8ec7c5629caa910a3e3f0c8a3bc01458585e97249dbf29c279bd7c81", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/person_add_alt_1.xml", + "upstreamIcon": "person_add_alt_1", + "upstreamPath": "android/social/person_add_alt_1/materialicons/black/res/drawable/baseline_person_add_alt_1_24.xml", + "upstreamSha256": "25abc8554d3cd1fd31c8a6093995de6d2740500db91c56e5c990bcaf4dd159c5", + "localSha256": "91303649152ed70ce62a4a1b7f20d0f61e3cbc84cf82fd94af85cc70d0292c51", + "orderedPathDataSha256": "9cd806f5c944c705253479ab58e1e1ab1caf58376c81712967768db0e281a0d1", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/person_add_alt.xml", + "upstreamIcon": "person_add_alt", + "upstreamPath": "android/social/person_add_alt/materialicons/black/res/drawable/baseline_person_add_alt_24.xml", + "upstreamSha256": "5082e7bb5be2e86a178af1f45e164d4bc09a154d8b87be2867ab943342c868f7", + "localSha256": "d8e61ff5cb8d4bc49f3652bc8f23f652b6c8386a0a91fe62921741ef64ea6231", + "orderedPathDataSha256": "0de143ad2e6de78ad542fe8e3db7c801418c24981a07705d9fe8637879f872da", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/person_add_disabled.xml", + "upstreamIcon": "person_add_disabled", + "upstreamPath": "android/communication/person_add_disabled/materialicons/black/res/drawable/baseline_person_add_disabled_24.xml", + "upstreamSha256": "32e21619e3b7092945f122adbf614e8d306f9d1392b56e551873168fecb71e12", + "localSha256": "07977c8de11a58a78106fecc140ae6e17a261de6daef5da1ce550b5f837dcba1", + "orderedPathDataSha256": "5db8bf6403fbf5defc64bb0ce0f3db27d47a0da82c0ac5e956edbfbed61486d1", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/person_add.xml", + "upstreamIcon": "person_add", + "upstreamPath": "android/social/person_add/materialicons/black/res/drawable/baseline_person_add_24.xml", + "upstreamSha256": "951d536b816d0eb77ca9af8ab5c9e64943076c56eeb84ece2f81c702a53ddc22", + "localSha256": "c1956456830ae32951efa7c15a7a67d665dbf9cbecbb6716179dc3d7b2a57abf", + "orderedPathDataSha256": "21d47af08f543065d4d4e84ddbe03a871f496f86348ec33217f327a2436cd8fb", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/person_off.xml", + "upstreamIcon": "person_off", + "upstreamPath": "android/social/person_off/materialicons/black/res/drawable/baseline_person_off_24.xml", + "upstreamSha256": "d20a9d76c5a8e07f0490418e04a66a62ad1c89dd1d12a24507134cc2927b4256", + "localSha256": "74ba46c87c5115c32440ba2839e104503e8c35edb93b5d0b22836b4eecdb341b", + "orderedPathDataSha256": "ab46e882e75f16802c5705a8821d2e1b8bad76ec7070d112ef52290845bbdcc6", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/person_outline.xml", + "upstreamIcon": "person_outline", + "upstreamPath": "android/social/person_outline/materialicons/black/res/drawable/baseline_person_outline_24.xml", + "upstreamSha256": "eb16d96adb730a32f197f11f9351b7eebc107673c4da686fb7a123bd3e4a82b6", + "localSha256": "bd8c425ac2110bf9b5138b8f4b4701c5d3e0fdfb4a35f17e9b035c78ee0701bf", + "orderedPathDataSha256": "492e1ed5c46308b1a80c641611c87d67f8f23c0bfe9dd654c0760bcc183ef4c1", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/person_pin_circle.xml", + "upstreamIcon": "person_pin_circle", + "upstreamPath": "android/maps/person_pin_circle/materialicons/black/res/drawable/baseline_person_pin_circle_24.xml", + "upstreamSha256": "646b34f97cc8f1c7ebbe0a489e9626eab63fca6f936670880632c7685047fbbc", + "localSha256": "d5bcd0161d8bd80481e67a081d50e0219665b0be461b4a6e524b6500eafcbbb1", + "orderedPathDataSha256": "a57ed21e86bdf2ce0d5e73b7f9608a4331737d30d7fb3e086ef7fa43678ed545", + "originalGeometryMatched": false, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/person_pin.xml", + "upstreamIcon": "person_pin", + "upstreamPath": "android/maps/person_pin/materialicons/black/res/drawable/baseline_person_pin_24.xml", + "upstreamSha256": "a3d6abec321d540823794f061aa010bcc979f3176d2d0c61ba42ed72a77d44c8", + "localSha256": "52f98de0b1e43e52c86780a7e5f8f00ee7d948dcef544db4cbaa0ec6c56dec02", + "orderedPathDataSha256": "a3f75419693b0db90280a552255c51b140c0e43af38b4c9e3fa5ede42d0fdd8f", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/person_remove_alt_1.xml", + "upstreamIcon": "person_remove_alt_1", + "upstreamPath": "android/social/person_remove_alt_1/materialicons/black/res/drawable/baseline_person_remove_alt_1_24.xml", + "upstreamSha256": "be3079e5bf11935e34f28f5e7b3410ff3d701d15a6bdbdc3a0dccf2ba53f98fb", + "localSha256": "140a8df1d90e5906905ac69fd71d94801869db323e958fa83bcca6e41f5567c5", + "orderedPathDataSha256": "0237185f2592e1cc15f73b526818005233b8bc9d522de1d021cad53f4a4d45dd", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/person_remove.xml", + "upstreamIcon": "person_remove", + "upstreamPath": "android/social/person_remove/materialicons/black/res/drawable/baseline_person_remove_24.xml", + "upstreamSha256": "be3079e5bf11935e34f28f5e7b3410ff3d701d15a6bdbdc3a0dccf2ba53f98fb", + "localSha256": "b47fb179e80b298f8d1fa7ed0bef9530052d2e811c6c8a9109e223afc1d0cb45", + "orderedPathDataSha256": "0237185f2592e1cc15f73b526818005233b8bc9d522de1d021cad53f4a4d45dd", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/person_search.xml", + "upstreamIcon": "person_search", + "upstreamPath": "android/communication/person_search/materialicons/black/res/drawable/baseline_person_search_24.xml", + "upstreamSha256": "f52c64321585da87451e240266fc6749f79769b8fa57f424cf9991f5a67fe900", + "localSha256": "247c30db366d17d34fcdd732e700a9b004f7668ec5f1a9bd743d86d074168254", + "orderedPathDataSha256": "9584129676ab980caf7a9d4664598f2c68021d37b55eefa4bdae486a8e8ed6bb", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/person.xml", + "upstreamIcon": "person", + "upstreamPath": "android/social/person/materialicons/black/res/drawable/baseline_person_24.xml", + "upstreamSha256": "a8cde21c13f445d6ed7780fbdbd87aada4afda67189e1dac4bd824ed95b9e79c", + "localSha256": "c96fcec2b93580a964e001ac4b5edd612687d7f83777757fc0e09c27aacd3b85", + "orderedPathDataSha256": "67f8a9bd1209777791e84839f8f916d5c1f31b608abce037239088b36a57498c", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/personal_injury.xml", + "upstreamIcon": "personal_injury", + "upstreamPath": "android/social/personal_injury/materialicons/black/res/drawable/baseline_personal_injury_24.xml", + "upstreamSha256": "56c8ec0a4e07002b1fd417bc0dde6c27391abbb8b64a021a0f1d65729c1b2807", + "localSha256": "bc4b4308668302c1f5ee9e678de3103092f060f714b834f1113466b80be77ae8", + "orderedPathDataSha256": "a388b3c82a1dde137a472e94fbe4875b5e608c99dc0346cd33fff3498f3034ec", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/personal_video.xml", + "upstreamIcon": "personal_video", + "upstreamPath": "android/notification/personal_video/materialicons/black/res/drawable/baseline_personal_video_24.xml", + "upstreamSha256": "6d43c716e74fd55ffaaf391784f7c6533a3e00a3ccf2a7eeea20c2d286f38f73", + "localSha256": "3d2c3b6ca4040a927de0488396b6374e52003b27ba92eec4df4c4601a78e529f", + "orderedPathDataSha256": "3e1cba13e1b788fc2c8bc2eccd40513085e72e8d321de062f1f4e867a9ac0dfe", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/pest_control_rodent.xml", + "upstreamIcon": "pest_control_rodent", + "upstreamPath": "android/maps/pest_control_rodent/materialicons/black/res/drawable/baseline_pest_control_rodent_24.xml", + "upstreamSha256": "33f475e3984ddac48a5cb09b86b811941bde5375b85224f2be07e71de8ee69d2", + "localSha256": "4e7850d80b200ce0a4b04fba72da0d432c77597736240d4874256ff63d285d7c", + "orderedPathDataSha256": "a2fdb45c357c3942963ee26e4141a98c44a2297008d60a145971aeff68953acc", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/pest_control.xml", + "upstreamIcon": "pest_control", + "upstreamPath": "android/maps/pest_control/materialicons/black/res/drawable/baseline_pest_control_24.xml", + "upstreamSha256": "dd8278a73de6bdda46f8143a79e026539e2da60f280b75f28edd4cec67410c88", + "localSha256": "24164c4d62d127d63e773cb75f41da2bec959257beabeba6e2b01d419d9a6443", + "orderedPathDataSha256": "c82476895a2ddce6417b0ae65450897f640714aa263febd1480d82a2499c8a40", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/pets.xml", + "upstreamIcon": "pets", + "upstreamPath": "android/action/pets/materialicons/black/res/drawable/baseline_pets_24.xml", + "upstreamSha256": "1f1b3609a882db64f56ffa00178df3e857722c244b3488ebc8113d0820c1b1ed", + "localSha256": "1d4d15412c644c602b70e72c9e2cafe1b3e305713946f00a85ca89c727439d90", + "orderedPathDataSha256": "0cd77e8028773358f815adb5cb9848e721b7c39226b4bd9a7b411de289f61207", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/phishing.xml", + "upstreamIcon": "phishing", + "upstreamPath": "android/device/phishing/materialicons/black/res/drawable/baseline_phishing_24.xml", + "upstreamSha256": "8850cc92b1ade9c2b5741cc852986ffdef804b64ec99422cf299a8d70a862676", + "localSha256": "8fc2e73955375adfcf70af4dc8825be3656fe39324c2a58c68dbeb34f6bac1f9", + "orderedPathDataSha256": "16cab27cdf196899001e3150aa9b9b6cf894dab7ad95673585d444b6d0d8c88e", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/phone_android.xml", + "upstreamIcon": "phone_android", + "upstreamPath": "android/hardware/phone_android/materialicons/black/res/drawable/baseline_phone_android_24.xml", + "upstreamSha256": "8b43c24dda6847b9a350f0b228fb736815fe0e09fbf94c5172780ad5f0785f58", + "localSha256": "909e7a4196eba822836b31073bcc761261cf192edb01771da02c5baab4685299", + "orderedPathDataSha256": "4b957cf23c0d9570bb53cef1f260503b733e1c83bec311c172115e6189b45288", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/phone_bluetooth_speaker.xml", + "upstreamIcon": "phone_bluetooth_speaker", + "upstreamPath": "android/notification/phone_bluetooth_speaker/materialicons/black/res/drawable/baseline_phone_bluetooth_speaker_24.xml", + "upstreamSha256": "f34f1b5f65026e285c874c72e244aab1049b46c9c282f809c0c5c54fa3cc86a3", + "localSha256": "8c65b74f27c8d354a274365a118ac65f779c535a00a5386fc8517effd1d29aa3", + "orderedPathDataSha256": "5608849807f640b76acbf4d4da11b7cbe52a0fe0b60e67aeeb6515186143fff6", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/phone_callback.xml", + "upstreamIcon": "phone_callback", + "upstreamPath": "android/notification/phone_callback/materialicons/black/res/drawable/baseline_phone_callback_24.xml", + "upstreamSha256": "8e6678cf7678390b782ead965352fc0b80b2d894f4adbe763354409c115b5999", + "localSha256": "bb62c6c0d389aeb4e388457a3cdbd8034dfcee0c6d19c9d23857536c2084f385", + "orderedPathDataSha256": "e0b764ac02411730d8759e491b4d880775dc45b846ab5c69521ef549c0986955", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/phone_disabled.xml", + "upstreamIcon": "phone_disabled", + "upstreamPath": "android/communication/phone_disabled/materialicons/black/res/drawable/baseline_phone_disabled_24.xml", + "upstreamSha256": "754c5d62d72c101efe5615a8a33f201a224bf498ce167498da254c39f9aa4e3f", + "localSha256": "1abf21dd38854ea35644a7ec3f489606d5a2971c0bfa26b0a988b430be37e247", + "orderedPathDataSha256": "70eda239d4face0cb401de730a8ca15baaf33a3d23c3b87df4b50fb43aa41609", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/phone_enabled.xml", + "upstreamIcon": "phone_enabled", + "upstreamPath": "android/communication/phone_enabled/materialicons/black/res/drawable/baseline_phone_enabled_24.xml", + "upstreamSha256": "a371b95bf75aed1c4029c4983a9e6fef9b955c8034c06b1cee9fe86a09d18b98", + "localSha256": "64f687ca26f8a86d446015ad17dc368c3b2b8047173a3cf2bd7ee315def4ebf9", + "orderedPathDataSha256": "7da043fda6e6711d947d35d9b46b932ddcbbfbd8fe2188d5a4858de7045a95e1", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/phone_forwarded.xml", + "upstreamIcon": "phone_forwarded", + "upstreamPath": "android/notification/phone_forwarded/materialicons/black/res/drawable/baseline_phone_forwarded_24.xml", + "upstreamSha256": "c65a7743b4d06467997b63d9bdb66b6acbeb72ae36bc223a7a1d29de5373cb50", + "localSha256": "eb801d2ed83a6079cf8943b1dacaf12db393cac0df18417ac24d25ba07dfa2e0", + "orderedPathDataSha256": "f6eeb8275340850a14fd9be3a3bface1882e0939e692dec4fcf1580e08783adf", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/phone_in_talk.xml", + "upstreamIcon": "phone_in_talk", + "upstreamPath": "android/notification/phone_in_talk/materialicons/black/res/drawable/baseline_phone_in_talk_24.xml", + "upstreamSha256": "5caf5b3b3c9463b83239588b616b7ede955b4935cc147996d383f8a1633fa0f8", + "localSha256": "ff42fbc02e247d816bb43030b854492992c548a1b4bbd7abcb6ca2700db5977c", + "orderedPathDataSha256": "2c0a5d1fca561cb259ebed6617625797a00916a7c87b9733d8a93be07d249ee7", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/phone_iphone.xml", + "upstreamIcon": "phone_iphone", + "upstreamPath": "android/hardware/phone_iphone/materialicons/black/res/drawable/baseline_phone_iphone_24.xml", + "upstreamSha256": "626a1ef8069ddcd37cc95281386895cee70ae31b2a6d5b2a27bcc61bf599ecb8", + "localSha256": "7f8c6fd1652cde1b5062f3646d8fb7558ff8ac7c517d62b862891e5cdc4b4dea", + "orderedPathDataSha256": "c0d3dcb2cac9f3506887c5564d14fe39ee6f9b8747c312aa54b246136a7e632b", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/phone_locked.xml", + "upstreamIcon": "phone_locked", + "upstreamPath": "android/notification/phone_locked/materialicons/black/res/drawable/baseline_phone_locked_24.xml", + "upstreamSha256": "5661631d72bfc3ee8ab9670f6e4925fabc1558b470c63bdecefd9bf3cd3de378", + "localSha256": "f45dc68d2b10b806cab0df2b44541eb18b7e8f76ba5c17c032289d5d72ca06ac", + "orderedPathDataSha256": "baff531f93816b714fdfcd7327154e3c02773fb0f59d93a185ffeb6503e676a3", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/phone_missed.xml", + "upstreamIcon": "phone_missed", + "upstreamPath": "android/notification/phone_missed/materialicons/black/res/drawable/baseline_phone_missed_24.xml", + "upstreamSha256": "7df25e55d9f5201840fb862a0f0156ba9b73a30e9756944b0d70f86821853ed6", + "localSha256": "b3364f6a1d3adb1c32f36f0446c19a08d55332a4c1c11b8071a5466bfe5e17d4", + "orderedPathDataSha256": "33baacbde8354517f911e586609fa0e2802289b33fa8cf611427e1f00da6e01c", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/phone_paused.xml", + "upstreamIcon": "phone_paused", + "upstreamPath": "android/notification/phone_paused/materialicons/black/res/drawable/baseline_phone_paused_24.xml", + "upstreamSha256": "5c98480a9cd50a5b5fcded28962d0f8c3aecd8b1524971b7c52cf857d236b149", + "localSha256": "22242e0c86c093e1cd7c32f077b2ecf6294c22c686e3b96f15be7a961c4aef42", + "orderedPathDataSha256": "2f59406c8fc8b43e0a22b3fda98a880558be5e306188f5bf445efd54076ac6ab", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/phone.xml", + "upstreamIcon": "phone", + "upstreamPath": "android/communication/phone/materialicons/black/res/drawable/baseline_phone_24.xml", + "upstreamSha256": "743ef320c7fa9dd3517fedb43a68ba5d7574316d1a26e5c40c8466f6f5e950e9", + "localSha256": "40e09f6f4104418057e45fdea427300426c6480d827d6153d30d26ce944bc79c", + "orderedPathDataSha256": "969d7195087c44d0b7a08d00f1bbdd911958561a146b77df232f90170705e174", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/phonelink_erase.xml", + "upstreamIcon": "phonelink_erase", + "upstreamPath": "android/communication/phonelink_erase/materialicons/black/res/drawable/baseline_phonelink_erase_24.xml", + "upstreamSha256": "4f037c4dcf067441501cca723272056dd25e0feb21292b860b583ae7341bb156", + "localSha256": "ad2719bb131ca52c4fa770e4a78c19f90163db5757ded9b1496213eccb8a5c87", + "orderedPathDataSha256": "228da66ebe6007d76036c392dd8abab4af4253461bc55c1d7eeb943e0ad898ce", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/phonelink_lock.xml", + "upstreamIcon": "phonelink_lock", + "upstreamPath": "android/communication/phonelink_lock/materialicons/black/res/drawable/baseline_phonelink_lock_24.xml", + "upstreamSha256": "b9b7f21621904d5de3a8979860badcdcfde81e28d90e6cfd69a53c0c4698c2dc", + "localSha256": "26831e79301ed329d37897ba41bd8b3763324f5faa84a9da858386d001155648", + "orderedPathDataSha256": "74e33e1a228bc0456a57d3aaf3d577b163df7185271c536b5ed7e9135523b10f", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/phonelink_off.xml", + "upstreamIcon": "phonelink_off", + "upstreamPath": "android/hardware/phonelink_off/materialicons/black/res/drawable/baseline_phonelink_off_24.xml", + "upstreamSha256": "587c96f32b40c0bd69edff82e4ef789eacda3dbf21b536694ff0d144031df71e", + "localSha256": "8d9d7c17c8da2fa16c490481969b9093cead68a2c5738fe5f41a7dee49dfb41f", + "orderedPathDataSha256": "ab1b6589111750018ed607639c7b96a8986c98a6863db783ad8da06c491bebdb", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/phonelink_ring.xml", + "upstreamIcon": "phonelink_ring", + "upstreamPath": "android/communication/phonelink_ring/materialicons/black/res/drawable/baseline_phonelink_ring_24.xml", + "upstreamSha256": "40253792a73fbc4bcfe090c7cb2647891a09f82f5f84f857d94ac319721e6167", + "localSha256": "ffc08e0bdc9298b267932147e4d07343ec0ca5b6713321d51991479cb11653bf", + "orderedPathDataSha256": "2dca4431e1dd3c7113a37a0eed2d0ab21c54c0dc7a38c04cdf37b3d042451e28", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/phonelink_setup.xml", + "upstreamIcon": "phonelink_setup", + "upstreamPath": "android/communication/phonelink_setup/materialicons/black/res/drawable/baseline_phonelink_setup_24.xml", + "upstreamSha256": "7775afd6f32dcc2c02dd55e0d82397ea852bcd41664f5e5f956f93c97af3ab18", + "localSha256": "5f9cc8200006c89dbc04f1748b69b95278fa716e939678d6d30b28039d124f69", + "orderedPathDataSha256": "f0630b0b7c72d74b7d9f703f2815b840b8ad0decd57a518a9c0e6217b8dc665a", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/phonelink.xml", + "upstreamIcon": "phonelink", + "upstreamPath": "android/hardware/phonelink/materialicons/black/res/drawable/baseline_phonelink_24.xml", + "upstreamSha256": "5bb9c6ac25869337d97b9f0fe8dd548325230386cf804c1a4004133330f9bcdb", + "localSha256": "31fd8c63a17b02dbbdb98042f0763c2c464761c9a8fabb3399afb955ced2ba87", + "orderedPathDataSha256": "49d9ecb483b9fb4efce9d199f25bfc37b5cc4a1689e7e190d4c2ba198ea5307f", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/photo_album.xml", + "upstreamIcon": "photo_album", + "upstreamPath": "android/image/photo_album/materialicons/black/res/drawable/baseline_photo_album_24.xml", + "upstreamSha256": "4bfeb24addead65306e055616e2b1a2c7376a96abc3ba1e139908e83e6834be8", + "localSha256": "8a48a394cec3d9918d171350df940bba025d5de5f4fdfe38064b0a695e70bd00", + "orderedPathDataSha256": "011df6ce9f12114e0d872265ca5a32e1b2f96d44684ac9f2ff36971fb458d539", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/photo_camera_back.xml", + "upstreamIcon": "photo_camera_back", + "upstreamPath": "android/image/photo_camera_back/materialicons/black/res/drawable/baseline_photo_camera_back_24.xml", + "upstreamSha256": "2e34c4192997c3dac816d319a62884dd98dc0c7565defe6a173d6e659e8d606e", + "localSha256": "4a2c7a57c29cbcf605dc5726866472c40c55624a81f0dfb8b2d9a50c61f7e886", + "orderedPathDataSha256": "dc347654a705a86e1f0ffbda24429e2957507604d7c8397de2b30b3fc7e655c5", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/photo_camera_front.xml", + "upstreamIcon": "photo_camera_front", + "upstreamPath": "android/image/photo_camera_front/materialicons/black/res/drawable/baseline_photo_camera_front_24.xml", + "upstreamSha256": "5dd96bb0e92fb842f1c5c0cec45ddf5e1d41aef12533bef5767d8adec61ee492", + "localSha256": "3c928c3ebf0b1a635d38bbf98db029a973d83992a414069718b0067b21cf1ff0", + "orderedPathDataSha256": "cbc16ec2ee93ada47f585c76694142cd2ac9b1901e923a4c69d11c762fede02d", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/photo_camera.xml", + "upstreamIcon": "photo_camera", + "upstreamPath": "android/image/photo_camera/materialicons/black/res/drawable/baseline_photo_camera_24.xml", + "upstreamSha256": "0976ddaeb4144665433a3840295f48bce05a7d70f8e09a3282e20dbdd72da291", + "localSha256": "91375ffbadcae515e1b838c0f587526c96e92cec798f6ab019bc759fd063da65", + "orderedPathDataSha256": "8532e25ecb7bf8eb37c3b87779a6e8cdd5cea2f2c55e8dc4de035accb046bcac", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/photo_filter.xml", + "upstreamIcon": "photo_filter", + "upstreamPath": "android/image/photo_filter/materialicons/black/res/drawable/baseline_photo_filter_24.xml", + "upstreamSha256": "96d0c19cc946d1bacb1d5e8f3f577d4b628e3b964a2a9a451ce1be8dcf3de671", + "localSha256": "481659f2b8d689624687a71cde294db525c76aed4897ab2ca348e26e75e8fde5", + "orderedPathDataSha256": "5590c62f9c850404a80c9597ed0d3998dac262d88539dca304abac2b482908c1", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/photo_library.xml", + "upstreamIcon": "photo_library", + "upstreamPath": "android/image/photo_library/materialicons/black/res/drawable/baseline_photo_library_24.xml", + "upstreamSha256": "ce3e1047fd91a389a7049eb60c8ac11d588da161a065ab0595461e2007c8f1d3", + "localSha256": "88f175c448a2de0a118d97c3d980f95e793f8e49de8ea988fbb5c67545b8d23f", + "orderedPathDataSha256": "efdb1fb1478389acdfd07e08eaf5505ca4b6625dee22806e0da143b4aae8e51c", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/photo_size_select_actual.xml", + "upstreamIcon": "photo_size_select_actual", + "upstreamPath": "android/image/photo_size_select_actual/materialicons/black/res/drawable/baseline_photo_size_select_actual_24.xml", + "upstreamSha256": "8342b12a5975e2edc7453f80c2d783786e349fff850009679a24d863c51d1416", + "localSha256": "d5e9c3768890a47d1adafefa23dbaa352c75ffffb8699df499de52eb4cff555b", + "orderedPathDataSha256": "4793170b0d543ea2d60535a587e4b37f24f07b9f235a2c88be1368028476b9fb", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/photo_size_select_large.xml", + "upstreamIcon": "photo_size_select_large", + "upstreamPath": "android/image/photo_size_select_large/materialicons/black/res/drawable/baseline_photo_size_select_large_24.xml", + "upstreamSha256": "f774e4939f22b021e61e466b0e04e831d5ebbbefef7b0052af73bdf0c34c1a2d", + "localSha256": "4f045e08b65cf442c73e6fd1a4e60045f767ac88769a35ed7a2d545b9bf4a8c1", + "orderedPathDataSha256": "462394e06beb86900804f794b6b5ee598c1c6cac3218ed5616c72e9796136e80", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/photo_size_select_small.xml", + "upstreamIcon": "photo_size_select_small", + "upstreamPath": "android/image/photo_size_select_small/materialicons/black/res/drawable/baseline_photo_size_select_small_24.xml", + "upstreamSha256": "c74158a27262bde98f6d97cb920ea1775bb1f4126f4774231ee56f3dd1037ecf", + "localSha256": "23a3d25bc7d02b3807bb57593fb78a3211619c2cc765f796d4c65327f56bf475", + "orderedPathDataSha256": "4ed5b43da9d86918087b1551309ec255caee7a2a3534e3fc271b28909b0aa614", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/photo.xml", + "upstreamIcon": "photo", + "upstreamPath": "android/image/photo/materialicons/black/res/drawable/baseline_photo_24.xml", + "upstreamSha256": "dac9f692691d4bcbea987c9f3d8cc5b21c002c16628d1ffc0a7e65cf0773bc23", + "localSha256": "9e2d87fb8336ef10f057fb0419c0e634b9e191c4fc4461322c0bb6ea763f04ec", + "orderedPathDataSha256": "69a23aa4815ed09e5c0545f4dc9585d6e3a883223015b523680266abbc6d56e8", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/php.xml", + "upstreamIcon": "php", + "upstreamPath": "android/action/php/materialicons/black/res/drawable/baseline_php_24.xml", + "upstreamSha256": "ca294b9a5d647ffe4ec381a2272faf4ade8cb81309f2bfbf316995795bcb9be6", + "localSha256": "b4c620f7c1c9411269e9aad16953dd405643597920569147613c799845d5d6bf", + "orderedPathDataSha256": "0a98de991ffb9ff8f02fca12b3ae819edab0f67e59a1f8ef2ade8098a144de9f", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/piano_off.xml", + "upstreamIcon": "piano_off", + "upstreamPath": "android/social/piano_off/materialicons/black/res/drawable/baseline_piano_off_24.xml", + "upstreamSha256": "42634cf00e5b39c53cda0569b4cd035d2958e5f29553467016244c1d13793adf", + "localSha256": "bef0b1d40ee5a92d6d341a7c2b21b8e28ae70c4e0398f44abb0c650d2bdcde67", + "orderedPathDataSha256": "c78353881b14db687ca7c0937f0b022b733f3d974e847675ee687574a92fbdc2", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/piano.xml", + "upstreamIcon": "piano", + "upstreamPath": "android/social/piano/materialicons/black/res/drawable/baseline_piano_24.xml", + "upstreamSha256": "1bb9d8e66652591e290b29323af9922c6b641e93fca48392b4e15d8a5b8e45dd", + "localSha256": "c91e7caeac9206226b908dbc3fdbc8bde66bb694a704ddae829540b0aaaf64c4", + "orderedPathDataSha256": "8fc21d2ee791d2e3eb88ad2c5fcd01764a57c77ac58beaabceb3678e70282a15", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/picture_as_pdf.xml", + "upstreamIcon": "picture_as_pdf", + "upstreamPath": "android/image/picture_as_pdf/materialicons/black/res/drawable/baseline_picture_as_pdf_24.xml", + "upstreamSha256": "54a6354a68d061382d371d13a193b3d3caadf22c5e78af8760f53f004032bc02", + "localSha256": "b876ad6d73def6557b5d91688162f084fe294596d251d37116f4f5c22ee0e857", + "orderedPathDataSha256": "a993eb2c7b066b1b283ddd7081a1b3f4b1c6d03c316de5fb38f8ad78f094f579", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/picture_in_picture_alt.xml", + "upstreamIcon": "picture_in_picture_alt", + "upstreamPath": "android/action/picture_in_picture_alt/materialicons/black/res/drawable/baseline_picture_in_picture_alt_24.xml", + "upstreamSha256": "954e4d7406ac58ee72b83a6ad6f8fcee9f2a6c53427d9311ddbcf40e660262ec", + "localSha256": "43211a3ad7d7191c41d5e3671f3ecde7f63072abbfa64c8818d31c7d12e9fe45", + "orderedPathDataSha256": "9ce84b23ef7d31f101545ed596ee0192ebdb1a5b767b5e2ca4b898874bab1fde", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/picture_in_picture.xml", + "upstreamIcon": "picture_in_picture", + "upstreamPath": "android/action/picture_in_picture/materialicons/black/res/drawable/baseline_picture_in_picture_24.xml", + "upstreamSha256": "34d0a9c13177486c0d97ceb19cbe32ca9c6dac85d6bcf3443f8fc71c77b61e9d", + "localSha256": "84325090324b7a14e9d314c8e2f22363602af0e0b463df35d16007dda2baed8b", + "orderedPathDataSha256": "94ac33d276d8b3f79537153e3850d03f754017cd9cef435a9cd29a3d2a017240", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/pie_chart_outline.xml", + "upstreamIcon": "pie_chart_outline", + "upstreamPath": "android/editor/pie_chart_outline/materialicons/black/res/drawable/baseline_pie_chart_outline_24.xml", + "upstreamSha256": "3fb592873255bb2ca7a450a2d3354bc666f96f728e4c3e7e893a87292a3cccf5", + "localSha256": "4d5206b1d50853213d50dd806344bd23e8df92cb7a425facd932f071307d3a9d", + "orderedPathDataSha256": "d868bb4bcac2a27ea75f5db5084caccc8646f0defa7e4f6a6858b025cc96bb09", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/pie_chart_outlined.xml", + "upstreamIcon": "pie_chart_outlined", + "upstreamPath": "android/editor/pie_chart_outlined/materialicons/black/res/drawable/baseline_pie_chart_outlined_24.xml", + "upstreamSha256": "eeda48c187d7169fc6d8500c3ca645ea9f460698123cde43349362087d52dc99", + "localSha256": "c551a2527b6a5272950c83cdc9d5a52c8b1a893da4c973d7e1995cbcd63cb7c9", + "orderedPathDataSha256": "845635e17bd0b0ecf731968f8b517f45f05f15320f1b333196f7d6d6a3183713", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/pie_chart.xml", + "upstreamIcon": "pie_chart", + "upstreamPath": "android/editor/pie_chart/materialicons/black/res/drawable/baseline_pie_chart_24.xml", + "upstreamSha256": "ff83592ba3e4b698bfb24b6e66fffcc79bd8bada6a486e37e35d6e35022e0e7c", + "localSha256": "1c412986fd19da8c8329e64ed51fe94b37ee378f4bc4d76949dc1b2f5a5ddd32", + "orderedPathDataSha256": "877fb03a2169953f24a3edfc9fae0e580a21569f339446c8f5c01b700c7c5133", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/pin_drop.xml", + "upstreamIcon": "pin_drop", + "upstreamPath": "android/maps/pin_drop/materialicons/black/res/drawable/baseline_pin_drop_24.xml", + "upstreamSha256": "df7edcd7589c43948cbd78acaaf84c4bd6978e389b15e35e34a8e046f90ac87a", + "localSha256": "4b633cae11728775be1b3c9b270a084a42f8bd8d1c4bc4093f47c83e5da5b0b0", + "orderedPathDataSha256": "3a2b1473fe4e27253bc66f695c43700a762b46dd3efa973a5e55bfbcb876d020", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/pin_end.xml", + "upstreamIcon": "pin_end", + "upstreamPath": "android/action/pin_end/materialicons/black/res/drawable/baseline_pin_end_24.xml", + "upstreamSha256": "cf6c7d4815b64eeecc240cbb79df4115e9bdcfc2998f4532bdde2e0a0eab81b3", + "localSha256": "24009234066170c64fe284dac1dd8bb2ddd4f91e836daf7a15b120a768650941", + "orderedPathDataSha256": "2464537f7a620136681c5aec2e4150f62a89122f6da92ecb3752e76a071520cf", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/pin_invoke.xml", + "upstreamIcon": "pin_invoke", + "upstreamPath": "android/action/pin_invoke/materialicons/black/res/drawable/baseline_pin_invoke_24.xml", + "upstreamSha256": "85576ba7c0d6290b2dc41a01bb3a16951dc43ff9387db6b6a89a39f187ed50e9", + "localSha256": "9d518cdca41458d2a5bf69ceea1759769b71f16675653c4a81c259c5ff315f0a", + "orderedPathDataSha256": "78584ba344bd7b1461ebc773a0328871535d50417ebfe64e42ccf336b26eb719", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/pin.xml", + "upstreamIcon": "pin", + "upstreamPath": "android/device/pin/materialicons/black/res/drawable/baseline_pin_24.xml", + "upstreamSha256": "2f389f372d1d3ccc935f177d308b61a76884f6641c404a18b7629883e023138a", + "localSha256": "ccda9db3332c57e9f512c9b09da379a33c746d833c63865e3257db0aed8681b5", + "orderedPathDataSha256": "7c95fb9f33d9f3ecea7489ff2cf1524ba041051ae5e5c60fadcabaa5f782212d", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/pinch.xml", + "upstreamIcon": "pinch", + "upstreamPath": "android/action/pinch/materialicons/black/res/drawable/baseline_pinch_24.xml", + "upstreamSha256": "11f59fff9ecef2b138366e43507432ed0d411bcd790f03c2a54fe739e0846fd4", + "localSha256": "3dc924c07417e14ebb0939bde170b2baab1a383b437fce081cc5a019c3364d3d", + "orderedPathDataSha256": "398538c56a26c66f5c2f109300fe101375e896b5854f3ba21d191bb30a6f09ca", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/pivot_table_chart.xml", + "upstreamIcon": "pivot_table_chart", + "upstreamPath": "android/navigation/pivot_table_chart/materialicons/black/res/drawable/baseline_pivot_table_chart_24.xml", + "upstreamSha256": "29ee284e67f93bb99ff9e6c3147a7b4eb97581bee25ba69d0d893356f7e62b9c", + "localSha256": "6d6c1ffbe8fc732b43625cec987e693237bb699eb9f46a7975e06f4b53c943d9", + "orderedPathDataSha256": "38678054fa780c49e3f94b7aa326491230096862d4ed80775508810eb38b4f1c", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/pix.xml", + "upstreamIcon": "pix", + "upstreamPath": "android/social/pix/materialicons/black/res/drawable/baseline_pix_24.xml", + "upstreamSha256": "df04386a912cff79fa99371e9a8d52687a035ccd2aa76cfb66162cd918d2b5db", + "localSha256": "23c8f0ec4afed48bf0e7af9b1459beeaa92980512b8721874e64991fea0cda84", + "orderedPathDataSha256": "615e87fdbde365004600aa89f0fbd3f65c6acd71cdf54d12cd7d7a62575930d0", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/place.xml", + "upstreamIcon": "place", + "upstreamPath": "android/maps/place/materialicons/black/res/drawable/baseline_place_24.xml", + "upstreamSha256": "470ae3c3d612ac3c7db3586431c6783154e54d309428579026e48b79bc196317", + "localSha256": "f94fd6768635d80fe81996f76917d42d7af554e078098867398ad1c04da0b7ed", + "orderedPathDataSha256": "5f62b0d8c48e250a38478e2ef48351be60bfdf071406eca08a6e99deb736d0a6", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/plagiarism.xml", + "upstreamIcon": "plagiarism", + "upstreamPath": "android/action/plagiarism/materialicons/black/res/drawable/baseline_plagiarism_24.xml", + "upstreamSha256": "91d10a513227428d50814755fd41fb932aff1ff65ceeac49d647bfe087aa251e", + "localSha256": "2eff2c517c9d19b67810d44767806db8d3b944ab69715f3455ae74fdf6ff105d", + "orderedPathDataSha256": "d0da02f72082d1a407c04381d368b6cf0616e5b02c331c333e7dc104c5aea0c8", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/play_arrow.xml", + "upstreamIcon": "play_arrow", + "upstreamPath": "android/av/play_arrow/materialicons/black/res/drawable/baseline_play_arrow_24.xml", + "upstreamSha256": "67fb13daad9b2639f8990133f5dc98c002359e507b25c22e3608fe35bb0540c4", + "localSha256": "d664919d3ce8d2e27b21d3ec919da1ca1c59caaeea095e9c28a469f2346c29e1", + "orderedPathDataSha256": "7452887311c9b7f5a741693514bac664205e3fb74707f5fde0a59d7a87658f6d", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/play_circle_filled.xml", + "upstreamIcon": "play_circle_filled", + "upstreamPath": "android/av/play_circle_filled/materialicons/black/res/drawable/baseline_play_circle_filled_24.xml", + "upstreamSha256": "a4ea931ce87385aca2e7adb6ee6e1093ea0b03c5059d52958299c17da41f0707", + "localSha256": "becbfc9611c712f8722eb4de3bf83a932ddcdb0e70ce4c9d0ac03956acffda0e", + "orderedPathDataSha256": "ffbe5d240b3a36071fc0fec274a4afbf9a5f31a402fd571f971ce38acea921b6", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/play_circle_outline.xml", + "upstreamIcon": "play_circle_outline", + "upstreamPath": "android/av/play_circle_outline/materialicons/black/res/drawable/baseline_play_circle_outline_24.xml", + "upstreamSha256": "84c148e5da2f4f508b5658007b9ca1b53ede113246393c1497f06620e7c7d385", + "localSha256": "6cb17c020730a3bdb2b6d36f99dd5d03cf8536b034957b5c9740698bd2408fe2", + "orderedPathDataSha256": "991f76ec79a1cd138315bdabd69956d212e1f3add832d0ff36db1c059d0d7b3f", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/play_circle.xml", + "upstreamIcon": "play_circle", + "upstreamPath": "android/av/play_circle/materialicons/black/res/drawable/baseline_play_circle_24.xml", + "upstreamSha256": "2c1efa6772bf294820c4fa06ab1d1299341d999c11f19263500a7e084b612cb7", + "localSha256": "5664de27c98f365d82511ce4b5503c4da0cff7c2a52c9a14ed185ee897aac1d0", + "orderedPathDataSha256": "1ba2ee9af5ae814fb6f7df40d5dc0a5fd749109653b8a0f8d9eb8b842e6b1c91", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/play_disabled.xml", + "upstreamIcon": "play_disabled", + "upstreamPath": "android/av/play_disabled/materialicons/black/res/drawable/baseline_play_disabled_24.xml", + "upstreamSha256": "d5e945b9e7a2f7431e0c576b3301275bcea3c0bbbe0ba625c0719308cb929308", + "localSha256": "aa510a489cefdbb4bde6bc1ffffcb41540a3ad1d4b500db5dedd635a9f4855cc", + "orderedPathDataSha256": "5645385e4840cd45df07c2acca7256fbcb8665f7e7e8e0804303aefd5187089a", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/play_for_work.xml", + "upstreamIcon": "play_for_work", + "upstreamPath": "android/action/play_for_work/materialicons/black/res/drawable/baseline_play_for_work_24.xml", + "upstreamSha256": "78b5782cadb1fbae8406da5bbf63fe1b24bbc459d41dfe6af44e1afd4ec6ba17", + "localSha256": "542ba54e27ad7be0b603c9102e01ee082dd618244a43ecb56490c08a19200a80", + "orderedPathDataSha256": "a86edf52c27dd9aeea4a3fed56df471417c317847bdccb09a80b38677720fec7", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/play_lesson.xml", + "upstreamIcon": "play_lesson", + "upstreamPath": "android/device/play_lesson/materialicons/black/res/drawable/baseline_play_lesson_24.xml", + "upstreamSha256": "875c90851391436f1301e92791cf51f311140608477ec9b1ec7121b3b27affcf", + "localSha256": "dc676510da665f78660bcd08985ef99ffa0352c039af50647f3ee8891c5078fd", + "orderedPathDataSha256": "7db6a78453cae82948d3b1aa59e830b6c87cebf7ab167b406930a2777e4e7a01", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/playlist_add_check_circle.xml", + "upstreamIcon": "playlist_add_check_circle", + "upstreamPath": "android/av/playlist_add_check_circle/materialicons/black/res/drawable/baseline_playlist_add_check_circle_24.xml", + "upstreamSha256": "c72c6c5b5da64a51b75b80e28bd74ba2ad06de7bd7ed2db1f3dcc94fa3e00274", + "localSha256": "42762fd6b43a400ea86cb56e72c9ef1b9d70ede63f9ffc672056c41a5dc64a67", + "orderedPathDataSha256": "65493f436627f62003938cd20d5aaf476582d0e189a21b0f3c91006a25c0d08e", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/playlist_add_check.xml", + "upstreamIcon": "playlist_add_check", + "upstreamPath": "android/av/playlist_add_check/materialicons/black/res/drawable/baseline_playlist_add_check_24.xml", + "upstreamSha256": "c8101fa547c4fd3ef74f3ecf0bdffd371816a491877075e960d70c984b1e788c", + "localSha256": "9206d718168f62a141181ffced4c74758f00c9dea7362e7f24242f54f84857de", + "orderedPathDataSha256": "d5080807d0348e000ebdca680500a4deecb3c4b6640269c54d39679bcd851fdf", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/playlist_add_circle.xml", + "upstreamIcon": "playlist_add_circle", + "upstreamPath": "android/av/playlist_add_circle/materialicons/black/res/drawable/baseline_playlist_add_circle_24.xml", + "upstreamSha256": "703ef9d240aa4b0ced4373f8f5ca9807a8c037dff2bc93cf1b056ad33401a32d", + "localSha256": "93b4bfac6e8202b3e3791975cb31dc412ded22456baad2abd489851bcdac8a9d", + "orderedPathDataSha256": "be8999f2f91c52fc5aa7e444e3c2230b1407d957bfc07c796f574c8830d36148", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/playlist_add.xml", + "upstreamIcon": "playlist_add", + "upstreamPath": "android/av/playlist_add/materialicons/black/res/drawable/baseline_playlist_add_24.xml", + "upstreamSha256": "9306e7f59adab410312edf3a128c9f7e069d424f323b5381e00129d42f282581", + "localSha256": "22b84ee7076d2a4b3452961d1aa0eeb1986dc18fe196985db079e6eb1421a8f8", + "orderedPathDataSha256": "c33b2bbec972d202acb63374b43787dfc1684016fe634d5e9a38ce340c13dbb6", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/playlist_play.xml", + "upstreamIcon": "playlist_play", + "upstreamPath": "android/av/playlist_play/materialicons/black/res/drawable/baseline_playlist_play_24.xml", + "upstreamSha256": "bad70660dfbc5ff3cc065997ab29c564da0ff9b573973f9870c0a419f3ae7403", + "localSha256": "6502546a1af61767c204d3b05f38cdec2a41a043c15d2b31f75810e27fc68823", + "orderedPathDataSha256": "ca76674f485812e72da55c0c2d73ad39ef727e5f0a5bfd9cc2696aae93e0a4d0", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/playlist_remove.xml", + "upstreamIcon": "playlist_remove", + "upstreamPath": "android/av/playlist_remove/materialicons/black/res/drawable/baseline_playlist_remove_24.xml", + "upstreamSha256": "f040b686fea5b031a0ded8c314b3a33f7c6ab26fc03796e230eae53959606c77", + "localSha256": "79352679f628faba2cb6570e0374653ba788a4f843e6f60acb936259f7850190", + "orderedPathDataSha256": "29faf9e590d72b4f943ac7d2c1f3db4744c39557b80ae066e707d01435b98db8", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/plumbing.xml", + "upstreamIcon": "plumbing", + "upstreamPath": "android/maps/plumbing/materialicons/black/res/drawable/baseline_plumbing_24.xml", + "upstreamSha256": "b6bf1f7ea7b924e8ee4dc18a99deb5439d447e29d76aa5b9e325b44648fca0fb", + "localSha256": "8484fbaddda020a965a8800e9dcc857c1831bba8c048f713b50bf7d689529c35", + "orderedPathDataSha256": "f3a05d415e5faa4c23ee9a950d0562d296405e9e802f6b276c49aa42d456baec", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/plus_one.xml", + "upstreamIcon": "plus_one", + "upstreamPath": "android/social/plus_one/materialicons/black/res/drawable/baseline_plus_one_24.xml", + "upstreamSha256": "3b44273e891c10ff8b5a2ab1fac2b5af7a366b577cbdd60033f0be71ba767f23", + "localSha256": "530ab725d731dcc5b6ad761663741010ca8a4dda1abaf612d93cc9785fd39097", + "orderedPathDataSha256": "cf28bc327b2f0ffd929e31563b5c974e820e56973c674a8a3c91b2fe1a913404", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/podcasts.xml", + "upstreamIcon": "podcasts", + "upstreamPath": "android/search/podcasts/materialicons/black/res/drawable/baseline_podcasts_24.xml", + "upstreamSha256": "a75e97cb5f8efe360117ee414536e36f35d30196237d4bfa7a5788ce1e9dd620", + "localSha256": "343f5f5fe873be95c225bc2f3ad40d32ac3123e165fd785657a413d088af3aa1", + "orderedPathDataSha256": "4852467fd1877e81cc99efc6d0a22298b65652c218990b1917fdfb94442606ff", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/point_of_sale.xml", + "upstreamIcon": "point_of_sale", + "upstreamPath": "android/hardware/point_of_sale/materialicons/black/res/drawable/baseline_point_of_sale_24.xml", + "upstreamSha256": "a5aa099aa09b32c1ffc7b48eafcd6e38a450e64066d922001fd7e7a64f3aca89", + "localSha256": "c83816e58dbc6cafd0a2bc89baed1636370954b47af87c8d5a50277a32ecc76f", + "orderedPathDataSha256": "84bc08f99564e80c55c1baf31db9348dd104b0bdadc7e0db131c1780cb621b51", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/policy.xml", + "upstreamIcon": "policy", + "upstreamPath": "android/content/policy/materialicons/black/res/drawable/baseline_policy_24.xml", + "upstreamSha256": "a4afa23df4052c58e805b17875b553b5fb665c501e5c0b5a3fb04354683f24d7", + "localSha256": "2bfd01acd05b8b1948226199939b85d7695746c7ba2eafac93ae2beca957612d", + "orderedPathDataSha256": "414587b87d4f11a8c0287fbe23d1f5629aaa94cf13fd3cc7daa6b9e61624b5de", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/poll.xml", + "upstreamIcon": "poll", + "upstreamPath": "android/social/poll/materialicons/black/res/drawable/baseline_poll_24.xml", + "upstreamSha256": "0e94ceb6a779575229de3f72871b35131d9e80696590ca7f43a469c5ec328324", + "localSha256": "e1d2ed5f99e6c30be3ad08b143d855429298cda4647415dda5e9b7d3fb0e5cce", + "orderedPathDataSha256": "0cfaad9b87c240933f6bcb31fda116b19adebaec8c530c3c724a6a3dc44f0c66", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/polyline.xml", + "upstreamIcon": "polyline", + "upstreamPath": "android/editor/polyline/materialicons/black/res/drawable/baseline_polyline_24.xml", + "upstreamSha256": "965123d2ec2aef4295867fd69d17dd0bfbae0d76d3e32ca5a3ab68d1f63e6b38", + "localSha256": "45cb7c9299c5b5ce4b346740a5ef520510695ab8c7fd7904d2f0bbecf688f129", + "orderedPathDataSha256": "59b1af9159258349bd79cdab2dec4a0bcc82488718ca444e6224aac19468303b", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/polymer.xml", + "upstreamIcon": "polymer", + "upstreamPath": "android/action/polymer/materialicons/black/res/drawable/baseline_polymer_24.xml", + "upstreamSha256": "59d150e027b065ddc189bd5364be33d344eac103ba309bca511ac45954396cb5", + "localSha256": "92d446f9ea917b54313460d705a642e183d4a11d61580adc5fc4b9fc2861115b", + "orderedPathDataSha256": "3656250cbcf2901f0f481a935830b0a2f7d183943ec650350a168d111dddcbd0", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/pool.xml", + "upstreamIcon": "pool", + "upstreamPath": "android/places/pool/materialicons/black/res/drawable/baseline_pool_24.xml", + "upstreamSha256": "6ca249f0e3d7115963457e1533a56a4732e85e2990c060637e77967eb7acfb51", + "localSha256": "51493f462f0f13e5fd45ea3bc1fd65d8618d162caa0bd17df525e9137c764c24", + "orderedPathDataSha256": "ab8f02b45ba389d72ca2b853ddb0d2b9bff4935916472f5824538efcf4ac1437", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/portable_wifi_off.xml", + "upstreamIcon": "portable_wifi_off", + "upstreamPath": "android/communication/portable_wifi_off/materialicons/black/res/drawable/baseline_portable_wifi_off_24.xml", + "upstreamSha256": "3ab61190402903f8f6689475f3f4c9a819c66041dca507ad5fa505842387c419", + "localSha256": "de9252d71488557eddb2d5de71c77044e912937b590ef82dfe2a93fc09deade6", + "orderedPathDataSha256": "598fc7fd7a777fa9b4cf9e4d75cdf0b370b68a2fc4a1b12dedd9329839e1a6c7", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/portrait.xml", + "upstreamIcon": "portrait", + "upstreamPath": "android/image/portrait/materialicons/black/res/drawable/baseline_portrait_24.xml", + "upstreamSha256": "5cd8a0b01d022fb666a04de64b4e27752f2024a93ac85fa5be7b3c2a79a53890", + "localSha256": "f22e09e0f02c88a109bcc4f5082a8f1f01f625c0cff3ba8d168edfe188661ba9", + "orderedPathDataSha256": "09cd585038858c716007cfc16d486d9909c88aa1e7e2f7bcf2fe7d6b14296b47", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/post_add.xml", + "upstreamIcon": "post_add", + "upstreamPath": "android/editor/post_add/materialicons/black/res/drawable/baseline_post_add_24.xml", + "upstreamSha256": "a5ba8859733fe7babf3124c6b7fd0b4711b99895faf255aa0036a2f9dc58f145", + "localSha256": "11e0f01fffdd67b69bd7d0b343502419de9d9210ff778427507cfc0c315af5a0", + "orderedPathDataSha256": "af5d1b84105e98ba64105746b66ddd82bba436f2a0f05d17089bf9cf994eb70c", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/power_input.xml", + "upstreamIcon": "power_input", + "upstreamPath": "android/hardware/power_input/materialicons/black/res/drawable/baseline_power_input_24.xml", + "upstreamSha256": "debf6a88f84ee5887194a31f8a5f4903eb872b24d27e1e133db90041977ef3f8", + "localSha256": "c43a1d56a8093967280b8a02b8c416622c4d550215581121268f6c6c42f41a68", + "orderedPathDataSha256": "1a98595a7410140f3b8bd65e9678eb865d41f86675b9eb038a5cdea5617f848d", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/power_off.xml", + "upstreamIcon": "power_off", + "upstreamPath": "android/notification/power_off/materialicons/black/res/drawable/baseline_power_off_24.xml", + "upstreamSha256": "1ccea896faa08495c65822c7b226d247faf49cfae29c6969d84358c3df88e67c", + "localSha256": "a96577683e692919ed1b193944ead83492f59f570f2a87cba3bb574e841e5749", + "orderedPathDataSha256": "94f2e1930e3cc889da943253c4fc116ad7334410bcb3e659c25f8899b26a4135", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/power_settings_new.xml", + "upstreamIcon": "power_settings_new", + "upstreamPath": "android/action/power_settings_new/materialicons/black/res/drawable/baseline_power_settings_new_24.xml", + "upstreamSha256": "b045593853bd4d3b9d5816c2f71e317c980dea1a6a51cc5c802876c79f178811", + "localSha256": "1617a9dcf6190d72c70c54b379d0fe565c65d26e80d63eb99898e23e6697e660", + "orderedPathDataSha256": "cc56505a648ee2d770fe9e3a46b40d0464faa86e1777fffa3e9672a30c434105", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/power.xml", + "upstreamIcon": "power", + "upstreamPath": "android/notification/power/materialicons/black/res/drawable/baseline_power_24.xml", + "upstreamSha256": "ce4e20a2d205bd8a5710194ce29e7078de245770883c8cb5ef3b2af42512f698", + "localSha256": "2b71b3e7787da9569b989e1458c04d10ff5ca60427c64686836a185946e65239", + "orderedPathDataSha256": "b3202da79868614cabd578e6d2d208c599f1170edc4475fa658a1e2674c7374c", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/precision_manufacturing.xml", + "upstreamIcon": "precision_manufacturing", + "upstreamPath": "android/social/precision_manufacturing/materialicons/black/res/drawable/baseline_precision_manufacturing_24.xml", + "upstreamSha256": "928b47fa54c721c2cf7bb88fbd85c1e4b0a6901af072c2b0f4aa53a02ded7392", + "localSha256": "3bc73a1ac172ae624e6afb834236c364f13611c0bc06e33cb62ff5cc372997cc", + "orderedPathDataSha256": "529646d82ec3e6143bdbddd7541335f454557d1564fb121bc5c6d451b5252397", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/pregnant_woman.xml", + "upstreamIcon": "pregnant_woman", + "upstreamPath": "android/action/pregnant_woman/materialicons/black/res/drawable/baseline_pregnant_woman_24.xml", + "upstreamSha256": "43559c33b5ffa5733b6d0359d606b531096b4f6341ad3fdadb555b8c5fca6ff0", + "localSha256": "58cb72ef8ad4f6086b4d5f03d9b61c6774918c7cbf52460c0b3a8669a78c4acf", + "orderedPathDataSha256": "abd230a2191c85e8038dd8dbdd0f4cb1466ec6e7d17cf5ab5442abbbfc8d17fa", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/present_to_all.xml", + "upstreamIcon": "present_to_all", + "upstreamPath": "android/communication/present_to_all/materialicons/black/res/drawable/baseline_present_to_all_24.xml", + "upstreamSha256": "2a52bca186ea3997eb78c9e30a9501213cfce7196bdb64470af15bb92f866fb0", + "localSha256": "f2788ec3a75ea5606515b88e7333323b7e8edc5bc4a7eaf33134c4aa08698cff", + "orderedPathDataSha256": "e121acc35df9b8ebaeb6c8fc81d80400fcf5559fc2dc6a42d37a082c7c235d24", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/preview.xml", + "upstreamIcon": "preview", + "upstreamPath": "android/action/preview/materialicons/black/res/drawable/baseline_preview_24.xml", + "upstreamSha256": "1e82f833346279f04e18e623201c4eba70acb64663289c31c6ce470b9cbf2e59", + "localSha256": "ae2bd2ece5b4ea187186b1def700477ce4417fdde7889707876dfb151114c815", + "orderedPathDataSha256": "f6db583e56918d77604999c44644fa5a7be7f84293913ccf07742f04fd90aa94", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/price_change.xml", + "upstreamIcon": "price_change", + "upstreamPath": "android/device/price_change/materialicons/black/res/drawable/baseline_price_change_24.xml", + "upstreamSha256": "fbced945fd1c8d741ea32078bdaa111770478246afeee7f3fa6e0f0f392efb13", + "localSha256": "9ede05c698170ee9f910702399a0044bc04d9b6337d5a844d4b19885aeeae381", + "orderedPathDataSha256": "ed4e4d9fe78d13af4266292a34534a7d3dab9e8e49097eb958a2ee568f795a28", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/price_check.xml", + "upstreamIcon": "price_check", + "upstreamPath": "android/device/price_check/materialicons/black/res/drawable/baseline_price_check_24.xml", + "upstreamSha256": "d41ceb52d309fa9169874a6a750975135d9424fda6e299046371eba1d6ab03c9", + "localSha256": "0e3f14f69055e4e0858b421133dcf6e1b3a7da8475a0159748ac2c2b334f6728", + "orderedPathDataSha256": "670c9e43d85c861e8ba90a4ef3cadbb4161818c2f8a10e338871cce3b3f03bfc", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/print_disabled.xml", + "upstreamIcon": "print_disabled", + "upstreamPath": "android/communication/print_disabled/materialicons/black/res/drawable/baseline_print_disabled_24.xml", + "upstreamSha256": "4dde424155c30aa6572f732284fb7edb13fd0d4dae8469054d8ff98b7b191267", + "localSha256": "b0343e5f1f1b889fd42f7f0ec32867e71fa846436581bd010597dd370c16b497", + "orderedPathDataSha256": "4c64dafb28ff32058ef277248425955d2a9b86498d338a4ba70ef4fc99a6b089", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/print.xml", + "upstreamIcon": "print", + "upstreamPath": "android/action/print/materialicons/black/res/drawable/baseline_print_24.xml", + "upstreamSha256": "81a23be72af693d09bb847785fda0fdb16303fa4a33c392cc7a2c51b7fa8aef2", + "localSha256": "303033f79c22a74b3a41497c6ce41e8a00991b539e874a7a5de46248f33bf5cd", + "orderedPathDataSha256": "d93bc182afd820e7753909de022888699fc606e2e879156f62446974ca22f548", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/priority_high.xml", + "upstreamIcon": "priority_high", + "upstreamPath": "android/notification/priority_high/materialicons/black/res/drawable/baseline_priority_high_24.xml", + "upstreamSha256": "65064cab93b3f71821e6a2fad6be9b7fc3a949c3ea42c7acdc298614cc07dd6f", + "localSha256": "d8a9c9081166ab0f6f220e63f137f004c8b07847e053c76c5c178ada84bcc153", + "orderedPathDataSha256": "27bde14ed7c47f2d32f0f0d9b650f8283f514ae1a771ce038243aab0c5b87c99", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/privacy_tip.xml", + "upstreamIcon": "privacy_tip", + "upstreamPath": "android/action/privacy_tip/materialicons/black/res/drawable/baseline_privacy_tip_24.xml", + "upstreamSha256": "88e19b6c3ff5fb69bbb6e6774ca558df0c2b691edd353302ffa53617dedea9c3", + "localSha256": "5c845f45f8ac50e75ab044464e80e64d7ec0fce56e1b1e86e67307db90b845b8", + "orderedPathDataSha256": "27a45cafd6b7bf1096302314f66a1f1650ea6dd1dd06bea71ccd780aad9f13f7", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/private_connectivity.xml", + "upstreamIcon": "private_connectivity", + "upstreamPath": "android/action/private_connectivity/materialicons/black/res/drawable/baseline_private_connectivity_24.xml", + "upstreamSha256": "c5c86bf954289e5111d7c3fb029a4ef4c7735f2d15766825a6304cda909aa3d3", + "localSha256": "2f3fc9b5fcb66ff567aabbf493a5673b314dced4cf4ab39d35b0650b4ddf9a91", + "orderedPathDataSha256": "f530e94cd468698bb51b6cee1ef45471837352cef8557271e7573de33444d11d", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/production_quantity_limits.xml", + "upstreamIcon": "production_quantity_limits", + "upstreamPath": "android/action/production_quantity_limits/materialicons/black/res/drawable/baseline_production_quantity_limits_24.xml", + "upstreamSha256": "220d4414ccbe72d1aed5d365f65cd58f6a5dce9605e4bcead661b1404532a205", + "localSha256": "d88b889d1cbee9aec06d5c01336f0f2a9ae759892f6b9fb7873cd66f3c8d79c6", + "orderedPathDataSha256": "7225b6e98875a7a1bd464246db7f577aaeb2b93bddfb75329b8bd8a6e2d8cfb8", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/propane_tank.xml", + "upstreamIcon": "propane_tank", + "upstreamPath": "android/home/propane_tank/materialicons/black/res/drawable/baseline_propane_tank_24.xml", + "upstreamSha256": "78bd5b8c9c81984d124dcec3d2412786301d74f5487592868a13bc7caf3c37c5", + "localSha256": "eb42092700278ac18dd41b4386c89acca31a1862b03e6462a454a3d784541396", + "orderedPathDataSha256": "921ae0b06114e7513f55cfda6e7ed210e58eb5de3eb074d6fc77a0a3aff61ae1", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/propane.xml", + "upstreamIcon": "propane", + "upstreamPath": "android/home/propane/materialicons/black/res/drawable/baseline_propane_24.xml", + "upstreamSha256": "6c03570130f1c6415179490130bb351e895b0135e1afe57239c1959beba3fb30", + "localSha256": "2a58b50e90250f80bc36bb9323c6c8400c0e877e17fdf235e6920b6a85eed097", + "orderedPathDataSha256": "d1d34919cad74963bab53d58a0b8f650af3272a82d6be4e329af078635974005", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/psychology_alt.xml", + "upstreamIcon": "psychology_alt", + "upstreamPath": "android/social/psychology_alt/materialicons/black/res/drawable/baseline_psychology_alt_24.xml", + "upstreamSha256": "8537c945aedf7b4d92a136d538fbab093c7f6900dac3033b6324cc848c5625b7", + "localSha256": "f2164841f76e406d7e892aa04a28d2e4cb7c5b8109ab95b6314ec70fa494d9d2", + "orderedPathDataSha256": "b24967a0709752d47e97cb8878c6323f78800c1cc6abd9125a9fdcf99863a20a", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/psychology.xml", + "upstreamIcon": "psychology", + "upstreamPath": "android/social/psychology/materialicons/black/res/drawable/baseline_psychology_24.xml", + "upstreamSha256": "8d458ed7cb000b333c9aecd5ec180641b99eab0b984391c19b848b5bd0c07a55", + "localSha256": "7efe186115d98c2ed6b623c5933dbb31337144f61fb91da671b14456acd9a7a1", + "orderedPathDataSha256": "bb6aca747e39b38ac54ecdfbe82c3665f4a2c7b607aa4bcdacbea4736380e21d", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/public_off.xml", + "upstreamIcon": "public_off", + "upstreamPath": "android/social/public_off/materialicons/black/res/drawable/baseline_public_off_24.xml", + "upstreamSha256": "30737950d57c6abe0246f3c52368436168957eca0f016bbb291ec7f99cabbf58", + "localSha256": "5df330979a241546dbef0aac0e71dca00fdf199f1a5c29368ca0e244bcddea30", + "orderedPathDataSha256": "b06b58b50eac3e124668339b44b4b0d0128e3ad47877085e428e2caffd6bc098", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/publish.xml", + "upstreamIcon": "publish", + "upstreamPath": "android/editor/publish/materialicons/black/res/drawable/baseline_publish_24.xml", + "upstreamSha256": "bb97e129572e26a33085cdb4b612fdafc2294e26bae5bae699d95aa087ae5813", + "localSha256": "009732c5f957e35e1d94886b3cfe09c89139f328038f97ac832b3326755550bb", + "orderedPathDataSha256": "606f30dbfec114e6d880bf92971ac0211818568ced548be2ec05f80941cd073d", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/published_with_changes.xml", + "upstreamIcon": "published_with_changes", + "upstreamPath": "android/action/published_with_changes/materialicons/black/res/drawable/baseline_published_with_changes_24.xml", + "upstreamSha256": "a3a8bfe3381aee3119f500aab73e1e8705bd25560a50270e3270a24e3aba2a38", + "localSha256": "692fed984c65c6b364028368548007342f1e15e97b4aeffd92b3a4f8a174f2bd", + "orderedPathDataSha256": "bc854007dc88d49c7f2cfe0e82e4f7373fb38ccd185a2f48f314dfdc744b9ea7", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/punch_clock.xml", + "upstreamIcon": "punch_clock", + "upstreamPath": "android/device/punch_clock/materialicons/black/res/drawable/baseline_punch_clock_24.xml", + "upstreamSha256": "8d655ca37afc9a5ae2a8316af156b17763938bb9e5e98e793565f9c803bfee91", + "localSha256": "1750b11bece28a1afb6069dda34fd12e38147bce1b6cfdf646350a49ba20787e", + "orderedPathDataSha256": "a859e2ded9f3628a4aff55e61a913449ad236fef9741c28c0390940922e2a20d", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/push_pin.xml", + "upstreamIcon": "push_pin", + "upstreamPath": "android/content/push_pin/materialicons/black/res/drawable/baseline_push_pin_24.xml", + "upstreamSha256": "3472b1f26eb0737fe0b21e8b5974bd9f9e286c764c8bb0698bbd51b3128dbf39", + "localSha256": "78429b3abb75b208f12bc39b612a096ed1c8767a85669e4b2adfb7529f1eb968", + "orderedPathDataSha256": "1115869fd0d7d953fbe1245c9d66589eaf4c26a91daa5032d33fcb45bba39285", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillType", + "value": "evenOdd" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/qqq_no_network.xml", + "upstreamIcon": "wifi_off", + "upstreamPath": "android/notification/wifi_off/materialicons/black/res/drawable/baseline_wifi_off_24.xml", + "upstreamSha256": "def4cc81ca9ac3d2a5a7972ea38e31238b9ecd479534dc7fcde652f0457df45b", + "localSha256": "931e643310e8015d0b62492e095cb0a82d69d98c22f63c2f3fc3131807412c26", + "orderedPathDataSha256": "b9a40a52df0d18d33add515c0ce1be0bf3093102bef734cf8b9a8e8dd99c41a3", + "originalGeometryMatched": false, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "154dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "129dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#0062FF" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/qr_code_2.xml", + "upstreamIcon": "qr_code_2", + "upstreamPath": "android/communication/qr_code_2/materialicons/black/res/drawable/baseline_qr_code_2_24.xml", + "upstreamSha256": "e59618e92dbc2569f00ba5adb2721a0ae8202e8810a7f99b02460b73f575c727", + "localSha256": "28c3b23a72623ea83fa981eb8937e867a11014fc62e0b3858059f98827c6c1af", + "orderedPathDataSha256": "adad90c3d4e60c82d9af40af258de782d632c9e1ca8e0ddaecbcb3a436494ef6", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/qr_code_scanner.xml", + "upstreamIcon": "qr_code_scanner", + "upstreamPath": "android/communication/qr_code_scanner/materialicons/black/res/drawable/baseline_qr_code_scanner_24.xml", + "upstreamSha256": "c1cf476986db7400f65eaab845db0e3fd99c24a5e0d0d0df8a539860ecabefdf", + "localSha256": "aba7d24897f5d6df6c49156a03e5f07f82ee2cb2d52f687c070c489cb98a5958", + "orderedPathDataSha256": "1cbb329679f1065147b41268533d23e0546259ca5da140ac431b564dc4a08131", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/qr_code.xml", + "upstreamIcon": "qr_code", + "upstreamPath": "android/communication/qr_code/materialicons/black/res/drawable/baseline_qr_code_24.xml", + "upstreamSha256": "442c932d0026d80977c0391d58446276aab45b3ab40aca5257730108ff73392f", + "localSha256": "682070d87d9e56e0be78997d2241a6c63dbb00fc173651ca76d18e59f711ccae", + "orderedPathDataSha256": "50a956ce09c18927aae921b8c0f8dd186f24e2e8e7f0ccefdaecb093d977e9d5", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/query_builder.xml", + "upstreamIcon": "query_builder", + "upstreamPath": "android/action/query_builder/materialicons/black/res/drawable/baseline_query_builder_24.xml", + "upstreamSha256": "e4fe13ddb79b9673e2aacbf1493576b63664bb266e204afa24db83c6435f1ef8", + "localSha256": "03b8ca7e3e5d32b09f73fc36f2e93f6acab75f267bddf76835de1c8db788f870", + "orderedPathDataSha256": "0d3b3f6922f646d62e277f90cca992aefb17d92204d7ba2fc8d98d2659f5189e", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/query_stats.xml", + "upstreamIcon": "query_stats", + "upstreamPath": "android/editor/query_stats/materialicons/black/res/drawable/baseline_query_stats_24.xml", + "upstreamSha256": "9b5a7fc82fbde5b7393c9b2da6ea74e2ae1503eb8e2d636d75807c37c15ca292", + "localSha256": "c02fc4258b3cb96daacd61b69155d0a41d68335a2dc0f5bf4cae27194c3b788f", + "orderedPathDataSha256": "047a32e18b187caa7ff46f98cb1c129596c6484d9e7c4e26a0df7b9febd46312", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/question_answer.xml", + "upstreamIcon": "question_answer", + "upstreamPath": "android/action/question_answer/materialicons/black/res/drawable/baseline_question_answer_24.xml", + "upstreamSha256": "2b7033ad87b1a4ac0fd248303adc95ee2c910c4745e9d57399ba18b1ca5ec678", + "localSha256": "eb672ebfcd3abec6c941ab5f209a647a463c37b95cdd16f68fb3bfdab86858e5", + "orderedPathDataSha256": "fd986c3f7b3632060d09b0742b36dfb99955204637440f6556671ff760192528", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/question_mark.xml", + "upstreamIcon": "question_mark", + "upstreamPath": "android/action/question_mark/materialicons/black/res/drawable/baseline_question_mark_24.xml", + "upstreamSha256": "58c4ef3878148f5c25581b9ee5a807db9f808036051c53b18575a2ae878b942e", + "localSha256": "6fada714319d6d1d98fffb6a41180f2c81a3d11f83abb329b0862d96032993fa", + "orderedPathDataSha256": "2061513b8e3fe7958fe7094fffb68bc6e3e61a8f7df0ba91034991922ed5d514", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/queue_music.xml", + "upstreamIcon": "queue_music", + "upstreamPath": "android/av/queue_music/materialicons/black/res/drawable/baseline_queue_music_24.xml", + "upstreamSha256": "b4284a87bee35f33b1027840b90602d5cc6b895b310152b5b6f08ca857487765", + "localSha256": "9c6a7a89c0a4acb2b4af62e59fec56a66b7b18d60a5791bb237b51a7b9aac43e", + "orderedPathDataSha256": "9e4da5d70e8c90adacf222a328aea44cafbd4778e95de3a1e5dcf3c307421a93", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/queue_play_next.xml", + "upstreamIcon": "queue_play_next", + "upstreamPath": "android/av/queue_play_next/materialicons/black/res/drawable/baseline_queue_play_next_24.xml", + "upstreamSha256": "6cc533c9c91508b483387c1dfda5e1e377eb6f1fe0fa32634fc28370429f09e2", + "localSha256": "5cdd1680446ea4a6922d39e1028dc1c10cd982852a85401bff77c406ba6db261", + "orderedPathDataSha256": "2903dd978b44d4e17adc2e2370f05f7dfe59d9eaa0c639de9508f08eb38fa699", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/queue.xml", + "upstreamIcon": "queue", + "upstreamPath": "android/av/queue/materialicons/black/res/drawable/baseline_queue_24.xml", + "upstreamSha256": "e5aba84818bacfff0a77dccc94e5af0aaeda9e3486e627458e33bbf6f2ffce1e", + "localSha256": "2bbe21cbe1f6b3a391516a19ca0f0470b95cc8c36f8c5af8073d051b7a57ad42", + "orderedPathDataSha256": "8d3086d102d2b4b7c5fa3c371c812aff886b1e8c1b7bb9fab383836da449c5fc", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/quickreply.xml", + "upstreamIcon": "quickreply", + "upstreamPath": "android/action/quickreply/materialicons/black/res/drawable/baseline_quickreply_24.xml", + "upstreamSha256": "50f96679a9dfa32896600f84b8fb108630593328fe5434ea40cbd7d5f359648a", + "localSha256": "cadae5538279c807ecdbdd35c7f8eb994c728ed5f1411f5bb8555f1c0bab7fa3", + "orderedPathDataSha256": "f160b7326b4b548748bcd8011cbe3a29394a5fcb5558b91288025c9c05e612f8", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/quiz.xml", + "upstreamIcon": "quiz", + "upstreamPath": "android/device/quiz/materialicons/black/res/drawable/baseline_quiz_24.xml", + "upstreamSha256": "e5985ad82a3f2d07cedabe2f6a4491581bdc4822371955aa1a377182a434e568", + "localSha256": "14ec8a88e628975d6d8162359e4c62f01e921fd898e4b3b239c64bf7647b2196", + "orderedPathDataSha256": "f80f45be86cb3965800e50abeb10d8ab0617de2f485081c6015e077b82f6da17", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/r_mobiledata.xml", + "upstreamIcon": "r_mobiledata", + "upstreamPath": "android/device/r_mobiledata/materialicons/black/res/drawable/baseline_r_mobiledata_24.xml", + "upstreamSha256": "4d2523ade0a9e30f18f30ef17ab06728c86a9c89ab332599230c085bb2358548", + "localSha256": "824fa3a290e486c9bf1422be6476ffd1bf80e158d193b8a2c81f62265aced86c", + "orderedPathDataSha256": "6a7b5e3c9b0e1904a69949fa6446bad59fb2227e2cbcf365555f5d575b3aeb36", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/radar.xml", + "upstreamIcon": "radar", + "upstreamPath": "android/device/radar/materialicons/black/res/drawable/baseline_radar_24.xml", + "upstreamSha256": "f0a9b5e191f961d11a16947137f5718632a344e6f91bd494c1d925584f847b10", + "localSha256": "ab11cc6333121e95c1846323d9654b5ccefeede0dca92a579cb2553c4a20a268", + "orderedPathDataSha256": "385073602757249414808b760431d2b403ec8709d900f9599f8ba2d8f4122923", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/radio_button_checked.xml", + "upstreamIcon": "radio_button_checked", + "upstreamPath": "android/toggle/radio_button_checked/materialicons/black/res/drawable/baseline_radio_button_checked_24.xml", + "upstreamSha256": "37f35a48c3378c1a1e626eb19ffe4200495472c288f47bbb24146ef46ff639c0", + "localSha256": "2ab9e0d7340dc2dd51f148ca56e15dd63b3446a27fbe97391e0ff3b4f3d8b199", + "orderedPathDataSha256": "2229cd90d0a385af3d42a28a5162812e2d9cf2f7b498f4c6be448b066e068646", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/radio_button_unchecked.xml", + "upstreamIcon": "radio_button_unchecked", + "upstreamPath": "android/toggle/radio_button_unchecked/materialicons/black/res/drawable/baseline_radio_button_unchecked_24.xml", + "upstreamSha256": "1e84ad9d4ae0c8960f01277cd8d8c5724ccd7170c7914d4db1a4bd433fb1aa2d", + "localSha256": "2c21cad9cc7fe1730b1a5079686b40d1a405438134022ca914d764c67deac18d", + "orderedPathDataSha256": "73c53790ac113af4ae9769c7612b0778ad86d1b745660bf7bf9584beafb30c75", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/radio.xml", + "upstreamIcon": "radio", + "upstreamPath": "android/av/radio/materialicons/black/res/drawable/baseline_radio_24.xml", + "upstreamSha256": "5d644a93e34d989f0e168270ff5588083fbc5ae0f088803ad061bde68aab6fdc", + "localSha256": "2e5030e9c29a492da75ddb59ca146f152257230b20f77039eaf3f24edc2d644b", + "orderedPathDataSha256": "47e7a12c0413ad415e2eaaad45c496d9c05120f5079efe8a405eaadf06208aa5", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/railway_alert.xml", + "upstreamIcon": "railway_alert", + "upstreamPath": "android/maps/railway_alert/materialicons/black/res/drawable/baseline_railway_alert_24.xml", + "upstreamSha256": "35755c7e309175218ba664fd09ffe6a6464d4b568a0978ed5f57efb2dc47f88c", + "localSha256": "fccf351a1f170bc735bd9418c5eb5be86d366bfd1f9bb6f3369b3748dadfc28a", + "orderedPathDataSha256": "5d39631b04787ce7e23a41f089509fc77c0bfd8e441ea86c74c2de37696a4160", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/ramen_dining.xml", + "upstreamIcon": "ramen_dining", + "upstreamPath": "android/maps/ramen_dining/materialicons/black/res/drawable/baseline_ramen_dining_24.xml", + "upstreamSha256": "2ee68e49c1d96310377f8a7218e2bee08b10cb1f1ccd4e13ad85ea17e6612cd1", + "localSha256": "b9e9c59c93e8b885a3dbc3cb655bc9c499fb4c4c8ade175dab3c08b40214092c", + "orderedPathDataSha256": "b46cdb3c6501a15cf6f8f9076af5b9285cc5c0e76477814970026b8ff08fcda0", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/ramp_left.xml", + "upstreamIcon": "ramp_left", + "upstreamPath": "android/maps/ramp_left/materialicons/black/res/drawable/baseline_ramp_left_24.xml", + "upstreamSha256": "bfe5211938b89f1353ea9d14abc7baf395ed51930afb68d7c7c7cb335ad9dbcd", + "localSha256": "228ede774ea4441b604f61027e5a362cd2637699163cfd66411c6a3c365c897c", + "orderedPathDataSha256": "a8b5f6167cebdd8e896a90360fe2c88ec7b45194cde8a982a5b207ed4d2c39f6", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/ramp_right.xml", + "upstreamIcon": "ramp_right", + "upstreamPath": "android/maps/ramp_right/materialicons/black/res/drawable/baseline_ramp_right_24.xml", + "upstreamSha256": "352ffbfc61bf8d67cfed29c766a60944494752460539b2556ae9e59f8912c146", + "localSha256": "3da2b22e6865c6e249e985cd1194f52b766d53003d62323d4e2a9807b2a271a4", + "orderedPathDataSha256": "84c7fc6bf54ca2beac2c0eea920bd2f219a7f48e020e6223f86853cd1f523413", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/rate_review.xml", + "upstreamIcon": "rate_review", + "upstreamPath": "android/maps/rate_review/materialicons/black/res/drawable/baseline_rate_review_24.xml", + "upstreamSha256": "e8045717d5dd85e4de278db89b432efcfb9ccb73cc454a40c5869a9f8c907fa9", + "localSha256": "0daaef3263f641abf6c91e8ea510ab1197db59c15f22faed4382f7cb5e7ae8a5", + "orderedPathDataSha256": "26f89b56dbd800a6b509f2e3f65f713e8b97a53a09d220bd932e9322ef5c7dba", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/raw_off.xml", + "upstreamIcon": "raw_off", + "upstreamPath": "android/image/raw_off/materialicons/black/res/drawable/baseline_raw_off_24.xml", + "upstreamSha256": "bee4a14b2b8aca9ff072e02deb60847be37be2ea37e194ff360f7135b1cd13cb", + "localSha256": "474133e7dccfa2df9eb63352aba1a4f390f8a56792d3d0ec088afbd4c08438b6", + "orderedPathDataSha256": "c0fc73ebaee89273fa5a8c344619579bdc5c096493cef7e0eab3fe2210da33f2", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/raw_on.xml", + "upstreamIcon": "raw_on", + "upstreamPath": "android/image/raw_on/materialicons/black/res/drawable/baseline_raw_on_24.xml", + "upstreamSha256": "f5323748fd631c0d7bffbc267e69b363a4dc8119dc91984a0c2e639c30748c9e", + "localSha256": "223f88c85a73a87f81943c3a3b1e3b6f9dec0a9b96215f0d71979cbac81eeedc", + "orderedPathDataSha256": "f67ba2015fe47687110a4b5e093a866db1342fb57a9a536ade6e2e40230bfd01", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/read_more.xml", + "upstreamIcon": "read_more", + "upstreamPath": "android/communication/read_more/materialicons/black/res/drawable/baseline_read_more_24.xml", + "upstreamSha256": "2737fd904292127e9c7f5c78bb02108aa47abc41e155994a28a47eb32b46d0d6", + "localSha256": "df7e52fd79e1eb31f0a8aae6e9caab45c601e6cd2eef96c07efc89980873b02d", + "orderedPathDataSha256": "27dce343aca2c54299182c3c65f258698431da305e0b83e82d50abdb3877b0e9", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/real_estate_agent.xml", + "upstreamIcon": "real_estate_agent", + "upstreamPath": "android/social/real_estate_agent/materialicons/black/res/drawable/baseline_real_estate_agent_24.xml", + "upstreamSha256": "a16b78e534de3dee9517f471ea730ba91c75b513d2c1239e4b2857a83374d4b4", + "localSha256": "bfd288102858e9ac089731b889d72da80ae9325b235b41651e10c2b7da4271f4", + "orderedPathDataSha256": "e64372368a12138cac5a41ebb4c398bee8101740930c5ae13885d102e3844626", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/rebase_edit.xml", + "upstreamIcon": "rebase_edit", + "upstreamPath": "android/action/rebase_edit/materialicons/black/res/drawable/baseline_rebase_edit_24.xml", + "upstreamSha256": "d4ba15a9ffbb72914375f5401aac0607c38ed90eb474b8e045856ba7f4068a38", + "localSha256": "817269d3c018015bfc98b89a4ad279470d6e0f7f1d7459642483503da297869d", + "orderedPathDataSha256": "ca51220dad31eaea7463e27c0880fb0937873a3d40c9ea016877d7778c3c71be", + "originalGeometryMatched": false, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/receipt_long.xml", + "upstreamIcon": "receipt_long", + "upstreamPath": "android/image/receipt_long/materialicons/black/res/drawable/baseline_receipt_long_24.xml", + "upstreamSha256": "ec85f5e501679addde8da0dd26631a247232d448d6deac47d9b988703692e8c5", + "localSha256": "d0327af370dd7c55fe44b0bc16546940720ea6471460dbd410a8d2dd7de3a72a", + "orderedPathDataSha256": "d3c4b44ae9386defb244be84442dee7a381b85612c3e2d3912f731cd441b581c", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/receipt.xml", + "upstreamIcon": "receipt", + "upstreamPath": "android/action/receipt/materialicons/black/res/drawable/baseline_receipt_24.xml", + "upstreamSha256": "a7b7ed843de92d264883fb33112670db1f63fcbb638be2948adaea5d6cc1c4e5", + "localSha256": "7001011888235722f184be43d33cc7439d4a1d703450ee6dd03f6aec99453b66", + "orderedPathDataSha256": "ab01b79a33ff6b15a823112603f4ec6a37da0899168f667dcbb0cd4ffaf3ebcf", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/recent_actors.xml", + "upstreamIcon": "recent_actors", + "upstreamPath": "android/av/recent_actors/materialicons/black/res/drawable/baseline_recent_actors_24.xml", + "upstreamSha256": "8d521b868b599888d6016255e45cd2efd696fa57c8eba9bd2bb03ea1b444ebc5", + "localSha256": "140facade478f927cac89dd891944ec9a91d67cf8ad63c49827543eeda6ee6da", + "orderedPathDataSha256": "efe152883f70b81f434d1a4526f752b70d0d99bbe50835170131edf26719b8a4", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/recommend.xml", + "upstreamIcon": "recommend", + "upstreamPath": "android/social/recommend/materialicons/black/res/drawable/baseline_recommend_24.xml", + "upstreamSha256": "975f61da55932d1400acc6a95b5bee94ed163a28c975358ce355ae388212decd", + "localSha256": "74c2b6e12247115eea0d24f05fd3a9e36cefb206f95ae2ff29070417c3fda63d", + "orderedPathDataSha256": "3e9f4c46f77f9f8d472f825addeac77b2dfaffafe70a72fbc1ce67498ed05846", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/record_voice_over.xml", + "upstreamIcon": "record_voice_over", + "upstreamPath": "android/action/record_voice_over/materialicons/black/res/drawable/baseline_record_voice_over_24.xml", + "upstreamSha256": "cb8d80a275b3c2bfbac055371d85d53e833a63b41475889b191f0a2db9a66e0f", + "localSha256": "cc9851e8f6c7f5b33f36982b87200ac2d7085439f7fe9e069d4a34b8e13359c3", + "orderedPathDataSha256": "5ce3d5a63df5f095c33fcfd7d7ea07be5bf287c2bb9f8fc3eb2d5efa716af4ae", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/rectangle.xml", + "upstreamIcon": "rectangle", + "upstreamPath": "android/editor/rectangle/materialicons/black/res/drawable/baseline_rectangle_24.xml", + "upstreamSha256": "b3937d3326f74c5111a13e7d3cb5d0572b23a7f4504052de71e1d8303f7485e6", + "localSha256": "d46f605eaf5d2294c3c57c9cecaac7117d0ac119390977ef0412a0145f47bb65", + "orderedPathDataSha256": "4aa2b5f743b795716d991bcc9e562a73437d48e6d0708893324af51a6e07c74f", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/recycling.xml", + "upstreamIcon": "recycling", + "upstreamPath": "android/social/recycling/materialicons/black/res/drawable/baseline_recycling_24.xml", + "upstreamSha256": "1219c77dc528a88c248be176d498ca592f877d9c49ceb40e68e62c0931659df3", + "localSha256": "ebded788741845aa2ecc113dab0a6616013dfde4d79162fe48e4bbe2ac5996e4", + "orderedPathDataSha256": "77228208e0dcc3461b5b79d52cbbe1e1e57fd5186e79ee96012495610901dd9d", + "originalGeometryMatched": false, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/redeem.xml", + "upstreamIcon": "redeem", + "upstreamPath": "android/action/redeem/materialicons/black/res/drawable/baseline_redeem_24.xml", + "upstreamSha256": "b472a796464da2dfc6a21d2386767788da688cfa49ce227679e496e0696dc885", + "localSha256": "8dbfc3d115ffa70d55e699ddda0c6c8f631fce52a71f57a09f20efd9a6290754", + "orderedPathDataSha256": "1fd1dc6fe08a0bdcb6eaf2cf94d8b402a062013c4e7a7214408147ca5c450d3f", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/redo.xml", + "upstreamIcon": "redo", + "upstreamPath": "android/content/redo/materialicons/black/res/drawable/baseline_redo_24.xml", + "upstreamSha256": "cb6065aef3e6c9c9097616db3398fa9c0f5065accaee30e8dca841b43b6c44e3", + "localSha256": "0bf034023e2d9bbb7cd85211da80ac562ecbf3a65c7d9f81c0c3c7e6c776c29e", + "orderedPathDataSha256": "aeae46490e23e8df65336e92bcbc5545f6c3f115457e15abf9cacf731156d90f", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/reduce_capacity.xml", + "upstreamIcon": "reduce_capacity", + "upstreamPath": "android/social/reduce_capacity/materialicons/black/res/drawable/baseline_reduce_capacity_24.xml", + "upstreamSha256": "66c76d2822097ff930671c41f62a89fe9160d059d2c1ec3adf4e354c19bf7567", + "localSha256": "f67cecde2d8c72b42b556c1001449348d5c92e6249d9f73ae6fdc0ac1f3a7e4d", + "orderedPathDataSha256": "468fbf973e4874cfd97a8eb9e43eefd91de05314bbda7dbfc274945782a24537", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/refresh.xml", + "upstreamIcon": "refresh", + "upstreamPath": "android/navigation/refresh/materialicons/black/res/drawable/baseline_refresh_24.xml", + "upstreamSha256": "bc41660e68af6a70f7f73272dae6e0bd3b4c45da2f9cdf43a77c89434d8523ba", + "localSha256": "cc8ef0f87d8c69a7e989c80005064f70ae179592dbae80ef8a624c5223f99604", + "orderedPathDataSha256": "d74fdce9900d5978422e12fc7ae620cecc68f0e835c5441ca17407f4d3968646", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/remember_me.xml", + "upstreamIcon": "remember_me", + "upstreamPath": "android/device/remember_me/materialicons/black/res/drawable/baseline_remember_me_24.xml", + "upstreamSha256": "d5bbb3221bc5a69609c2b398b5b4d8cc009e4e1ac4de84ab990156695d9ffbf0", + "localSha256": "2cbe293932eaa2453e1770d736e463713dffd1fccf5d6671abffce131165242b", + "orderedPathDataSha256": "e8cd7b23db43298418be7227c8d9933c7488e62c48634c73b2ac132029c8a692", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/remove_circle_outline.xml", + "upstreamIcon": "remove_circle_outline", + "upstreamPath": "android/content/remove_circle_outline/materialicons/black/res/drawable/baseline_remove_circle_outline_24.xml", + "upstreamSha256": "9e9b137056c00c248d0148df647b4d09855c09d8af17339decbad79fd56f1ed1", + "localSha256": "b74c6a4c46e70cd5fad14513a5adea6eba962830b1130a9d7227440807cb9098", + "orderedPathDataSha256": "75fe4073874267d1759058606ea7542807d0180dafd3457673f652706dd22766", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/remove_circle.xml", + "upstreamIcon": "remove_circle", + "upstreamPath": "android/content/remove_circle/materialicons/black/res/drawable/baseline_remove_circle_24.xml", + "upstreamSha256": "fdd5faa301da2090c52e5ac4922a9470de08450f94fd422471c9b2b81b7faf7f", + "localSha256": "d8794f4d0542416f53d9d17e08b99c24797c1c1e3d52ae3ffdb62325980eff90", + "orderedPathDataSha256": "56a378fdfda3760908ecb7198c1c51ef4ee2191e192727f8e7a58984412dba4b", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/remove_done.xml", + "upstreamIcon": "remove_done", + "upstreamPath": "android/action/remove_done/materialicons/black/res/drawable/baseline_remove_done_24.xml", + "upstreamSha256": "f8aa1f2e3b62609c308b9b2d78dd689cc58f946ef98fe7f4ac1a6d5b428cfc7b", + "localSha256": "328edb8dcf0e73488e61a9e0f458a65578c7f182d1d74c625de89a459b5a0151", + "orderedPathDataSha256": "81d15d7443afa9ef3c9ebb0cf9cd526345e40c2656eaf5d5f9b36de5d024882e", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/remove_from_queue.xml", + "upstreamIcon": "remove_from_queue", + "upstreamPath": "android/av/remove_from_queue/materialicons/black/res/drawable/baseline_remove_from_queue_24.xml", + "upstreamSha256": "c030cf6727e2846993c4e6b9b574da9470e32d19812cd0d9de6fbc1df5115308", + "localSha256": "88b2f9f20ac452199106dab2a648c62522b0d4dc523fc99f826678212a683025", + "orderedPathDataSha256": "b4649956cce005a65fca1e53d78cc72ebecd56ab898e17e3da374a5c5c1f612c", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/remove_moderator.xml", + "upstreamIcon": "remove_moderator", + "upstreamPath": "android/social/remove_moderator/materialicons/black/res/drawable/baseline_remove_moderator_24.xml", + "upstreamSha256": "a925e6b7bc60c8fd8f56d8ce523a300f42f9ceb2f60a677798607da4587f4528", + "localSha256": "cb3c5167bf954d42698b116f37a4ced6d5851843e9ead4fc3eb9aed062e80f0f", + "orderedPathDataSha256": "8d050e5bf162532cbbeb93eb0f76370a3c7470a00c94e0d74c3b36773b71d558", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/remove_red_eye.xml", + "upstreamIcon": "remove_red_eye", + "upstreamPath": "android/image/remove_red_eye/materialicons/black/res/drawable/baseline_remove_red_eye_24.xml", + "upstreamSha256": "ca28a5336b5c5c80369efaa9e1cffef74af9ce87eab1f3327b98f19fedd6645c", + "localSha256": "80429ed37f9ede51153f732dd3fadd886d3ea6e5eea9e859df3196e00e084637", + "orderedPathDataSha256": "efe6e4a613d856261a06fae75c883f8f26dfdb742d0ff09c35222d6cd4b839b0", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/remove_road.xml", + "upstreamIcon": "remove_road", + "upstreamPath": "android/maps/remove_road/materialicons/black/res/drawable/baseline_remove_road_24.xml", + "upstreamSha256": "1e8cee14a9397b0b4827468daf3576cc9c1bba7ddcdd550982d116ce46b04d05", + "localSha256": "b37a6406bd2f6cbccca8043481563317c2ca4e44ab756fa5a04742887930b478", + "orderedPathDataSha256": "a0c42cf8a9d91feafd4e66c525910fbe41c1332c5d0e3a7e521a88c952796735", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/remove_shopping_cart.xml", + "upstreamIcon": "remove_shopping_cart", + "upstreamPath": "android/action/remove_shopping_cart/materialicons/black/res/drawable/baseline_remove_shopping_cart_24.xml", + "upstreamSha256": "22da7036c7bb8835c634f9429f817129436f1bbd4bede49f2d5e5c3e72ad160c", + "localSha256": "ecce5c3a065411e235eb5280610dd0ebde3c59e54a605044159db531d211b604", + "orderedPathDataSha256": "1972c5b9a8eaabf18844ef088a590b6fc110097527222bb72f57a210294a40a8", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/remove.xml", + "upstreamIcon": "remove", + "upstreamPath": "android/content/remove/materialicons/black/res/drawable/baseline_remove_24.xml", + "upstreamSha256": "27332040481c1e180a2f81d8670ffa2f4ac25e9b59ba972dc258d4c44e7700dc", + "localSha256": "1a4e45d6121b034713e42f973367b82d1abc5758d22bf4be09434670ae7f7f13", + "orderedPathDataSha256": "06587d95218e9fd037079285592778c22ba188f43b11b3c74ed98fc90e383616", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/reorder.xml", + "upstreamIcon": "reorder", + "upstreamPath": "android/action/reorder/materialicons/black/res/drawable/baseline_reorder_24.xml", + "upstreamSha256": "8e24eebc10d29c7bd3654de836803b555d41ab4b828b8557b730cf663cbbf050", + "localSha256": "6a187a06961e047154797a9574fd69c47843d171b2af8a5701b6e36eb4844bf3", + "orderedPathDataSha256": "1370b3b4273db6f58ede743e341cd09ec8c80818dcb935a2038322ebbe4498a0", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/repartition.xml", + "upstreamIcon": "repartition", + "upstreamPath": "android/action/repartition/materialicons/black/res/drawable/baseline_repartition_24.xml", + "upstreamSha256": "c999b8769783b78bb5c1130ce4e446502ab5f3b0ebbdbf9998a5459072c8252c", + "localSha256": "bcbdad41c6c10cac1e8f5a3fa1a93a6b9195f08caa1e9c4786909c246b14ba1c", + "orderedPathDataSha256": "74dec277360f588dbf300e3bbc410e035ca170a9e3d6f85b4cdd2518d6035bba", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/repeat_on.xml", + "upstreamIcon": "repeat_on", + "upstreamPath": "android/av/repeat_on/materialicons/black/res/drawable/baseline_repeat_on_24.xml", + "upstreamSha256": "76a95bb210085f8b0dbb164c6936a938a8c205202f87028081b2b235ead10ce0", + "localSha256": "303ad78d26a1330739e4469ce85314b669b7d2af323179637266062c91e606ad", + "orderedPathDataSha256": "6d75f40c8b1bcee3eecbb5dd3175bd597409686f8c7ea21ffde98406ce469a04", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillType", + "value": "evenOdd" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/repeat_one_on.xml", + "upstreamIcon": "repeat_one_on", + "upstreamPath": "android/av/repeat_one_on/materialicons/black/res/drawable/baseline_repeat_one_on_24.xml", + "upstreamSha256": "bc7681da2aca2c79a5daffb7d07838d76ea975226e249ef162d2251fcb308ff4", + "localSha256": "7043d0cb21ba43d823a4fd9982f7daac6b69677747f2ed1ef7fcf3fdfaed6ab7", + "orderedPathDataSha256": "5dac2684e140bfc1b6b27adc4cb24b912e7208d5e2ce0416451483fda07b1912", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillType", + "value": "evenOdd" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/repeat_one.xml", + "upstreamIcon": "repeat_one", + "upstreamPath": "android/av/repeat_one/materialicons/black/res/drawable/baseline_repeat_one_24.xml", + "upstreamSha256": "06e5dcb0232c5ca9d65fdc873c97a92deeee67af42721405537c132d45922e3d", + "localSha256": "8d600b3506c322b27ee93687ef178d0f14d19c0c36e960fd1d70829c66e8b4d1", + "orderedPathDataSha256": "9704ef5c8af75cc41ecf5d1b31bef708669867fa373e4c7c038441f5655f2f4c", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/repeat.xml", + "upstreamIcon": "repeat", + "upstreamPath": "android/av/repeat/materialicons/black/res/drawable/baseline_repeat_24.xml", + "upstreamSha256": "8a0f433ba62bacb8402365bd44772801fbe2d5606c96246336f33df6fc885a68", + "localSha256": "dd2077aeaee8a9f4733aefe6adda81a36e68fa25ee8e43683da49be3f106d54f", + "orderedPathDataSha256": "1a56c24dc84d6c60c8779d72f6dc1a87a5c170777b8ee99be28781b75826c4e5", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/replay_10.xml", + "upstreamIcon": "replay_10", + "upstreamPath": "android/av/replay_10/materialicons/black/res/drawable/baseline_replay_10_24.xml", + "upstreamSha256": "e951ba17cc35955892105003a359869083f16821be3e5d0b9baa01339e23be6b", + "localSha256": "8e228690c883b40c78d2ee23d5c4b8ea7148497e6db087d8b560f4c1bef23717", + "orderedPathDataSha256": "2ea2195aa6e09e9d5232215ace48f3bf5d2adbacc03191bdbe03abcef1d5e974", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/replay_30.xml", + "upstreamIcon": "replay_30", + "upstreamPath": "android/av/replay_30/materialicons/black/res/drawable/baseline_replay_30_24.xml", + "upstreamSha256": "fcd394bb6ded6daab4875534f76b01f9f1c9f254684e98f6d01367acb9b56e74", + "localSha256": "99d7827cf03d5184ce2de01711296213dc8b46cb4e6558ad9b75036294f63270", + "orderedPathDataSha256": "d11ad84077163c87204672d8f2313f50e7976c572a9b883ae7500bfba4fc0ea5", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/replay_5.xml", + "upstreamIcon": "replay_5", + "upstreamPath": "android/av/replay_5/materialicons/black/res/drawable/baseline_replay_5_24.xml", + "upstreamSha256": "cb9d6d1ea0759fac2b14cabc000a5710758fa06f753cbc175e8d4a102308b531", + "localSha256": "d0b9ab2de1322a8d960a41e876b5360b10f49559289cfcbc241863f94832ab10", + "orderedPathDataSha256": "e16f5421aa39a761caceebc41fd631d01fd41b8c077bbfa903fb73dee96c308c", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/replay_circle_filled.xml", + "upstreamIcon": "replay_circle_filled", + "upstreamPath": "android/av/replay_circle_filled/materialicons/black/res/drawable/baseline_replay_circle_filled_24.xml", + "upstreamSha256": "e0401d5bc54a23ba9fb0160d0bd85dfcc47587f4eee416c542a1959cd6fce3a3", + "localSha256": "2c337173b196bcc4179c2925bd86d248537a498936801e4e6c2ed5d2744bc94e", + "orderedPathDataSha256": "2001e04124e32b38d24f7a461c9d5434db96ee6f8cd8eff8e8b5bf0983e0f123", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillType", + "value": "evenOdd" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/replay.xml", + "upstreamIcon": "replay", + "upstreamPath": "android/av/replay/materialicons/black/res/drawable/baseline_replay_24.xml", + "upstreamSha256": "832f795075d566b9bc7943384093bef502ca0b503f3c373904f4bcab7a43b1c9", + "localSha256": "85e2eb8bd0550071df54e642a664dbf83e072ea10590e53782567f727eb27b68", + "orderedPathDataSha256": "3addcf0950d91915780e6a2cc0d71edf08a8b45c5bc8f8467aaf9e0e368720cf", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/reply_all.xml", + "upstreamIcon": "reply_all", + "upstreamPath": "android/content/reply_all/materialicons/black/res/drawable/baseline_reply_all_24.xml", + "upstreamSha256": "8daabf8cbc4b05791e1dad457a3b5503ba57e5c80c26de196a057b2e1a4523bb", + "localSha256": "214215c12a55693a9c68343dc7b0a3fc67a8c65f8027c1bc12fd96727e8aa1f1", + "orderedPathDataSha256": "b4fffc14c2cb7bd7a452a6d534dff58556432a676747da78bbdd15c385603f20", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/reply.xml", + "upstreamIcon": "reply", + "upstreamPath": "android/content/reply/materialicons/black/res/drawable/baseline_reply_24.xml", + "upstreamSha256": "fa6bdedf12904d294f590f3c4cf5602aad1b19b8dd0ea026097eae05846809d8", + "localSha256": "708e25011f0dfe5a0936676b2efbee01f723193739e7e5e1f33d68f077b2fb5b", + "orderedPathDataSha256": "f6384268e0ad44647e6c65bac05ff6a9c5fd919ae4d50b42c6a317e9ccd4ded0", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/report_gmailerrorred.xml", + "upstreamIcon": "report_gmailerrorred", + "upstreamPath": "android/content/report_gmailerrorred/materialicons/black/res/drawable/baseline_report_gmailerrorred_24.xml", + "upstreamSha256": "1918e867983e2b1eb5f16ed1dfc429ffcf63b8d1432173eaa2e2cc5ba6f1ef56", + "localSha256": "0d25fdc936c6e25d84d7f039f01c6b089b84aad49428730410739abd9efce151", + "orderedPathDataSha256": "61ca17b2e6cbccc3eafb4adf78a32f9ba86c734cf07354836c3b89815f797502", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/report_off.xml", + "upstreamIcon": "report_off", + "upstreamPath": "android/content/report_off/materialicons/black/res/drawable/baseline_report_off_24.xml", + "upstreamSha256": "0b39751283317e0c26fa5da5e17f4c949a4ecbc92cb4ca9653b0384d2e3138b3", + "localSha256": "0376afdba2dee4c28530571f765f2b7fb8664d53d12ad5f38b5d91fea593ce71", + "orderedPathDataSha256": "2ed86704bb97bb0d3de6e4f9bbac81d949998b571b10103ccbb5cdeb7309b4fe", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/report_problem.xml", + "upstreamIcon": "report_problem", + "upstreamPath": "android/action/report_problem/materialicons/black/res/drawable/baseline_report_problem_24.xml", + "upstreamSha256": "3e33b1ed909248589cac4e30bc2c8595b2ebb1d6c843beaae06f306f8ead67c3", + "localSha256": "71357a04b89f606555552f3dbf3fbac67844dc0fe031b143a01fc22ae28b6004", + "orderedPathDataSha256": "faa8298199d245d4993eea26eea979cc4febe00f0cbed700d85400b8fd24bffa", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/report.xml", + "upstreamIcon": "report", + "upstreamPath": "android/content/report/materialicons/black/res/drawable/baseline_report_24.xml", + "upstreamSha256": "7d6cefdb99d4beb18cbd6a88274ea61b213e8d327183681726cddfa1858d8175", + "localSha256": "3d278043dd1396af429c420ea9d2ff81d21399a09d862abca2366bac8ad66d7c", + "orderedPathDataSha256": "7ef4376fdd69fadd8ac9f55afb6329a8eafa7a5bef886d89a56554aed041a2dc", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/request_page.xml", + "upstreamIcon": "request_page", + "upstreamPath": "android/action/request_page/materialicons/black/res/drawable/baseline_request_page_24.xml", + "upstreamSha256": "4eb8292003963ddc3e3d1360126f7cf375775ce86954fb70082c892dbb69097a", + "localSha256": "4c8bc7a84683ced68bdaa88497d4724a46cdccc731377e3822c496baf037afc3", + "orderedPathDataSha256": "343be81d28c4121166c0c84eb546e9d583266f387e49ad0712717a304ec5e3ec", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/request_quote.xml", + "upstreamIcon": "request_quote", + "upstreamPath": "android/file/request_quote/materialicons/black/res/drawable/baseline_request_quote_24.xml", + "upstreamSha256": "c073e09cd7a264d577917ca73dace16d5ca3b42968a773211d50c2446c88e378", + "localSha256": "b3ffb0c91fcf119b46524d860dab1b622e34420b7ad937f7ea51c41e67f7cb16", + "orderedPathDataSha256": "0b20bd1ace70f71f0cf06286000423bcad472cba590bbdf985299b3b93f19799", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/reset_tv.xml", + "upstreamIcon": "reset_tv", + "upstreamPath": "android/device/reset_tv/materialicons/black/res/drawable/baseline_reset_tv_24.xml", + "upstreamSha256": "8312bc054c12d9d7864718ac906a273ed0aea5010c5b39ddc217c14d0763d44a", + "localSha256": "2bd647e54ecb89098660b543db7812efe40b830a2324e873646608cc1b4ba833", + "orderedPathDataSha256": "3c4d866173cc7c744f5224f72b764d39d6cbb693c312dc6af8ec45b4980fe782", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/resource_class.xml", + "upstreamIcon": "class", + "upstreamPath": "android/action/class/materialicons/black/res/drawable/baseline_class_24.xml", + "upstreamSha256": "4b8fd6fd514cfbe051f70eb9bb3bdd0bce1538d63a6f216281a5e5d158d31d44", + "localSha256": "6d8c9a392f8ff3021c531174f8198e48fdf74d20c93dfb8010ae1a7655c08c28", + "orderedPathDataSha256": "22ceebf57e1846c6bd8ae11b9845ddea359849ad8a26cd8fac3687dc8a614bbe", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/resource_public.xml", + "upstreamIcon": "public", + "upstreamPath": "android/social/public/materialicons/black/res/drawable/baseline_public_24.xml", + "upstreamSha256": "d77e48de08535ee7f1da6fc369d2c91a477ce323822f7e8b1ba6e5a702daeb63", + "localSha256": "68c64f5865db12d19e0a56db756d9d4450978686b3cb6e2c23ee5586542df720", + "orderedPathDataSha256": "1bb3169460606dcc444d8249c639af6064753eed9e834eff1772e7bde970fa1a", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/resource_try.xml", + "upstreamIcon": "try", + "upstreamPath": "android/action/try/materialicons/black/res/drawable/baseline_try_24.xml", + "upstreamSha256": "794ef01c0b9a05bbf6072b9b2b30d0bab4ff7908a2eb65b5a1bd74f1403f8ce4", + "localSha256": "0e64560a776f9b3f1a6b601a1f0e2576101866ca46ab9af2ce70f4950afdc5bb", + "orderedPathDataSha256": "839d464d295fc71479faa98a710cd53a533bd3dc5b33f7adfba78bc90bfb92ec", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/restart_alt.xml", + "upstreamIcon": "restart_alt", + "upstreamPath": "android/device/restart_alt/materialicons/black/res/drawable/baseline_restart_alt_24.xml", + "upstreamSha256": "79b54b4af7e27cc7017b80b5a87ee7f63096bd0239bb78b1e157ec1f09d7911a", + "localSha256": "0e41a77a76da30ccb5f4f551d2dc3928603f4203e552d5c1d180d96e47dcd8c6", + "orderedPathDataSha256": "ae5e39a4c1c6fd6ad0ca7b5147fbf7f5b29e8e9b0e89e966327ec9c27636588d", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/restaurant_menu.xml", + "upstreamIcon": "restaurant_menu", + "upstreamPath": "android/maps/restaurant_menu/materialicons/black/res/drawable/baseline_restaurant_menu_24.xml", + "upstreamSha256": "f827cffff52a136dc3ee3245d4151eb7a54f7f9ca3df2b7bcaad3cf1deb189c5", + "localSha256": "4fdb1335ff3df14cea87c716b316b2c0d1251adae149f77fc0331527ca630581", + "orderedPathDataSha256": "eb62ab978699570edb38e1cbd3f99b7bacc39929451250ca8cf1206eb5db2b81", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/restaurant.xml", + "upstreamIcon": "restaurant", + "upstreamPath": "android/maps/restaurant/materialicons/black/res/drawable/baseline_restaurant_24.xml", + "upstreamSha256": "daf520c8b1884fe8d8eae09bf7eac123e6ee6bdbc51420ddea526212cfddce7e", + "localSha256": "cf2da608bfaa92f5cd2c6530583d0b22fcdfd1143a36e2f401aacb2bd0643b60", + "orderedPathDataSha256": "37ee4684e38a80eba08c5c982b61de2525a282b699f090f9fbeba7bd26e9b35b", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/restore_from_trash.xml", + "upstreamIcon": "restore_from_trash", + "upstreamPath": "android/action/restore_from_trash/materialicons/black/res/drawable/baseline_restore_from_trash_24.xml", + "upstreamSha256": "6f21e9a3f13cb0c07524b44df75c79ad4035d238884a49e28fe5bfc2ea39e02d", + "localSha256": "2d4947669828979c708cd6e7bf1cf7ce8dfeeb841955ec1ce373d0e3308aeb22", + "orderedPathDataSha256": "9b749bdcc9030da65db98f553af3b0608c77ddbc40e650b7870ce0e88ff67132", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/restore_page.xml", + "upstreamIcon": "restore_page", + "upstreamPath": "android/action/restore_page/materialicons/black/res/drawable/baseline_restore_page_24.xml", + "upstreamSha256": "10a2f2da63fdecc8f01f6427a4c17a517181eef06e8636bf738d2474e4313715", + "localSha256": "cb37e7a119666f6ff89b68b6ca9bdb624cf9a42759298ec095b11bb5c18a9741", + "orderedPathDataSha256": "bf22fa70f065f6bc9031f28cebe349f483f919f2f928eb681a22421d63331ec3", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/restore.xml", + "upstreamIcon": "restore", + "upstreamPath": "android/action/restore/materialicons/black/res/drawable/baseline_restore_24.xml", + "upstreamSha256": "a45be30e999d5205184145cc149b1e1282acdb6614ec32fad9c3f54810504047", + "localSha256": "45957e95bb104aabc8810d878dbce6e597642837d700572e6588ca0d7dbd0e75", + "orderedPathDataSha256": "74500b0eb3d997f34c1094583b4bd56e68aa048c3792edccfbbf8c6797a8c23d", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/reviews.xml", + "upstreamIcon": "reviews", + "upstreamPath": "android/device/reviews/materialicons/black/res/drawable/baseline_reviews_24.xml", + "upstreamSha256": "794ef01c0b9a05bbf6072b9b2b30d0bab4ff7908a2eb65b5a1bd74f1403f8ce4", + "localSha256": "34a45bc08b7df1d7f2025ad5472e2501758f044533004a1cd4ef9c095efe98e5", + "orderedPathDataSha256": "839d464d295fc71479faa98a710cd53a533bd3dc5b33f7adfba78bc90bfb92ec", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/rice_bowl.xml", + "upstreamIcon": "rice_bowl", + "upstreamPath": "android/places/rice_bowl/materialicons/black/res/drawable/baseline_rice_bowl_24.xml", + "upstreamSha256": "07aa88b7e375dbc2dd597e52584a72dc38a7bc050d28cdd3629fa64e7a19ff2c", + "localSha256": "948f42c2417263697dfc53d945810c05880febe8b16f10fef05b4ccf66efb356", + "orderedPathDataSha256": "fd1fae99e55f0c86b36c4ae8cff0598ebbe0c3cfffe45d38fb9dd05531167758", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/ring_volume.xml", + "upstreamIcon": "ring_volume", + "upstreamPath": "android/communication/ring_volume/materialicons/black/res/drawable/baseline_ring_volume_24.xml", + "upstreamSha256": "fad7b4b3bafa991ee26850a5248e7fe948e9b549c695d7a11d9ac40149d02121", + "localSha256": "cc2d934d20568ab91574df774b1ec283e0e904086aae5a615389c954e03e10a8", + "orderedPathDataSha256": "5eb0c2c3b489fd6bcbea1c6cac0eadfbad3588c69b4a9606dcd734ec654a5f5c", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/rocket_launch.xml", + "upstreamIcon": "rocket_launch", + "upstreamPath": "android/action/rocket_launch/materialicons/black/res/drawable/baseline_rocket_launch_24.xml", + "upstreamSha256": "c6c52f5617e8dca11d284a9339d2a4ff67ef1099a10686f416c9e577e6162a26", + "localSha256": "9a64a52a7e7a69cd29b86bdcfa30f744c316759a0d21c83c300a0bbc920d0196", + "orderedPathDataSha256": "59ef5162749e84b047ab891ac5796e9d2e94f16082ab2b547efc357e6bd64620", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/rocket.xml", + "upstreamIcon": "rocket", + "upstreamPath": "android/action/rocket/materialicons/black/res/drawable/baseline_rocket_24.xml", + "upstreamSha256": "da8d012509ec781922f293daa85b5963fe0b244310b906faaa83ad90a7ea0bff", + "localSha256": "e5d0b6f74c0841526bcfd62e91c0f4b5e2b46c3c55896bec73339fde877e3eb2", + "orderedPathDataSha256": "d16de7a42384e07059a500b9591d8b8af6a9d1182b097c536767497d340204c5", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/roller_shades_closed.xml", + "upstreamIcon": "roller_shades_closed", + "upstreamPath": "android/home/roller_shades_closed/materialicons/black/res/drawable/baseline_roller_shades_closed_24.xml", + "upstreamSha256": "15b76df501b7a2a5c63cd629920cef862986f56d6a9374be9096daf2a51bb0c8", + "localSha256": "3a154712dca45d902129daf3cc179e0401a0aa4a85b7c927e8f8013dfc58ee8e", + "orderedPathDataSha256": "6e934ed2e187efd0f4534482d762cf764a67bf03666a4d625c165510eba4da7e", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/roller_shades.xml", + "upstreamIcon": "roller_shades", + "upstreamPath": "android/home/roller_shades/materialicons/black/res/drawable/baseline_roller_shades_24.xml", + "upstreamSha256": "dce80e2e3f1520d78e9950a72fb55c7ec0c50e147ef7fb6f52d63317c4ac76b7", + "localSha256": "3ef33761de6461c5cf69567021198629b76265cbce62e86f66c24e128c13b107", + "orderedPathDataSha256": "4631657497a0570b80d277e2d6beb3672352720584090b07518771d7c5061fec", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/roller_skating.xml", + "upstreamIcon": "roller_skating", + "upstreamPath": "android/social/roller_skating/materialicons/black/res/drawable/baseline_roller_skating_24.xml", + "upstreamSha256": "5111270529a413c39dbfc3c45db3beebe4485e22ef5e05568ab4ad3e4dc6ec7f", + "localSha256": "65ebbe6e0c3aeb4be8ba3eaa346996e23a91bcf7952fc72e5ce0b80953558442", + "orderedPathDataSha256": "cd62301f08da9d9c89fe4ed6229509cd63a5ab448fba6bebbfcc51a4156e1f5f", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/roofing.xml", + "upstreamIcon": "roofing", + "upstreamPath": "android/places/roofing/materialicons/black/res/drawable/baseline_roofing_24.xml", + "upstreamSha256": "b71b71bc5c1c896bb5d84b5f4df8f8bc5765f4c03e3d59e48e9bf3b77059b763", + "localSha256": "ebfe1dff62e281cee156ff715f7d618aa552f3f0f99e810e34476618bd946573", + "orderedPathDataSha256": "5dc2e32da30b12ef01683a8612bb72cb55e1d4ed636af513aaffdf195988fc72", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/room_preferences.xml", + "upstreamIcon": "room_preferences", + "upstreamPath": "android/places/room_preferences/materialicons/black/res/drawable/baseline_room_preferences_24.xml", + "upstreamSha256": "1d980c2e283726d2226c6f3a1a3a006fefbf09a928c5e9da29f5c07684531899", + "localSha256": "bfe6d0e7a014903c07024d9c19d0d6dee8b587979a06a0ca4294368156fe98e9", + "orderedPathDataSha256": "9996f2c7349c05e99fbc4ac26c91dc2ce00e30acb7e979d8b4f47e4a77411125", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/room_service.xml", + "upstreamIcon": "room_service", + "upstreamPath": "android/places/room_service/materialicons/black/res/drawable/baseline_room_service_24.xml", + "upstreamSha256": "3181a976b65cd3d1cab66f1139f5213167e8e7046702de2c491c7a73654ad238", + "localSha256": "5372689d9df2a799ea46aa454d685103144fed4f58869cf78453e6187746fd6d", + "orderedPathDataSha256": "3e7876c8f256f65d6c4f55b0ecec93f21ecb20bf1d63da0de418fa29d814c167", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/room.xml", + "upstreamIcon": "room", + "upstreamPath": "android/action/room/materialicons/black/res/drawable/baseline_room_24.xml", + "upstreamSha256": "470ae3c3d612ac3c7db3586431c6783154e54d309428579026e48b79bc196317", + "localSha256": "2ccb4a73953bf2958cfe507a12b67dcc39c58dd5b58d562830357faa004e4053", + "orderedPathDataSha256": "5f62b0d8c48e250a38478e2ef48351be60bfdf071406eca08a6e99deb736d0a6", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/rotate_90_degrees_ccw.xml", + "upstreamIcon": "rotate_90_degrees_ccw", + "upstreamPath": "android/image/rotate_90_degrees_ccw/materialicons/black/res/drawable/baseline_rotate_90_degrees_ccw_24.xml", + "upstreamSha256": "46fc910c22c8737cf59fc5aae2e9a17a409392b768a5a7160bee8df519cedd0e", + "localSha256": "c008752bd164cd827ed36ba681dab4f27b653f9edc1dd721725bd6cf96c0d71c", + "orderedPathDataSha256": "fe069fe91baadd85cfcf26bccdd62c82e7ad09a44e45bffa325f4ac7836c706e", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/rotate_90_degrees_cw.xml", + "upstreamIcon": "rotate_90_degrees_cw", + "upstreamPath": "android/image/rotate_90_degrees_cw/materialicons/black/res/drawable/baseline_rotate_90_degrees_cw_24.xml", + "upstreamSha256": "64e09ec79e1d9cda156ff9a030c3454d6dd9ebb0e878441f046c489055bfdf9e", + "localSha256": "60cb0fde9578349931acbce19b99439d32172aa9577ec745b7518fac6c1bb747", + "orderedPathDataSha256": "68b79bf449733d49cd09c432b463f2f2b7427be384119b06552b94140c7bb726", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/rotate_left.xml", + "upstreamIcon": "rotate_left", + "upstreamPath": "android/image/rotate_left/materialicons/black/res/drawable/baseline_rotate_left_24.xml", + "upstreamSha256": "973823a6d859958f25373568b7c4447624f0c7d38726b774f68fa69fa9a5388d", + "localSha256": "f465ed0e1df68554f2fe8af66d5b4942602c4288de73e1380d225639e93602f2", + "orderedPathDataSha256": "e3f30ecf8f47e000f5301417a5e724b98ae7fe8daa3579e0e44b48e5c9e0fd14", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/rotate_right.xml", + "upstreamIcon": "rotate_right", + "upstreamPath": "android/image/rotate_right/materialicons/black/res/drawable/baseline_rotate_right_24.xml", + "upstreamSha256": "3b8a94cb8bb65ebe03ed54bea48d280afd752b42111b850f9faaa9fd1988be31", + "localSha256": "187a0a4aae9b679bbe979a54c6d7a0c70ede154515ff01817686c14b15894279", + "orderedPathDataSha256": "24187ef8fa77f6726fa55c204b7533e1e90127ece54c13825bfbe6c88ad09877", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/roundabout_left.xml", + "upstreamIcon": "roundabout_left", + "upstreamPath": "android/maps/roundabout_left/materialicons/black/res/drawable/baseline_roundabout_left_24.xml", + "upstreamSha256": "c632fd4f668f424cdb9742b29beffb8638f2f914c5cc410025907700e5fc2faf", + "localSha256": "8479d4db9932bf7f478ceb47015c6ddee2d91c1fd2a47a7742931f026baea8f5", + "orderedPathDataSha256": "be9d98aa44adad42ea584901ac251c9cfedbc6111f9f058768447f1d55d098ae", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/roundabout_right.xml", + "upstreamIcon": "roundabout_right", + "upstreamPath": "android/maps/roundabout_right/materialicons/black/res/drawable/baseline_roundabout_right_24.xml", + "upstreamSha256": "cd956fd7276b4cef073abf2ad98c6aa8ce70e35b17d2caf648a703f5d843a6ba", + "localSha256": "b67b0816fcf53a7330eb537f32986df438b093b489790af6b1e8fc6b8d54bf01", + "orderedPathDataSha256": "0a357325f478e7d3dc01e5e4e4f659361c28cedb831eef3d5bd07363131c4bfb", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/rounded_corner.xml", + "upstreamIcon": "rounded_corner", + "upstreamPath": "android/action/rounded_corner/materialicons/black/res/drawable/baseline_rounded_corner_24.xml", + "upstreamSha256": "64088f328c203ecab50b872bedf04f6e6c8a0631520decf7703b1577797047e4", + "localSha256": "b2da689a437979a04ef010fd607b17d5a392c4a5d4ee1bf58aff946b808a04d4", + "orderedPathDataSha256": "69f7cbcca257b6548332fa41a54fe7921a92a588256c82494eed6ee15174c95a", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/route.xml", + "upstreamIcon": "route", + "upstreamPath": "android/maps/route/materialicons/black/res/drawable/baseline_route_24.xml", + "upstreamSha256": "75fd9ec06450f1e45ed06496466ffb282495e3b971fe431303f7750bdb1268f5", + "localSha256": "aff45ee300287266134496128845ce7b5150179d2916d9ee85dc4bd1c0acc166", + "orderedPathDataSha256": "36782da8182cf3ed7bfd157082d248b9909aa2d4e34fad2276449514206dda9c", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/router.xml", + "upstreamIcon": "router", + "upstreamPath": "android/hardware/router/materialicons/black/res/drawable/baseline_router_24.xml", + "upstreamSha256": "cb533a62168f247847c05b2056df8f4d95f6f21c5e2e698d5a8aed8c51f7d156", + "localSha256": "7f454654ac78c0ba986dd04838aff7dcdc401237369658c53c01ce80ec56336d", + "orderedPathDataSha256": "c99c829d088c077544a93c749335f8d03f70e2ce34dccf729de0cbb130ee8c4a", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/rowing.xml", + "upstreamIcon": "rowing", + "upstreamPath": "android/action/rowing/materialicons/black/res/drawable/baseline_rowing_24.xml", + "upstreamSha256": "0f7591b07e51451af29fe059a5b1050bd37382bb31c04bc9330e89c4a6740896", + "localSha256": "e91a1c61d4526af8fd4019afbb5c392f5394fda1e3ab3df8c7fdaaaaa717733e", + "orderedPathDataSha256": "f18d0b3be0517a07f59f28db281190b34cfcadc80b49594c13d3d4e68f479af2", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/rss_feed.xml", + "upstreamIcon": "rss_feed", + "upstreamPath": "android/communication/rss_feed/materialicons/black/res/drawable/baseline_rss_feed_24.xml", + "upstreamSha256": "24119890352f9f61e45b54aa8631694fc81c905b9291df53cd2df3a29aa20cdc", + "localSha256": "59123f9604bce290d5f77f372d36cef6bd645b3c1dbe418bd24489eea8d4b6c1", + "orderedPathDataSha256": "87314eb395b4a074258e8f390c39f75737447343a5784ec723055d0599349e82", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/rsvp.xml", + "upstreamIcon": "rsvp", + "upstreamPath": "android/device/rsvp/materialicons/black/res/drawable/baseline_rsvp_24.xml", + "upstreamSha256": "b9692619fdfaa79c742c9cf6bfa94f52a5dafcbc3f2ca87bd33f9be927c45177", + "localSha256": "0b1ac24b81d341e4b73e695f3d78b3ae14286a374023594be4b10b63367f3593", + "orderedPathDataSha256": "3a89ed1f2c3d226a2dfdf6b9097542c1d5c920e2efeda9a591e0cf68691f197a", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/rtt.xml", + "upstreamIcon": "rtt", + "upstreamPath": "android/communication/rtt/materialicons/black/res/drawable/baseline_rtt_24.xml", + "upstreamSha256": "2674b762d8c9ffdce362d7b8288050a8fa359b1cd47fe0080881fc7ac19f53e3", + "localSha256": "b13055ed2008b53c135ad131aae9315483df514b27d786df0dfbc060e02177c0", + "orderedPathDataSha256": "018c19ed472a3f82f4ba28f3c7b7f5403412a6359455e08580da1675e17327ac", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/rule_folder.xml", + "upstreamIcon": "rule_folder", + "upstreamPath": "android/file/rule_folder/materialicons/black/res/drawable/baseline_rule_folder_24.xml", + "upstreamSha256": "b01a43a20ce350b61631237e40e26a51b5c76e015f00edecb31c0882d53bf08d", + "localSha256": "2cd6309525eeb10deb1d5c50de5723a88789a6d5023f2175cf6b1f10b229d901", + "orderedPathDataSha256": "4251c99e9ec83d69f9352c2308ca0919c6e2001621bef1369fc5411a6b3e46f2", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/rule.xml", + "upstreamIcon": "rule", + "upstreamPath": "android/action/rule/materialicons/black/res/drawable/baseline_rule_24.xml", + "upstreamSha256": "c3bb01ebadeb6b3c2599db4b8d43f563732e48fa834f1dbb575e4d3139812d91", + "localSha256": "624b29f6d075fb12ac78c8ab5d1878533afb58227a76ad707da66b85502d9190", + "orderedPathDataSha256": "b129cd87ffa40baeff6ace781e46da592ba97f8424eeb9282580dd390dcefc1f", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/run_circle.xml", + "upstreamIcon": "run_circle", + "upstreamPath": "android/maps/run_circle/materialicons/black/res/drawable/baseline_run_circle_24.xml", + "upstreamSha256": "eff6af48976e0dcf8220d2bdb3e35f3691cd074aad6545da6214ce5d818a8452", + "localSha256": "9c1ab649bffef2d560a91b9af9b69714a5b5914768ebcbb59fe8f953870955de", + "orderedPathDataSha256": "5dbd05dcdf7cf60e7c216b3bfeb6297d704c2017626fe0f9adf5527144b5d95f", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/running_with_errors.xml", + "upstreamIcon": "running_with_errors", + "upstreamPath": "android/notification/running_with_errors/materialicons/black/res/drawable/baseline_running_with_errors_24.xml", + "upstreamSha256": "87bf3c9428d2da5a59de0ade84178c4b33c2c1b1e816748c3cf7513e0ab9731b", + "localSha256": "e6ffad5f40f1a119135ee39d18af75fbd6ed6d72c8fb5b87e0229284518825eb", + "orderedPathDataSha256": "ccc027654cfed93f25fb9d86c992e9a157a8d934597b98574fc9b409a5119d21", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/rv_hookup.xml", + "upstreamIcon": "rv_hookup", + "upstreamPath": "android/places/rv_hookup/materialicons/black/res/drawable/baseline_rv_hookup_24.xml", + "upstreamSha256": "7c35840cc78a41559aca74a088be9f25d970c35f144b0638bb0404a75efab2b0", + "localSha256": "24ebc358ea758749ec2d1265ec73268a896126995c3355519aa45df35f07e198", + "orderedPathDataSha256": "d01bb00a345b9bf9021052bfa19feae977639b85038ec946f260135cf4958b5f", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/safety_check.xml", + "upstreamIcon": "safety_check", + "upstreamPath": "android/maps/safety_check/materialicons/black/res/drawable/baseline_safety_check_24.xml", + "upstreamSha256": "a83e76d9cf6d2e5303acb8a271898febc772dadb5142cf7afbb6b4eaec8c60e3", + "localSha256": "6d9268f5ee494e12521b0a38f4a5d9c2be65313d6e186f00a9c045a51f98075e", + "orderedPathDataSha256": "1b06a2130b0150e5a0fe437da9b794305a1cfaaa2cdbd030761abe78627a4b47", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/safety_divider.xml", + "upstreamIcon": "safety_divider", + "upstreamPath": "android/social/safety_divider/materialicons/black/res/drawable/baseline_safety_divider_24.xml", + "upstreamSha256": "3d1295be77b5a44b006f12b319d0b72fc78a1111290f8a2af75aea6f75ade85f", + "localSha256": "9602111507d33ef555b55a7487e718d62602f80e8387bfa5d02be437077f3ef9", + "orderedPathDataSha256": "038a777d0f08d8549f9ec13420ba7ff4d9011d5062f7cddf2b98a3562435d457", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/sailing.xml", + "upstreamIcon": "sailing", + "upstreamPath": "android/maps/sailing/materialicons/black/res/drawable/baseline_sailing_24.xml", + "upstreamSha256": "2bfbd6176bd575f8b0e4165b8ea13218993f2fc5b41d528b7c8be95373833919", + "localSha256": "f129c4e9156f5c3bdc3b458fe8cb2368c7195cfdd0fda9fdfadedfa97a60ec32", + "orderedPathDataSha256": "5ef5eb37d995215b4b9c317b450cde4628d430adc8a65922abe59f0a8a96e896", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/sanitizer.xml", + "upstreamIcon": "sanitizer", + "upstreamPath": "android/social/sanitizer/materialicons/black/res/drawable/baseline_sanitizer_24.xml", + "upstreamSha256": "462eb376f990f44d461cd6c52e244c08bf4c6fb2bf7411dc1a24364f7b880462", + "localSha256": "867bac9d2af53a504e2b47114363ddb6b7f58d9e4478b3948bfd56482951bdf9", + "orderedPathDataSha256": "1698edef36a35709fad470281ea9041627d36e6abd8295fdabf3c22c39391ec0", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/satellite_alt.xml", + "upstreamIcon": "satellite_alt", + "upstreamPath": "android/action/satellite_alt/materialicons/black/res/drawable/baseline_satellite_alt_24.xml", + "upstreamSha256": "1d11376e99a484dd99affda4db63c44a2846850aa5ecd07addd20bde014c52cf", + "localSha256": "73ec8ef1186508ce859daf5d439fa32f05baa70a04231cd72c08d8d1b340bec4", + "orderedPathDataSha256": "fac7d8987ad6402f8dd1c065da0b8fd040bdd7c22dc5da31f1704079aa5576a7", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/satellite.xml", + "upstreamIcon": "satellite", + "upstreamPath": "android/maps/satellite/materialicons/black/res/drawable/baseline_satellite_24.xml", + "upstreamSha256": "3ac825040538527a4d4e74f1ceb47326afc97af677f3caa83456ea8fab7b7161", + "localSha256": "ee68d21abefe77550b4c24599bd44066ebed397840bb39715d021e8d3456d475", + "orderedPathDataSha256": "ab9173731f0fa6bcb17cc1204824472b46a2c375def921aa92bedbf34ad3208e", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/save_alt.xml", + "upstreamIcon": "save_alt", + "upstreamPath": "android/content/save_alt/materialicons/black/res/drawable/baseline_save_alt_24.xml", + "upstreamSha256": "19dbd2357601f787d1d5e7508def06be20affa64f1346fda8c60ea7df3eabe75", + "localSha256": "e59114a16d5ffe2b565dd388fabb340fb7d28657ac4cdd666c6dfe8f71f30ddb", + "orderedPathDataSha256": "ae38dd008acd92c7967c9ad3e601925bfd2c1c49b1fd07e88676a467ee573fd8", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/save_as.xml", + "upstreamIcon": "save_as", + "upstreamPath": "android/content/save_as/materialicons/black/res/drawable/baseline_save_as_24.xml", + "upstreamSha256": "0c8db66b289253125f5208c019474af08fc65524d5f6c6a39610d3ebf6d6faa0", + "localSha256": "5b49d2bbdbd5263326f7e94c3eaf586b77d30c71a3d36b859d6008614cdf7458", + "orderedPathDataSha256": "5d2795f903922440558bed17811055538fcd0765865422c32e38d477539fa20a", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/save.xml", + "upstreamIcon": "save", + "upstreamPath": "android/content/save/materialicons/black/res/drawable/baseline_save_24.xml", + "upstreamSha256": "c006b6dd54ff5a4137de6c52d45d4bb661a64f885ce5c1a5b650506826f1c3fe", + "localSha256": "85603c009369de163e63c5cbb00085c00903f70b60d64266e8b726e03a043816", + "orderedPathDataSha256": "1f9200d265aafca02cc2b5f60dbdf4d62422e91abd2c28e9e4c3718120b4bc63", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/saved_search.xml", + "upstreamIcon": "saved_search", + "upstreamPath": "android/action/saved_search/materialicons/black/res/drawable/baseline_saved_search_24.xml", + "upstreamSha256": "c58441e6d1965de2ac6f1342bc1054e8e6983e3de4b33f253c2a540b32a635fa", + "localSha256": "27c65694d0e5e703096d4484cc32983adb986d36a0c48e9249d0d1327dc43ce1", + "orderedPathDataSha256": "c8a6c00b7cbdb08752ffeac5a2f889494ddb2c01bab119e06533cee4f52e37bd", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/savings.xml", + "upstreamIcon": "savings", + "upstreamPath": "android/action/savings/materialicons/black/res/drawable/baseline_savings_24.xml", + "upstreamSha256": "6c4b31415d1644408a21c65cf47f718c9875024c8970caf77d791b5422e983c8", + "localSha256": "b770995b1650e144c205d4188360ef084088a58558eed24573a02a47b50e6d64", + "orderedPathDataSha256": "1c55adc5d06468ea9c4ed84663667e9db3f047d0c8440744ec6f85f71987794a", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/scale.xml", + "upstreamIcon": "scale", + "upstreamPath": "android/social/scale/materialicons/black/res/drawable/baseline_scale_24.xml", + "upstreamSha256": "f8e32167f24a8ed5420e6ae40fdbbb9f435987bff5a3bc496cfbdb93f34e2a0f", + "localSha256": "8980b9fc859312c109650431fed91608b31cae96de3b02fa9a11224a0b882715", + "orderedPathDataSha256": "bfcad6d300e08d00c053b9702adf366d2e1a8ccde2bf8d28a675cb8b7568dbfd", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/scanner.xml", + "upstreamIcon": "scanner", + "upstreamPath": "android/hardware/scanner/materialicons/black/res/drawable/baseline_scanner_24.xml", + "upstreamSha256": "87bde72d3f87bc394611d2a1de2b3691d4efd243e9be73a2264aeb4ddae03c12", + "localSha256": "3443d2909cd300a46e3d62e15d7981508a18d60e7a9a7a598148a809e86c8e7a", + "orderedPathDataSha256": "a2bf516b44a1872320ecfdcc9d198a09021431d508c7a68aa86d43429b0c942a", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/scatter_plot.xml", + "upstreamIcon": "scatter_plot", + "upstreamPath": "android/editor/scatter_plot/materialicons/black/res/drawable/baseline_scatter_plot_24.xml", + "upstreamSha256": "87c6d9ead508bcfbc7488f31a90008df9ff195f16acd39b65cc5837a02028567", + "localSha256": "844f5bc562883d46d994a9e18349a43c07565b20925bf999256c04204fea0553", + "orderedPathDataSha256": "7c90c90b0cc3f56983c50f1bffed6b95259171c1bc29a34c70c4629631947020", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/schedule_send.xml", + "upstreamIcon": "schedule_send", + "upstreamPath": "android/action/schedule_send/materialicons/black/res/drawable/baseline_schedule_send_24.xml", + "upstreamSha256": "ab5b974d9317d001d43bc2c3da75d9c1d3712bf4f8c253ad68d99b375318bd05", + "localSha256": "ac6a1a22692ab101d726581a803b1d29e4d02151225890d698b9de953bf2abc7", + "orderedPathDataSha256": "94d3f806e1b5af02cc307c34eea2c708b2c240d3f6e99ae214c3635ff57c32f4", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/schedule.xml", + "upstreamIcon": "schedule", + "upstreamPath": "android/action/schedule/materialicons/black/res/drawable/baseline_schedule_24.xml", + "upstreamSha256": "e4fe13ddb79b9673e2aacbf1493576b63664bb266e204afa24db83c6435f1ef8", + "localSha256": "c03d896810da61c8ad44d272287f1b7e842ae48e6fa9f1d992b7e19f6be5b24c", + "orderedPathDataSha256": "0d3b3f6922f646d62e277f90cca992aefb17d92204d7ba2fc8d98d2659f5189e", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/schema.xml", + "upstreamIcon": "schema", + "upstreamPath": "android/editor/schema/materialicons/black/res/drawable/baseline_schema_24.xml", + "upstreamSha256": "d50e130cdf8f5fc7dcd6846890f777b446774341af5783f7f8a85200bde97b5d", + "localSha256": "ad701af7e8b1ecbe01eb07d42ed8a10772aa392a067809358f4b9aefd7984fb0", + "orderedPathDataSha256": "3950122b00d280b8b2ab0a8fcc0f89a9a2ba40629ae3a74594daa71f27b91466", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/school.xml", + "upstreamIcon": "school", + "upstreamPath": "android/social/school/materialicons/black/res/drawable/baseline_school_24.xml", + "upstreamSha256": "99d2cb7778b3ca8c29b260d65423fc439de3bb28f94b5f657302752180b62da1", + "localSha256": "984be8e77774650aea8f17ca3df47e3e9439e4148f6cabdac59aed8f2b2911ca", + "orderedPathDataSha256": "7aee4e2b4cc52adc2c255068eae1475eb269fdf148e9241fbedf219ab32c5525", + "originalGeometryMatched": false, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/science.xml", + "upstreamIcon": "science", + "upstreamPath": "android/social/science/materialicons/black/res/drawable/baseline_science_24.xml", + "upstreamSha256": "938fc01c290e7bd36c6d1fe7cbf916617da5dd43eb34c1fffb35148b3064d261", + "localSha256": "6e4787a5be27bf6c4d5f06ceb9259e640df55bb4f7168fba0eb5d33341cfc198", + "orderedPathDataSha256": "df3c60b2d397f00bf7317edf439107d6f9a1247fab6720b0beae2bebdf73a87d", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/score.xml", + "upstreamIcon": "score", + "upstreamPath": "android/editor/score/materialicons/black/res/drawable/baseline_score_24.xml", + "upstreamSha256": "5155e9d4374404563520d804c17acadf5dc7444da1d664187cfddb2159aada0e", + "localSha256": "b666053fe9686cacacb123434d4acb08f06d789d70739ac1033be3ebc6a399dd", + "orderedPathDataSha256": "a838a1af33f381dcffa8953e2b5cdabfb0148b74f30e016f37982c8dd6a206fa", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/scoreboard.xml", + "upstreamIcon": "scoreboard", + "upstreamPath": "android/social/scoreboard/materialicons/black/res/drawable/baseline_scoreboard_24.xml", + "upstreamSha256": "7587658e0fb460d304509100c7e7108de6b5bb02761e8c5dcab10ede57da5c29", + "localSha256": "5a6da6f0df9bbc3dba7e34e1d4109eef8fcb7b2122a864c3ccf6f6e2e80a2def", + "orderedPathDataSha256": "72569d8ec7c6d5cbac4b1099c0effac8a82b58f4951456b2fed6dbad2ad46210", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/screen_lock_landscape.xml", + "upstreamIcon": "screen_lock_landscape", + "upstreamPath": "android/device/screen_lock_landscape/materialicons/black/res/drawable/baseline_screen_lock_landscape_24.xml", + "upstreamSha256": "91f2a7b1f430f09cbf792af4c9d0fde3d09e23bdd29685071d99d2d584995b32", + "localSha256": "5acb3fc5bef469278b2968d22fc0882f89b42b55e6926ffdfd699ab4d70ab954", + "orderedPathDataSha256": "bf388a415f368f1783ace0169489d2cc7dce14a8efc0c3e7dedda028f9a7b9e8", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/screen_lock_portrait.xml", + "upstreamIcon": "screen_lock_portrait", + "upstreamPath": "android/device/screen_lock_portrait/materialicons/black/res/drawable/baseline_screen_lock_portrait_24.xml", + "upstreamSha256": "b46c61272fd56614126017a95aff7a87081161d253b3c3ed27dda3d72ad862dd", + "localSha256": "7db7c18ab1d97771a1e5998460d8469d43813a1f700da2dd50a8f1a0aafc312b", + "orderedPathDataSha256": "bf5f26729e21fc9b446f9013d3389fec42526f3d09f113bb09d3061b100fcbcf", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/screen_lock_rotation.xml", + "upstreamIcon": "screen_lock_rotation", + "upstreamPath": "android/device/screen_lock_rotation/materialicons/black/res/drawable/baseline_screen_lock_rotation_24.xml", + "upstreamSha256": "6f4975163127f915a16c35c8ce0d85038a86028ea50a9ffc06fe16895d49f4f3", + "localSha256": "acce291b57bb0812435753d8f7e7c0913c7dcee8797027e7a6c85f96d66eab46", + "orderedPathDataSha256": "3493834aecf7d88a729082d7bfec6dd4d1b4bc01641105055b0a426b2f4afb87", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/screen_rotation_alt.xml", + "upstreamIcon": "screen_rotation_alt", + "upstreamPath": "android/maps/screen_rotation_alt/materialicons/black/res/drawable/baseline_screen_rotation_alt_24.xml", + "upstreamSha256": "7e6a94b34c9f062162dc48f4d9700de8ef36a2d092af0f3254a4016fce0bbd31", + "localSha256": "85b2c211871574e1b97b2ad14a6a23216cabf7b06d1658336bf94163891af979", + "orderedPathDataSha256": "5f3a1917a80355b96712aa5e05f6bdf7338c3bd456cda6113c8e518daaecb6a9", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/screen_rotation.xml", + "upstreamIcon": "screen_rotation", + "upstreamPath": "android/device/screen_rotation/materialicons/black/res/drawable/baseline_screen_rotation_24.xml", + "upstreamSha256": "b03587713986faa2a6defb47df9aa60fdf75ae5d9aae0f7efd52bc348505f05c", + "localSha256": "8296079a56683223613d674361ace7ef98c7aeb17c48053a1eb1085902028c21", + "orderedPathDataSha256": "17f200eb14cd7011b5cee279ba611c1d46510050274295c86935ca6892d07410", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/screen_search_desktop.xml", + "upstreamIcon": "screen_search_desktop", + "upstreamPath": "android/device/screen_search_desktop/materialicons/black/res/drawable/baseline_screen_search_desktop_24.xml", + "upstreamSha256": "d0453d294fb0520dccb4271c497bf99c8df11ea057ff06bccba9690f7bc8eac1", + "localSha256": "604e6acc1c8351527a787ac05f027152cd689eb36d8b0a97a95dde438daddc69", + "orderedPathDataSha256": "1ec98ed3ca08338103e3058b0a555eb8c13172a9162c68f22eb4179fd70d653f", + "originalGeometryMatched": false, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/screen_share.xml", + "upstreamIcon": "screen_share", + "upstreamPath": "android/communication/screen_share/materialicons/black/res/drawable/baseline_screen_share_24.xml", + "upstreamSha256": "4d342af1e84f5506e4c3ead4743e7abf0bd17726f915571c6c0fb6befd1ff62f", + "localSha256": "4de57f129bf0cd706373c5006a6c50f4238d694f0b09b4a0498b37dbe092a136", + "orderedPathDataSha256": "de9968303f656e901e9bf807b19ea725b81d4d7820977e473daf7de984e67532", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/screenshot_monitor.xml", + "upstreamIcon": "screenshot_monitor", + "upstreamPath": "android/device/screenshot_monitor/materialicons/black/res/drawable/baseline_screenshot_monitor_24.xml", + "upstreamSha256": "9a7ace63c06c90fe9085fa86f10f01a71659cf5a12203cfce1660e3758634476", + "localSha256": "062a058eee61f589338d629d8326c54eba85f6dc783e68e10340657681078d75", + "orderedPathDataSha256": "8bccafdf573a96807ada40f8239b57e3baa9dae4dff2fe26c3e2b3aa3761bf2d", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/screenshot.xml", + "upstreamIcon": "screenshot", + "upstreamPath": "android/device/screenshot/materialicons/black/res/drawable/baseline_screenshot_24.xml", + "upstreamSha256": "ea5d65a0b2c09fc6fd636f71944bd1b935de04f139f0c20e2818851171a86b06", + "localSha256": "9e14b09a16e964f4ad60da0af18b7104750a85ccf52755c9aed0545c52fb10f9", + "orderedPathDataSha256": "54fc69434d5820991f6f14d552e74d135ae53814c04259823dc7a10b77523e3e", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/scuba_diving.xml", + "upstreamIcon": "scuba_diving", + "upstreamPath": "android/social/scuba_diving/materialicons/black/res/drawable/baseline_scuba_diving_24.xml", + "upstreamSha256": "4c358b7509dd51c937294f004bd0dc0e9c0217a6ea3983d070378e35ec86f885", + "localSha256": "3682ee2841a0c552bfe5f20c598f15d3ff8bbbb4ba60175edab31e3f1de72d40", + "orderedPathDataSha256": "3e15081426637d579a38e1497580b420cf72f5c5fac1ab66b247fdbe47b65a44", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/sd_card_alert.xml", + "upstreamIcon": "sd_card_alert", + "upstreamPath": "android/notification/sd_card_alert/materialicons/black/res/drawable/baseline_sd_card_alert_24.xml", + "upstreamSha256": "e1486c45730250ff4041370f8630afc87fd9987ba63d36f72184f6373b33a278", + "localSha256": "1aca5713cf1de9db5aa692c2b494a043694d5a8bed6b5fd9b59e37e2495f7f5d", + "orderedPathDataSha256": "e838cf29f065bed1fc0fa4b028bda7df73c6dc8841f3cf8c0db48780e28f1b45", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/sd_card.xml", + "upstreamIcon": "sd_card", + "upstreamPath": "android/notification/sd_card/materialicons/black/res/drawable/baseline_sd_card_24.xml", + "upstreamSha256": "1e8a985e083b6d653ab486909af16937a80f2025f14d1463ba7ed094bbb38f53", + "localSha256": "294f6f0c7cda36e9c0e632e2dcbba342b8c44d25524d1c70562bd03b813aef18", + "orderedPathDataSha256": "31283848a06a7a9e45dff54a9e85d3fe939f7928db5b48cdfc119a838726fa11", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/sd_storage.xml", + "upstreamIcon": "sd_storage", + "upstreamPath": "android/device/sd_storage/materialicons/black/res/drawable/baseline_sd_storage_24.xml", + "upstreamSha256": "1e8a985e083b6d653ab486909af16937a80f2025f14d1463ba7ed094bbb38f53", + "localSha256": "cfeab814198934f082033a35592aabe64a5532d3ce4ee787522a1bfb3b468a5e", + "orderedPathDataSha256": "31283848a06a7a9e45dff54a9e85d3fe939f7928db5b48cdfc119a838726fa11", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/sd.xml", + "upstreamIcon": "sd", + "upstreamPath": "android/av/sd/materialicons/black/res/drawable/baseline_sd_24.xml", + "upstreamSha256": "755df9bbdca5214551567fa6d66e1354d9977afb1811d9ea48354eae1f8ffd11", + "localSha256": "e582f33a70e6cae8b61dfeb4ab69d12a05d57919ffe2e4257f31bbd668b6b33f", + "orderedPathDataSha256": "db7f94a8c55b2080a69b10eef7ee7f3183c2670fd446a82cc9d2fb0e863ffdb2", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/search_off.xml", + "upstreamIcon": "search_off", + "upstreamPath": "android/action/search_off/materialicons/black/res/drawable/baseline_search_off_24.xml", + "upstreamSha256": "0007663160c3aa44d44f6e593904f9d994c4b097354c5e0c87a0e9e6518f0ca0", + "localSha256": "1bbca02eb1541e0a14b8a5fe9edf5aebd2579cc549c3f68e71258328d2dce8ad", + "orderedPathDataSha256": "f1bf4c19ab1d6a527858b8f2b8b0f2baa042baa1806d9637fe329209990b3281", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/search.xml", + "upstreamIcon": "search", + "upstreamPath": "android/action/search/materialicons/black/res/drawable/baseline_search_24.xml", + "upstreamSha256": "58876803cf08164dd770b83e711944eb80728782b0f2548ff4094c722798fed0", + "localSha256": "7689a370e5ea70f14654153c7a628c25a7eb914d670941fbed301ce3afdd1806", + "orderedPathDataSha256": "8566debda444a4c6c5a0c19bed9cc1e0850032d82486b7e754b1df683402df27", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/security_update_good.xml", + "upstreamIcon": "security_update_good", + "upstreamPath": "android/device/security_update_good/materialicons/black/res/drawable/baseline_security_update_good_24.xml", + "upstreamSha256": "75dada9967d005430a99ba5c22fdaa4dc0b99ba6a8d0292b792b0e2ff9c9d41b", + "localSha256": "a3edacd37eb1f558347f6ad4eed099387eb15ed779fd0e5c78747f778011e14c", + "orderedPathDataSha256": "233e0ff89cea424b008bd517e7081847235b73ac9f050b1a1f3110222dc13b67", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/security_update_warning.xml", + "upstreamIcon": "security_update_warning", + "upstreamPath": "android/device/security_update_warning/materialicons/black/res/drawable/baseline_security_update_warning_24.xml", + "upstreamSha256": "926748e41f7b2701027fba3b252b3b50fc4c5380a26f8ea2e070e37158502127", + "localSha256": "55e333729b4bc491a53107f56ea56c609ea32490c32dbd9056f8edb853220359", + "orderedPathDataSha256": "f2b24f059142cbd093178c289842c62605c908a85d487db77522fdb53ab316a9", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/security_update.xml", + "upstreamIcon": "security_update", + "upstreamPath": "android/device/security_update/materialicons/black/res/drawable/baseline_security_update_24.xml", + "upstreamSha256": "41bf3db32b15ac6712e4ff7d8ff474156a5056e218f84b65907d314fceadee07", + "localSha256": "b08ae6c476dca8b1a3612d0e7c03b0552e90605e2275a38962e1a3bf5a37341d", + "orderedPathDataSha256": "777d9784b645158212d9508553bdeda805b56fa0e08ffdb7224141e63385bcca", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/security.xml", + "upstreamIcon": "security", + "upstreamPath": "android/hardware/security/materialicons/black/res/drawable/baseline_security_24.xml", + "upstreamSha256": "6d0dd38b08225e8cc9f9055d27f61f95ba9ce9201a909f88608b21d3e46cb8b6", + "localSha256": "cff0652357003f2305be38b48d25ec61f59b17c58aa3f8a35036b1337725f43a", + "orderedPathDataSha256": "375c22b93a7e8e5e9a6641072f49477c3e9901c8ed50db48de98311e13fb2941", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/segment.xml", + "upstreamIcon": "segment", + "upstreamPath": "android/action/segment/materialicons/black/res/drawable/baseline_segment_24.xml", + "upstreamSha256": "e2a0e92532935942c744a40be5243ffd7b566e3c5257de93540532336d3229c4", + "localSha256": "7fbd753ea7b86376f9223a3a90344aa481c00275b945fee46887d7b6ce7847f1", + "orderedPathDataSha256": "d7495824914b97fe7cb990877687776665a4ad1016459524f1888c48380c03da", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/select_all.xml", + "upstreamIcon": "select_all", + "upstreamPath": "android/content/select_all/materialicons/black/res/drawable/baseline_select_all_24.xml", + "upstreamSha256": "95c46e1defe05dc8f7ee1f7db1616b87857927dd2997e336c0e328a5e296e309", + "localSha256": "62976b913508d760e6b33df43df894541cc051fb6ace1e6d37d63875aa0f5d1c", + "orderedPathDataSha256": "5f2c7096a895a53e18cdb3034aa566d11e59b0f5c4191012c02651c031e774b6", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/self_improvement.xml", + "upstreamIcon": "self_improvement", + "upstreamPath": "android/social/self_improvement/materialicons/black/res/drawable/baseline_self_improvement_24.xml", + "upstreamSha256": "992fa747145a028f6fe8f675203d0303feaf41f367bd6397bcd5c0ab486cf7af", + "localSha256": "a31a149906d06a085fc193b9590e390d82d8a99725a9e00abe05edda21c19ec8", + "orderedPathDataSha256": "8327b8edd9d5538ad3633b59e466e6f56a43cc3d51d1ab385e97a622974a77c3", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/sell.xml", + "upstreamIcon": "sell", + "upstreamPath": "android/device/sell/materialicons/black/res/drawable/baseline_sell_24.xml", + "upstreamSha256": "9f3690c07aa58f88f42b6d35412fb0057d087aa499c48134ff11515e9d08c13b", + "localSha256": "843e266c5bb48f9dc20f07d31fb0b373cf954003365a853ea0b8c7660ec88c78", + "orderedPathDataSha256": "23bc37c123e805f828f7f203afb9968c29df068866cc97443c85bf05a36a12b1", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/send_and_archive.xml", + "upstreamIcon": "send_and_archive", + "upstreamPath": "android/action/send_and_archive/materialicons/black/res/drawable/baseline_send_and_archive_24.xml", + "upstreamSha256": "e858a0a73c3f2ffcb74dc531494d98e1529dcc8af0770aa61b07ce7696c33bad", + "localSha256": "df535d290713675f3c0e47808201337a20de76708b988cddccc4517dd405f88a", + "orderedPathDataSha256": "6389f47234447a134fb3ea5d1a5ba54e5fd077c68d31ed87da1755b1d2c4f34d", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/send_time_extension.xml", + "upstreamIcon": "send_time_extension", + "upstreamPath": "android/communication/send_time_extension/materialicons/black/res/drawable/baseline_send_time_extension_24.xml", + "upstreamSha256": "87efe8b7d22d17f71ce949f6d77d5d2261e5cfefe541fe6ba5f7d7a93fd85728", + "localSha256": "2a51bf176a744cbe8a6c69b558fcdaaba396a9d1caa28b28c1b3bb3bd4e3c958", + "orderedPathDataSha256": "9fc69d53731420f30d1c41f6dbf64aaa0824225b2ed6772235dd43ad9fd575b1", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/send_to_mobile.xml", + "upstreamIcon": "send_to_mobile", + "upstreamPath": "android/device/send_to_mobile/materialicons/black/res/drawable/baseline_send_to_mobile_24.xml", + "upstreamSha256": "c81e2328c2ff33311d287d77a54ca0cd7fb7328468c89758960e331c4dbb781c", + "localSha256": "06b69f52ba62fbaf72f423a0f6730bc22c5cc3be2b4a56be0c35cada01b7e584", + "orderedPathDataSha256": "65b043e24c490e0df7c65c2bbd7efbddb294711b28e14f64968bc2ebffdac125", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/send.xml", + "upstreamIcon": "send", + "upstreamPath": "android/content/send/materialicons/black/res/drawable/baseline_send_24.xml", + "upstreamSha256": "961cbb613db95e5c654bea92bc58906a351fc0bcff5a990df39452aa5bf13078", + "localSha256": "9d76d045c06d848745b094427a25aa7e2374c330cf0fe31b972b0d56126c5a22", + "orderedPathDataSha256": "bd3569b153a27a295e0fa7da1b99bf16da3ddc9115b1d80e99615266f96d1ad0", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/sensor_door.xml", + "upstreamIcon": "sensor_door", + "upstreamPath": "android/home/sensor_door/materialicons/black/res/drawable/baseline_sensor_door_24.xml", + "upstreamSha256": "652c0558cda7a1f0a19f67ee92b260f7ab7180f051e3b1c705ecc6c66b8c0ef8", + "localSha256": "4df1d97a8f568da23d3105251a11fa9b06b957830c5d938ea9ecdaea140d79fd", + "orderedPathDataSha256": "86ec259dc834fa1fd1b7dbfc00d8dedd5973730aa06097de4e91ecc8350f2063", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/sensor_occupied.xml", + "upstreamIcon": "sensor_occupied", + "upstreamPath": "android/home/sensor_occupied/materialicons/black/res/drawable/baseline_sensor_occupied_24.xml", + "upstreamSha256": "082e74c63fbd0add9519304d71888db86be396d0c4f16566dd042b943b7903e1", + "localSha256": "1a59c3bfae74a69199877077821515152f07bd4856813b631dd9f8a83ef993d2", + "orderedPathDataSha256": "94c335eeb1473adc88cd10f20f69ce77d8f2122088c1b3d875943f2722df90e2", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/sensor_window.xml", + "upstreamIcon": "sensor_window", + "upstreamPath": "android/home/sensor_window/materialicons/black/res/drawable/baseline_sensor_window_24.xml", + "upstreamSha256": "02e6b565dd2722e3837653ea7294ab8153f2e7096843ad251a8fde777c9e0077", + "localSha256": "591ceaa8f059f070ed1bc617738ec7c20b1e75f492af1e7a3f41219b0b2b90d9", + "orderedPathDataSha256": "8e64773790bee22bb979e007233f340ff6c7eecc69f442b13136569adf9accf0", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/sensors_off.xml", + "upstreamIcon": "sensors_off", + "upstreamPath": "android/action/sensors_off/materialicons/black/res/drawable/baseline_sensors_off_24.xml", + "upstreamSha256": "abf8cc01c88f10e1b34227e7286d6136dfbbc2474af5dca1399cf86fd50c185d", + "localSha256": "f92e404eda046140c0ed3e5e4714a8a2154f2402bd36b117077aa023e9503d3a", + "orderedPathDataSha256": "5851b68778e9f9e914b8fb750932f2c13f28d9ea2d8d04d901896e3db0dfc60d", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/sensors.xml", + "upstreamIcon": "sensors", + "upstreamPath": "android/action/sensors/materialicons/black/res/drawable/baseline_sensors_24.xml", + "upstreamSha256": "8dc8207ee44e1454229e0164cb227bcdeb82013cbb08c9747e3332dab718640a", + "localSha256": "1705ac960386df9741f6757c824ebde2fc592646ed448183cc250daa2a37bbbe", + "orderedPathDataSha256": "6094f2e2cf878a73f80c465bedce1179ebc92be3bcfcceecaee94bec674f9311", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/sentiment_dissatisfied.xml", + "upstreamIcon": "sentiment_dissatisfied", + "upstreamPath": "android/social/sentiment_dissatisfied/materialicons/black/res/drawable/baseline_sentiment_dissatisfied_24.xml", + "upstreamSha256": "35ad2517385985f45fca2fa483e25f0de9e268b52257c1e960cd728f43d7f571", + "localSha256": "b56f687a8e5a6b6ff48bd9d1523313fb8db9f01e3fadc60b7b918de5261bcf37", + "orderedPathDataSha256": "d04760c6201a6fca9a3dbe1fc03bf231cca0e025fce7b8491ead42dbdce2a837", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/sentiment_neutral.xml", + "upstreamIcon": "sentiment_neutral", + "upstreamPath": "android/social/sentiment_neutral/materialicons/black/res/drawable/baseline_sentiment_neutral_24.xml", + "upstreamSha256": "32776690bee112488f9d4f43fdb2b7f377cf660e42774030735cb6a35fc3fa4e", + "localSha256": "ec84703f5f7c3a3e3a30a18d2fbdf4dea8dd6a87849863d9c85f21ede482b969", + "orderedPathDataSha256": "70b04ce24ddb021b513ffdd668c2fefb7380dcdb0afa9e91d43302684fca9ae7", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/sentiment_satisfied_alt.xml", + "upstreamIcon": "sentiment_satisfied_alt", + "upstreamPath": "android/communication/sentiment_satisfied_alt/materialicons/black/res/drawable/baseline_sentiment_satisfied_alt_24.xml", + "upstreamSha256": "74a8192acd906f8c30e5759f7a32a0d368ed50b3a90688828ed852253d578ed5", + "localSha256": "2a6b9aa1b66a3c85d2e8a66bd278068b0c32d2543b4d376bbe192d06d8742f3e", + "orderedPathDataSha256": "2531be1eb851908449456cc7b7c57e69245b8c8bc999b4537ab3a554afdfba0f", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/sentiment_satisfied.xml", + "upstreamIcon": "sentiment_satisfied", + "upstreamPath": "android/social/sentiment_satisfied/materialicons/black/res/drawable/baseline_sentiment_satisfied_24.xml", + "upstreamSha256": "5bdb807b82b1864f54923d745a2522647e5c3667a8f61ea7b348e6174842257e", + "localSha256": "10720547386419ea93bbdaff77edefe587ea0ed9e3788245b8d5e978b42a13a8", + "orderedPathDataSha256": "d18ab524ea00509ab4ff01c872e8dd853f8f59180d75dfc6139dfc2045a3a320", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/sentiment_very_dissatisfied.xml", + "upstreamIcon": "sentiment_very_dissatisfied", + "upstreamPath": "android/social/sentiment_very_dissatisfied/materialicons/black/res/drawable/baseline_sentiment_very_dissatisfied_24.xml", + "upstreamSha256": "126258b49caf07ff292316a5d67e733eaac00a4a40509f06f1bb5740edfe3ba1", + "localSha256": "9089066936272fb5a3d8aa687518549ad571f2376f3335b69acba8c3112954d6", + "orderedPathDataSha256": "e7b0d60f95fd93ff44a0f731a625843d207bbf8b9738dbd325e05018ab2bd18a", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/sentiment_very_satisfied.xml", + "upstreamIcon": "sentiment_very_satisfied", + "upstreamPath": "android/social/sentiment_very_satisfied/materialicons/black/res/drawable/baseline_sentiment_very_satisfied_24.xml", + "upstreamSha256": "3ae6ba09d63036cc31095592f95aff9b05c5b2ca47ea6bf0892ec36246c0ce0e", + "localSha256": "28c4cc22adb9fcf2a8b71ad36310af6559df1085fca5c6eb2e749dffb8030f47", + "orderedPathDataSha256": "dbeca4896c906584c306f760cb57a4b370f00b7c01de0025326d70fb1b0a3454", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/set_meal.xml", + "upstreamIcon": "set_meal", + "upstreamPath": "android/maps/set_meal/materialicons/black/res/drawable/baseline_set_meal_24.xml", + "upstreamSha256": "c87e68a3a89bb682dfea023930451d451cc249bf43f969a9063590c3fe86f24a", + "localSha256": "fb183224c51f6052f974d544014f56e4e0f777ece18fd495d090bfddfb71e434", + "orderedPathDataSha256": "e936c1ca715f3daedc5f55fbfbb8b4aa1ee737e62a33527200e0279bc5a9c2e3", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/settings_accessibility.xml", + "upstreamIcon": "settings_accessibility", + "upstreamPath": "android/action/settings_accessibility/materialicons/black/res/drawable/baseline_settings_accessibility_24.xml", + "upstreamSha256": "b3cc4268b102630aea6dbc97893241b4b90273210566047c6d8309c94bc1f319", + "localSha256": "d2a6ef830edc3731bffa14cc917dc5d947628ee365af958109380d118d88a268", + "orderedPathDataSha256": "7e1367c8c2db48b3f0418fc2f5ea13c231a4a726289e3f56a74756b1add8c72c", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/settings_applications.xml", + "upstreamIcon": "settings_applications", + "upstreamPath": "android/action/settings_applications/materialicons/black/res/drawable/baseline_settings_applications_24.xml", + "upstreamSha256": "b862e43ce1a6216579ee77b11441dc5853c52fcbf322ed4501acb6ecbb96531d", + "localSha256": "b3cb2fc5af61a53cdf29027136065f0a05192c0f953a2cdc7b818c72292da41d", + "orderedPathDataSha256": "43d5b88efe94e62be54eb4f17a62c26de25882d639b39a4b47445d6add8b1f7b", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/settings_backup_restore.xml", + "upstreamIcon": "settings_backup_restore", + "upstreamPath": "android/action/settings_backup_restore/materialicons/black/res/drawable/baseline_settings_backup_restore_24.xml", + "upstreamSha256": "705e03f4d27ce91bf5d2e978226d19db02a008b4669c4553ad5fb889df3363f0", + "localSha256": "ccef4c51db16403bdb0632ea0a7104aa25ebc73ecbd65244ee8a0fdf3e7c8abf", + "orderedPathDataSha256": "669db478aa7de8f0f8c57368461e3d467522f16d01d9d57942d7ec63435bac8d", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/settings_bluetooth.xml", + "upstreamIcon": "settings_bluetooth", + "upstreamPath": "android/action/settings_bluetooth/materialicons/black/res/drawable/baseline_settings_bluetooth_24.xml", + "upstreamSha256": "95455185ac9a2574ead83d500f14e65cb9d324ffae50f9e67ffc883ad6081ff1", + "localSha256": "1541d1836c27bd2bda23974873b10756cebf180c15d4cf645e2bc5a1a2d86cda", + "orderedPathDataSha256": "86d1b858da75fb54e3adc650f2e5820d08558331c8d8490e74bf67cca311bea0", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/settings_brightness.xml", + "upstreamIcon": "settings_brightness", + "upstreamPath": "android/action/settings_brightness/materialicons/black/res/drawable/baseline_settings_brightness_24.xml", + "upstreamSha256": "1128c98d7f69d09de55b2b27c5a05ae7c58f64018cad329afe483303a25b94d7", + "localSha256": "af9c2b9dcd10f89862889496a933c0e044430226555d1b6abe5abe7713d2102d", + "orderedPathDataSha256": "f522ad6b1f926f0bdfff04e64957ccdf61de2603775cd9ff5d6fc7272d7338d6", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/settings_cell.xml", + "upstreamIcon": "settings_cell", + "upstreamPath": "android/action/settings_cell/materialicons/black/res/drawable/baseline_settings_cell_24.xml", + "upstreamSha256": "787a2631f6a61533ecb74266a9611e0f0dc08bd14b598f2f063ea055206af181", + "localSha256": "900d81616bad914c5974783008afbd0d8ce62ee237a6061d382f7f3ceccab5f9", + "orderedPathDataSha256": "3249795979875ce065cc483a3c5d17abf54dd16641b7b6478a00ec55043e7dec", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/settings_ethernet.xml", + "upstreamIcon": "settings_ethernet", + "upstreamPath": "android/action/settings_ethernet/materialicons/black/res/drawable/baseline_settings_ethernet_24.xml", + "upstreamSha256": "c36094bad91d12fb98a8f7b88fffd38d73345bb6f958ac3a5f81aaf40b3ed8dc", + "localSha256": "767d69ae27b386f89b3d0728c3bedf36a1602fcf4922a590cafe454d0db78e00", + "orderedPathDataSha256": "65f8f6dfae36602a6cfb112075a11fad2c861057f142fa22407d3d6025d6fa81", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/settings_input_antenna.xml", + "upstreamIcon": "settings_input_antenna", + "upstreamPath": "android/action/settings_input_antenna/materialicons/black/res/drawable/baseline_settings_input_antenna_24.xml", + "upstreamSha256": "1081a48608fa60491c0abf8f3a6bfbbbde561b6636d7ff677f2f278ce2528d38", + "localSha256": "0b1615564bea47c457b9b3d42d6610d93ea974c5d68416f315d5161894260e2f", + "orderedPathDataSha256": "11911a9859681e8de71588d21c30626ce19919654ceaed197d099274e5f83a7c", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/settings_input_component.xml", + "upstreamIcon": "settings_input_component", + "upstreamPath": "android/action/settings_input_component/materialicons/black/res/drawable/baseline_settings_input_component_24.xml", + "upstreamSha256": "b651284395560ae22f90cb6023e731907390cbccd6715c0db27923e3315a68ec", + "localSha256": "4c4dc2baca45f16156b5c84813c04ef97ec605c5bf54787c254a026d290e9acd", + "orderedPathDataSha256": "24de1f3457c9b5008f2ea528ba1d34cfed183b71dc78d9d2275b3e296358578b", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/settings_input_composite.xml", + "upstreamIcon": "settings_input_composite", + "upstreamPath": "android/action/settings_input_composite/materialicons/black/res/drawable/baseline_settings_input_composite_24.xml", + "upstreamSha256": "b651284395560ae22f90cb6023e731907390cbccd6715c0db27923e3315a68ec", + "localSha256": "d2bf0f2fb25ec4a422b5fae30521bafd45d8659e65f1499dcac9291855a22a8f", + "orderedPathDataSha256": "24de1f3457c9b5008f2ea528ba1d34cfed183b71dc78d9d2275b3e296358578b", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/settings_input_hdmi.xml", + "upstreamIcon": "settings_input_hdmi", + "upstreamPath": "android/action/settings_input_hdmi/materialicons/black/res/drawable/baseline_settings_input_hdmi_24.xml", + "upstreamSha256": "f74eae6086a15bfe2d5066d5e72b96e9da532bbe2a86e438211f94e948a33e61", + "localSha256": "b997621dcade0bf3c0bee089bd9828c574ea2b5a11a84c9b201d3294ec36f437", + "orderedPathDataSha256": "934c4bc9f2bf81a73eff47de7c16cb38d3069e480c04d8d44b1582eeb7d91ac4", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/settings_input_svideo.xml", + "upstreamIcon": "settings_input_svideo", + "upstreamPath": "android/action/settings_input_svideo/materialicons/black/res/drawable/baseline_settings_input_svideo_24.xml", + "upstreamSha256": "047ce71a5ff30649891138f8efdd08fc2a5e3c5362b059d5b873626ccdc335b0", + "localSha256": "cc4836ae9b50d593db050bf53543e793460430999022b9f84bfdc474c55dff4e", + "orderedPathDataSha256": "a2b1d4d98a676b8f65a60740c0a435a5c755e26adb537984df03c53803e7245c", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/settings_overscan.xml", + "upstreamIcon": "settings_overscan", + "upstreamPath": "android/action/settings_overscan/materialicons/black/res/drawable/baseline_settings_overscan_24.xml", + "upstreamSha256": "25ecac9b492b0ff618cfeedffccd283544a2eb85b7b9854f2a5b6334db7ce3d5", + "localSha256": "2d6a04989845c9abca31adcbd200d35f7b87710b43bcda7816234319411ca4dc", + "orderedPathDataSha256": "7554d243869f422f46426cb3245c0ded9771a45efd3060c6d686195ef2d46988", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/settings_phone.xml", + "upstreamIcon": "settings_phone", + "upstreamPath": "android/action/settings_phone/materialicons/black/res/drawable/baseline_settings_phone_24.xml", + "upstreamSha256": "62565594b3a14e474fc0f99ec44447eb7a5927cb1e27a0ac0d4fc744b0079b84", + "localSha256": "345c69647bbf7828d0c490559773d888e5e77ea6465509021cf5764a8b6ee887", + "orderedPathDataSha256": "1cddee759d04665e26c52f63d84841f6e1de3bd57b20dc2d4ff16891f24439cd", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/settings_power.xml", + "upstreamIcon": "settings_power", + "upstreamPath": "android/action/settings_power/materialicons/black/res/drawable/baseline_settings_power_24.xml", + "upstreamSha256": "5ec82c3c403dade90a1f948ff7c5235ba19a59b9c2621ac5b1cec2aa345b649d", + "localSha256": "1571426d5d149e4697c0c36484d2b42130b87b7a4f8f37ada21dc4b9db07f8c8", + "orderedPathDataSha256": "bc61acf89f08f1b2997290f211069ae0db2e62c0a6063ac17511cdf5216ea63e", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/settings_remote.xml", + "upstreamIcon": "settings_remote", + "upstreamPath": "android/action/settings_remote/materialicons/black/res/drawable/baseline_settings_remote_24.xml", + "upstreamSha256": "5f5331c8a1693ba5ae86cda72c48ae30c72c57d14291d8f8a8e73623fb88b2bc", + "localSha256": "a133bc10d086d08b15bb1de1777ab74914524a403c50e44f9f791ae138928a49", + "orderedPathDataSha256": "071584b762e3b2ad9373d482bcfd1c51c8adfecea597e30dcba4e3ec5204cb79", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/settings_suggest.xml", + "upstreamIcon": "settings_suggest", + "upstreamPath": "android/device/settings_suggest/materialicons/black/res/drawable/baseline_settings_suggest_24.xml", + "upstreamSha256": "bf3a0ff0819984c19a2e8633514346eb835c27bd117e2696b46e5b7459f23fd3", + "localSha256": "1d3c44235b0a270a6e02c80a8b3d7d7d94edade6559c1525ef93bb5053d896c8", + "orderedPathDataSha256": "75d01bee2e78533d2f0b8bfcccf7c232585d7d38064052e8e18abbb7b270472c", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/settings_system_daydream.xml", + "upstreamIcon": "settings_system_daydream", + "upstreamPath": "android/device/settings_system_daydream/materialicons/black/res/drawable/baseline_settings_system_daydream_24.xml", + "upstreamSha256": "b6da26e6b3ee05cd9784fd58264d74168ed8c9840729e651fdc928f380ea2d42", + "localSha256": "6c89aabdd701f290e297f92f34cc8566d567164d4cf8ef476cfd9efce04eb7f5", + "orderedPathDataSha256": "cf6815ac685a31ee8281ad312f00477a2685d03371d36864e929ca5a8fab0376", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/settings_voice.xml", + "upstreamIcon": "settings_voice", + "upstreamPath": "android/action/settings_voice/materialicons/black/res/drawable/baseline_settings_voice_24.xml", + "upstreamSha256": "2fea1e3bddc5bbbf4ac4e67b96d018b92066d2660117d3a9a15db6cb9de645c2", + "localSha256": "85945eef7736235ceb8f1d7a1d85828c9204fc59ba15ed69c4e8bb1207260ebb", + "orderedPathDataSha256": "d7ab9d53e139487a2a8f251399f35cc9eb2779f0c86867bc48239e52b804559c", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/settings.xml", + "upstreamIcon": "settings", + "upstreamPath": "android/action/settings/materialicons/black/res/drawable/baseline_settings_24.xml", + "upstreamSha256": "700bc442d778e5f5de2b574834c912aa89bdf25fca8184b62a33e3857e6bb7ee", + "localSha256": "cc3f9b3998aed44cb28341fd9d0413b362cb01fee83dc3029223634ded191226", + "orderedPathDataSha256": "1bef6ffcb2cf29f11af09eb79dcf6c8606f45b618adcac912d35007f19f5fa32", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/severe_cold.xml", + "upstreamIcon": "severe_cold", + "upstreamPath": "android/social/severe_cold/materialicons/black/res/drawable/baseline_severe_cold_24.xml", + "upstreamSha256": "35fe632ebdce39f21aa42f800dc97ae6f928c82ff6d8fa9188b2b6748ec5a9cc", + "localSha256": "3745e24f7c7313b9fc6485a49b49ee533a5ddd93486209fa4f10a1097ea01eb7", + "orderedPathDataSha256": "b7cfe5c875eddb01c0a9193b98dd0604c87e0984e34d2374c6ef12d847f62f5c", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/shape_line.xml", + "upstreamIcon": "shape_line", + "upstreamPath": "android/editor/shape_line/materialicons/black/res/drawable/baseline_shape_line_24.xml", + "upstreamSha256": "9109aaeb43d85ffebc496f5edd62dac6b51b29a800fcc3f4a1aca5a821925c04", + "localSha256": "0c8226846aa55ca75f4cb575e4015124d3068e9a46625ab89c6bfb14f0f885b2", + "orderedPathDataSha256": "83b071289b427c28bbdc027088ca5c9099228883e7864e28181897fc6d3d2bf4", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/share_location.xml", + "upstreamIcon": "share_location", + "upstreamPath": "android/device/share_location/materialicons/black/res/drawable/baseline_share_location_24.xml", + "upstreamSha256": "8b17b29283aba94b692a6c8d6d4941c15163c4249afc5a2355113947926e88e1", + "localSha256": "be14f287b360b0d2f981f460cc2c30d1bb2b74724b2512df50a926c35efe1f28", + "orderedPathDataSha256": "f31d3d6c026bc2c2d9e2e8bd2c7fc7b24984e3e502f2bb581abbf169a83c1192", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/share.xml", + "upstreamIcon": "share", + "upstreamPath": "android/social/share/materialicons/black/res/drawable/baseline_share_24.xml", + "upstreamSha256": "ca8e459e698022ec7ea492a08e990585a868b51a0159e3cc13ecbc7f03e92d7f", + "localSha256": "24e605033d83139320f9a69bf6460ccdef1921884ab9cdfae87e2070a724ab23", + "orderedPathDataSha256": "b05cc152b6f49b9c5a1ea9a0287af27614ede3a86204dd88b37aca34974cca7e", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/shelves.xml", + "upstreamIcon": "shelves", + "upstreamPath": "android/home/shelves/materialicons/black/res/drawable/baseline_shelves_24.xml", + "upstreamSha256": "5d1d4ef6146cc2fb6a6cbdce130438738dfb9324cd8c29e62a6b275244c04f52", + "localSha256": "90ed160de52c56cf791d3eacf9aadec6c75df8075a2992dc5504882e41045f18", + "orderedPathDataSha256": "4162167ba920bacba959dbe7c666877b0caececcd1e5b7613ddd2896cab68136", + "originalGeometryMatched": false, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/shield_moon.xml", + "upstreamIcon": "shield_moon", + "upstreamPath": "android/home/shield_moon/materialicons/black/res/drawable/baseline_shield_moon_24.xml", + "upstreamSha256": "ed9c741c3b5045b9eb9b7e1311a496a460cfd7aeec58c483e4e3fec6774e2932", + "localSha256": "b7d9941522cb683cf1ebda05ab2ead56a3b130f5245ef97aad488dc6b3880f50", + "orderedPathDataSha256": "5f5615d0806303b41e6039ae39835495474061e6aac585d0bceaa8fd3bc1db82", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/shield.xml", + "upstreamIcon": "shield", + "upstreamPath": "android/content/shield/materialicons/black/res/drawable/baseline_shield_24.xml", + "upstreamSha256": "200ac72716a48a41a82f1d781edf90872113c1bae0b9d906735df52bbccc6ed3", + "localSha256": "3e43e908c99960ff29cb684d862c449d8e05d8f1a32bbbe95fc5b1240e41f4f4", + "orderedPathDataSha256": "aeae6ff1e4368870865b7e86f1e51ec733f58b200bf2cadc99d7b1b69abe063b", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/shop_2.xml", + "upstreamIcon": "shop_2", + "upstreamPath": "android/action/shop_2/materialicons/black/res/drawable/baseline_shop_2_24.xml", + "upstreamSha256": "cc6dd36561336d6634e10772e9b583d63f9529761cc6ad72f3a69e639c2ad81f", + "localSha256": "7067b8c977b5a00129dadfb1409263e48aa185c7e4206b85dee2f4be76bf62f5", + "orderedPathDataSha256": "9728fa0861ba77fb4560b884c5d770a6558264029f754c652c1ae0cbab9a5faa", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/shop_two.xml", + "upstreamIcon": "shop_two", + "upstreamPath": "android/action/shop_two/materialicons/black/res/drawable/baseline_shop_two_24.xml", + "upstreamSha256": "3a6358910bbda8b3650f574afa945e9e8246a75472d7ac95c27c8d433e6b67cc", + "localSha256": "b3f16dc6bcc008c2a98f951780de76c58e775240b066ba24185dac81c2363636", + "orderedPathDataSha256": "106021c36f28d01bf3b9a107cce15cc556f2ec60a82f9a9cf1a41fd51844571d", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/shop.xml", + "upstreamIcon": "shop", + "upstreamPath": "android/action/shop/materialicons/black/res/drawable/baseline_shop_24.xml", + "upstreamSha256": "355079bef46c2f568c4cfa060b5773ff9c52f1a330603966de11c68f8a2ca9f4", + "localSha256": "879ae4824fcb137f6783eb41025ad2ffcc36aede7ad6cfd4fe29098124e8dea6", + "orderedPathDataSha256": "354ed059013391b1bb7717271e1056b829d9bd87d4e38449a50e4a44101225fb", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/shopping_bag.xml", + "upstreamIcon": "shopping_bag", + "upstreamPath": "android/action/shopping_bag/materialicons/black/res/drawable/baseline_shopping_bag_24.xml", + "upstreamSha256": "730b8889a9f1a9063034899e18ae19269790dec474f4554edf41b8e7ba9b3668", + "localSha256": "f84fbbc222af09f1c7f76ba0a114b49f63dfd6462a5518f44c7d8d6dc8003398", + "orderedPathDataSha256": "173492d195baab6460fd826916af2098c2ca0de5c95e6687a3cfc788a66924bd", + "originalGeometryMatched": false, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/shopping_basket.xml", + "upstreamIcon": "shopping_basket", + "upstreamPath": "android/action/shopping_basket/materialicons/black/res/drawable/baseline_shopping_basket_24.xml", + "upstreamSha256": "5da1894fba5bf90fc07413aa408685c92dded4c7ec6821786222a1a64dc25b62", + "localSha256": "237b4c3508390b195cbdaa8940eef6ddd97b7267605f8ecaeaf71c6da556696e", + "orderedPathDataSha256": "e65a310081eabecdf6c01325eb84fc759571d4e2dcfc28bed3cf7100cbaf6663", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/shopping_cart_checkout.xml", + "upstreamIcon": "shopping_cart_checkout", + "upstreamPath": "android/action/shopping_cart_checkout/materialicons/black/res/drawable/baseline_shopping_cart_checkout_24.xml", + "upstreamSha256": "43c87c14e9e9e9222f024a05f1b1ee1e1a4750282f7f329446ca5a59a5f6a89a", + "localSha256": "169fe031f5134b6ad903275f3dc660d964bed19ad56dd8e2ba19f72f70aeffd2", + "orderedPathDataSha256": "4675691907b3e15a397959b4eb644c9e9e0304f02be5ed783d80413822d08d6b", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/shopping_cart.xml", + "upstreamIcon": "shopping_cart", + "upstreamPath": "android/action/shopping_cart/materialicons/black/res/drawable/baseline_shopping_cart_24.xml", + "upstreamSha256": "458a3c5727c73dc99d3a672bc3e0a6d8296e66ba9bc7b87881e54fe5072baff9", + "localSha256": "3dad172f53943627cb83606b3aa8b23dd339abba3473bade7d5b47255a030ebc", + "orderedPathDataSha256": "7e0532c170b8c1d53f9d6909ec64fb5f316c9b8d3a78adde669a3489c326611d", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/short_text.xml", + "upstreamIcon": "short_text", + "upstreamPath": "android/editor/short_text/materialicons/black/res/drawable/baseline_short_text_24.xml", + "upstreamSha256": "7eb9fd07ca4d473047c5395c269416c78fdbf4f35376ffcbaafa8252d0151f61", + "localSha256": "e73b42eee0186885f7fcc615da68078126afa2b9d8ba5e557413e8e034195578", + "orderedPathDataSha256": "5b3afa7f0fa9cfd1b1bc31d889e6ab14414f007f9c2ba586898de1a33ca016a2", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/shortcut.xml", + "upstreamIcon": "shortcut", + "upstreamPath": "android/device/shortcut/materialicons/black/res/drawable/baseline_shortcut_24.xml", + "upstreamSha256": "93f7ff62bbe2d632d4975faa0d9b47aa677abba0b2bcb1eb09a9f9d23c27f264", + "localSha256": "886d2be6393e5394b47c22f8e44a0ad15d556c78454cf015c2740d70dc81158e", + "orderedPathDataSha256": "48386c1fccfc8f48f84eff8b593d75108a6009f82fe63e456ce8218656e348b0", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/show_chart.xml", + "upstreamIcon": "show_chart", + "upstreamPath": "android/editor/show_chart/materialicons/black/res/drawable/baseline_show_chart_24.xml", + "upstreamSha256": "4df8b017626e512a3ffd47e7b7f7356cca16a398b99bdf654890a9f0c33a81e4", + "localSha256": "ba2c243b13dd5936379f5405c2abfc91717a9bb1a43466b6df3d595221fa0ee3", + "orderedPathDataSha256": "c1bc36d9ee9c0367f70195ba0d449cd0f6fb91683ff970bdeb62a9764e97c994", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/shower.xml", + "upstreamIcon": "shower", + "upstreamPath": "android/search/shower/materialicons/black/res/drawable/baseline_shower_24.xml", + "upstreamSha256": "0bbf602372ed6cbb279b2d1cbe1a34555d992a69c345cfd10f050e15feaffff9", + "localSha256": "4fe43d59aa7822e9f89787e70ab3dff59fed4e14a3b1bc6ccdb188ea13304fe0", + "orderedPathDataSha256": "1de1c0193b29deddf4516835c20683277f4dbd5e7aee53b8b3277bac42d5d037", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/shuffle_on.xml", + "upstreamIcon": "shuffle_on", + "upstreamPath": "android/av/shuffle_on/materialicons/black/res/drawable/baseline_shuffle_on_24.xml", + "upstreamSha256": "55589e4fa9252db8f868c32ebae8e3908bb2d99ebe03ac5caf5d4c536d323df3", + "localSha256": "b08e07815620940f687396091d2256c91c0247b255f7df8b7185caa47a327890", + "orderedPathDataSha256": "8c2e797820978c1dcc3bd82de5912f560e8413c9f05ba5aa132974def1667780", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillType", + "value": "evenOdd" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/shuffle.xml", + "upstreamIcon": "shuffle", + "upstreamPath": "android/av/shuffle/materialicons/black/res/drawable/baseline_shuffle_24.xml", + "upstreamSha256": "2d7befebdd81f9d0d701c33c33a22ae9922f834f65e06f94860469a12973c5f7", + "localSha256": "3370f6674e55be4ffbabb3699feb43d21909ce85b31102cfd666c52a82930c06", + "orderedPathDataSha256": "9147a29d4e5c7f20898fb6a27bd74db6580e27ef8d7dd6fe2430f7195f57ea19", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/shutter_speed.xml", + "upstreamIcon": "shutter_speed", + "upstreamPath": "android/image/shutter_speed/materialicons/black/res/drawable/baseline_shutter_speed_24.xml", + "upstreamSha256": "cae807f462f5bd0c4a8b61dea1f09456612c9ebee29b25fde2e9cfb482f72e99", + "localSha256": "10b288a471c6cb3748f6d05ab94ed962f86b3a0c607fd5b25523d87337dfdd17", + "orderedPathDataSha256": "967c8458ce5d50f1749fa0ef3dd143e913c8668a04502802173f4b3432195e80", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/sick.xml", + "upstreamIcon": "sick", + "upstreamPath": "android/social/sick/materialicons/black/res/drawable/baseline_sick_24.xml", + "upstreamSha256": "30f15ca3794f3a939a7d360c887265dfa14bee2e556f5d1f768abd1469c307dd", + "localSha256": "1263d8bcbf4218d0e407f91c5a6e3959bc92187ec7b09cb811e251a0663ee459", + "orderedPathDataSha256": "555c200fc6686f6d107976bcdbed9bc7e677501ea186b5ac8a38e55fa20d99f7", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/sign_language.xml", + "upstreamIcon": "sign_language", + "upstreamPath": "android/social/sign_language/materialicons/black/res/drawable/baseline_sign_language_24.xml", + "upstreamSha256": "27eeb68934c2f6f9bbe86208ca1d2b6fa7c3b8eb31f3d3566721f9ffed79ad96", + "localSha256": "190dc7e104c19303254a64eb7a0f9e2b459f2704901d397fede8da45291753c0", + "orderedPathDataSha256": "44b7eda7dfb8469ff2b5d120248257ff5637420e8966fd69d201709c476edfee", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/signal_cellular_0_bar.xml", + "upstreamIcon": "signal_cellular_0_bar", + "upstreamPath": "android/device/signal_cellular_0_bar/materialicons/black/res/drawable/baseline_signal_cellular_0_bar_24.xml", + "upstreamSha256": "1f9f9e2551dd02902e9fede04ece4731a963cbfeb109286277c774d9deef80d5", + "localSha256": "82c8d7eed475ab2c1233c7f9f061f0006d6804d8efd8cdf968c003ced8a9c9f1", + "orderedPathDataSha256": "d10a53c89b4ff9a3f73e4d921cea04371ed7f6f6899db884c2f02a02d7a7d7fd", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/signal_cellular_4_bar.xml", + "upstreamIcon": "signal_cellular_4_bar", + "upstreamPath": "android/device/signal_cellular_4_bar/materialicons/black/res/drawable/baseline_signal_cellular_4_bar_24.xml", + "upstreamSha256": "6208d270578b9ac080f4c7571eba978301622b0c6657d8f32ab83f022100449f", + "localSha256": "bc5034aef3207050331636306c42929becb83bfb64a6bb9dabb022350a1103ed", + "orderedPathDataSha256": "5557ed7b3040f33361dfe8139f402ccf175e7793f8c0a4a7eb5162f077beac11", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/signal_cellular_alt_1_bar.xml", + "upstreamIcon": "signal_cellular_alt_1_bar", + "upstreamPath": "android/device/signal_cellular_alt_1_bar/materialicons/black/res/drawable/baseline_signal_cellular_alt_1_bar_24.xml", + "upstreamSha256": "68c568b27c0063516c9b3a3182d0cd828539afe859d515d9906fbe513631b19c", + "localSha256": "981e8ce07b2ec07a32a23df6a15c2779a1a5a19e8be16a53252e64a7627746a5", + "orderedPathDataSha256": "16c0c55138fe254150220b09dffdcab48d9b49aab8d08821a68424e3d44e2548", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/signal_cellular_alt_2_bar.xml", + "upstreamIcon": "signal_cellular_alt_2_bar", + "upstreamPath": "android/device/signal_cellular_alt_2_bar/materialicons/black/res/drawable/baseline_signal_cellular_alt_2_bar_24.xml", + "upstreamSha256": "f3c6208fe8bc39b9e0ab68aecc51d30acb7b34524808f7a6123652b9560eacd2", + "localSha256": "ddb9eae0faef72c23675f5d45a6e8044bf8c91187f67a03176d04d41296cced9", + "orderedPathDataSha256": "e9712c3e37462aeaba7038499b59bbd50437a5c542fb452495a4f88687dc2acd", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/signal_cellular_alt.xml", + "upstreamIcon": "signal_cellular_alt", + "upstreamPath": "android/device/signal_cellular_alt/materialicons/black/res/drawable/baseline_signal_cellular_alt_24.xml", + "upstreamSha256": "8a5f77ecabc2edb0347e4db306cdf1bcdf7fcd76feb31876204c60b8a182beef", + "localSha256": "1900d21286f66af9a6865d52d9f8033a9e88ff723447a3b6fb24cf7956489f04", + "orderedPathDataSha256": "4085084cc20d4cf3ae46bd03c76182abeb3511c7b8c8353c583d8546fbff7e06", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/signal_cellular_connected_no_internet_0_bar.xml", + "upstreamIcon": "signal_cellular_connected_no_internet_0_bar", + "upstreamPath": "android/device/signal_cellular_connected_no_internet_0_bar/materialicons/black/res/drawable/baseline_signal_cellular_connected_no_internet_0_bar_24.xml", + "upstreamSha256": "126fa6f5a2d5608ab413fdc8041c6c885d02872e0023b1504ad377cbbadfb8e2", + "localSha256": "6d97c9a03ab07556090969e0d9018db5ee449fc2aa7cac1953e5d290c0f8a538", + "orderedPathDataSha256": "2d73c57f8415d0ea64af040a7344e700703623d547305b9d037a382cf307b980", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/signal_cellular_connected_no_internet_4_bar.xml", + "upstreamIcon": "signal_cellular_connected_no_internet_4_bar", + "upstreamPath": "android/device/signal_cellular_connected_no_internet_4_bar/materialicons/black/res/drawable/baseline_signal_cellular_connected_no_internet_4_bar_24.xml", + "upstreamSha256": "c7d7542e8760af2ecc3d0fed6fd49d47a8cbb61c60e2b22f794eefc61da2582c", + "localSha256": "a62e3aecf678a0cb3eb4b8f5238ac2ab93a7c5a1a7cc55c345830b1650cafa6d", + "orderedPathDataSha256": "01f1a03ad0fcf995c9e4082eeaceec9c3e0b3e754f633b9e133fd817765cb21a", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/signal_cellular_no_sim.xml", + "upstreamIcon": "signal_cellular_no_sim", + "upstreamPath": "android/device/signal_cellular_no_sim/materialicons/black/res/drawable/baseline_signal_cellular_no_sim_24.xml", + "upstreamSha256": "ca8609678d51624c7be871c7093221d5178409475fb43c09f4012561b581d7c6", + "localSha256": "8911cd3a0a9631cf98afba757a82a64620246099f8b360853c4cf1f85ca8a9f0", + "orderedPathDataSha256": "2ad31986d4a78e7d9a80c57d31b2d648f3c506e31c483a9b294bbdb2fce6cc40", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/signal_cellular_nodata.xml", + "upstreamIcon": "signal_cellular_nodata", + "upstreamPath": "android/device/signal_cellular_nodata/materialicons/black/res/drawable/baseline_signal_cellular_nodata_24.xml", + "upstreamSha256": "1cf2f8d155d6fdb6128ad5b13782799030b384345aa2e46daa89126cb2fdc2a6", + "localSha256": "44c14402ee6aadbfd22aae494d35a8bc45850b0b830fdd903fbf7d90254b1f32", + "orderedPathDataSha256": "e8380e57be2d0453941aa39baf1917388c45ae000d67c2259d94dfb4ae49875e", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/signal_cellular_null.xml", + "upstreamIcon": "signal_cellular_null", + "upstreamPath": "android/device/signal_cellular_null/materialicons/black/res/drawable/baseline_signal_cellular_null_24.xml", + "upstreamSha256": "8aa41efd346dd4b95da1fbf22b766f15a1802d487ea3ef6d5b8f59cbd5375b3b", + "localSha256": "5de932077a019e11ef7db5a0112874d93f319afaed77acee88a63df7b7e72223", + "orderedPathDataSha256": "63efb4f8c28f9a4ba02d48574ee16ee176c131cab1dca81fb2c04f523a9b119e", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/signal_cellular_off.xml", + "upstreamIcon": "signal_cellular_off", + "upstreamPath": "android/device/signal_cellular_off/materialicons/black/res/drawable/baseline_signal_cellular_off_24.xml", + "upstreamSha256": "adf4b7d95c12ca37eab1fcb800daf44f1f35db84dd55415e8ea8b1e05b933094", + "localSha256": "547e8e0aabbdba4a5961d66513d1a80f105798c23ccbc2facc31ed19acf7fbe8", + "orderedPathDataSha256": "8cbfecb5d4fb687b9cda90625bd0ff2cda873b48d075334aba8c846f06d10c0d", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/signal_wifi_0_bar.xml", + "upstreamIcon": "signal_wifi_0_bar", + "upstreamPath": "android/device/signal_wifi_0_bar/materialicons/black/res/drawable/baseline_signal_wifi_0_bar_24.xml", + "upstreamSha256": "d85884f7d59e2832c00977319e9dbc7343ec8fd771d3cff81248aa1f002dfddf", + "localSha256": "99241f1ebb012779cc610ba3c6aa5f5748db2f1df1f5b28d724c5bb82144d76f", + "orderedPathDataSha256": "2595da64029cd92228ffadff30dfebfd24f192ce28bf4ffb71d97fb3e018a532", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/signal_wifi_4_bar_lock.xml", + "upstreamIcon": "signal_wifi_4_bar_lock", + "upstreamPath": "android/device/signal_wifi_4_bar_lock/materialicons/black/res/drawable/baseline_signal_wifi_4_bar_lock_24.xml", + "upstreamSha256": "6b36aac9d19ff59e6fb5f213dd3bb8ec100fb45d31237b76f8fde3ca1be4c212", + "localSha256": "2a24f4510e3f39c03dfc6b977d3af4975f914c867b8f4f1a1202fac2c8a9d970", + "orderedPathDataSha256": "14093d3908c1974f45f2d3172c721d651ecad810748c1aaa3c797d69fc4ea745", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/signal_wifi_4_bar.xml", + "upstreamIcon": "signal_wifi_4_bar", + "upstreamPath": "android/device/signal_wifi_4_bar/materialicons/black/res/drawable/baseline_signal_wifi_4_bar_24.xml", + "upstreamSha256": "0492b1ab99cb2cf582730240731e6bb60efb5792c5c83d1f82dbb11742506396", + "localSha256": "8582ecc4b23194aa720c9076880254c3e0dcc52bb676fd070dbdcd713d7d6635", + "orderedPathDataSha256": "8cca476daaf2ec2f36150e1fca13fe1ead8f70bff9da9ce3752b0b5d597b8a92", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/signal_wifi_bad.xml", + "upstreamIcon": "signal_wifi_bad", + "upstreamPath": "android/device/signal_wifi_bad/materialicons/black/res/drawable/baseline_signal_wifi_bad_24.xml", + "upstreamSha256": "d7c74ed02d19a2a9dc0a3cf44730eac4b97cd9a9deb940b3497c8b24d81c7fb0", + "localSha256": "ee43eef4da40f91f09b71d065acab12f88c95edc03233c21f7a3117beed0acf5", + "orderedPathDataSha256": "abb696cbec274a51498a010144c61f94443c05606b18146f76e1f17e8840385a", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/signal_wifi_connected_no_internet_4.xml", + "upstreamIcon": "signal_wifi_connected_no_internet_4", + "upstreamPath": "android/device/signal_wifi_connected_no_internet_4/materialicons/black/res/drawable/baseline_signal_wifi_connected_no_internet_4_24.xml", + "upstreamSha256": "d7c74ed02d19a2a9dc0a3cf44730eac4b97cd9a9deb940b3497c8b24d81c7fb0", + "localSha256": "76e55537a43f8a76b2b4cc97da89a4cbe90da8620881d29f7d5b9d16e5e3cc7d", + "orderedPathDataSha256": "abb696cbec274a51498a010144c61f94443c05606b18146f76e1f17e8840385a", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/signal_wifi_off.xml", + "upstreamIcon": "signal_wifi_off", + "upstreamPath": "android/device/signal_wifi_off/materialicons/black/res/drawable/baseline_signal_wifi_off_24.xml", + "upstreamSha256": "31cabb57e624fc5862496963e68959ab375e031d1b516fcd348bf0ab1e12ccda", + "localSha256": "3f1a39d22debb2f76c9fd36b5820acec9d3ee64b43d676b63a13f928010f1091", + "orderedPathDataSha256": "ec66be57f3b222ad23f4316320547b0f273f336c383e0ba9750e56305d83a680", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/signal_wifi_statusbar_4_bar.xml", + "upstreamIcon": "signal_wifi_statusbar_4_bar", + "upstreamPath": "android/device/signal_wifi_statusbar_4_bar/materialicons/black/res/drawable/baseline_signal_wifi_statusbar_4_bar_24.xml", + "upstreamSha256": "1af29b4ea04c95e0f5ff838485f603e5cfdeea1210bbe9a05f4b805d00837d7d", + "localSha256": "20527812871b2afa14f2b72aab76b47764c7c18f27526dc061c67aa827e4cd94", + "orderedPathDataSha256": "52e3af2dd6ac608ad50a1aaef923f3db4b29e052799c042f4a91b2efdcf9e026", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/signal_wifi_statusbar_connected_no_internet_4.xml", + "upstreamIcon": "signal_wifi_statusbar_connected_no_internet_4", + "upstreamPath": "android/device/signal_wifi_statusbar_connected_no_internet_4/materialicons/black/res/drawable/baseline_signal_wifi_statusbar_connected_no_internet_4_24.xml", + "upstreamSha256": "5136db9a23556a5ae39051103416165bddbbd3c7f06b6d302d22adc3d160b5e3", + "localSha256": "b661a5cc605503a43c0bb4f605c59686f016ce6d12f312ff367b2e11d1f5b58c", + "orderedPathDataSha256": "93593db3f84b1d98d464383b552124362942053df82042282c11305cb39712d3", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/signal_wifi_statusbar_null.xml", + "upstreamIcon": "signal_wifi_statusbar_null", + "upstreamPath": "android/device/signal_wifi_statusbar_null/materialicons/black/res/drawable/baseline_signal_wifi_statusbar_null_24.xml", + "upstreamSha256": "65aaf693924caace07eefd65eaeb7aee413f592f367caf0c126ed079928b97d5", + "localSha256": "008053bf48c63b7f6ab96f5a107d5c7d3a7184789562c25c296e631bb8f7afb3", + "orderedPathDataSha256": "2e9221e20aba28a4cb58b186b920e85306a7deca7c9f760d14fead637d4ec735", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/signpost.xml", + "upstreamIcon": "signpost", + "upstreamPath": "android/maps/signpost/materialicons/black/res/drawable/baseline_signpost_24.xml", + "upstreamSha256": "1fd57d3bee7b64dcb2bdb5148da015f85a4f98ed5b40d29d10d346b8412d4caf", + "localSha256": "0da7ffb1ec315bf5b5ffc8d1b063f1dcf8695bafc03a87ddba4d150728f641aa", + "orderedPathDataSha256": "7b10f0c92b75e534d27d1c10a71d59bb70b02f9edfa7516096abbe2a178d9f9d", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/sim_card_alert.xml", + "upstreamIcon": "sim_card_alert", + "upstreamPath": "android/notification/sim_card_alert/materialicons/black/res/drawable/baseline_sim_card_alert_24.xml", + "upstreamSha256": "e01aafb8671e80af7d87382c4f9dd67f67161e16a6131cde670e76634f6931bf", + "localSha256": "dfe4b9944b8d77b69d351b80edacc95d4d621b84e669df8233a3121b99dc3731", + "orderedPathDataSha256": "9af0bb52d5a40cf2139a4c633bf91746b1c65aa79d259b65c25afb6c42faeb1f", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/sim_card_download.xml", + "upstreamIcon": "sim_card_download", + "upstreamPath": "android/device/sim_card_download/materialicons/black/res/drawable/baseline_sim_card_download_24.xml", + "upstreamSha256": "5eeb1ee6689e919525bb42551174cd04cfb08d0da6283b4ff03c501246eeb2a7", + "localSha256": "d23371eea55c6bbe1fe341f433300d7bea23955092d8535165456901d187acc9", + "orderedPathDataSha256": "b00c26000ebf09cca0b8c5e94c6253a76772f7f69176492741a5105a8933a34c", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/sim_card.xml", + "upstreamIcon": "sim_card", + "upstreamPath": "android/hardware/sim_card/materialicons/black/res/drawable/baseline_sim_card_24.xml", + "upstreamSha256": "ec9ee5ccb39e3c50b4fa89f1e78cc59e40259dd8ae23e9134a94c5436b86dd82", + "localSha256": "e91f9e0af620bd388510252c5e3fa789ff7832ced1ca3208b744011b49669eda", + "orderedPathDataSha256": "0ae0d1016a87f746155cf17e53457cc9fc952fca149a73ba8f09c478e223ec84", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/single_bed.xml", + "upstreamIcon": "single_bed", + "upstreamPath": "android/social/single_bed/materialicons/black/res/drawable/baseline_single_bed_24.xml", + "upstreamSha256": "f1920f51e846cf3834c2726dd76c62f55a5c351d001772383b803106a27d940a", + "localSha256": "7870f62bf61216e8f93161af427d82253a4d78b934feaa1cc595a55ce209a48a", + "orderedPathDataSha256": "4d7639f5d7d233619349c1a374d110d94540c2ee2c74c1f1cf0e3d93e69d6d84", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/sip.xml", + "upstreamIcon": "sip", + "upstreamPath": "android/communication/sip/materialicons/black/res/drawable/baseline_sip_24.xml", + "upstreamSha256": "e06f4c0671bca4377e76c6b1465bf1d2d81488223ad318c805de13e406cef33c", + "localSha256": "8f86a0fe96ca6f651c93d545910b90fc4628c9846cca0dfc9b23ab7dcd4aa4da", + "orderedPathDataSha256": "06f8d187bebc1c3f342d49171c78a688fd21dfb3535db68f2e0eac80fa83cf6c", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/skateboarding.xml", + "upstreamIcon": "skateboarding", + "upstreamPath": "android/social/skateboarding/materialicons/black/res/drawable/baseline_skateboarding_24.xml", + "upstreamSha256": "f37fc720e1086c3e0726555077bfcc085f4b1f75bdcc5867fb26b3f50ba4640c", + "localSha256": "1aad319931699f9bd0ce659dcd33a28180c655abaf8e4d21ec6373a22e6e2a0c", + "orderedPathDataSha256": "30715b1bed5cf0b88da57f41443873692586b5adc1222754efb03c17f6e7d29a", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/skip_next.xml", + "upstreamIcon": "skip_next", + "upstreamPath": "android/av/skip_next/materialicons/black/res/drawable/baseline_skip_next_24.xml", + "upstreamSha256": "73c639ffcbe1ab902969a7555bf2715f1c6ead68c5775138c4168d4e154f0191", + "localSha256": "efdac5f20345062fb469d14a8d397cedb8c42589fc4fd7b8d1077eac43b864ed", + "orderedPathDataSha256": "d41a62400b101d5c47de53badb9370a3b09a91ac3c6f57f5c7c4a9d83807cbb5", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/skip_previous.xml", + "upstreamIcon": "skip_previous", + "upstreamPath": "android/av/skip_previous/materialicons/black/res/drawable/baseline_skip_previous_24.xml", + "upstreamSha256": "4c839a12d94481da0339a9c47c11d83450217026dc72ed0285a48f056b0b110a", + "localSha256": "e187ff0a622f6edbf58f8796e9b575e5af8db4a8b517ecc63df9b1210f714fe1", + "orderedPathDataSha256": "8455bed394c01c8275206df44a0b35df1108b3469bb9822ea66f4c8bb70bb39e", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/sledding.xml", + "upstreamIcon": "sledding", + "upstreamPath": "android/social/sledding/materialicons/black/res/drawable/baseline_sledding_24.xml", + "upstreamSha256": "096b72f8d1f1a0b3dc4b2c744fa20034a37746ded50bca7d02fdd8efe40bb1b4", + "localSha256": "8fb7392e2fd4bf12beea8017f93a48fa16c76efbe93cbdbbf1d2cbde5ca6fdcc", + "orderedPathDataSha256": "065dbf509ddcd5b63186313bd1b08fce05b5d6127a9ffd6f2de0d00ccefc7db8", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/slideshow.xml", + "upstreamIcon": "slideshow", + "upstreamPath": "android/image/slideshow/materialicons/black/res/drawable/baseline_slideshow_24.xml", + "upstreamSha256": "81aa930c361493b6fa8c4a5990284f1ded69dd0bf1e898caabdae9e25fe1b46a", + "localSha256": "991089c1204bad6eb0e1fa506cde7283ee61718f6db29f6776704e246cf5f251", + "orderedPathDataSha256": "cf9e3e5bb2bab65ef6925baff95d3be3e0bfdec27de31c3c954f5c625342c456", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/slow_motion_video.xml", + "upstreamIcon": "slow_motion_video", + "upstreamPath": "android/av/slow_motion_video/materialicons/black/res/drawable/baseline_slow_motion_video_24.xml", + "upstreamSha256": "fa4f841d7e126705759dedb8619ecb69a45ac19ab4d7450e119e56fe8a4a1de9", + "localSha256": "a016d468f889e90ecf20caf2ec6b88aae8f938f683367050a9cabd158c7dc1fe", + "orderedPathDataSha256": "057a4dad6cbfa1e749f04ce61579f1508d9ca76ac87c242a2188fec020415507", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/smart_button.xml", + "upstreamIcon": "smart_button", + "upstreamPath": "android/action/smart_button/materialicons/black/res/drawable/baseline_smart_button_24.xml", + "upstreamSha256": "ef760cf740a7c366c17a360fcb8907e9a519ed43d3f2db3b3cf87fc6ac649fef", + "localSha256": "52e65dbdf2b4e724fceba3a06bdd41440733b2a96220a193bd49410aa906020a", + "orderedPathDataSha256": "182c06769375a4430806a2455ef930e56720222ce4e5c9aee3d10eed567f977e", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/smart_display.xml", + "upstreamIcon": "smart_display", + "upstreamPath": "android/hardware/smart_display/materialicons/black/res/drawable/baseline_smart_display_24.xml", + "upstreamSha256": "3b34408a91783bcf559fd3e2d63b917a9d57b9061be432e2955286a9a574fe5c", + "localSha256": "7c381c8c779018271fb4ad735d78dcb4e4f60702a0ae1c4ccc93a7d2a955b2f7", + "orderedPathDataSha256": "4cd6e4ff82b234c723bff6f85595d0285035bfdfa5540f337f9bd211403af4ec", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/smart_screen.xml", + "upstreamIcon": "smart_screen", + "upstreamPath": "android/hardware/smart_screen/materialicons/black/res/drawable/baseline_smart_screen_24.xml", + "upstreamSha256": "fb4d3dc94cf354b2b4d216406fbc61c16ad75d7d656d01792b377a3de2aefd17", + "localSha256": "4c777e0f93a0bacb0b533fb83cf8400016ff76abbc21f9bf9af38d6393a10497", + "orderedPathDataSha256": "5253b065fa25a0afa92d20d549bdc4b181d5e5d5a4c11dc1c1f02172d54aee0e", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/smart_toy.xml", + "upstreamIcon": "smart_toy", + "upstreamPath": "android/hardware/smart_toy/materialicons/black/res/drawable/baseline_smart_toy_24.xml", + "upstreamSha256": "0a8a4e0ef8c85d116d35f309c7d198bf5687e6fdd4efc6cc72915e3c73808f91", + "localSha256": "310817f649803e2e567008c1f9b7709148edae11c0f4a214a9934f7d8c7e085a", + "orderedPathDataSha256": "1c7661e48281431472dfabd4337cf089ef46d2c36714c99d205d6061707bd711", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/smartphone.xml", + "upstreamIcon": "smartphone", + "upstreamPath": "android/hardware/smartphone/materialicons/black/res/drawable/baseline_smartphone_24.xml", + "upstreamSha256": "24dc7adce7ec5a283160d608e073696b5c68d94a62a3215b0536c2e09e4821f9", + "localSha256": "8899e6bf0df095e06b84e91e0e68b400e1db778cea9c70b9d02e3ab8c08fd5e6", + "orderedPathDataSha256": "49469cc89e74d672ca79bef07458b012538f307af0fc81647f53834f3c43fd41", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/smoke_free.xml", + "upstreamIcon": "smoke_free", + "upstreamPath": "android/places/smoke_free/materialicons/black/res/drawable/baseline_smoke_free_24.xml", + "upstreamSha256": "67397c10a7afa3afd8ea58b0affa8591e533f63ee58e4c354a5ff17bccd79ff3", + "localSha256": "29f33643da39b7d8979ea9c881aa3e1d81cdf67c5e0ffe1b35b304ea4004aa4c", + "orderedPathDataSha256": "19cf59ddddf5d42239dfa5027364ca627d2d19b7e4b76770b4b9ebc96f0019d5", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/smoking_rooms.xml", + "upstreamIcon": "smoking_rooms", + "upstreamPath": "android/places/smoking_rooms/materialicons/black/res/drawable/baseline_smoking_rooms_24.xml", + "upstreamSha256": "26690e0c9dc25f18238f4eefbabdd1040e2328f5ef501ead1d15bcbdb7e2a4cd", + "localSha256": "45468a19108c1c8e5eb44a591af78f71ee4e3f11b11092014ad32d0a5df37d89", + "orderedPathDataSha256": "e7de09a500045bfae19817be808f40754ee9b2e94cd059290744a0adaf1e0437", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/sms_failed.xml", + "upstreamIcon": "sms_failed", + "upstreamPath": "android/notification/sms_failed/materialicons/black/res/drawable/baseline_sms_failed_24.xml", + "upstreamSha256": "2a25c4d85b762d7a199a8082baba38763b76aebb210cc5ae9073f99404babdcc", + "localSha256": "5e8738848f63a693cbffbc4f51a8384cdde2fcb600e83794aadbabc9d7325a49", + "orderedPathDataSha256": "293cb7716f342cca8c6e4dcd7f9f757a36096c7a67d22c4572cebaba15b94119", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/sms.xml", + "upstreamIcon": "sms", + "upstreamPath": "android/notification/sms/materialicons/black/res/drawable/baseline_sms_24.xml", + "upstreamSha256": "653d91185aca0d17119dcb8f4be689f14c1c74da050f1fa6e62314648d99fb94", + "localSha256": "e2be846bb7871bf9022f3d035b0bfcf09c4429dd2012bba2d025acbd3e94c21d", + "orderedPathDataSha256": "b44f1f559041b39f56bfbaa6fb93e931d5ca9b161839372746e1e1cb1047d9f6", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/snippet_folder.xml", + "upstreamIcon": "snippet_folder", + "upstreamPath": "android/file/snippet_folder/materialicons/black/res/drawable/baseline_snippet_folder_24.xml", + "upstreamSha256": "85b505d98bb8acf72ef96fbc36d58610c912442ade6fe82ad57951a4390287f8", + "localSha256": "b4b631ef06fba2d6d7506ffbcc868a080949a24e3b60eb95754ab9affbd7cccf", + "orderedPathDataSha256": "25fd367d8cdece30067acd0954c5a6a021ef69c6143de65a83b6a3deff562e28", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/snooze.xml", + "upstreamIcon": "snooze", + "upstreamPath": "android/av/snooze/materialicons/black/res/drawable/baseline_snooze_24.xml", + "upstreamSha256": "ff546bca0b882e36c868efefcd382e92db3834984f82f6c18b7b7a5e2d17b271", + "localSha256": "9b84e1814a833945e070e90a9f17defb0f7e438616ae6c307be8f1fe0732bac6", + "orderedPathDataSha256": "65fe966af11e6b0dda0dd1459ec9e0769693f870e72ad90e7501833a92368ff5", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/snowboarding.xml", + "upstreamIcon": "snowboarding", + "upstreamPath": "android/social/snowboarding/materialicons/black/res/drawable/baseline_snowboarding_24.xml", + "upstreamSha256": "1786dcbaa2f78016993b1b5ec44cadeac6c3668f4b0785b9743e989031a02b93", + "localSha256": "780ee14096cce708970237efcc1b596e59534fab21510c88a1c6abba31cade10", + "orderedPathDataSha256": "31a807ca61d747789ab593af5fda1d4e67f2926f7ce1acf64638cffa014ad216", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/snowing.xml", + "upstreamIcon": "snowing", + "upstreamPath": "android/home/snowing/materialicons/black/res/drawable/baseline_snowing_24.xml", + "upstreamSha256": "11ade2183fafb411c12173005cbc576255221a803a559359b58fc3fda56d410f", + "localSha256": "3a1e3afafd7e5c0f3f8ea4644aab00887f43e21832807fd1ded6aa15766a688c", + "orderedPathDataSha256": "190119f6796eff4c6104479dca0552301ef5d56e0779881dfcfbc5bf84e053b4", + "originalGeometryMatched": false, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/snowmobile.xml", + "upstreamIcon": "snowmobile", + "upstreamPath": "android/maps/snowmobile/materialicons/black/res/drawable/baseline_snowmobile_24.xml", + "upstreamSha256": "0438b6099f93274207075eb70b77f6b440241e38153b060bd0ea3d1dd9b8b0dc", + "localSha256": "192dbb01882333d1e9d63144277c6fb483bf79f8123da8745e5c0be8ad32fd20", + "orderedPathDataSha256": "037b22bd6048748e003bf1edf71fa21e302780244e71126ee48e71fa964e82a3", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/snowshoeing.xml", + "upstreamIcon": "snowshoeing", + "upstreamPath": "android/social/snowshoeing/materialicons/black/res/drawable/baseline_snowshoeing_24.xml", + "upstreamSha256": "9cb0890801448ede3646234daad91395512de58ad56d36714796b48d0a603dc4", + "localSha256": "0bafd883343256eb044ff6c8bdfb8a741801dc3b3b0ce8ddbd801bc9dadb4f1e", + "orderedPathDataSha256": "c1be8e1f11ac677137dc82edb05965bce27945d9c06b2fa80e15507b0f2dcc83", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/soap.xml", + "upstreamIcon": "soap", + "upstreamPath": "android/places/soap/materialicons/black/res/drawable/baseline_soap_24.xml", + "upstreamSha256": "7c9731f8b767c5d818afab5ed88f6aa189bc067b3195fa92042c439cf9df47e5", + "localSha256": "94034bcf381ec257803ee371623d6fce2cd33ab8bd79b36769b6ea3287c6c66e", + "orderedPathDataSha256": "fcf847370b0ac78382cc43dd3371c79b81b14bc4b5f3353254b456c29ea8c1a0", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/social_distance.xml", + "upstreamIcon": "social_distance", + "upstreamPath": "android/social/social_distance/materialicons/black/res/drawable/baseline_social_distance_24.xml", + "upstreamSha256": "26db2273a0046fa74bb0533f81a3d98198febca23484e5da7a050e898267603e", + "localSha256": "e5e6e7d0c445545bb590365edc9f62dd151e2f848e349abe8a4921b48a086385", + "orderedPathDataSha256": "e0b0cdfc8b0f288ea7097d06a9521b480db5d8c7a11f6e286bfaef0f6edcbdcb", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/solar_power.xml", + "upstreamIcon": "solar_power", + "upstreamPath": "android/home/solar_power/materialicons/black/res/drawable/baseline_solar_power_24.xml", + "upstreamSha256": "e99303d029dc3c73602d66a027544f767164300f8123835ea8a5b4e6b6c5266a", + "localSha256": "3ab2dc363b4835742ffa5f8c9290c4ff5ba62ff7accc21397e2e5f5c45fcf720", + "orderedPathDataSha256": "953c58e8447d6f150ecc864ec9c8ba66cc8129fe8210ba87373c005a9c2ec4cf", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/sort_by_alpha.xml", + "upstreamIcon": "sort_by_alpha", + "upstreamPath": "android/av/sort_by_alpha/materialicons/black/res/drawable/baseline_sort_by_alpha_24.xml", + "upstreamSha256": "4e3a80062b29a70df674093969c27ade2b966a977e05df32784fa43f56eb4507", + "localSha256": "4222103ec0be31dfa39dab9ca68eaaef7810709dbd7e6a6844e0b68b3c1d6e8b", + "orderedPathDataSha256": "cd3e9d675c8f596c23fd8d1fc0c7cc4593d9e6bfac60a9a734fa4ba8315a99ec", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/sort.xml", + "upstreamIcon": "sort", + "upstreamPath": "android/content/sort/materialicons/black/res/drawable/baseline_sort_24.xml", + "upstreamSha256": "4ab87455cf2f3f5dc43f695e6dc9dbd4827ace76075db94c0e4150851b256540", + "localSha256": "1a156c53f9ca00b8445b28741d9942d7065c6e153d8146af6ae4523f485292b9", + "orderedPathDataSha256": "88945485eb356dc5e1792d6baed603a7a4dc2d4a4fe4c560b025ace53f051551", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/sos.xml", + "upstreamIcon": "sos", + "upstreamPath": "android/maps/sos/materialicons/black/res/drawable/baseline_sos_24.xml", + "upstreamSha256": "4c8950f5b6f41c700bf6fbe3faf4d54e2c79b4d22630e3f7e016986b6cddc473", + "localSha256": "14bf2b960c62a381ddb3afd1b01f26c47a763a6cc19f9a8f3a8fb92cf040399a", + "orderedPathDataSha256": "b0b0fee1e28445dce6d6f783d4652e9a941ef413b3e20ebc908837f9768e15cc", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/soup_kitchen.xml", + "upstreamIcon": "soup_kitchen", + "upstreamPath": "android/maps/soup_kitchen/materialicons/black/res/drawable/baseline_soup_kitchen_24.xml", + "upstreamSha256": "3c51d4e1f4c396a33e0bda258410e25212a421ec2e71c2d07ab77d84d8d33083", + "localSha256": "6a3bd44724a100cf316793229d5fe761c71456733b860fc031a7522b5285f188", + "orderedPathDataSha256": "99fe53496f8238f9772089d745949c4c2bc8d3d7d6f75dd6f84d7b63b8de5e6f", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/source.xml", + "upstreamIcon": "source", + "upstreamPath": "android/action/source/materialicons/black/res/drawable/baseline_source_24.xml", + "upstreamSha256": "e8da165a96acc851aeab41a2eb68a8416af3b6d0297f15449742489f38fa94f8", + "localSha256": "6469c3931e930e63c36d6faed3c849bb10cb435d7bdd5030a76b3cc87a4f71a8", + "orderedPathDataSha256": "120cbb32243da4419cebc50b02540c0d6166b2ba67b4b8bdbca09f7d7bb4cc09", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/south_america.xml", + "upstreamIcon": "south_america", + "upstreamPath": "android/social/south_america/materialicons/black/res/drawable/baseline_south_america_24.xml", + "upstreamSha256": "3e560649659090170f69095f082b158d996fc225b93f301772ff970260044e85", + "localSha256": "0656524dc8939589e3ed9ccd6624cacf7a9cc5f4800259a959f4720c1df15e69", + "orderedPathDataSha256": "42286e0e335e566a05b9a55a849bfa05303cc2db037f41bd86b069d453b2a9c4", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/south_east.xml", + "upstreamIcon": "south_east", + "upstreamPath": "android/navigation/south_east/materialicons/black/res/drawable/baseline_south_east_24.xml", + "upstreamSha256": "bcd95217510128918f03b60ea266f87269a5c26cccd643a0e287bc906d8f3292", + "localSha256": "cbd90a9a0111da1d8eb49b6b26a1711b7f2716effaed6769092485fdc1f9be81", + "orderedPathDataSha256": "5bacdb0d01b1971770b6c0b68dee07913db3b99958a20c82c4451fd7c55e28f3", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/south_west.xml", + "upstreamIcon": "south_west", + "upstreamPath": "android/navigation/south_west/materialicons/black/res/drawable/baseline_south_west_24.xml", + "upstreamSha256": "31527212f5da7a9dbb704e513f70f36fdb7ab74ae8b2b95185a40021ed6e0aa9", + "localSha256": "a416f94ec5e755760dd84bef8bfe97cade3cd443d81772c4922fb754bd7180d0", + "orderedPathDataSha256": "ab996b39816a58b64b09d66b876fc5a2e3273facb295195eee795b179c63f5a0", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/south.xml", + "upstreamIcon": "south", + "upstreamPath": "android/navigation/south/materialicons/black/res/drawable/baseline_south_24.xml", + "upstreamSha256": "9dbd3d8cba76a985acee897070e4474209c9c343ae8deb519a3e22d346efa673", + "localSha256": "3bce631a617366d7eebd3213c6f872e9224a23328fdf1469ee536ae0369bb525", + "orderedPathDataSha256": "c245766a7aa991cc742c7fe5be9309094f79ba4e290b8d9eed54a1912014172b", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/spa.xml", + "upstreamIcon": "spa", + "upstreamPath": "android/places/spa/materialicons/black/res/drawable/baseline_spa_24.xml", + "upstreamSha256": "bfa08bce23576bb3798631c236be1480bf276059d629cf60a6f11c6072f0e9a6", + "localSha256": "ec0eb333482666610dba9b0ba354c4c0954d812c9928a84ab5d3eec322abb3c8", + "orderedPathDataSha256": "00a6e12aeb6da2e0e0b82eec22a5d999747a6f1306f23c7203e7b55722e07f11", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/space_bar.xml", + "upstreamIcon": "space_bar", + "upstreamPath": "android/editor/space_bar/materialicons/black/res/drawable/baseline_space_bar_24.xml", + "upstreamSha256": "fdffd5ada2d95cba42843cf5a68c9e8d8ce9ff0cfb33b5148cbee2495b07c0ac", + "localSha256": "a8c57303d219cd9bc1b57ecf130faabe89d321d4515608f1d3829ad1bdc7ba5d", + "orderedPathDataSha256": "268eb55bbb7cd4bf7e06b5d52fb9c5e75c3285ff57c848b9d91a775a0637f30a", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/space_dashboard.xml", + "upstreamIcon": "space_dashboard", + "upstreamPath": "android/action/space_dashboard/materialicons/black/res/drawable/baseline_space_dashboard_24.xml", + "upstreamSha256": "20a9e85b83d837dd25cf1133fa7bc1cd1f4869a667fce50f520eb9f5540d64ef", + "localSha256": "b5a05cb6396c8158af58f46998a20e37eb7859e8d70a92d186a199da8b8d64e8", + "orderedPathDataSha256": "9799cf5df545705fc4cd774aaf3382f6b7cdf88c6596632f3780271b160c41d0", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/spatial_audio_off.xml", + "upstreamIcon": "spatial_audio_off", + "upstreamPath": "android/action/spatial_audio_off/materialicons/black/res/drawable/baseline_spatial_audio_off_24.xml", + "upstreamSha256": "668a858c0c35975df047fb3041d7b23b4f6738171a39abf53c0eec30d4c89740", + "localSha256": "740a9adae10ce4d7cd18d10d055b4471d6cb2250f6bbfe1d4d1d136d317fc519", + "orderedPathDataSha256": "a00ac26e22624bf2bf6e93c9077ef1acf646926c1ca89a00c8c2348194d4c32a", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/spatial_audio.xml", + "upstreamIcon": "spatial_audio", + "upstreamPath": "android/action/spatial_audio/materialicons/black/res/drawable/baseline_spatial_audio_24.xml", + "upstreamSha256": "4181e9008bced38bde017c49a0ef89ca865b254adbb81ee5f8b99a83da618fe9", + "localSha256": "cb85ab7ba6ff15944ab6a79cdbfbe444afce86291f9ee194d0bd2c9a6b163e28", + "orderedPathDataSha256": "e55cdedb6f2f021cd95a8f0fe627f86b0a63db6fb043bd5fb7080f4839aec086", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/spatial_tracking.xml", + "upstreamIcon": "spatial_tracking", + "upstreamPath": "android/action/spatial_tracking/materialicons/black/res/drawable/baseline_spatial_tracking_24.xml", + "upstreamSha256": "45d7c01f0557306b0d50718fcb132b6279c41a300285e47ae9960a9c683389a4", + "localSha256": "7d66c2f50072a683a98d928ff55b16020826f642753e2f939ff30deccf123945", + "orderedPathDataSha256": "ddf455d63ac89b300ec4139faea4ebf0bd8fb4ed90eb3b828eb5a8c6725a58c5", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/speaker_group.xml", + "upstreamIcon": "speaker_group", + "upstreamPath": "android/hardware/speaker_group/materialicons/black/res/drawable/baseline_speaker_group_24.xml", + "upstreamSha256": "2d1cc6232fc55c878d5ed1a9ba0cdb8187a2e02978d28a49b9a4cd911418a364", + "localSha256": "80fb6ed42efe97e3a228af8cdfce9dcdee48b93702b790cf607f979612262e69", + "orderedPathDataSha256": "87cc1abbaa9aea31f1ee12ecfb0dcf7e0ca1e98f045dfe98b9a6fed4997e88d4", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/speaker_notes_off.xml", + "upstreamIcon": "speaker_notes_off", + "upstreamPath": "android/action/speaker_notes_off/materialicons/black/res/drawable/baseline_speaker_notes_off_24.xml", + "upstreamSha256": "c835109c90bbd02a97b35b7b750a4d4cc0cebb8b46a4267a6970674f3eff7bd0", + "localSha256": "3a2d832535ef3b21c841c9a9920b6abe49bc25ed4b4ebbc70e7e21861c1e244c", + "orderedPathDataSha256": "c1d38693dd2f20fb26b56cc2cf77838281dc3ea280717d19d0c20825a8780ed8", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/speaker_notes.xml", + "upstreamIcon": "speaker_notes", + "upstreamPath": "android/action/speaker_notes/materialicons/black/res/drawable/baseline_speaker_notes_24.xml", + "upstreamSha256": "3156e32706bd0beff8820a89558551c7be643a526c4933586bb1c80ba3b6fc91", + "localSha256": "797bce13b92e964f9af802016b84217e05f2404d2ed75148544e0c68363c282b", + "orderedPathDataSha256": "ad8f87d338c413bfb59e62da0b22cfe28f497a93a0525c1d24536eaee2c310da", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/speaker_phone.xml", + "upstreamIcon": "speaker_phone", + "upstreamPath": "android/communication/speaker_phone/materialicons/black/res/drawable/baseline_speaker_phone_24.xml", + "upstreamSha256": "84aa6092aa23dde5be70769ed76f1560a4a6eac2dcffb59242f9cb3c5b2446f3", + "localSha256": "7fb93318d59096f2fe32b7523d8b2577e05bc68a5964531e48b898fcb2f55437", + "orderedPathDataSha256": "e46e7df2b5e632cf253d7f79da9d0ff9e2969a653e98de9dd9caafc42d95dc6e", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/speaker.xml", + "upstreamIcon": "speaker", + "upstreamPath": "android/hardware/speaker/materialicons/black/res/drawable/baseline_speaker_24.xml", + "upstreamSha256": "4c87a6871e828ec90bed6462a358f80af0054d0a57c140a598f746183eebfaad", + "localSha256": "bec0cd91a1639f5fb4457f967a64406ddef40183afb9ff7c613b8ff52417e580", + "orderedPathDataSha256": "734ee53762ee39028df19d0181bd13d10cfacf63520fabf839a87135584b6381", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/speed.xml", + "upstreamIcon": "speed", + "upstreamPath": "android/av/speed/materialicons/black/res/drawable/baseline_speed_24.xml", + "upstreamSha256": "f543ca9b04d5c5bd63866af3bf17c81155f9cdedfeb2cc44728fa4b5de2e223e", + "localSha256": "165d41f3ffef216b4b042713879888cd92d0887f1d796c205f370b1a803a468e", + "orderedPathDataSha256": "3a53f181437734c308f45d7ad7f2da421139195073b3092c2ca8845b4a0ce12c", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/spellcheck.xml", + "upstreamIcon": "spellcheck", + "upstreamPath": "android/action/spellcheck/materialicons/black/res/drawable/baseline_spellcheck_24.xml", + "upstreamSha256": "015b25b3f7c506af549884dfe0630ff4436512dcfa70fbb7e346fecc0bf881b1", + "localSha256": "7bb5ce9fa08de0a8ed7bfd5b48eb4065d1e8b552081b3df26b5bc19e86314f4f", + "orderedPathDataSha256": "f6b1b7f591403de8fe7e05bb51bf92e366dbe1e8eafa1fa4589d5d01f9755796", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/splitscreen.xml", + "upstreamIcon": "splitscreen", + "upstreamPath": "android/device/splitscreen/materialicons/black/res/drawable/baseline_splitscreen_24.xml", + "upstreamSha256": "252e11eff188c4cbddebc849d493c120eedb23636007faaa98cbfb31a035ea92", + "localSha256": "6bf3185c6066e5d2e3e785c9ed5e50870c79442111f0da81290ea19ca4d6d592", + "orderedPathDataSha256": "070a054a9d4b2534c9f18728a7f7bcc7c5b832022c097bafa71881c9e801b6ee", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/spoke.xml", + "upstreamIcon": "spoke", + "upstreamPath": "android/communication/spoke/materialicons/black/res/drawable/baseline_spoke_24.xml", + "upstreamSha256": "792d07973b5576972ad552a747e4c64917e69f18bebeaef2d5e803f8462abd70", + "localSha256": "e5300c950245519911e66042f5e4b46257c378de76e6d847aed86b3fcc1629e1", + "orderedPathDataSha256": "7092f34b65700c957c113405c59daf936b99a2ece7426eefdc4991d3d9a7df35", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/sports_bar.xml", + "upstreamIcon": "sports_bar", + "upstreamPath": "android/places/sports_bar/materialicons/black/res/drawable/baseline_sports_bar_24.xml", + "upstreamSha256": "40b3a803d393f3139c58d6392d902ec45e7ccd64b702dbcff2f4bf011817c1c7", + "localSha256": "8a13579a36edf3edede9bc438991ec2e536a6a6210ccf75166fa78ad9eee489e", + "orderedPathDataSha256": "eb5736a4db910459c56aac70acf198461b5fc475ba8dceba4eeb58129472d9aa", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/sports_baseball.xml", + "upstreamIcon": "sports_baseball", + "upstreamPath": "android/social/sports_baseball/materialicons/black/res/drawable/baseline_sports_baseball_24.xml", + "upstreamSha256": "651116c65ed1c0c6d70aec647171bdf120038c0850d8859842972e27217b8334", + "localSha256": "75ff4701c364c87d601e9ff92332b986e315d39bda375736f5f88b4150539ad8", + "orderedPathDataSha256": "ad13f8760c9926ac507879677384035e742f8c351a0f625f669f910c663c12a9", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/sports_basketball.xml", + "upstreamIcon": "sports_basketball", + "upstreamPath": "android/social/sports_basketball/materialicons/black/res/drawable/baseline_sports_basketball_24.xml", + "upstreamSha256": "e4ed2743eb9d4ef2a128f5c1d3e161d11fcdb59c4293d28732148426d66c33d0", + "localSha256": "aeaf1329bafa2a4f1d563f1a45699df8d98425a83168782afb3d1f0599e4a78a", + "orderedPathDataSha256": "f777a1af5033c3322e7abca4244032344073162a6aae891d1614045587bad900", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/sports_cricket.xml", + "upstreamIcon": "sports_cricket", + "upstreamPath": "android/social/sports_cricket/materialicons/black/res/drawable/baseline_sports_cricket_24.xml", + "upstreamSha256": "6c5b75e0e516be713394211e86dee6ef557bfefd83a18bd7c334ff209f756089", + "localSha256": "16c395aa40746e877bb7d5d5fdd4a91a3e9889ecc82eaf68df8f9705419631b0", + "orderedPathDataSha256": "96f77693e792053cff8c4f7106d317d506dc61e231f08acd1a793addb77d40e4", + "originalGeometryMatched": false, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/sports_esports.xml", + "upstreamIcon": "sports_esports", + "upstreamPath": "android/social/sports_esports/materialicons/black/res/drawable/baseline_sports_esports_24.xml", + "upstreamSha256": "6a650f7a9c948925d8d84972643d879f32691c12b1f62d1296a7e9c0c0f0812a", + "localSha256": "5e89949e8a1e20fa330016a79d2698fb1415d69d15ba68d447b9fa9448cdfa9c", + "orderedPathDataSha256": "ebc597598c19e978d8749ef456122b67b3f3b10a4522df9617b1e3b4c67f6c16", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/sports_football.xml", + "upstreamIcon": "sports_football", + "upstreamPath": "android/social/sports_football/materialicons/black/res/drawable/baseline_sports_football_24.xml", + "upstreamSha256": "bb39af92a4ea08683a4f9f65bda9f6ec794cdfdc4e24da98f16b7c935858bccd", + "localSha256": "55365e879faa96530128fafdf82922e6aeab9fdfd43269a30db7ce3d1cf85709", + "orderedPathDataSha256": "2b35fc4be0e244ac3e05b676fbbfa0dfe5953ec3f7eed04c68e1f0d3fa9437d3", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/sports_golf.xml", + "upstreamIcon": "sports_golf", + "upstreamPath": "android/social/sports_golf/materialicons/black/res/drawable/baseline_sports_golf_24.xml", + "upstreamSha256": "10991ce3ccee21f1a4e2847e7dfc845dd4469616e399729d9597f8307f10e31f", + "localSha256": "fe22e3fb5aceb164b47e612f31ea129913ff8b1791e20ea976bd8203de8a7b1d", + "orderedPathDataSha256": "c76945d5c6839e02ba35bc299535efbd46680eda2b2d2466d7287af25f3f12af", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/sports_gymnastics.xml", + "upstreamIcon": "sports_gymnastics", + "upstreamPath": "android/social/sports_gymnastics/materialicons/black/res/drawable/baseline_sports_gymnastics_24.xml", + "upstreamSha256": "834f5ab327e093735c22d672fae85ba879b57f46d15d3949f6fcaa787af311e7", + "localSha256": "e807ae0e00ea4acac5026fb6341da5066430c4ac5c961e8c1cd711d31edb1a44", + "orderedPathDataSha256": "6f08767d63446b2e27abc2b783f8439da289103687a17f5558ef69b181062b46", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/sports_handball.xml", + "upstreamIcon": "sports_handball", + "upstreamPath": "android/social/sports_handball/materialicons/black/res/drawable/baseline_sports_handball_24.xml", + "upstreamSha256": "9cb11dc4ab548758c1df7c8adee4457886a5af647b549a1d438824af3c120e89", + "localSha256": "948326473c7ec78e83c6850cf8f8e3258e9060bab6cebb44d65b38d7ee6fedd8", + "orderedPathDataSha256": "ebcac6c25d5ec60f5cabfb5387d4066450dce43fc418fba98cf449c0d34735ed", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/sports_hockey.xml", + "upstreamIcon": "sports_hockey", + "upstreamPath": "android/social/sports_hockey/materialicons/black/res/drawable/baseline_sports_hockey_24.xml", + "upstreamSha256": "7a9dd90acfe4dde2b5bf286fd05d4725c402d1d1e037228ade8ec0e05bf0d5a3", + "localSha256": "242bdc04922d1c8ac10b1fa8c937cd7b787d0176fe668cb4325de7bb04ef0e10", + "orderedPathDataSha256": "9ff1949bfaf4af02406f333adfeb88485b61a8c77e43e75b5b1daa07c623498c", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/sports_kabaddi.xml", + "upstreamIcon": "sports_kabaddi", + "upstreamPath": "android/social/sports_kabaddi/materialicons/black/res/drawable/baseline_sports_kabaddi_24.xml", + "upstreamSha256": "3a8385170bf30396d7f585d9b02dbc20c05f4cd901f174892a6be9e98b906841", + "localSha256": "fdf0fb9ebf53b52bc1f1c336e5b5f9174e93b4b68c72538605e228ec42bafb54", + "orderedPathDataSha256": "7d936b83e3167f693da2ed9242977b6e418ec69a2fbec6d7dca2cf3441f26664", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/sports_martial_arts.xml", + "upstreamIcon": "sports_martial_arts", + "upstreamPath": "android/social/sports_martial_arts/materialicons/black/res/drawable/baseline_sports_martial_arts_24.xml", + "upstreamSha256": "5fa438e010c72071421d30fe5a308383325dc945fe221453e341f3fdd64e80e2", + "localSha256": "50b4ca2b1e0c812b86a0025afabc9ee77800da2163f448190c0ac6fe3de314d0", + "orderedPathDataSha256": "a326d15344a40affe19dbab38380008246aa744e12556ecb63fd013a095d1cce", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/sports_mma.xml", + "upstreamIcon": "sports_mma", + "upstreamPath": "android/social/sports_mma/materialicons/black/res/drawable/baseline_sports_mma_24.xml", + "upstreamSha256": "37836593d1bce7d4c4932f73de682884f19078a96b00af6c6cb57ba09963fcb5", + "localSha256": "fe4e3f93e1793994ff8622d7d25751628d116bf76aa4012f754716e97e667d82", + "orderedPathDataSha256": "0dbaa6e69de9c71caf995895e6377fe336fa84f7f78491ad745534e9b7d132b3", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/sports_motorsports.xml", + "upstreamIcon": "sports_motorsports", + "upstreamPath": "android/social/sports_motorsports/materialicons/black/res/drawable/baseline_sports_motorsports_24.xml", + "upstreamSha256": "ff83e540e5fd4f338586788d5d5f0e71929ed6c08dee5ae8b9974dba2f27ea3c", + "localSha256": "dc21f8f15a1effaa0a05b6e00700ceac36dde3ca24aa3f3d59dbdcd860f8e5b0", + "orderedPathDataSha256": "4492cb8618f254d31fabb438b941209d8695d2a9e87848153eb2dd85464b5572", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/sports_rugby.xml", + "upstreamIcon": "sports_rugby", + "upstreamPath": "android/social/sports_rugby/materialicons/black/res/drawable/baseline_sports_rugby_24.xml", + "upstreamSha256": "dfea0570825bb5006e50a66359c275594d68ee9177f3891e0d378aa9379aabbb", + "localSha256": "2f5af5b3c01f3272b96cb07f30ec3466e4ed17a9600d8325d1f799d32daeb7a0", + "orderedPathDataSha256": "819b02fa17867a167a4872711d7c6ff526db6f451d427fb3262b652e4d8c940b", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/sports_score.xml", + "upstreamIcon": "sports_score", + "upstreamPath": "android/device/sports_score/materialicons/black/res/drawable/baseline_sports_score_24.xml", + "upstreamSha256": "8d78b122673adbd601d670fd75a3d04d100b5f1ff5be7aae3a543ffa6eb17792", + "localSha256": "66795a41be3ec970c198a89d33834447aecd248910d5dd9251434c91b421d391", + "orderedPathDataSha256": "6da2e89c189ae60088b24ba80fe86259af85482a65c52dbc47a2eaafd1d198c1", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/sports_soccer.xml", + "upstreamIcon": "sports_soccer", + "upstreamPath": "android/social/sports_soccer/materialicons/black/res/drawable/baseline_sports_soccer_24.xml", + "upstreamSha256": "8adcff4dda68de5aef3d11e344c591c5f53f18933f5bc8ffe91c5b200410dae1", + "localSha256": "0ce290eb810287e38b49cf5a84ebdd944df11d21795d1bc0bbaafefac5257e03", + "orderedPathDataSha256": "4ce2a65be61318e5e84d30af14c3280519c608c935cbefa5beaa1bc1d4471543", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/sports_tennis.xml", + "upstreamIcon": "sports_tennis", + "upstreamPath": "android/social/sports_tennis/materialicons/black/res/drawable/baseline_sports_tennis_24.xml", + "upstreamSha256": "00ff899e29f3bcc01d6a1d96a39a4a203760da1b12374a2c7e2ed3466030c018", + "localSha256": "c87ce388e671a2029a138104e00e88e42d2e07ba36aba5147684f1861ba399cc", + "orderedPathDataSha256": "daff2eacea15385a8ed09fa55de19ef8f357872e79f64d6976568f707b7339c9", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/sports_volleyball.xml", + "upstreamIcon": "sports_volleyball", + "upstreamPath": "android/social/sports_volleyball/materialicons/black/res/drawable/baseline_sports_volleyball_24.xml", + "upstreamSha256": "4af40c6e1add5d35c9744e717de9d46662cdb94a54729bf234d605962b404937", + "localSha256": "d9bfd713b48cff8461f1a59f82eb0aa6de5e1a7eb390c3bf3d8b03f96f7772c5", + "orderedPathDataSha256": "4ad1168eb59297b6b0c75e579593f0034936e09cc953b1e6cbb275e6ab18ff86", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/sports.xml", + "upstreamIcon": "sports", + "upstreamPath": "android/social/sports/materialicons/black/res/drawable/baseline_sports_24.xml", + "upstreamSha256": "664eb4fb6410c9f34352407c50c47f27b02ce21f014b5e1fb0a6628aa8bea8dd", + "localSha256": "bf282d59163250b4b219686cb34ada205f90c8e3f3d0f4be33f11ce43f2dc885", + "orderedPathDataSha256": "5b87c71f323baee43c569b4c3fcc57c646bc7ef956cb12477dfa3c4cf6ebc340", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/square_foot.xml", + "upstreamIcon": "square_foot", + "upstreamPath": "android/content/square_foot/materialicons/black/res/drawable/baseline_square_foot_24.xml", + "upstreamSha256": "1b3b7ca1f8a2049a2dcfe66be23e7286c4b8fb28b7d17cc83a0bd78bf7089d05", + "localSha256": "363823a496214f06377539c6bc7f4fecfed4fd7d3ba874e7c945938436e2235d", + "orderedPathDataSha256": "a71d99933df8937d487912f8d2abe993a959752c9f1829153e37995f5dbd41b6", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/square.xml", + "upstreamIcon": "square", + "upstreamPath": "android/editor/square/materialicons/black/res/drawable/baseline_square_24.xml", + "upstreamSha256": "862f46785a2f235e501d080e3471fad1097298a3083ab8787978052d5fc00ed1", + "localSha256": "756603a1898eb12f2338d1ad4ee57d9db5818c2b813b36f4ab3dfba36b4b5f2a", + "orderedPathDataSha256": "e4d39d337e3687e75a65acc9943a89512eb9e3181b723a4c0c606320647dcffa", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/ssid_chart.xml", + "upstreamIcon": "ssid_chart", + "upstreamPath": "android/device/ssid_chart/materialicons/black/res/drawable/baseline_ssid_chart_24.xml", + "upstreamSha256": "720600c264c550583f2f4b858f3ff821e960b0980186e62bbcacf3b7222eb68d", + "localSha256": "da893e76cf879c3171d6ded47d398759b85a0a77887ba07a1c76387dde6ae0e1", + "orderedPathDataSha256": "b7518e8d3c3bd5b9673fdc969c93cf90204fed70e885174c16fc6370d015d61b", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/stacked_bar_chart.xml", + "upstreamIcon": "stacked_bar_chart", + "upstreamPath": "android/content/stacked_bar_chart/materialicons/black/res/drawable/baseline_stacked_bar_chart_24.xml", + "upstreamSha256": "c312352d91942ca901d77753f785f14dc5107a8a94f36b5f2aba536a96eed5aa", + "localSha256": "1c443d325fa0c6e340c5f89b87caf7930a40460c72cf215be96ca4a304005a31", + "orderedPathDataSha256": "5a45f8d3cbc5b5e1c2dd0ef3db666d249708732bfd5eea99e6af9bf610d1fac8", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/stacked_line_chart.xml", + "upstreamIcon": "stacked_line_chart", + "upstreamPath": "android/editor/stacked_line_chart/materialicons/black/res/drawable/baseline_stacked_line_chart_24.xml", + "upstreamSha256": "465bf190d4a9a7aa5e02ab3e63572ca9f0cce3b0b96d7915e8687e31d8837e8c", + "localSha256": "ce237eede8176abf37ee6ad7873c2cf634ffc21dde250fcea9a39671fec453d0", + "orderedPathDataSha256": "c1b80c043a0a7b6da569ce1fe6e089ab8b554ee201e148153668b664670d6cb4", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/stadium.xml", + "upstreamIcon": "stadium", + "upstreamPath": "android/maps/stadium/materialicons/black/res/drawable/baseline_stadium_24.xml", + "upstreamSha256": "f26f763d0e4601812c78ff3fc6913ebf8d157dbc37f3a69e3d94c3dc00c3726b", + "localSha256": "66fc2268f829c1a0ce990cfd2d9a78411c1553508a527e7cd6dda082f1d82c4c", + "orderedPathDataSha256": "4c959eb06f6a2b7b17e2521ff1c3b3143fb34db6d4c3020789f864e00ddc6c3a", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/stairs.xml", + "upstreamIcon": "stairs", + "upstreamPath": "android/places/stairs/materialicons/black/res/drawable/baseline_stairs_24.xml", + "upstreamSha256": "455c0b4de6ed6eaa2f0762c25be3342a5ba8188476949bbb9f6030472caa77d5", + "localSha256": "e83865e26d30245fc833ca1b2714956d33d399b0fd9a38179aadddf59cb24227", + "orderedPathDataSha256": "a15f126c1bf1e566d9b810a5207ce5c29e6a3d58030b55b274f5b9a7e194d24f", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/star_border_purple500.xml", + "upstreamIcon": "star_border_purple500", + "upstreamPath": "android/toggle/star_border_purple500/materialicons/black/res/drawable/baseline_star_border_purple500_24.xml", + "upstreamSha256": "8ddb1de2660061235da8f214444311b23c82f72be516d66f3265835d7b3a4b38", + "localSha256": "2b84a37a96d0916a4be9b8ff87a0b7407ad123b7c5d75c80204def68af0caa01", + "orderedPathDataSha256": "e259a871c7b88691887547d07a14c07f9dae28158600403d7be415047621b110", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/star_border.xml", + "upstreamIcon": "star_border", + "upstreamPath": "android/toggle/star_border/materialicons/black/res/drawable/baseline_star_border_24.xml", + "upstreamSha256": "6934e2a0275a0e634b7d493bcf5e2d4c71ae6332a676cbe1a63798b3cef87c74", + "localSha256": "2d4ffe29ac043ca9a3682d663615e2d0f91c22d88652f864aee0a5cb1c58ff46", + "orderedPathDataSha256": "72a690768353e0324eaf1eb76641fd9801b37e24aa3e331ae5033938631437f7", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/star_half.xml", + "upstreamIcon": "star_half", + "upstreamPath": "android/toggle/star_half/materialicons/black/res/drawable/baseline_star_half_24.xml", + "upstreamSha256": "57bbcf0e0e5317ecd8e92564fbdd89061e4ea93d6bfbcf7037b49f5e831e8868", + "localSha256": "f83c265d9ae6d30e0656f5c4f28f21de96e7f4cde45af2ca2848fc624b686f39", + "orderedPathDataSha256": "4ba74aefa0303399319f7ee6cbcebdb3187b3497ad9a3d6ff619659b41ff56a6", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/star_outline.xml", + "upstreamIcon": "star_outline", + "upstreamPath": "android/toggle/star_outline/materialicons/black/res/drawable/baseline_star_outline_24.xml", + "upstreamSha256": "6934e2a0275a0e634b7d493bcf5e2d4c71ae6332a676cbe1a63798b3cef87c74", + "localSha256": "8a79ad56a1a73ddc9163a86e18bd5a16cdf48cbb8be290edb07566ccc94a8a42", + "orderedPathDataSha256": "72a690768353e0324eaf1eb76641fd9801b37e24aa3e331ae5033938631437f7", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/star_purple500.xml", + "upstreamIcon": "star_purple500", + "upstreamPath": "android/toggle/star_purple500/materialicons/black/res/drawable/baseline_star_purple500_24.xml", + "upstreamSha256": "8ddb1de2660061235da8f214444311b23c82f72be516d66f3265835d7b3a4b38", + "localSha256": "da6b7209f4d6da4d6095a8d8db7c74b6bb2b1acca3dec61d5630a295af1733ad", + "orderedPathDataSha256": "e259a871c7b88691887547d07a14c07f9dae28158600403d7be415047621b110", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/star_rate.xml", + "upstreamIcon": "star_rate", + "upstreamPath": "android/action/star_rate/materialicons/black/res/drawable/baseline_star_rate_24.xml", + "upstreamSha256": "8f079066fef7553674b14883af8ae2ac9c1cf0d97e43aaa0772afdc4b6ec92c5", + "localSha256": "1f9e486f776f372b0552e90ec3969132edaa1b21e05474d880b275b4753a529b", + "orderedPathDataSha256": "466048872c557fb190d84c0a58d3713e831ee01d420e1f7e08abdc5f8185b928", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/star.xml", + "upstreamIcon": "star", + "upstreamPath": "android/toggle/star/materialicons/black/res/drawable/baseline_star_24.xml", + "upstreamSha256": "fd926a22880bd60f50981b28ee4b413a179709d35426c21939d08c96c4b4876a", + "localSha256": "46896b645947ceb6c572b1874ee184c0d66199ba51f7955b66d1ab69f0e89a63", + "orderedPathDataSha256": "35324c992ba5c0dae9f64554ba7c17f5b196ed7b87567e1d919b382f776f9c5b", + "originalGeometryMatched": false, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/stars.xml", + "upstreamIcon": "stars", + "upstreamPath": "android/action/stars/materialicons/black/res/drawable/baseline_stars_24.xml", + "upstreamSha256": "d498641cfa9fc68299cce3f572ad878b8ab55a7a2c9289f9c26622f105be1f0e", + "localSha256": "943825e6d9fe32f90a5117b8ebf06812e98ffbf06ac92464174498261596257a", + "orderedPathDataSha256": "6148bef50e8ab5137d8c6cc140e4f4dc8ddb6ab7850cb7fa2af98ead2c03176a", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/start.xml", + "upstreamIcon": "start", + "upstreamPath": "android/hardware/start/materialicons/black/res/drawable/baseline_start_24.xml", + "upstreamSha256": "dfd833910a1acfed57d5fae6f5d41c165ec3bf5c10299e0dd54b71a6fdb60fe9", + "localSha256": "b54b00b8ed0d20e2f4648fe8efc75f7184c4d1cb1175f0f2ad5de7e11bd00d23", + "orderedPathDataSha256": "c97fadd2c4e792c3d143491f6009e6cc35e033445a27aad640af9827cb78c434", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/stay_current_landscape.xml", + "upstreamIcon": "stay_current_landscape", + "upstreamPath": "android/communication/stay_current_landscape/materialicons/black/res/drawable/baseline_stay_current_landscape_24.xml", + "upstreamSha256": "6a4bd0a10fa965eca05253200236c8eca97b411faee77368392697ec3f246f1f", + "localSha256": "8c80b09c5e561e866285ef87458da01b3a41188e19a0d5489401ccdb936662da", + "orderedPathDataSha256": "7b0c545a27f540a6ee58ed52fb6211dd8b9d5ba6786002c13826765717f4c38b", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/stay_current_portrait.xml", + "upstreamIcon": "stay_current_portrait", + "upstreamPath": "android/communication/stay_current_portrait/materialicons/black/res/drawable/baseline_stay_current_portrait_24.xml", + "upstreamSha256": "8dbb02824e2699b64e8c5055e9caa71c3dcb80a7a3f095897e6791ac75041285", + "localSha256": "214bea4fdf4d1234a8d03941fb3126c296e6723fa1d68c92e90f0845db7d9a09", + "orderedPathDataSha256": "6dda8ce20d23b9ef07b6608d347ecc016f4abd9c4e064107c0b395adaef01081", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/stay_primary_landscape.xml", + "upstreamIcon": "stay_primary_landscape", + "upstreamPath": "android/communication/stay_primary_landscape/materialicons/black/res/drawable/baseline_stay_primary_landscape_24.xml", + "upstreamSha256": "6a4bd0a10fa965eca05253200236c8eca97b411faee77368392697ec3f246f1f", + "localSha256": "301b18e298e9e3dc0b568eb3cfd75c35c44dfdfb15e738989ec34b7e68c69ee1", + "orderedPathDataSha256": "7b0c545a27f540a6ee58ed52fb6211dd8b9d5ba6786002c13826765717f4c38b", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/stay_primary_portrait.xml", + "upstreamIcon": "stay_primary_portrait", + "upstreamPath": "android/communication/stay_primary_portrait/materialicons/black/res/drawable/baseline_stay_primary_portrait_24.xml", + "upstreamSha256": "8dbb02824e2699b64e8c5055e9caa71c3dcb80a7a3f095897e6791ac75041285", + "localSha256": "1ff3d91a5e3381d4b6d3bd73ac68834b53a47fb456b46d8172af403d77733ff0", + "orderedPathDataSha256": "6dda8ce20d23b9ef07b6608d347ecc016f4abd9c4e064107c0b395adaef01081", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/sticky_note_2.xml", + "upstreamIcon": "sticky_note_2", + "upstreamPath": "android/action/sticky_note_2/materialicons/black/res/drawable/baseline_sticky_note_2_24.xml", + "upstreamSha256": "d864bcdfc3f6e705c7ed9ebeef5b0d9001e0aa72b02574c4c86da0cc777360d7", + "localSha256": "66d67201b79d6baefbcce47acb6ca5bbdaf91e2c1552588c80e83290b69516db", + "orderedPathDataSha256": "6976bac3bceaadeeed62958c8212d6f495a592dcab5757b8bb1ddbcc11d06df3", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/stop_circle.xml", + "upstreamIcon": "stop_circle", + "upstreamPath": "android/av/stop_circle/materialicons/black/res/drawable/baseline_stop_circle_24.xml", + "upstreamSha256": "355b6505d648d90fa501f288252c3142825ad77dc85c758b92149b237a55f96d", + "localSha256": "cfd5b540ca5d62f0735c85d393d60cbf4ee58ec49fa2bf501b2509eea38fbfc7", + "orderedPathDataSha256": "b6307a1fc8734f2c7008bbe5389f3bfc0591eb40eaf8211465d679656067eda0", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/stop_screen_share.xml", + "upstreamIcon": "stop_screen_share", + "upstreamPath": "android/communication/stop_screen_share/materialicons/black/res/drawable/baseline_stop_screen_share_24.xml", + "upstreamSha256": "de4cb72b7a03575655ab85467b46de8c31bcd09df3b8c8574b819cf6e593103b", + "localSha256": "8fe213bbf0d13bcd9b110ace24333a43716b48a5b3d1a051f761e7c1e956b7d3", + "orderedPathDataSha256": "cb803157ce98e22ad2d817df785b5f5675ed75432d81daa9c2dbe9b3146b76d5", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/stop.xml", + "upstreamIcon": "stop", + "upstreamPath": "android/av/stop/materialicons/black/res/drawable/baseline_stop_24.xml", + "upstreamSha256": "bd2c65760275542e75cf54d098c60c40696c704c22bc7b48015f3fbbe5bc093a", + "localSha256": "eed3df9e6476e1c75a49addc8bbfc9ba66a731ebbf18e76a6a522caf91e3b883", + "orderedPathDataSha256": "be02e72602de89fc72c105d60921a6f1f4f66a3ddbce3cff925305fbec019cb7", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/storage.xml", + "upstreamIcon": "storage", + "upstreamPath": "android/device/storage/materialicons/black/res/drawable/baseline_storage_24.xml", + "upstreamSha256": "d987a76dd5ecbe9bc58cdcfd3c39ff97857974e8644fc1e4a80afeb398625e88", + "localSha256": "5444db5f4ff292dbe45f366504be13fb76687dcd4d3e6be21f724902a58dee7c", + "orderedPathDataSha256": "4c4587f4096a8aea62d065a3e0543f480755def5ed8cc2fa71cb3ac0d240dc50", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/store_mall_directory.xml", + "upstreamIcon": "store_mall_directory", + "upstreamPath": "android/maps/store_mall_directory/materialicons/black/res/drawable/baseline_store_mall_directory_24.xml", + "upstreamSha256": "70800753a5e6e722cc8aee4392f6605523b774bb0f77fa4859afeff18c44009b", + "localSha256": "5a26153de94ff3113fa29ed6a26fe4c49d46c142e89b80ad2d4dbf8116a99216", + "orderedPathDataSha256": "ce375c4f019dac1db3bb3cf605508daab8dd7cac85655136b8df81db46b4a2cd", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/store.xml", + "upstreamIcon": "store", + "upstreamPath": "android/action/store/materialicons/black/res/drawable/baseline_store_24.xml", + "upstreamSha256": "70800753a5e6e722cc8aee4392f6605523b774bb0f77fa4859afeff18c44009b", + "localSha256": "444f4aab49010c578c1e2f04bc208987704441ba5fa2c0a1dc861ba514059b71", + "orderedPathDataSha256": "ce375c4f019dac1db3bb3cf605508daab8dd7cac85655136b8df81db46b4a2cd", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/storefront.xml", + "upstreamIcon": "storefront", + "upstreamPath": "android/places/storefront/materialicons/black/res/drawable/baseline_storefront_24.xml", + "upstreamSha256": "9c0e5a462c1bbcb2f97ceec513ba83d4c315f3b81b6f5593d1c1789906194ac1", + "localSha256": "5b8ebd2c88f0636199a8e0496941c743b7e49ec3b5c3b2fb5975544e9014f520", + "orderedPathDataSha256": "e1ab9b742cba36ddcb4da9c6a3067da0066dd29998e31f2a770f3dc70c047842", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/storm.xml", + "upstreamIcon": "storm", + "upstreamPath": "android/device/storm/materialicons/black/res/drawable/baseline_storm_24.xml", + "upstreamSha256": "10a897dabff270b07eefabcf23da1854384311953f2068611b7901ef0dec137d", + "localSha256": "5e71106de7e9ded157288b600d18d57163fb05085dfae334c5f7ebabefa566a7", + "orderedPathDataSha256": "f003720b466c0196e5728ff59d68f69211760c10e575a098f720098e57eae7d6", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/straight.xml", + "upstreamIcon": "straight", + "upstreamPath": "android/maps/straight/materialicons/black/res/drawable/baseline_straight_24.xml", + "upstreamSha256": "4b5d504127125fa39cc9943f2144a8ea9171f752390f0aa96c9280f9b17719c3", + "localSha256": "9abf6025b1f9997ae1b27db2ac796d81986e9514b55d833225cd945b5a30632e", + "orderedPathDataSha256": "d3fea02a6ed577053a99651a03fd9d82dd164d08f3b4b36b5b614b581c4cf5e4", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/straighten.xml", + "upstreamIcon": "straighten", + "upstreamPath": "android/image/straighten/materialicons/black/res/drawable/baseline_straighten_24.xml", + "upstreamSha256": "8abd70ce946d8e90ac312f76fc8215e2237619e0622076c94fb7604bfc5a3120", + "localSha256": "62c51239bc804197a9832e9c6dde19862b32f23896ff509cee71e37447ba7856", + "orderedPathDataSha256": "d29934dd7e69ec871ec569d3288a8436763243d7f493b050a33950340077e09f", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/stream.xml", + "upstreamIcon": "stream", + "upstreamPath": "android/content/stream/materialicons/black/res/drawable/baseline_stream_24.xml", + "upstreamSha256": "ff7f1784b7fe84dcc565a1b0b205edc48e6a9a7ec0ad37e3f701ba0c69e5b3d3", + "localSha256": "c8496dd62c8362a487b2ddeb5895a67c00b7e24496824751b1501b4cb35552a4", + "orderedPathDataSha256": "1b91b9d6a5ec8ce1d8ac1313bf84ced7deccc677ee0960f8a8164079b7ebfd02", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/streetview.xml", + "upstreamIcon": "streetview", + "upstreamPath": "android/maps/streetview/materialicons/black/res/drawable/baseline_streetview_24.xml", + "upstreamSha256": "3602c98ebcf90b906133c74dc9bc023fbe709d2ba1deb45da0d4304353917eaa", + "localSha256": "a5f957ef5c8f66496b6c33615634216004ce6101b0ac3c2620014d5b3ee61e3c", + "orderedPathDataSha256": "617fc48011c153fa3838c7c7c132afc721dd547d96b48b9ee9e75bae4039f17f", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/strikethrough_s.xml", + "upstreamIcon": "strikethrough_s", + "upstreamPath": "android/editor/strikethrough_s/materialicons/black/res/drawable/baseline_strikethrough_s_24.xml", + "upstreamSha256": "4fe2503e1b627acfc3be3ab9bf4a5854e66d04af1fd1115b3775bbbfc883e163", + "localSha256": "f638f952a2a9b43dd64e0d7ae3151af8772cfd964c56da0e46e41cada56cd415", + "orderedPathDataSha256": "84febabc99376a3637b5e86dc1eb551ab8cfa9aac9275c3bea54b72c93856d36", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/stroller.xml", + "upstreamIcon": "stroller", + "upstreamPath": "android/places/stroller/materialicons/black/res/drawable/baseline_stroller_24.xml", + "upstreamSha256": "7fc30309340c274d80f2e70883acee73662864315ca69e8960e25c4e1c72a6fa", + "localSha256": "adbfc50b9baa42df733c9f00c49b8e43209f1e47444eb5ce80f0c2c43a67821d", + "orderedPathDataSha256": "5a80acc5031b6de2e25c08831ac288f67cf78176cdd9b3c33a6644a05e03ccdb", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/style.xml", + "upstreamIcon": "style", + "upstreamPath": "android/image/style/materialicons/black/res/drawable/baseline_style_24.xml", + "upstreamSha256": "5f7f10a9fdbdc99af40a56818bd725640900308a75dc5febf82c5972a70d4390", + "localSha256": "ad5bdbc97b9ae46bd20103029f492f724b40d00fa94b0e7dfdfb5efb8dd087e5", + "orderedPathDataSha256": "4796817da0e8dcb8e05cddcbc6f86e75dee9c6f5fdc02f416692b09549b9f1c4", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/subdirectory_arrow_left.xml", + "upstreamIcon": "subdirectory_arrow_left", + "upstreamPath": "android/navigation/subdirectory_arrow_left/materialicons/black/res/drawable/baseline_subdirectory_arrow_left_24.xml", + "upstreamSha256": "1cce27ad365917b4d4d2b7d91614892e204995746af17774ee0c8006f83e6b8a", + "localSha256": "98c1563e5238a7d922e303f454ea1b87db4f7f35cce02895f8ab15bc3598d163", + "orderedPathDataSha256": "9967c3ff78180c4c7a735e32d786a3703c24ad98f0bf222104e97c5ca49920b8", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/subdirectory_arrow_right.xml", + "upstreamIcon": "subdirectory_arrow_right", + "upstreamPath": "android/navigation/subdirectory_arrow_right/materialicons/black/res/drawable/baseline_subdirectory_arrow_right_24.xml", + "upstreamSha256": "d2639ab1e3693910dcae7639abaa962bcc0da8df7ff6ce1e59ed862e8b7f27c4", + "localSha256": "6e088108e294c8996d9605ba86a228f3ab71fb3565dad1be9a5df6770c50fce0", + "orderedPathDataSha256": "0bc5d23fc1710d1dfcdb2030aa8856219c2c312624a7b6d0a76105dca6802d3a", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/subject.xml", + "upstreamIcon": "subject", + "upstreamPath": "android/action/subject/materialicons/black/res/drawable/baseline_subject_24.xml", + "upstreamSha256": "730b33d618e0d2ce3d122ea64a6adc41dd99daa5c2cbb933b599a99b5b0e04bd", + "localSha256": "263e1f244105aa019341527dbc588e1a1a1b22a24192a05cd7321ef133e62d3e", + "orderedPathDataSha256": "794c7f536b052f1fc785d3399718a7c5f675e58598807177342f00033584a65f", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/subscript.xml", + "upstreamIcon": "subscript", + "upstreamPath": "android/editor/subscript/materialicons/black/res/drawable/baseline_subscript_24.xml", + "upstreamSha256": "3ba5467ee72b871238b4c3fde89e12af45c0357ac82278779efe342b539ca3d3", + "localSha256": "0691387cbd8f996344d4f44dd948799f7385587a0e5f9a8eb78b3d17d255265d", + "orderedPathDataSha256": "4420785ff4d9875bdb0bcda6c335118882a32a217842e937d205a774253be1ea", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/subscriptions.xml", + "upstreamIcon": "subscriptions", + "upstreamPath": "android/av/subscriptions/materialicons/black/res/drawable/baseline_subscriptions_24.xml", + "upstreamSha256": "14c301eb6e063de980bd841be6b1454dd8400d7de04288c814fd627a88992b9a", + "localSha256": "959f1ab4152e63b29f90eb643ab62bb9c916a0c527d317305a144178cc7843f5", + "orderedPathDataSha256": "c5c0a2bbb557a9505c317f0d590d7058f727a680bd0a32c957700b51316cc18b", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/subtitles_off.xml", + "upstreamIcon": "subtitles_off", + "upstreamPath": "android/action/subtitles_off/materialicons/black/res/drawable/baseline_subtitles_off_24.xml", + "upstreamSha256": "afb433f97fe685195970cff0cf7da8e8ccb947d3481672f3f52ad6ee2afa60e2", + "localSha256": "a3cbe7ee85b8a25b1c960471efc722abcdfd0f32f4f14eadb7c9a43efa367564", + "orderedPathDataSha256": "47497b9fa311f9e78ca1e652f1052a0323e75bddd9e83e3267201a9341ebf40e", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/subtitles.xml", + "upstreamIcon": "subtitles", + "upstreamPath": "android/av/subtitles/materialicons/black/res/drawable/baseline_subtitles_24.xml", + "upstreamSha256": "04227fbeb0c5b19c6752d33cf947e1b0bdfd90d975b975b92cf34f83f5d0da3d", + "localSha256": "3c8ad60b8205faada96e7d3cc25b7ca6951b50ccfdeeb9023954cc4133009711", + "orderedPathDataSha256": "54e2e8fe1741a093fb59b26cbf16e045a1443c7cdbd2fbabb4e132a7bfde334a", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/subway.xml", + "upstreamIcon": "subway", + "upstreamPath": "android/maps/subway/materialicons/black/res/drawable/baseline_subway_24.xml", + "upstreamSha256": "6be4c20305eb3d7c03a4d10af7a2dfc00472516871b9ab661f365bcc9f2a40fb", + "localSha256": "917dc250333f6415ec75df2e83eef4456325a6e008f4298e6c67e05cd04e2b30", + "orderedPathDataSha256": "bbb256854fab59238b7d82e330a8366dcec90f1b95bd9e10961261cec30b0b5f", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/summarize.xml", + "upstreamIcon": "summarize", + "upstreamPath": "android/device/summarize/materialicons/black/res/drawable/baseline_summarize_24.xml", + "upstreamSha256": "6d60ed1c82db0a66f22183c5503e37d3687657f7cb53bfa521d02d6a6fb84e14", + "localSha256": "c81cce56d73ae3f1f909fd0263609270d637abcd670e96cec2bb5cef5dd559ad", + "orderedPathDataSha256": "4d64d9932a02408c3aa622cb68e28266131a9d368a56a1102597eb0686be8bdd", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/sunny_snowing.xml", + "upstreamIcon": "sunny_snowing", + "upstreamPath": "android/home/sunny_snowing/materialicons/black/res/drawable/baseline_sunny_snowing_24.xml", + "upstreamSha256": "1b35a9a375f9fe044f64058f2c1b15f3a5ed5da459b0f66b26cb9bbceb3f4184", + "localSha256": "435f2cbe488bc31ec1b83df69b42b4d2619f4bbc040a86090ec24744ac12d3b0", + "orderedPathDataSha256": "8fdf0db169fbf5b0c5d2566b7cf1dd70b1065a0783c185452c4ba2cd24e9ba4a", + "originalGeometryMatched": false, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/sunny.xml", + "upstreamIcon": "sunny", + "upstreamPath": "android/home/sunny/materialicons/black/res/drawable/baseline_sunny_24.xml", + "upstreamSha256": "e8ff4856ee39738129fe4cd3e67ef0b5851b9242ba7212626988e33986cdeaf8", + "localSha256": "5110a13e9959037d41f6640d55256041ccb98a3e910a0c744ee1f712a5b3f24d", + "orderedPathDataSha256": "f7997f7a290ce7a160027b605174257cfcc9aaf1a2dcf9a91608d629db83a909", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/superscript.xml", + "upstreamIcon": "superscript", + "upstreamPath": "android/editor/superscript/materialicons/black/res/drawable/baseline_superscript_24.xml", + "upstreamSha256": "4464b2ac1a5e68545622b0eade063d5b669c564db2fd386e569eca2a9a420b6c", + "localSha256": "b8c2646348d8fb3166fc8721645aa7150234ff580a2d67cd789762278d3ab68c", + "orderedPathDataSha256": "e9d8ba639c4ade58d0bb03327b43d9dc2ee320077310ba44c6c7dfcaad3347d7", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/supervised_user_circle.xml", + "upstreamIcon": "supervised_user_circle", + "upstreamPath": "android/action/supervised_user_circle/materialicons/black/res/drawable/baseline_supervised_user_circle_24.xml", + "upstreamSha256": "28efcb9c4ee8a44dff947d61f7bf79db9c0f0c1b8a428914cde22201154b2f6c", + "localSha256": "1d9e93653724d8db31f41048bbf5a49c10d7d0879de563a78ff9c1225a566b36", + "orderedPathDataSha256": "5f13d5eed5224ac7e0520b2061969e31614ff25ee37f189ca58539b3b16123f5", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/supervisor_account.xml", + "upstreamIcon": "supervisor_account", + "upstreamPath": "android/action/supervisor_account/materialicons/black/res/drawable/baseline_supervisor_account_24.xml", + "upstreamSha256": "fec2e862eb7e79e2dd21d322acf6d964403d0aadea88f78455aabb873468c2f9", + "localSha256": "83a568e7517124c0db0d2d0f82b01c430e460d12390c2fa421ec0d5fba9c9736", + "orderedPathDataSha256": "1d23e0f8fa15c97ea691a283c35e70aa55455b487b02f15a7367fa84690ed944", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/support_agent.xml", + "upstreamIcon": "support_agent", + "upstreamPath": "android/notification/support_agent/materialicons/black/res/drawable/baseline_support_agent_24.xml", + "upstreamSha256": "207a537f2d5656a7495df12c4ee9836b2195ce663fdc2f20ba0c2e11f3f7658c", + "localSha256": "9c3f5760765a7bb25c94a7ffb36ef05e78030d9bdd85702389dc73a55ce6a484", + "orderedPathDataSha256": "808b59720bd60eadd32daab91947ad270ebb814e0ca4fc3af8ebc9d3794a3d78", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/support.xml", + "upstreamIcon": "support", + "upstreamPath": "android/action/support/materialicons/black/res/drawable/baseline_support_24.xml", + "upstreamSha256": "3f386e4a56c9a5f76dd817be0d59ea9ede871db8a359d44af79b2c6c287bd646", + "localSha256": "24b818873f9221e394823d10ba13dd5418ce220691686ae3985c883adfb39eb3", + "orderedPathDataSha256": "fa7af0ff7f3a1a00b29009d124adca9b7fadaa7faab531ae5ff1bfca76f22f28", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/surfing.xml", + "upstreamIcon": "surfing", + "upstreamPath": "android/social/surfing/materialicons/black/res/drawable/baseline_surfing_24.xml", + "upstreamSha256": "97fa0e72da935a60eea273fb4db8fce4c4076ca49b4f41cbc2ca1303bdc8e3aa", + "localSha256": "6aa02c34c35a314464d4bb30be6ef1402e323721e0b76394c9d6ce49ee252b5e", + "orderedPathDataSha256": "958e3275f14d70ac13f5adbb7c96c19e3d3ee6c0361c979a0246b4f83010b511", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/surround_sound.xml", + "upstreamIcon": "surround_sound", + "upstreamPath": "android/av/surround_sound/materialicons/black/res/drawable/baseline_surround_sound_24.xml", + "upstreamSha256": "548f245a9d3588e51c8ea9ab2162c95b728f20f581673b08fb9bee989e06ed88", + "localSha256": "2f0d4ec62afd12841ab4b3ff969dbd1eb0487d9785274ad2383fce21e6019db3", + "orderedPathDataSha256": "ebca1e7d939c87876e75891e2d1be5b1d8010ada3291d48b497ede543aad9f63", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/swap_calls.xml", + "upstreamIcon": "swap_calls", + "upstreamPath": "android/communication/swap_calls/materialicons/black/res/drawable/baseline_swap_calls_24.xml", + "upstreamSha256": "098bb71515c16dd053713e0ad51d02c591e340798f4786e626b1ed42d99fdf94", + "localSha256": "b18680b7ce3918cb5f4881e22a4974195f15450c0e39baea7ee316f33c15469f", + "orderedPathDataSha256": "c681b9e17653543cee0ff8b92c283f61638e3b52ae15e92b9ceab09afd4a0c41", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/swap_horiz.xml", + "upstreamIcon": "swap_horiz", + "upstreamPath": "android/action/swap_horiz/materialicons/black/res/drawable/baseline_swap_horiz_24.xml", + "upstreamSha256": "4fc6930f994c0a0cd8a7ae7f8aca055a48ebaa9d066b765bfbb64d851f66de2b", + "localSha256": "17fbeee2d4251f0207e41d1f7026016ed0d7998e608101c971598bdc7c22cdd4", + "orderedPathDataSha256": "ff9269c9d2b88d60ea9050bae0d8401f4bbd29cd23a9fedf67d6a746bb6b0a8d", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/swap_horizontal_circle.xml", + "upstreamIcon": "swap_horizontal_circle", + "upstreamPath": "android/action/swap_horizontal_circle/materialicons/black/res/drawable/baseline_swap_horizontal_circle_24.xml", + "upstreamSha256": "f4f39b458d78eb003adc7eb011009e054069014e01709e6e332c6f487002fb71", + "localSha256": "f33ab8e724fff38998b23ed7619a431f5f753684f5ec9613d69107e0fc24a723", + "orderedPathDataSha256": "d2f2d2cc9d57aa4de2187a76bd3313bf75245d9fe2591a6075b7a7205ab667ce", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/swap_vert.xml", + "upstreamIcon": "swap_vert", + "upstreamPath": "android/action/swap_vert/materialicons/black/res/drawable/baseline_swap_vert_24.xml", + "upstreamSha256": "ba08d149cfede8265c2f2d9465b0b2afa6d91558003ab9976f9c7345695a0061", + "localSha256": "aad0e6d9c8a72c661a820d54625e316c19254f3cb96eade7d87bd5c8685d9bdc", + "orderedPathDataSha256": "02168df8afd8fa73c11c05c7097ce7d5d090c5e05ad177d5a92bd68a04517068", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/swap_vertical_circle.xml", + "upstreamIcon": "swap_vertical_circle", + "upstreamPath": "android/action/swap_vertical_circle/materialicons/black/res/drawable/baseline_swap_vertical_circle_24.xml", + "upstreamSha256": "332b2b9fab79b3059fae6fd9899b980f429c2fa1354e247a399488bbfeb96f74", + "localSha256": "722616719ff94100fe7c264bd0c99025890af443f5f0922c6315eb909b42e93a", + "orderedPathDataSha256": "5781098f9bef18cdbc19bafaaf379e679a9a37ffcfb204b27d2c48e691623d92", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/swipe_down_alt.xml", + "upstreamIcon": "swipe_down_alt", + "upstreamPath": "android/action/swipe_down_alt/materialicons/black/res/drawable/baseline_swipe_down_alt_24.xml", + "upstreamSha256": "096f988c922cbd4a25b0a80c9e528e59bb7ca17c86eb56e5f10412cab571e478", + "localSha256": "ea67b0f615d1a7cc4956cbbc11af6719cf99a750a4c03b489dbd4d3dab546212", + "orderedPathDataSha256": "12bc15d1ec6951099da23c8932175f46e42668e0f1c22f2627ed5bfbc7759465", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/swipe_down.xml", + "upstreamIcon": "swipe_down", + "upstreamPath": "android/action/swipe_down/materialicons/black/res/drawable/baseline_swipe_down_24.xml", + "upstreamSha256": "77cea0271078b1163e28c350011a27a9f19be45ef8bdbb3be434816ef57a179f", + "localSha256": "c9451a6884bb7d249e28102943988f35abdcff3e7fce41a86d84f6e4171b97ea", + "orderedPathDataSha256": "1aa823605a64c994c59dc0bc7913207dfd7fe6c59249e301c79715338579cf4a", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/swipe_left_alt.xml", + "upstreamIcon": "swipe_left_alt", + "upstreamPath": "android/action/swipe_left_alt/materialicons/black/res/drawable/baseline_swipe_left_alt_24.xml", + "upstreamSha256": "0b2644fd00660025ad2e6c16ef10be301e2e0f556b3bcc9a91d10b81a9a82713", + "localSha256": "518cf9d874b9e03840ca167e26d27583048cd3a6fc58938e57de726ba54d92d0", + "orderedPathDataSha256": "4a11b5dfce38d3d5edadad2779e13639a8b94b878956f711dd3df237d1fafe7b", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/swipe_left.xml", + "upstreamIcon": "swipe_left", + "upstreamPath": "android/action/swipe_left/materialicons/black/res/drawable/baseline_swipe_left_24.xml", + "upstreamSha256": "07e975194d8359d997f72e588e7d4f1c4dbf8eff5a8daadb488907f7c08aa797", + "localSha256": "e6c763cdd0dfa5e2e4fe29faf5143aa3252729e8cbcb85093a029c327be6ea19", + "orderedPathDataSha256": "f593d44e8bdefa5af1fff3f1166264bc3181a906d79b7e8c83a1f51b13f49493", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/swipe_right_alt.xml", + "upstreamIcon": "swipe_right_alt", + "upstreamPath": "android/action/swipe_right_alt/materialicons/black/res/drawable/baseline_swipe_right_alt_24.xml", + "upstreamSha256": "c14bd878a6e16fbc6d407359a125c1ebc17e06e2d6f4e5f180e2080bf4496232", + "localSha256": "84c1a897a5e1184b10ac95fcc11a6e4d29f21e21eda29fdd7fc29a9c1f94a4be", + "orderedPathDataSha256": "19fce37be13cf01ef79cbe8f38350e51d2de8d9968ff24cde46a25f82535eb77", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/swipe_right.xml", + "upstreamIcon": "swipe_right", + "upstreamPath": "android/action/swipe_right/materialicons/black/res/drawable/baseline_swipe_right_24.xml", + "upstreamSha256": "483983b27aa3452fe8a571fb2604b37182adf687d9def4eb6307cf01620d1f08", + "localSha256": "faf98bca524efd45c92076027c2f325801fd872eabf7e8e1d652de1d4db7909d", + "orderedPathDataSha256": "492970d2943a9e8c3cf9561a2b6f0a9d0ef225aa02c38d26cb9c6dc7f4d87f49", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/swipe_up_alt.xml", + "upstreamIcon": "swipe_up_alt", + "upstreamPath": "android/action/swipe_up_alt/materialicons/black/res/drawable/baseline_swipe_up_alt_24.xml", + "upstreamSha256": "28ba252312ab29d81f2560741ea6c448e40bd3e8a42c2e8219166a5f235d0ff9", + "localSha256": "1f2b20b629a1139ae98ae9a90acfb921f1952890ba746b8dd896b0a990be5f94", + "orderedPathDataSha256": "decd18cf6bdebfc122482307bfb229223c597a19fe941d38f38296e69a10f23f", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/swipe_up.xml", + "upstreamIcon": "swipe_up", + "upstreamPath": "android/action/swipe_up/materialicons/black/res/drawable/baseline_swipe_up_24.xml", + "upstreamSha256": "3932ecff3214a928389daf0bed40434788b65b588becf73a474d8f088491bf55", + "localSha256": "4282c7d97801b4c3492564c2d5b6d25e3a6f08f966858cb9e88c5ddeedabbc78", + "orderedPathDataSha256": "b931974f603268a7eda62c65de96266e9c24281f072c31bfa9b218705712e47e", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/swipe_vertical.xml", + "upstreamIcon": "swipe_vertical", + "upstreamPath": "android/action/swipe_vertical/materialicons/black/res/drawable/baseline_swipe_vertical_24.xml", + "upstreamSha256": "171d6773894b7e5e5271809aeb12b0271be3140086da0de8fd9000d2116d4798", + "localSha256": "293ede3010c415fa8e07a971d267307b56997254a38e8d096d5e6941f5a3592d", + "orderedPathDataSha256": "1c62c4bda38de458a3254ed89748d2b487fa9afe3c55708e8f214ccccc848ac1", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/swipe.xml", + "upstreamIcon": "swipe", + "upstreamPath": "android/action/swipe/materialicons/black/res/drawable/baseline_swipe_24.xml", + "upstreamSha256": "9592eaac4a18dd0ea36cc0a14928bcb40820d4bbd215b99185a9e69db2a63f85", + "localSha256": "324ab7e1077f724aceb3cd5186cba7c11b25e44b383f7f88bd5992fbf3c3dec2", + "orderedPathDataSha256": "e4580f8176ebc2d98933e5465ec615b05a19fa3fcd00ea3618e860e1b898521c", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/switch_access_shortcut_add.xml", + "upstreamIcon": "switch_access_shortcut_add", + "upstreamPath": "android/action/switch_access_shortcut_add/materialicons/black/res/drawable/baseline_switch_access_shortcut_add_24.xml", + "upstreamSha256": "5318c5463c0ca40ec9bfc06fc982d87215deccbbc63595841c0d2a42a994c04e", + "localSha256": "d4ce81e520725071f4e3f80dc43c3f39d78b24fdb96cb379380bbb1fc4bb95d5", + "orderedPathDataSha256": "46d46557ad0a75ae55eb5ddaf3200164a4ea8ca7e24a58362e689b7f1e600bd3", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/switch_access_shortcut.xml", + "upstreamIcon": "switch_access_shortcut", + "upstreamPath": "android/action/switch_access_shortcut/materialicons/black/res/drawable/baseline_switch_access_shortcut_24.xml", + "upstreamSha256": "dc797f5a98424f500ba37161830afa4f25d5a77dd75df79454acb835e088a376", + "localSha256": "042e624f1b2c321017b0294398900a45e01a34eadf834eb40687c13890e86837", + "orderedPathDataSha256": "16ed359502b6a1abac74a54b65e01a15fda8d61e9ee32eff0bd7e18596d20687", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/switch_account.xml", + "upstreamIcon": "switch_account", + "upstreamPath": "android/social/switch_account/materialicons/black/res/drawable/baseline_switch_account_24.xml", + "upstreamSha256": "feac6c9b669c357e26a4c36d492b0228af17a8f4beb3ffe709ce14dec5c2f8ff", + "localSha256": "e1028e3ed3ba81085fc15941a44264a4364494bd778e4e355fee3b272b1a6d0b", + "orderedPathDataSha256": "d2056a09906491d3d7ada2c3815ec76582bb8890150139164912b230d98af443", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/switch_camera.xml", + "upstreamIcon": "switch_camera", + "upstreamPath": "android/image/switch_camera/materialicons/black/res/drawable/baseline_switch_camera_24.xml", + "upstreamSha256": "c24cc53314f0ece1de0ce6c3a3b006499fb45b7c35e77202b26835fec196efd4", + "localSha256": "1a8e4fe265eab9ac177903ff33b6c089e6948e24acb42ef7b4b62d31a66e8c3e", + "orderedPathDataSha256": "a158d4b4a19903cab1138edf8f3da3159cf789af5d0dcb85aef736b9af42da24", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/switch_left.xml", + "upstreamIcon": "switch_left", + "upstreamPath": "android/navigation/switch_left/materialicons/black/res/drawable/baseline_switch_left_24.xml", + "upstreamSha256": "0afeb50fbe548569628de8d964fab12d8e116a88f8abd45f986c8159ce700ebc", + "localSha256": "42df4f56613009f9a19503b2c1b361704e9c6bcdccda6f892233f7ec8858c896", + "orderedPathDataSha256": "1c9d803f4011ff91472bcccb86a40cdad7c45b4ddc11299877d7b0a658f7fcbb", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/switch_right.xml", + "upstreamIcon": "switch_right", + "upstreamPath": "android/navigation/switch_right/materialicons/black/res/drawable/baseline_switch_right_24.xml", + "upstreamSha256": "4829f03932eb8c39288bf3cde92f102826609da0d67cd73ddb96a83748a39616", + "localSha256": "69fbc23db1fbbd233427becc92f86d8c3f6ded815bc4ae0a8f322314bd727471", + "orderedPathDataSha256": "8c31ffcc3bcf45cbd5aab39bbbffb84c823134f9555cf082e3097cb599e996bd", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/switch_video.xml", + "upstreamIcon": "switch_video", + "upstreamPath": "android/image/switch_video/materialicons/black/res/drawable/baseline_switch_video_24.xml", + "upstreamSha256": "86400779f1708494e36d9fce014a483c110196e7c5b1dc8a4671e017e93486dd", + "localSha256": "f5886520f517451d81c986794217b973361cfe5e5380ba0473a1790ee99b0ef3", + "orderedPathDataSha256": "731f9c19ebbcf1f802826601f87350bf57c057c565bd84a48ba0e018b39ee752", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/synagogue.xml", + "upstreamIcon": "synagogue", + "upstreamPath": "android/maps/synagogue/materialicons/black/res/drawable/baseline_synagogue_24.xml", + "upstreamSha256": "a53e0c293682b28bb229871415fddae5e648e05209f45f7fcb19740d124ecc22", + "localSha256": "a21605feb656b9fea0c6599af74f58a639f9f9c8b98cc8ea28576eb7037edcdf", + "orderedPathDataSha256": "35799920d37a90a38841f4979737b50b388fd125352c3ccff6db1d66c6f22cdb", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/sync_alt.xml", + "upstreamIcon": "sync_alt", + "upstreamPath": "android/action/sync_alt/materialicons/black/res/drawable/baseline_sync_alt_24.xml", + "upstreamSha256": "ce8cd0a9f2ece781aba38bdeff335112543c75f6733122e454d9b280822b0ef0", + "localSha256": "257b4201fd4e94c4e2e898940aea6eba6d2da0ff87896d3f4cc97b159ee109f1", + "orderedPathDataSha256": "f664dfe0dde6b9b646cd1c7f8a0cce3cc243f58adf360d990b1bd73d20c73a7d", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/sync_disabled.xml", + "upstreamIcon": "sync_disabled", + "upstreamPath": "android/notification/sync_disabled/materialicons/black/res/drawable/baseline_sync_disabled_24.xml", + "upstreamSha256": "846d9152001cf7434ab2551568e6d9ddb4bffa25a483fb11dea690165755f0cd", + "localSha256": "92ae01a019552ecae9b25c399620af7653c41c7189e603bd18538ac9edc34509", + "orderedPathDataSha256": "1ae92b9f512cfec3c7aacbf680d00d3177584da5237ff8ec27dc58b2420b5213", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/sync_lock.xml", + "upstreamIcon": "sync_lock", + "upstreamPath": "android/notification/sync_lock/materialicons/black/res/drawable/baseline_sync_lock_24.xml", + "upstreamSha256": "fd94f4d74068adebcd8463ab923b80812d4ac142ed8a64a856abc994ea641a19", + "localSha256": "6142fa7b01169281e3010d24c8bd98c5bd4a863317631c09abe4c2197434edf6", + "orderedPathDataSha256": "701b3d42c677883a387b9694f1454f2ea811b308c031a63d79224a2b83fd4017", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/sync_problem.xml", + "upstreamIcon": "sync_problem", + "upstreamPath": "android/notification/sync_problem/materialicons/black/res/drawable/baseline_sync_problem_24.xml", + "upstreamSha256": "3d1f5792d2fbdded99fed53b0e094e3d7b7ff4dfb560c5c1a4759bebcb4a7cf9", + "localSha256": "1e79ebe059b5f204e9f2c1f79c9c51a0d7b39dd2d02dee3a1a1aa29c4df244b0", + "orderedPathDataSha256": "a8c3b37c09dbcb0ef976c810099085eaac0afb519508da8b9d675776812a2fe8", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/sync.xml", + "upstreamIcon": "sync", + "upstreamPath": "android/notification/sync/materialicons/black/res/drawable/baseline_sync_24.xml", + "upstreamSha256": "8db3d2ab521cdd9ae90d7507fee96566f9142bf985d170a5cd5b281244cc3e93", + "localSha256": "52f5336fa9dacdaa2ad07d2c0a08ebfd89173a8ba940e4d6955d81ca7086ffdc", + "orderedPathDataSha256": "e11256bdb90ec5464f8ddad6f29513730d880a26b4dad3621a40393ab2bef2e4", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/system_security_update_good.xml", + "upstreamIcon": "system_security_update_good", + "upstreamPath": "android/device/system_security_update_good/materialicons/black/res/drawable/baseline_system_security_update_good_24.xml", + "upstreamSha256": "75dada9967d005430a99ba5c22fdaa4dc0b99ba6a8d0292b792b0e2ff9c9d41b", + "localSha256": "8d7a28ce73ca41eee941429f97c8f97bedbe39a8b3f8998ae145da0ebb5a7393", + "orderedPathDataSha256": "233e0ff89cea424b008bd517e7081847235b73ac9f050b1a1f3110222dc13b67", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/system_security_update_warning.xml", + "upstreamIcon": "system_security_update_warning", + "upstreamPath": "android/device/system_security_update_warning/materialicons/black/res/drawable/baseline_system_security_update_warning_24.xml", + "upstreamSha256": "926748e41f7b2701027fba3b252b3b50fc4c5380a26f8ea2e070e37158502127", + "localSha256": "2296106e95872da210c6a2a6e6a7dd3c8e022b8370d237abf154f3e1f47582bf", + "orderedPathDataSha256": "f2b24f059142cbd093178c289842c62605c908a85d487db77522fdb53ab316a9", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/system_security_update.xml", + "upstreamIcon": "system_security_update", + "upstreamPath": "android/device/system_security_update/materialicons/black/res/drawable/baseline_system_security_update_24.xml", + "upstreamSha256": "41bf3db32b15ac6712e4ff7d8ff474156a5056e218f84b65907d314fceadee07", + "localSha256": "7a1fdb4f0a89d0251d75747913788e6d719f474146a8638ebf9838a8a4a9e187", + "orderedPathDataSha256": "777d9784b645158212d9508553bdeda805b56fa0e08ffdb7224141e63385bcca", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/system_update_alt.xml", + "upstreamIcon": "system_update_alt", + "upstreamPath": "android/action/system_update_alt/materialicons/black/res/drawable/baseline_system_update_alt_24.xml", + "upstreamSha256": "5cc2f0a5cab9c8212328ce67d1bcaa2f9cc7bc6cdb96f9bbc503470d58c03992", + "localSha256": "c3dc845a3134390a4b8844ca45232d945189cc723e0e44df6c900890d83a0ce9", + "orderedPathDataSha256": "2f3c0d33a79179ed137d8736cdd4fc296de7cf5fc8e24a8f69eac7223d5105d8", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/system_update.xml", + "upstreamIcon": "system_update", + "upstreamPath": "android/notification/system_update/materialicons/black/res/drawable/baseline_system_update_24.xml", + "upstreamSha256": "a1c99814722a51bbb51b21500498d966dfc12d95db51a90c63a9d06b7926a7ad", + "localSha256": "c06745cd9dcd8a5029086e24beb9a512479fd097ca978338580563ea1561e0fa", + "orderedPathDataSha256": "212bbe1eac77eb0b17f426a30ba10b2a271ff2a61c4223d02a8fa6346f2db3bb", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/tab_unselected.xml", + "upstreamIcon": "tab_unselected", + "upstreamPath": "android/action/tab_unselected/materialicons/black/res/drawable/baseline_tab_unselected_24.xml", + "upstreamSha256": "4fb3f7f0ccab236731a2bce5079b87ac9f1f03459ec311709e3eab61faa2720e", + "localSha256": "ee15ac4bc9540e2616b8e0f190985a349a08d4f12f76e0dde64591c42585da1d", + "orderedPathDataSha256": "bb8b4a21c90bf7bb55619a0538b354882978d445e655358cd6bfa9d140c8aaf6", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/tab.xml", + "upstreamIcon": "tab", + "upstreamPath": "android/action/tab/materialicons/black/res/drawable/baseline_tab_24.xml", + "upstreamSha256": "716552d1e5e858fd605d47f946d9feb8b897a66c3d7bbd62a8916b7e346bebc7", + "localSha256": "2ba74d863a2c73974950f65ac51aa9359b706373a9e21e61111782c1177a4793", + "orderedPathDataSha256": "66a180014672716b5fc3c5ee34fc38343f22fea7c6e5b6e452239eb015620057", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/table_bar.xml", + "upstreamIcon": "table_bar", + "upstreamPath": "android/search/table_bar/materialicons/black/res/drawable/baseline_table_bar_24.xml", + "upstreamSha256": "cf6fcff456a4650b8130d3e4f86f6e6e92f98351a56464f42ef9883fcb2dbc94", + "localSha256": "35c3b65d971f6af08a36c9aa1dfdd20071541fa21fac92510b43270b846b681f", + "orderedPathDataSha256": "5a3ce45586990e6ec92d89b4a6516d36494cf9396efbfca2954d07d7d494f0c9", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/table_chart.xml", + "upstreamIcon": "table_chart", + "upstreamPath": "android/editor/table_chart/materialicons/black/res/drawable/baseline_table_chart_24.xml", + "upstreamSha256": "8f666799c68cc6eaa9e28c68260b201f56286a77788f67a9d7b80393e20f83c8", + "localSha256": "40bf1169440dddf4698500f2798cee23ce90f3224f24323643cde7d4f57aee17", + "orderedPathDataSha256": "695cd7408c0c5ab7cb8dbea773bf11f50aa9219b17ae9359399e304c7d72edc5", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/table_restaurant.xml", + "upstreamIcon": "table_restaurant", + "upstreamPath": "android/search/table_restaurant/materialicons/black/res/drawable/baseline_table_restaurant_24.xml", + "upstreamSha256": "a90317f56864e18ada97c857df7b710e292b9216a52727b33fbc246b5dc229fd", + "localSha256": "1d4bf679ed620038455e19b4fa9fb0a98410293fad213388a6c215674a2af1f7", + "orderedPathDataSha256": "90369d95745ee623cb90a558672e4a0fa5e8d03a2058c42dd04211014cf9af04", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/table_rows.xml", + "upstreamIcon": "table_rows", + "upstreamPath": "android/editor/table_rows/materialicons/black/res/drawable/baseline_table_rows_24.xml", + "upstreamSha256": "4b8b9615ae05837c5b7fc0b96395d6cf5ae75dc27b102d2d727e836b8a5aec3d", + "localSha256": "967dfa2abc1a037066088bf86360a93033484c070dd82c906c719017a8f2620d", + "orderedPathDataSha256": "1a64963e4cb6dcf58b0cf2a7df907d51ae57b394cd1a996c1d100fcfabdeea7f", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/table_view.xml", + "upstreamIcon": "table_view", + "upstreamPath": "android/action/table_view/materialicons/black/res/drawable/baseline_table_view_24.xml", + "upstreamSha256": "cfa419e610b81e220a1bb6be67d66b273efdfa7e65093f19bf51a92de371ee0a", + "localSha256": "7a44596412c99b91fc91ef87e4396061945f8e29f3e0a89edbfdc7e8da03aae8", + "orderedPathDataSha256": "3e23b737bb4ef9afcd734b1a7fd8ad99b6ec8904e8a2888f56e49d55d4fcdd26", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/tablet_android.xml", + "upstreamIcon": "tablet_android", + "upstreamPath": "android/hardware/tablet_android/materialicons/black/res/drawable/baseline_tablet_android_24.xml", + "upstreamSha256": "ffd335b2baf8ffb6eca6bcc77bc7f8b175c8cbf2065fdc75aa31c0e760ebdf66", + "localSha256": "c19dc75325694cb6a633f7036fe9851949d308ae7bef11135ef6b5abaeca4382", + "orderedPathDataSha256": "26a64aec919ed085db46231177031e29a14f775572eed86e6263a2c19b436a32", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/tablet_mac.xml", + "upstreamIcon": "tablet_mac", + "upstreamPath": "android/hardware/tablet_mac/materialicons/black/res/drawable/baseline_tablet_mac_24.xml", + "upstreamSha256": "84ccd58db90b6f801825a9ffb0cece3c0233758153543373801b008d7e4ee461", + "localSha256": "7a80204fa9f55721ca6eaac767973eceaa52cc87b2d54f0f484133cad328ecf3", + "orderedPathDataSha256": "12c84e786244dc10cf6192984b8bc9a7921faf4bba84b0ac2c4cbbcb972f2e97", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/tablet.xml", + "upstreamIcon": "tablet", + "upstreamPath": "android/hardware/tablet/materialicons/black/res/drawable/baseline_tablet_24.xml", + "upstreamSha256": "6269b9ef69b634393b9fbb312624b63e24be3cdaa81999f71c4943016c250494", + "localSha256": "9d81211efcc36595e96e0bf0f0cd807ea937da759e34490afd5470c92fe9ddaa", + "orderedPathDataSha256": "ec044cc5015113f7ddc4daf45e5c8c3aab863f17873b0dedb43136201cab1178", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/tag_faces.xml", + "upstreamIcon": "tag_faces", + "upstreamPath": "android/image/tag_faces/materialicons/black/res/drawable/baseline_tag_faces_24.xml", + "upstreamSha256": "a4ccc0e5580fdf0d99e9b33700d20e10d42c48f65439b12d1542898b26c4fa97", + "localSha256": "20af3c1dc8b9b7e50350c4b07f9375fe187d764e8c366e20a1cca9dd8999307d", + "orderedPathDataSha256": "5cc262b82e4615258d7d7c6e6f76bdb85c351d9a2ac223886ca63ef3a2b70344", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/tag.xml", + "upstreamIcon": "tag", + "upstreamPath": "android/content/tag/materialicons/black/res/drawable/baseline_tag_24.xml", + "upstreamSha256": "f1bdd5b1a6943481e66161737a5f956756ff5e6e12710351257a92e7c6e7373f", + "localSha256": "1c73c1691380d1ab0f633f4d825bb35540cb296fa6ffd766edc9c3beda88ac0c", + "orderedPathDataSha256": "cc3acb8af4635f5c488e5114aac28886e5ddf4a60641a1b3b1bad86bfe5d1d83", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/takeout_dining.xml", + "upstreamIcon": "takeout_dining", + "upstreamPath": "android/maps/takeout_dining/materialicons/black/res/drawable/baseline_takeout_dining_24.xml", + "upstreamSha256": "67665d81dd969a30445cee17e7fb4c6f2688a86a08d2c5279dd2a07d10c74b2d", + "localSha256": "21ec5ae58d60ef53cff29c53ed32ed195e2689d41323f1d544424be2ff71151f", + "orderedPathDataSha256": "b401147210a03cf3c73100b3daad5b3b54d98736c06ac3b5439ca28e0ff774a7", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillType", + "value": "evenOdd" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/tap_and_play.xml", + "upstreamIcon": "tap_and_play", + "upstreamPath": "android/notification/tap_and_play/materialicons/black/res/drawable/baseline_tap_and_play_24.xml", + "upstreamSha256": "2131550689b7ac858e8fe31531d71a44b80e28c496d9b22b46039010f3424ce4", + "localSha256": "7ea6133beccf75c326ef666b0607f9f26fe6a9cbf5a9d6b3a4a3dd7e49190e91", + "orderedPathDataSha256": "8335edd2b231ac0eb127171ed1c0c68168daa7e154c6d2ab8f5c50e1f3de6a86", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/tapas.xml", + "upstreamIcon": "tapas", + "upstreamPath": "android/places/tapas/materialicons/black/res/drawable/baseline_tapas_24.xml", + "upstreamSha256": "cf3f80728a3e1159d948548c40e4acd04aef16c939307bfeb1f43eabdb67ee4f", + "localSha256": "2771f349968d28a6e561e986af581302e5f85cf61679640981ad0845c8ddb12a", + "orderedPathDataSha256": "e10ae21190ecf36692d4915db94a35dafd72deff70d1e500ff19e69039eb1937", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/task_alt.xml", + "upstreamIcon": "task_alt", + "upstreamPath": "android/action/task_alt/materialicons/black/res/drawable/baseline_task_alt_24.xml", + "upstreamSha256": "951506458a32034d496a1afa358ca80da10b36a98e7bbda33802e08abd41738d", + "localSha256": "40a46908b75fe62f04f758965e2a6c019fb64a443b3b674e20ff4febc2d777f8", + "orderedPathDataSha256": "85265948004ac9113b488207941061555800d806e97c65decf34d747d4ec7ffa", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/task.xml", + "upstreamIcon": "task", + "upstreamPath": "android/device/task/materialicons/black/res/drawable/baseline_task_24.xml", + "upstreamSha256": "49bd417c49ce3e38f8496d91bacc7a01c4d53d6719a1e6b491c4d9ede656895c", + "localSha256": "e40f07841012d25585537fed560bbfc24d1f24a96874e13bb927439cde5bc8f0", + "orderedPathDataSha256": "f23d58b44b258f36498eb5df5a070927c87a3dbca43f4154b741a38b869b0791", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/taxi_alert.xml", + "upstreamIcon": "taxi_alert", + "upstreamPath": "android/maps/taxi_alert/materialicons/black/res/drawable/baseline_taxi_alert_24.xml", + "upstreamSha256": "424caa744862546e99a1dcb1fcfa4eb79399f988206abdb1c6830f0aa8b08485", + "localSha256": "898cdb7bf0226e2f42d46ea34be536cce605bfe29434083d90f1f0b277ace0f1", + "orderedPathDataSha256": "88ac4cab22511e7cecce0f531a806644dd1fae1db12da787d9ad870c78acc1cc", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/temple_buddhist.xml", + "upstreamIcon": "temple_buddhist", + "upstreamPath": "android/maps/temple_buddhist/materialicons/black/res/drawable/baseline_temple_buddhist_24.xml", + "upstreamSha256": "0f5d5a222a86e7cc6d130b4b25701ced456152f9335f50d0dbff0abfa820c6a7", + "localSha256": "02df8b17fd7575b8b5d3f378b0a0daa62616f3d0fb75071bc2f2e0492f9a16fc", + "orderedPathDataSha256": "f112a4341b63b157e45109d3b6df2683702ee92930cfb45acb2fc123b3c8bd37", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/temple_hindu.xml", + "upstreamIcon": "temple_hindu", + "upstreamPath": "android/maps/temple_hindu/materialicons/black/res/drawable/baseline_temple_hindu_24.xml", + "upstreamSha256": "a17b0f22339dc743f889c3088acfb5cee740e246062151f5351e34fea3750f08", + "localSha256": "aef06f2df1a65abfcffda3d3d88cb672aee5fd43e55df8c628de71cdd22e35ff", + "orderedPathDataSha256": "f58ae0bc62d5e77c7f76ac8a0a56d0fed717e99eff984302a9317d9e66b476f2", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/terminal.xml", + "upstreamIcon": "terminal", + "upstreamPath": "android/action/terminal/materialicons/black/res/drawable/baseline_terminal_24.xml", + "upstreamSha256": "4ee3ae70601b352e2b3b9dca21ebe986bfec2b11428720fe5f5fdaf58902d02b", + "localSha256": "0a587085da20c1afcca5a4a7b5e9789433dd9a67970af09de205e5e0c4c63081", + "orderedPathDataSha256": "bf5a92905e7767ce2c2094424da86ac95f41d351702e48179add3334d9225f52", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/terrain.xml", + "upstreamIcon": "terrain", + "upstreamPath": "android/maps/terrain/materialicons/black/res/drawable/baseline_terrain_24.xml", + "upstreamSha256": "e5065ce0ffd0587faf876c2fc79b6a64f144b6816693755957a7cd9f013d0e41", + "localSha256": "89a5f5f570f1351ed199410d13773305cb4944632a17f90224692a1fb100c48f", + "orderedPathDataSha256": "6ad7a00d57046a5e4decc4255e68931708d27e3f6b8d6fe1407130c95d1408d6", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/text_decrease.xml", + "upstreamIcon": "text_decrease", + "upstreamPath": "android/editor/text_decrease/materialicons/black/res/drawable/baseline_text_decrease_24.xml", + "upstreamSha256": "026c7ca74e20b3bdbfa1300d8faf677ec6ef94236a26f2da9307990d61792ad8", + "localSha256": "e78d570aeb027b12a70f1fe51df5b97a87640a9f079dcd02d3eabfbb0e9c5a81", + "orderedPathDataSha256": "944242c76120ed4fa925116a1c564d34346ef608b80b57aa95857a4ca8e0955c", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/text_fields.xml", + "upstreamIcon": "text_fields", + "upstreamPath": "android/editor/text_fields/materialicons/black/res/drawable/baseline_text_fields_24.xml", + "upstreamSha256": "59e60e6d87a1d46a2ab66845d6f74482e1f342aec24ff0b2c89baf3a2bff0a08", + "localSha256": "6d2944a39d9f0a73af7f12cd772f2a2a97bb9f80dda01aae809abd8040107e6f", + "orderedPathDataSha256": "18e005759f57e4e73338e81a81050114a944aec6c5341a2722dcf297804b9386", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/text_format.xml", + "upstreamIcon": "text_format", + "upstreamPath": "android/content/text_format/materialicons/black/res/drawable/baseline_text_format_24.xml", + "upstreamSha256": "700b3f6e70f97fa10b47cb5b4123a1a9597cd1428a99dc2f213f9d3a2f4650d4", + "localSha256": "2372b2d5d42ac8a0207f3740b593965f898fd92357b84e93840754c85b1c2330", + "orderedPathDataSha256": "9f648748e1856d5bb4d37d383220b6280d3989485eb38a4a8f64657eeccf00fb", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/text_increase.xml", + "upstreamIcon": "text_increase", + "upstreamPath": "android/editor/text_increase/materialicons/black/res/drawable/baseline_text_increase_24.xml", + "upstreamSha256": "b9db579d84b681e0dbb351244e99969a51feb4eac94fd6333fce7e9cf38c62f9", + "localSha256": "e06d4b979b477ac14d6915c7a7c78f56132daf2d1b0f8fd842a18fff2c9bcf03", + "orderedPathDataSha256": "30ab01acaad814690b4e8c9c6fb73fcd47a96549149adf4365dbad0f54e7c420", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/text_rotate_up.xml", + "upstreamIcon": "text_rotate_up", + "upstreamPath": "android/action/text_rotate_up/materialicons/black/res/drawable/baseline_text_rotate_up_24.xml", + "upstreamSha256": "d11b0a957f76c3fc65f933d0a04e6b0b0f9a0feecf700b2ddca1a18588d1af85", + "localSha256": "ad8f03b29ed8c65e9d0a76865e343f65f20da79aff19ada7929a6e157975c0fa", + "orderedPathDataSha256": "3e237bf0805f6737a4ab44a18eee6ae6201e51ff9c0272fa65fe695ddced05b2", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/text_rotate_vertical.xml", + "upstreamIcon": "text_rotate_vertical", + "upstreamPath": "android/action/text_rotate_vertical/materialicons/black/res/drawable/baseline_text_rotate_vertical_24.xml", + "upstreamSha256": "fa8ffd3286f951c34fed2033fd45ffff40bbcfc3cce8f3f8ecc8698c47ed8520", + "localSha256": "8e306ef91bb12821fc67da0d027a7e05fcb808276f84e8d46429c4560a3825d4", + "orderedPathDataSha256": "5e2571a6c0ea7c57749d4b18f3de22aced22317c80a84cb3153587181e5fba10", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/text_rotation_angledown.xml", + "upstreamIcon": "text_rotation_angledown", + "upstreamPath": "android/action/text_rotation_angledown/materialicons/black/res/drawable/baseline_text_rotation_angledown_24.xml", + "upstreamSha256": "45f2af2aa6daad680addc01679af25ad5dfcc48ba644c5bf70e577527054f0d3", + "localSha256": "2108e8c31e5dd9cb3bada9960ee630c0ef2af4a84c5f9c65b558b77dea2a4664", + "orderedPathDataSha256": "da7df5baa3cb3008b9d6931d3e6e6ca7350b19f36ffe8f7566be05a77d91a23a", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/text_rotation_angleup.xml", + "upstreamIcon": "text_rotation_angleup", + "upstreamPath": "android/action/text_rotation_angleup/materialicons/black/res/drawable/baseline_text_rotation_angleup_24.xml", + "upstreamSha256": "883d38215c625fb6282b7cb3675caecb82c41a121bb5b64dea26e3981b5eb092", + "localSha256": "abe6121dba623967de6f37fd836fffec512409fa740405f8730577e0e2dd4d19", + "orderedPathDataSha256": "00a5cddb107212cfc8407c133e275f6d9b3493cac925082eaf4165a27e70b476", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/text_rotation_down.xml", + "upstreamIcon": "text_rotation_down", + "upstreamPath": "android/action/text_rotation_down/materialicons/black/res/drawable/baseline_text_rotation_down_24.xml", + "upstreamSha256": "4f83251b4d79d53c27664d2f40ba1bee92bb4369efe44bde857c63ca1bf72c69", + "localSha256": "dd0786fdc0928c7c282e69c3da1bd9ef129ce5cfc4123297d9a11261c33f24fa", + "orderedPathDataSha256": "3b45033e96d19d55c19771c89aa0056e2545855efd66bcb6fd596d4f905afe8b", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/text_rotation_none.xml", + "upstreamIcon": "text_rotation_none", + "upstreamPath": "android/action/text_rotation_none/materialicons/black/res/drawable/baseline_text_rotation_none_24.xml", + "upstreamSha256": "d173c01e10188bfaacc673b5f39cc591eeec4531172a0bbcaa937ac72cbbfc10", + "localSha256": "67f8b9ccc3fe9e819988f6ce6296403e659d5319f69ec4c1e0867d82c6d866d8", + "orderedPathDataSha256": "86cec5f008ed39b70d4dae923d4c0d17013ef7084a9cf7c40a6d21739f752051", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/text_snippet.xml", + "upstreamIcon": "text_snippet", + "upstreamPath": "android/file/text_snippet/materialicons/black/res/drawable/baseline_text_snippet_24.xml", + "upstreamSha256": "cd6746e71e844434b54c0f442567400bc087f95ccad47876c171142cc9034470", + "localSha256": "dfca01fe05a1509aa65f9959d2bb71ca681005768123858c162bdfa0b6abfd71", + "orderedPathDataSha256": "e8440a712a1411c1c1b855e4355579d59eb83d4fc2031d2fe044f8a393d3286e", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/textsms.xml", + "upstreamIcon": "textsms", + "upstreamPath": "android/communication/textsms/materialicons/black/res/drawable/baseline_textsms_24.xml", + "upstreamSha256": "653d91185aca0d17119dcb8f4be689f14c1c74da050f1fa6e62314648d99fb94", + "localSha256": "bbab12d006dda88fb6477550144075aaae68acac428e15ac5716bd07fbef81af", + "orderedPathDataSha256": "b44f1f559041b39f56bfbaa6fb93e931d5ca9b161839372746e1e1cb1047d9f6", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/texture.xml", + "upstreamIcon": "texture", + "upstreamPath": "android/image/texture/materialicons/black/res/drawable/baseline_texture_24.xml", + "upstreamSha256": "b9bcc6a690f426cff39a4ea769525b0c570f68619ec42d6fa86d7dabecb1646a", + "localSha256": "f13e14744da77dce83be9124e662bb98862977c7a54d35873da0bec9ea5ea932", + "orderedPathDataSha256": "fdc2a6cd86b90329eb5f99d78b1f098dcd76cbc1a73d38a61246454fe09bc1f8", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/theater_comedy.xml", + "upstreamIcon": "theater_comedy", + "upstreamPath": "android/maps/theater_comedy/materialicons/black/res/drawable/baseline_theater_comedy_24.xml", + "upstreamSha256": "a440066876edd0dbf074225ddc81a17a290ebd629c0006c269dc31b7a2bb0f48", + "localSha256": "29f8242a5db0d7d1fd5de7a1b204c59377a09a50839e28f0ab96f2123cd654e9", + "orderedPathDataSha256": "38d347d5a20d9a56398cf0223564ead13139db4f74f7db1942695d4c38677abb", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/theaters.xml", + "upstreamIcon": "theaters", + "upstreamPath": "android/action/theaters/materialicons/black/res/drawable/baseline_theaters_24.xml", + "upstreamSha256": "4a43cf2e09e72f0c4d7e1c6c0a47555c975aba2b52f31b78a3b69177aa3a37af", + "localSha256": "ab4b893451d7b4821a9ca6afb112c1efbbd1502db9d951c87fef8375cbf9e30a", + "orderedPathDataSha256": "09bf1b40a9df866363a871d996fceddd1a8d01eadefdd4d720bdb9da116e7e4b", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/thermostat_auto.xml", + "upstreamIcon": "thermostat_auto", + "upstreamPath": "android/image/thermostat_auto/materialicons/black/res/drawable/baseline_thermostat_auto_24.xml", + "upstreamSha256": "b27a18c1665034d3b780e09d8868f3b768ad6fd50ac148614a5833b79d39e76a", + "localSha256": "eea849d70024f37f8597b795827805a07a0921384330ba55e418f698d31ab0ed", + "orderedPathDataSha256": "20e06795c4829b0640ba5031d71ef2fa2e4ca2d7cdb1d5fb8f5b3a8439dfd14b", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/thermostat.xml", + "upstreamIcon": "thermostat", + "upstreamPath": "android/device/thermostat/materialicons/black/res/drawable/baseline_thermostat_24.xml", + "upstreamSha256": "6d21f61ca4548b7b3a9cdde6a629e6600a5eb2364447c3955c5591116c10b6cb", + "localSha256": "8f5a78da0ab0bfdefd2b332caa12c546d0d2a9d67a82f6f350c019c00c760aac", + "orderedPathDataSha256": "c73027e6bbe58153b17fab228f77f1bceb40169c6d757bb5034d27de8c074b57", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/thumb_down_alt.xml", + "upstreamIcon": "thumb_down_alt", + "upstreamPath": "android/social/thumb_down_alt/materialicons/black/res/drawable/baseline_thumb_down_alt_24.xml", + "upstreamSha256": "fc14d9e70a991b4ef83bbb21904cfc9219dfc6d18488fb9a5f7052b9a5d94517", + "localSha256": "9ecbc4a4409309e745d947cabd05f1d58eefc918ff21bd468e5e196209b7027c", + "orderedPathDataSha256": "a5f9458c48af41d3d54f542cb222df38a7d98cf5b0e39f7f1da7eaa0be19982b", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/thumb_down_off_alt.xml", + "upstreamIcon": "thumb_down_off_alt", + "upstreamPath": "android/action/thumb_down_off_alt/materialicons/black/res/drawable/baseline_thumb_down_off_alt_24.xml", + "upstreamSha256": "c81bc1927d6620a42f66d62cb477086bad4083ba9c52e778def397285954db97", + "localSha256": "5c025b186a7660b087e92e245918e8fe28a91724308d958692bb021f3050cf84", + "orderedPathDataSha256": "9f4a76412b769323d79feecfa64e0da9b976d130a06e868a2c905214cda0df8a", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/thumb_down.xml", + "upstreamIcon": "thumb_down", + "upstreamPath": "android/action/thumb_down/materialicons/black/res/drawable/baseline_thumb_down_24.xml", + "upstreamSha256": "b233ae2fd02e4b9c6778fe7a54d5c92c0f65be4c90f1c3cc3c89ce33956b2416", + "localSha256": "37b98833b80360569bf1218fdb7f701dfd08a37a700efbd49de2d53c753e66c1", + "orderedPathDataSha256": "1bb40f80a5e469e09e40148a766d379d528b056bf9efc44e7210abff05a4c36a", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/thumb_up_alt.xml", + "upstreamIcon": "thumb_up_alt", + "upstreamPath": "android/social/thumb_up_alt/materialicons/black/res/drawable/baseline_thumb_up_alt_24.xml", + "upstreamSha256": "dffa51f8f94c811e907f22e29263d16f0153f696b36044b79eea370c0ec9e887", + "localSha256": "e4660d6af7f8c592252bbe15a55d225b7c3a2fcf89b3eadce8b19c23d3f06c88", + "orderedPathDataSha256": "771d9b8b8089ec11e8b712db802564d63d59adbe825c0aef32c389240119ed19", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/thumb_up_off_alt.xml", + "upstreamIcon": "thumb_up_off_alt", + "upstreamPath": "android/action/thumb_up_off_alt/materialicons/black/res/drawable/baseline_thumb_up_off_alt_24.xml", + "upstreamSha256": "218cc441f24459e525564fdc672d24ab9f4e69b0fe5823d9e8ee19e7e20ef5aa", + "localSha256": "a0360187524ea2d1e19c3eaeb49f334e9fcf9eba9d9d58b55021f8294a8c919e", + "orderedPathDataSha256": "c1fb648557abfb950c04358d3f77ea672ae9081451454e766b9c4e165c3d4266", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/thumb_up.xml", + "upstreamIcon": "thumb_up", + "upstreamPath": "android/action/thumb_up/materialicons/black/res/drawable/baseline_thumb_up_24.xml", + "upstreamSha256": "7cb800d589a84096fb96f61ed1fe2f8d948da6ec7ba10c491154494c29099699", + "localSha256": "6ca831142f821b95bfc72f67c0e2c88c90968f6ebe2516afe7096a4d1e7b5d40", + "orderedPathDataSha256": "4c37bc3265f0bc170448752d1c34d4f70ac3e5a8d8646a3fd0db5a70f5d30376", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/thumbs_up_down.xml", + "upstreamIcon": "thumbs_up_down", + "upstreamPath": "android/action/thumbs_up_down/materialicons/black/res/drawable/baseline_thumbs_up_down_24.xml", + "upstreamSha256": "c5ee5e825e0f3357d445d640a4b3350b242775f9bced1e5374361922c5eac4c8", + "localSha256": "e27ff85b834bb79933b85683125e3a50d068a03949d0777e74f380f81d824035", + "orderedPathDataSha256": "5590882fbe60f4059dbfdf129ef3bcae1ff354aecb4b2bf2d8d554fc5e10efb6", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/thunderstorm.xml", + "upstreamIcon": "thunderstorm", + "upstreamPath": "android/social/thunderstorm/materialicons/black/res/drawable/baseline_thunderstorm_24.xml", + "upstreamSha256": "509e71b5c6f12af9ca7476c2ed5dc19e584fe3a79e298fc183b5eec7e411242c", + "localSha256": "aeb52bd5608bb4741075c915ee2b6bd208dc3829a6c4e1c402ae2d775780492a", + "orderedPathDataSha256": "3971a876ed920fe91dffa625ef825730c9bd5858e4881e58c9c286d79e1ad2e6", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/time_to_leave.xml", + "upstreamIcon": "time_to_leave", + "upstreamPath": "android/notification/time_to_leave/materialicons/black/res/drawable/baseline_time_to_leave_24.xml", + "upstreamSha256": "71da486b8e2b22488201b571a079e0f151f384fbfeb8e47a52173f4d6d51cbaf", + "localSha256": "36ce7fa345bf12feb1553c35e7c95f7e5788b1805c890996605b4c974163f1de", + "orderedPathDataSha256": "c90fcdb410a3d0ba26e6e9705571e13af62d90ac57efc1ff7f10ac311b24253b", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/timelapse.xml", + "upstreamIcon": "timelapse", + "upstreamPath": "android/image/timelapse/materialicons/black/res/drawable/baseline_timelapse_24.xml", + "upstreamSha256": "5d40ebe943c9f080267a03b6e57fc691d105ea966409d4df957a7c032df7ff72", + "localSha256": "8e955934a3d93d3243ef8d41fc7632bb8e11b4bca6663867bb059dc881275695", + "orderedPathDataSha256": "9f574f04344465d4045af3f45e29cdcc4340c3ec2b0e8290993dae5bc0dc8f66", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/timeline.xml", + "upstreamIcon": "timeline", + "upstreamPath": "android/action/timeline/materialicons/black/res/drawable/baseline_timeline_24.xml", + "upstreamSha256": "c28883869b06dcdff135639d77e96563eea653d4df91486053177b9751006a1d", + "localSha256": "c09da81160af020b91df86280407fc6680fa348a40aeb6ef182bfde5d3f711c9", + "orderedPathDataSha256": "36da6fa0940a081a234ee3669c6607b6f2063e9cf87f5e21435e21d9f09c3636", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/timer_10_select.xml", + "upstreamIcon": "timer_10_select", + "upstreamPath": "android/device/timer_10_select/materialicons/black/res/drawable/baseline_timer_10_select_24.xml", + "upstreamSha256": "292691d664dba735dca36ae71ce06bbf076d99b0168db18685a5a74a2aead55f", + "localSha256": "b2f8e26dced98eac17c4fd14c45d3f843f5093ba3e883df676267a31df7c125c", + "orderedPathDataSha256": "b3ef1cd50f78d133360e974c854bcb2c0200ca7ed683b4058cce5b64b557bc93", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/timer_10.xml", + "upstreamIcon": "timer_10", + "upstreamPath": "android/image/timer_10/materialicons/black/res/drawable/baseline_timer_10_24.xml", + "upstreamSha256": "c776e66c813e009d20ef38dbf7b268d036bd8a06a4bf2610a2fcc64059785dd8", + "localSha256": "4781c360e959f24daf154a1150b15ad993187fd247752e5da1775b0700440df5", + "orderedPathDataSha256": "441e8d995b12757d10416af61d9572621dfa783fe6eb1eecd2600d8ab8797a6a", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/timer_3_select.xml", + "upstreamIcon": "timer_3_select", + "upstreamPath": "android/device/timer_3_select/materialicons/black/res/drawable/baseline_timer_3_select_24.xml", + "upstreamSha256": "934c2e54947fee0c762d7eb269b09b5f0a75cb63f1040571735de62afe977131", + "localSha256": "181a478fa4bf018613342f312d0fc4688fdbe16d66315cb2165de5579a6c8e20", + "orderedPathDataSha256": "dbeb60ebf76fdfce9b40d6a87a3c18e436cb7efb3995bbb31184ae4ac8ae9380", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/timer_3.xml", + "upstreamIcon": "timer_3", + "upstreamPath": "android/image/timer_3/materialicons/black/res/drawable/baseline_timer_3_24.xml", + "upstreamSha256": "37f4f979f7b12fd2b1dd19a9abc4749ec86e3fc34050e9b87e9dc6fd34585677", + "localSha256": "0745f61f37478f54a9bb0a90ec5f2fd984c2b65e5cf1f1cc28638caec32fc868", + "orderedPathDataSha256": "33dc3b0ecc0eca151b8d0ed652e1e402d1a183de1c71fd3550b8ad1941298344", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/timer_off.xml", + "upstreamIcon": "timer_off", + "upstreamPath": "android/image/timer_off/materialicons/black/res/drawable/baseline_timer_off_24.xml", + "upstreamSha256": "b72cfd2416e9df51a5821964d5f83807b071c711038b20c8a42f65306e9e1ccc", + "localSha256": "a7301273238765f96015b93f4b58471f25176acde2ab9eecf11dcfaad8537175", + "orderedPathDataSha256": "88905f38aa5dc5699661fb1f57f2e459d1d04e67e4004bf1897b454efede767b", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/timer.xml", + "upstreamIcon": "timer", + "upstreamPath": "android/image/timer/materialicons/black/res/drawable/baseline_timer_24.xml", + "upstreamSha256": "6849a86925fe1cf6cbfe6f983c15165dc77d0e02f350d5790bcb205269873c06", + "localSha256": "7566d3613a17d0810cb67374eb9a640fc57f44f0178e1254bdd446158f3acae2", + "orderedPathDataSha256": "d6cf668cada1f76b216782974e0ebe719f2d629448ac473a902d0b687692680c", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/tips_and_updates.xml", + "upstreamIcon": "tips_and_updates", + "upstreamPath": "android/action/tips_and_updates/materialicons/black/res/drawable/baseline_tips_and_updates_24.xml", + "upstreamSha256": "9ab5f19191ca676030cec61ffbb746ae4212d7698350580f84fb8346c77dfab7", + "localSha256": "83f301466e24e2084bdf9ea79f72e13bc4ff87dbdd6c9121af5b2d6f6ee0e332", + "orderedPathDataSha256": "6905be999be06a4220a36dc914d6e87d34edaa4d06d56ca8eefab03de4432cda", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/tire_repair.xml", + "upstreamIcon": "tire_repair", + "upstreamPath": "android/maps/tire_repair/materialicons/black/res/drawable/baseline_tire_repair_24.xml", + "upstreamSha256": "d9b46a929998ebc1eee61e84f262f72dbe148647161df6fb59ada00e15a09cb1", + "localSha256": "30ef554b27efbac8e87bccdef7b0dc976ad9ab51ba22008b0469810ab1f2aabf", + "orderedPathDataSha256": "7e8f1d93ea1a055c919e7ce3bb245f31ef72560343fc96f96f284633d062aaae", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/title.xml", + "upstreamIcon": "title", + "upstreamPath": "android/editor/title/materialicons/black/res/drawable/baseline_title_24.xml", + "upstreamSha256": "8b7d36f65af918f9d13428786a4a6aa4fe15d248cb5ada0840b88b8a68100014", + "localSha256": "a70a058237de474d9faa5d1f9d1ce1d06b58b55632cb0bf2b5d9f4a0cc98db86", + "orderedPathDataSha256": "950ebeab37d724f0f0cec73c9c94ab66dc84fdc3a6b842c28fd6902ab018054f", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/toc.xml", + "upstreamIcon": "toc", + "upstreamPath": "android/action/toc/materialicons/black/res/drawable/baseline_toc_24.xml", + "upstreamSha256": "c3ed1c9cb12aa2fa76794734d6027566c6e93e27fe755318a557e9e75428e669", + "localSha256": "fa9f2298fb31b4ef115b3129daa54fcd6742fa61e01b565ec781f8e1270aa527", + "orderedPathDataSha256": "e5b1a2b6570fe831d2f9abf8e0314f9ac5174e0f2e849573c0dbecc388ef6365", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/today.xml", + "upstreamIcon": "today", + "upstreamPath": "android/action/today/materialicons/black/res/drawable/baseline_today_24.xml", + "upstreamSha256": "d318bfb5fee64f0b0ddcae3a3346c899911014fa0f86afd2fcd1b82d8b8fa8b4", + "localSha256": "ba2364bb14fa56d5e4adb90090136ba6b52926b22c9f46ac3f323c0938b55198", + "orderedPathDataSha256": "c2900b3a074df2adadc97b77a7cb2ccd43f42c97e59a8585a27b6084d60c510f", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/toggle_off.xml", + "upstreamIcon": "toggle_off", + "upstreamPath": "android/toggle/toggle_off/materialicons/black/res/drawable/baseline_toggle_off_24.xml", + "upstreamSha256": "6540a3dae3d6cd10c7acbd4e62a6d696fd658c8dac03e0ad53aaf3347e91eaf9", + "localSha256": "66834ab8fade315516be7c9c45278fb1efe18b20954e66af1e417fe86ee5875d", + "orderedPathDataSha256": "49ef8df9a7b76bfbc07510fa1dfee18a825276ab09b2326abf740743b1859b80", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/toggle_on.xml", + "upstreamIcon": "toggle_on", + "upstreamPath": "android/toggle/toggle_on/materialicons/black/res/drawable/baseline_toggle_on_24.xml", + "upstreamSha256": "3e4fc78736aa0bba4bd5223e688fb2f79567609038708a8756e036dfc3769722", + "localSha256": "97a9ef55b876da4612ea7eac36ab00389a1849f4b803b482a17bf32663ee1ba4", + "orderedPathDataSha256": "c685afaa4dd9bf88a308193f4c2dab17adddc56aecf5cb2a04d5b49bc8f6ef5d", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/token.xml", + "upstreamIcon": "token", + "upstreamPath": "android/action/token/materialicons/black/res/drawable/baseline_token_24.xml", + "upstreamSha256": "3aa0a3cbe4aab35d6b017bc1a68511355fa1dbdf8072c173873925340044336c", + "localSha256": "c3e1e24305d31c733afae2ae67705488139578535a93817c83591acd1d629808", + "orderedPathDataSha256": "e5d83d87e12cdf9e147e2c81ce23a9f78e06bacccfef4c02b56d93fba8ea079c", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/toll.xml", + "upstreamIcon": "toll", + "upstreamPath": "android/action/toll/materialicons/black/res/drawable/baseline_toll_24.xml", + "upstreamSha256": "88ed13923d834ce0d72153e5ea19c9dcf1f128de7be09f35c5c8e5df28f8e9f2", + "localSha256": "e481b4cf7a988c779f5cfe3e5378d834bbde5ace2986f9aa6e09ddf8a69d3e03", + "orderedPathDataSha256": "8995069a0843886bdc7ac4e2dd11f129d29286806f431ace437bb46ac6d8c0ac", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/tonality.xml", + "upstreamIcon": "tonality", + "upstreamPath": "android/image/tonality/materialicons/black/res/drawable/baseline_tonality_24.xml", + "upstreamSha256": "82c6724f46b39058faf0174d406feb6cd2ebd9557212f7414991860640d2ce97", + "localSha256": "8117c072337628d93ef6624215831751d7fd61565cebcdafa89c5d4eb6f48d4e", + "orderedPathDataSha256": "e1340d2878eede561f91be79929a152a808354cf2e9b984472787d4a9e63eb9d", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/topic.xml", + "upstreamIcon": "topic", + "upstreamPath": "android/file/topic/materialicons/black/res/drawable/baseline_topic_24.xml", + "upstreamSha256": "e8da165a96acc851aeab41a2eb68a8416af3b6d0297f15449742489f38fa94f8", + "localSha256": "b7b7e22da042823f48dc6447aed6a324121dd8dc3149a669209b7a31fbf2deca", + "orderedPathDataSha256": "120cbb32243da4419cebc50b02540c0d6166b2ba67b4b8bdbca09f7d7bb4cc09", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/tornado.xml", + "upstreamIcon": "tornado", + "upstreamPath": "android/social/tornado/materialicons/black/res/drawable/baseline_tornado_24.xml", + "upstreamSha256": "70496281afcbe5fce0b98856d4a2e8d33eb1a6030b9c6b772bf6fc49d8b5fb34", + "localSha256": "9332c9017e22b7b8abbedc1d867eb1e275a732b83726a4e8fe15ae39355521c8", + "orderedPathDataSha256": "85da4ccd514a8d8088ce1551d821a2c20cb9019b9736cb81636e85cab597db7f", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/touch_app.xml", + "upstreamIcon": "touch_app", + "upstreamPath": "android/action/touch_app/materialicons/black/res/drawable/baseline_touch_app_24.xml", + "upstreamSha256": "e6287fe210e7f87f18dfa9973b44b7a8493390ee591d54e986549410ed15d7df", + "localSha256": "22ef0567d868a4009cfe86c652f9e89ea699b827918cdf83b0de2c7cccf125be", + "orderedPathDataSha256": "58228bf0a64e3152a132d44b3c1e432ac55a372a6d151dc499bdb4770eab2561", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/tour.xml", + "upstreamIcon": "tour", + "upstreamPath": "android/action/tour/materialicons/black/res/drawable/baseline_tour_24.xml", + "upstreamSha256": "e906750d1c5725869111711a13446d6ed200877d6c826e68d2c4fbbf7016e4e8", + "localSha256": "a5d9c88b88fd541db499a84dc7d35c38874d31fa7801dab3a7a24fcce1db83d1", + "orderedPathDataSha256": "efcdfb8eea7d982bc8b8af17a0d1ab6a0dafeaeb2cfc6f585eb7184f077c8950", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/toys.xml", + "upstreamIcon": "toys", + "upstreamPath": "android/hardware/toys/materialicons/black/res/drawable/baseline_toys_24.xml", + "upstreamSha256": "93db0ee679f4537a08b61ecb2cdb0b381aa7bac7933e7a6fdc7ac82d46003cd5", + "localSha256": "bae6b1c3c5f895b07835424f4fabe65db010b78e46e7c62b7d19f3f8bacda8de", + "orderedPathDataSha256": "6885d3e74525911a68b2fe197e6522393822277a3ef5ec2fd9eec02f22cd2da6", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/track_changes.xml", + "upstreamIcon": "track_changes", + "upstreamPath": "android/action/track_changes/materialicons/black/res/drawable/baseline_track_changes_24.xml", + "upstreamSha256": "f0fafd7b85953176b4637f9ff0d799bab111e59de23730a1b7d89cbeaf731bcf", + "localSha256": "0cd8d640cc3e1a4fd091a365409f179a2e2d00c2fb309284f91e24ee5e2e38f6", + "orderedPathDataSha256": "979879664c00aed1dc5931fce8fed9a295e0e87a6980a0ecb4c1346fb7563b09", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/traffic.xml", + "upstreamIcon": "traffic", + "upstreamPath": "android/maps/traffic/materialicons/black/res/drawable/baseline_traffic_24.xml", + "upstreamSha256": "39ab7fc52fdbae3b4771c1816828d8dbd93ab17a11bf704e1ed793e989609546", + "localSha256": "52fc582539ed06238467c2b396df2d86052db76c099993a42342b734bba3b797", + "orderedPathDataSha256": "f53bcc070801f3e3970200847b51fe075e5f499a2e2254a7135d16366376507a", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/train.xml", + "upstreamIcon": "train", + "upstreamPath": "android/maps/train/materialicons/black/res/drawable/baseline_train_24.xml", + "upstreamSha256": "075323b04a8505e09b6bdab808dfbbdb1b778589f3be6f59d3ce4bed58ea166a", + "localSha256": "3c7037ed3ef44bf4bff9ace418275efd503446b07de29006ec75d0ce5a0797c5", + "orderedPathDataSha256": "78fe8eae5f57090826522664c754185f07ec100c7520c83e2569b7053557d224", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/tram.xml", + "upstreamIcon": "tram", + "upstreamPath": "android/maps/tram/materialicons/black/res/drawable/baseline_tram_24.xml", + "upstreamSha256": "94036bbdcb5291acc767e9f8fe4886d894857ba4709344afa510b60dd064ff27", + "localSha256": "3f90307a075780f22e853bfe5378fecaa52de9b64ff89f7a335df9a32fe5e46d", + "orderedPathDataSha256": "b1994c24602d84f35d5f1f6707b6e3929e5fddb7ca368a021fbaa8b45aaeb9d9", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/transcribe.xml", + "upstreamIcon": "transcribe", + "upstreamPath": "android/action/transcribe/materialicons/black/res/drawable/baseline_transcribe_24.xml", + "upstreamSha256": "d1ce9dcb35b060c323bb6a9f822d70f9690b944bf868f570ec0d316ffb69c6a3", + "localSha256": "9845766622c988e8b0169b9c278fe3e6a8f17e56e3dfd7f628bc4530f38f516d", + "orderedPathDataSha256": "08db010105b6d3a4f0185b79570babb394474908ba3c027e0ceba37ec94ccf6c", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/transfer_within_a_station.xml", + "upstreamIcon": "transfer_within_a_station", + "upstreamPath": "android/maps/transfer_within_a_station/materialicons/black/res/drawable/baseline_transfer_within_a_station_24.xml", + "upstreamSha256": "b47a79a78dd9db1debd7c31c222b65675ab3bb85b463a5da286fe7604d82403c", + "localSha256": "479251ae7b991cc1ad4b69db2fc7f6fe86366c7986c23d34d72c62f37038b836", + "orderedPathDataSha256": "fc8848600b76f2df536c59e804f5806a81e2ac75749ddb400ab629933432f809", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/transform.xml", + "upstreamIcon": "transform", + "upstreamPath": "android/image/transform/materialicons/black/res/drawable/baseline_transform_24.xml", + "upstreamSha256": "06bd1ffba3a5f2e6044acdefea16b91f58eed56cc0d3983c1185d980adb6385b", + "localSha256": "edf33c01fa40db12c61d35a7d71f1e5001fd71bcb9f2216dfa81cf25f3ff4e69", + "orderedPathDataSha256": "32d4f88fb0215a2e67abb7bbe642615b91a7c874bdba100e525102d19cc5d571", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/transgender.xml", + "upstreamIcon": "transgender", + "upstreamPath": "android/social/transgender/materialicons/black/res/drawable/baseline_transgender_24.xml", + "upstreamSha256": "a850bb46b04d652b94d84a0dcbc9b7179bc5cdbcbc5e263062c0afdbe802e80b", + "localSha256": "6101b51c599e814ad80e5f5145f258708290257d9fc292f5499fd1fe662966b5", + "orderedPathDataSha256": "8a387cc0b00e7f62a810e442876ab28c7c14fb3c54c56306ab127a2f13653e97", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/transit_enterexit.xml", + "upstreamIcon": "transit_enterexit", + "upstreamPath": "android/maps/transit_enterexit/materialicons/black/res/drawable/baseline_transit_enterexit_24.xml", + "upstreamSha256": "2cc1bcd943d29cf68af58a5bce26be64238c412574bea04bf4fdcc0f8aa5ef43", + "localSha256": "123d26518db0316f15e18cf5186c2f950878f3fa73fed7e594df45a57e3b13ea", + "orderedPathDataSha256": "fa8838272b2592f65660f0743f4d4be3d20809e52c072a0c9d1370fe41b3a1df", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/translate.xml", + "upstreamIcon": "translate", + "upstreamPath": "android/action/translate/materialicons/black/res/drawable/baseline_translate_24.xml", + "upstreamSha256": "3b674521348ac8b68a6f6396b3175242368ddb1f5331356223348fdb369580e8", + "localSha256": "22ba2b26c20897bf77adb26c8ea9c59f5794e663b2603a714647e1aae3b7f613", + "orderedPathDataSha256": "967646e5d37fb112136ed264eecea65d1ef4b21b9f7b930eac5a5bc4ad0e2e72", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/travel_explore.xml", + "upstreamIcon": "travel_explore", + "upstreamPath": "android/social/travel_explore/materialicons/black/res/drawable/baseline_travel_explore_24.xml", + "upstreamSha256": "1a842fed43e8cc404237b21836c821db5a6c10598d975b702385eac14d7327a8", + "localSha256": "9183285e63017a37cea194a8287e53196a263693da3c45b571afb680dccfb2a1", + "orderedPathDataSha256": "f9644d1f701ee9ba87aff62762db7f0d9f6dcd76fe4a7dac39ab750a322ab3be", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/trending_down.xml", + "upstreamIcon": "trending_down", + "upstreamPath": "android/action/trending_down/materialicons/black/res/drawable/baseline_trending_down_24.xml", + "upstreamSha256": "7327744e67072c2916542d216a4d44e3e14d573ff06d1fbea968bfa97996a8fb", + "localSha256": "576015e1ed5fde9c20bbc7a67ede58a488a1b2954aeb4b8030c6f295b603b36f", + "orderedPathDataSha256": "b7d8ffc7cb158db95d835333cadfda62463c23e5cb137d1b3e18df8fadda9242", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/trending_flat.xml", + "upstreamIcon": "trending_flat", + "upstreamPath": "android/action/trending_flat/materialicons/black/res/drawable/baseline_trending_flat_24.xml", + "upstreamSha256": "a31f115a143f96e221dc042a5a2ccd693009b6b8c3ee5fb22a91f6fc964d84b8", + "localSha256": "f380f75c9384fb2f9721345915c9f500484282223aa605fc75be14dd72a19746", + "orderedPathDataSha256": "0869e2a2560d5fcdd1f6459b07c859482f90d3b53cf02c88763ee4b2b4b99518", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/trending_up.xml", + "upstreamIcon": "trending_up", + "upstreamPath": "android/action/trending_up/materialicons/black/res/drawable/baseline_trending_up_24.xml", + "upstreamSha256": "1b654bc351648cc3ad70f17d2c3d5709691b91fb5afcc51b49e12bcc127f7618", + "localSha256": "a79ee3f6a928b8153a7ae6c02790215f15c78c8af63e0577d892f3a73fa10f80", + "orderedPathDataSha256": "e18ec7cdf69542a6aa98cb80951dc0ba7f3517a59241e37b9f0cb891afcd1577", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/trip_origin.xml", + "upstreamIcon": "trip_origin", + "upstreamPath": "android/maps/trip_origin/materialicons/black/res/drawable/baseline_trip_origin_24.xml", + "upstreamSha256": "b1af8041a5da66ebf1b1c3d7fb36cc41ad49aee339e4ec49d5a36a4348f40c2b", + "localSha256": "0a67e65393f124c4f9ef331abc8f9f307956fbcae87517bcc9910774f44345ee", + "orderedPathDataSha256": "6e2900a1f61501f5f169a6ed3e6caa73ee452634ae075581e4f3ab13a4fd8bcf", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/trolley.xml", + "upstreamIcon": "trolley", + "upstreamPath": "android/hardware/trolley/materialicons/black/res/drawable/baseline_trolley_24.xml", + "upstreamSha256": "e161b8eddcacf72ea01e0b23c4710de380e283f5030e349b2daf1759c58a5db6", + "localSha256": "a5f0194b8ce6d0afc8c64afe21182666c150edd2c307fd8ae7e91ac0268f23c7", + "orderedPathDataSha256": "1a5ff4c7fc2b85918ec3ded251026b4483f189305c975a1d0320fefb9cd54968", + "originalGeometryMatched": false, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/troubleshoot.xml", + "upstreamIcon": "troubleshoot", + "upstreamPath": "android/action/troubleshoot/materialicons/black/res/drawable/baseline_troubleshoot_24.xml", + "upstreamSha256": "5ee8decbf0a72d5aee75758bb31fc9ec5d81b117b7dce7311b03012a70138cc3", + "localSha256": "28bfb490a23e3569bcbd507e1fe41ee950ed3688adfeb50ffabbf72d52782e54", + "orderedPathDataSha256": "9e47929e77685ebdbeeed4a172f9b8b108c690c1df7a29ad48e383919587edd0", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/tsunami.xml", + "upstreamIcon": "tsunami", + "upstreamPath": "android/social/tsunami/materialicons/black/res/drawable/baseline_tsunami_24.xml", + "upstreamSha256": "92cac3b174fa4b1b78ebef988d688895f3a168940d59966ef4e3f647b354b05c", + "localSha256": "4af4a3440ccaff891c079f1f881ba24f27bec75ffef089178bc1c48236fd4e1e", + "orderedPathDataSha256": "ead00e6bedebc1ed0f637c19f4eec6a67856f7983657b66b259a8afc66dff7ff", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/tty.xml", + "upstreamIcon": "tty", + "upstreamPath": "android/places/tty/materialicons/black/res/drawable/baseline_tty_24.xml", + "upstreamSha256": "16f4cc33a4fccb133b4da363e42112e355cf25a99f94633b3e543f5d776d2057", + "localSha256": "b697d7dead762f615a99fd9a42ea86e967c0794861000e398e45d684c9b6097e", + "orderedPathDataSha256": "132334071e6dd5f0b2c80f18ebda75264c6ed4c0ba5a6faef32fc0ab97fd1b22", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/tune.xml", + "upstreamIcon": "tune", + "upstreamPath": "android/image/tune/materialicons/black/res/drawable/baseline_tune_24.xml", + "upstreamSha256": "eaea09ca9165a1469e40e8d83f4abdfb43e8fda1af2a7f5d70662f45fa9f37b2", + "localSha256": "3c74b3bf52ebde31c3c68ec03c84cbd2059c2e2804f1248ef2a331f919f49c4d", + "orderedPathDataSha256": "a7c6722d54eda78e1cfd46621e6322e1570c37aebcd5175c633571dc7d30eae9", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/tungsten.xml", + "upstreamIcon": "tungsten", + "upstreamPath": "android/device/tungsten/materialicons/black/res/drawable/baseline_tungsten_24.xml", + "upstreamSha256": "df10dab9e45664aa5c2aae3ea3b648eff2893fb76b917571ea1821e8b10e6c84", + "localSha256": "eec13d862b40a1d4cec4eafa36808f5bda7bd03919650447764068212c569d75", + "orderedPathDataSha256": "036388c4f784c807484ae7023451e57d501451e49527b8e7a8d84a9d9db5d5ca", + "originalGeometryMatched": false, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/turn_left.xml", + "upstreamIcon": "turn_left", + "upstreamPath": "android/maps/turn_left/materialicons/black/res/drawable/baseline_turn_left_24.xml", + "upstreamSha256": "35859f679dc58b6bbc6afd6f7fe2b2d82b0f272f91ff6e9dde883ac6feb90dbf", + "localSha256": "cd28c2f75ef814d6faefbf5f4edf9514d42cfaef657fd7b7ba18168426fac5a0", + "orderedPathDataSha256": "c050698494c134816411e3310314fd87b13aaab52b4c2f35c879657f0c23132d", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/turn_right.xml", + "upstreamIcon": "turn_right", + "upstreamPath": "android/maps/turn_right/materialicons/black/res/drawable/baseline_turn_right_24.xml", + "upstreamSha256": "1dce85aa17d833c8c6ba62e5cca3d34a97109ebac8841bde32f7833669ba2c17", + "localSha256": "4a350f2316d8989054763511611b814655749fb88abd85f3b29bb9431e31d330", + "orderedPathDataSha256": "b982be4d6f717cf7d774328d264749ed57955c8a322fdc01f0f56a74c648efff", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/turn_sharp_left.xml", + "upstreamIcon": "turn_sharp_left", + "upstreamPath": "android/maps/turn_sharp_left/materialicons/black/res/drawable/baseline_turn_sharp_left_24.xml", + "upstreamSha256": "7ad3fa5a44fa7fd7fab78ad74f9613683a38495f0cfad19906ec4df2b0b8f796", + "localSha256": "5b79c279ca4c48cfbb0c2f85f73eeef4d6fff9e259c81bf2998e9af520be22f8", + "orderedPathDataSha256": "94bad5c27e3be24da71830ae1a9fc9cba9955895bee5a920108d268593abaeb2", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/turn_sharp_right.xml", + "upstreamIcon": "turn_sharp_right", + "upstreamPath": "android/maps/turn_sharp_right/materialicons/black/res/drawable/baseline_turn_sharp_right_24.xml", + "upstreamSha256": "e01935e71a6cdffa7ac4e8287c597cdf6f5501d475954d65ebc27ebdfb3efaff", + "localSha256": "4702b1167e8e09eb6ea52a187564cf986e517672ff08e6a4054547a9460ba7ce", + "orderedPathDataSha256": "9dd0f8074482baaebdd493abb3342b2e655533b7a5122e751c58b3359aa481be", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/turn_slight_left.xml", + "upstreamIcon": "turn_slight_left", + "upstreamPath": "android/maps/turn_slight_left/materialicons/black/res/drawable/baseline_turn_slight_left_24.xml", + "upstreamSha256": "5559a3aa3c2278bcc8baf56bfaa9b6b47ae4980dbf11371ac8607b44442fbc8c", + "localSha256": "f5fd673c684af174b3946f87718ec88bc3707221e9524228aa79df8aa590f61d", + "orderedPathDataSha256": "c5296cd5e64d5534e2fa656b32aedb48b6b535530d9d1f007fad68d4b248386f", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/turn_slight_right.xml", + "upstreamIcon": "turn_slight_right", + "upstreamPath": "android/maps/turn_slight_right/materialicons/black/res/drawable/baseline_turn_slight_right_24.xml", + "upstreamSha256": "96f2572955b521625d3df43341d92efff808951815709fcb20b32d5d8fb7851e", + "localSha256": "8356845232cfd8dee18a0185b74ea95bfd7a662576556f5efa990b837e307bc8", + "orderedPathDataSha256": "19d1fc58b1d027122f43ff015c40e2c893a0a4591d2f76e976f7280acec92aa0", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/turned_in_not.xml", + "upstreamIcon": "turned_in_not", + "upstreamPath": "android/action/turned_in_not/materialicons/black/res/drawable/baseline_turned_in_not_24.xml", + "upstreamSha256": "b87efcdb4ead96f3211f7bf1854d427bd689afe9ebc8e209c42765827a3c4ce4", + "localSha256": "6ad27b3740af19b5efa4bd84f87b5eea4b35747ff5848dd07b33bca47b8a102f", + "orderedPathDataSha256": "b19623c4a42ca990090ed8a05fe20adca5583b401b6dba51f52bd8fe3a434752", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/turned_in.xml", + "upstreamIcon": "turned_in", + "upstreamPath": "android/action/turned_in/materialicons/black/res/drawable/baseline_turned_in_24.xml", + "upstreamSha256": "8538ebd2019185382d3d5962ec39fd81e26b8350b7affc7a68bf57b96b84c5bd", + "localSha256": "a9d12fc8cc7d1ae9d7371816f570a6f986fa13f0b4f9e9ebd890acc27a45b888", + "orderedPathDataSha256": "9243e321a5c37d9e698adaa1907a669564f746829c9877bcc349f6d81d5dc8a9", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/tv_off.xml", + "upstreamIcon": "tv_off", + "upstreamPath": "android/notification/tv_off/materialicons/black/res/drawable/baseline_tv_off_24.xml", + "upstreamSha256": "2414c17e76ed397a11697c11bc72dfb81d04d0ac1813d2e351e3c558ec76d100", + "localSha256": "76d22c32a6c35247be6e359dde2d081086cf2126757b0dd58f26a07e43fb7941", + "orderedPathDataSha256": "ec89ca9f01d1ff569f178f4423ed01d682b4167ae924f09b39be5f6b41e2af26", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/tv.xml", + "upstreamIcon": "tv", + "upstreamPath": "android/hardware/tv/materialicons/black/res/drawable/baseline_tv_24.xml", + "upstreamSha256": "036437514db4853d304a0e99d875a99e0862c8922ffa55f2da0c367b7e3b1afe", + "localSha256": "5c0d1281e37b42eac9e849dcb41d451c55541b06ac3ae8b66e2814cdd3a5afd6", + "orderedPathDataSha256": "497c4324126cb179f7012e5e9e2e8e0ed7afcf4a5461e553db979326e0e0cf21", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/two_wheeler.xml", + "upstreamIcon": "two_wheeler", + "upstreamPath": "android/maps/two_wheeler/materialicons/black/res/drawable/baseline_two_wheeler_24.xml", + "upstreamSha256": "582ac34dd3d95e8145731d09d6f834d466c99937054c82b72275d3ec0a8492bb", + "localSha256": "66d5f045b4969dd4794947b10b4789e68f15d323966dfb996cb2fec4cd7d22a4", + "orderedPathDataSha256": "535e0cdac5850e0938c7005552b15fe0a867f94537afd9a105fcdf95c2242d26", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/type_specimen.xml", + "upstreamIcon": "type_specimen", + "upstreamPath": "android/editor/type_specimen/materialicons/black/res/drawable/baseline_type_specimen_24.xml", + "upstreamSha256": "aa5b50be757a54a7eee0b26afee74c355d694beeed33dfcd0bfd7323d9122aec", + "localSha256": "73a9768a121ed06e2a250cfd04b38e286df1d9fe18e07f631dd0319d2d1bb12b", + "orderedPathDataSha256": "6be37cdd9411c4683c6c1dc4019fada97bd4bee5ccbb219b81c9234ceb898cd0", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/u_turn_left.xml", + "upstreamIcon": "u_turn_left", + "upstreamPath": "android/maps/u_turn_left/materialicons/black/res/drawable/baseline_u_turn_left_24.xml", + "upstreamSha256": "f18e3143b1a57c88eaad9544a4823ac2e2a5a79461d3fe4bed3087b2d47eb1fc", + "localSha256": "b8ace7adf1d3dccaf44cbae17afb798c5cd8fc611931cf9232b22f98056d8f78", + "orderedPathDataSha256": "5b08da9d668959b013101ce183354cf8fdd7790cb40f0a5e02b1b4fc9f303849", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/u_turn_right.xml", + "upstreamIcon": "u_turn_right", + "upstreamPath": "android/maps/u_turn_right/materialicons/black/res/drawable/baseline_u_turn_right_24.xml", + "upstreamSha256": "020d9e5c1a25bf4660094e4a23b7be06b5daf9eb76e7c0dfe39e2339cd01dd12", + "localSha256": "20b03cdb28add7ca036816f9e6a284825a7ec36abb2d5cbe0d2095a80848c79c", + "orderedPathDataSha256": "1be8a84c0f822f9467e0f6030acc378a430ef929b1b5681b90253b0505d1a831", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/umbrella.xml", + "upstreamIcon": "umbrella", + "upstreamPath": "android/places/umbrella/materialicons/black/res/drawable/baseline_umbrella_24.xml", + "upstreamSha256": "335ef19b47d0db8afd35c86c94a3483eb3b4dd8085bcdddafa7de287011eb9db", + "localSha256": "443a5bbd589777c3ec039c4402e6d4e573c255240941cbf958a1a3ab30eda56a", + "orderedPathDataSha256": "934985edf0d5b8d0b05436be330b20aed4d69dbdfa64a1f3e820a41bbfcced06", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/unarchive.xml", + "upstreamIcon": "unarchive", + "upstreamPath": "android/content/unarchive/materialicons/black/res/drawable/baseline_unarchive_24.xml", + "upstreamSha256": "0730920126a79a910169e27376461726c64f16a4498660171f9bed86ffade6bc", + "localSha256": "f200bcc42e28105d1394194ca188abefa8fcd7b7d33d3b312acff1c3b85cd351", + "orderedPathDataSha256": "b649e2ff447a4e3710b40da3e696104eeb01d74b17995b0422b60f34f13baf85", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/undo.xml", + "upstreamIcon": "undo", + "upstreamPath": "android/content/undo/materialicons/black/res/drawable/baseline_undo_24.xml", + "upstreamSha256": "fd76d58a452b21a4238a840ee340744c471b3df75a836ac20a311c260c1f2cec", + "localSha256": "4ddd7a15e794f2c5978a0bf933946d9ebcc54d4b73fafd50e81ca397a002b257", + "orderedPathDataSha256": "57664aa48dc639525f0902b8898973cc82cf0a86be302d90fd4947114ff523f2", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/unfold_less_double.xml", + "upstreamIcon": "unfold_less_double", + "upstreamPath": "android/action/unfold_less_double/materialicons/black/res/drawable/baseline_unfold_less_double_24.xml", + "upstreamSha256": "f752058ae2743fe46323346118066b3542c9f655c1ed8db6b6cb1cb5b49324e3", + "localSha256": "3c21a0e206f0bb18477be134a15c1896c7ef2324919d07ccca150240737264e8", + "orderedPathDataSha256": "efa205bb9c5c04db952fa57c252f4226729d85fe1006d18d78d336ae9cf7f2e2", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/unfold_less.xml", + "upstreamIcon": "unfold_less", + "upstreamPath": "android/navigation/unfold_less/materialicons/black/res/drawable/baseline_unfold_less_24.xml", + "upstreamSha256": "f771e117f32cef58a6149aa71c350dddd4e3ff59a0cda90f928ab1f0e310da2a", + "localSha256": "a897c4aaf78e2723ab0a0f1df82d4d5646490582cc2f0b7da8650a0f0a61a583", + "orderedPathDataSha256": "9b6d2b59edeaa551d3ac71230e18503cc1bebda21d4106713ace712752143e4b", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/unfold_more_double.xml", + "upstreamIcon": "unfold_more_double", + "upstreamPath": "android/action/unfold_more_double/materialicons/black/res/drawable/baseline_unfold_more_double_24.xml", + "upstreamSha256": "8eb365f9f0035515e1bfda1189603c3966522c0fa4006b04788c645955f7af82", + "localSha256": "5c263f2932eafee7b6db4838319d31cf1142947b4729ca4886052685d9bd9578", + "orderedPathDataSha256": "3b1ad38c4aaad5ce6c632eafe731db9ac10b81cf1869edd7ac580f1711721b9b", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/unfold_more.xml", + "upstreamIcon": "unfold_more", + "upstreamPath": "android/navigation/unfold_more/materialicons/black/res/drawable/baseline_unfold_more_24.xml", + "upstreamSha256": "b4c3f316a205925dc1ad2f52eecf304bea1317a44b01f425370a709d74e42c0b", + "localSha256": "ee4b39ea3bb95723edc3feb5cafc811edfd9fb05735485885c47179019c5dd47", + "orderedPathDataSha256": "c65be56a02cd1348367b882ff92f3ef422eac5988b424d633fedd93bba475049", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/unpublished.xml", + "upstreamIcon": "unpublished", + "upstreamPath": "android/action/unpublished/materialicons/black/res/drawable/baseline_unpublished_24.xml", + "upstreamSha256": "edabaaff26b37183a3e61c41548467390791aefa2ccf0d5cdddcbd11b4335022", + "localSha256": "3d87c22e77a5be99ce93fce33d9cb5827824745577def39b55d1ceba3b3507e9", + "orderedPathDataSha256": "1cf9743c8ea0e71cca36aba340d8d5e46c567a74ad0ab96b9fe5b1ccaf1e8d19", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/unsubscribe.xml", + "upstreamIcon": "unsubscribe", + "upstreamPath": "android/communication/unsubscribe/materialicons/black/res/drawable/baseline_unsubscribe_24.xml", + "upstreamSha256": "595670497029d9a3c27754b2e2c5566963cae026f9a7b18ff99f04b913b3550f", + "localSha256": "8f9189b9c0a94bc58ab0b8ba6350469b178b110c314c4d79ede15bbeb3e6c089", + "orderedPathDataSha256": "bc6d7284778192f6e2ca643e565c34b503fd15ecea270f87af24e696223bb132", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/upcoming.xml", + "upstreamIcon": "upcoming", + "upstreamPath": "android/content/upcoming/materialicons/black/res/drawable/baseline_upcoming_24.xml", + "upstreamSha256": "21ecbbaf09226f7df9f448835de8300c6991cb864231141051b925aff6009b9d", + "localSha256": "08ae45c92e3e1b0bba283bbaa5a96fcd13762832f8aa94ae53ec831b54f3943c", + "orderedPathDataSha256": "a8ecaf1b70d673644bc665c04c177c4922aae3981528951fb60c52eaa38b7aed", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/update_disabled.xml", + "upstreamIcon": "update_disabled", + "upstreamPath": "android/action/update_disabled/materialicons/black/res/drawable/baseline_update_disabled_24.xml", + "upstreamSha256": "65c8a009f860ba3f464bdf15a3c586a004c344febbc1dd41e4a4ee6802a0d09f", + "localSha256": "e8f9f3e63b07abf4ce288f40619cae8347149d0b27d9fd681a55c08073a4a9a9", + "orderedPathDataSha256": "17bd5dc2efa3b594f891d83a44399fdbacd90a7d147eb8bdbdf9ba8916c1888b", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/update.xml", + "upstreamIcon": "update", + "upstreamPath": "android/action/update/materialicons/black/res/drawable/baseline_update_24.xml", + "upstreamSha256": "791cd2a80e8e9ed1e8bd47400c888de27d2d5a2edb46cf7e70b5391802d8df88", + "localSha256": "96f95d1d9c995f13d8aaf126ba800262db19f79b16b40604a820658378b410a5", + "orderedPathDataSha256": "255ba3917f5f5cb66b29047a3e33d073766b6d368e35910a2252fb841792cc6f", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/upgrade.xml", + "upstreamIcon": "upgrade", + "upstreamPath": "android/action/upgrade/materialicons/black/res/drawable/baseline_upgrade_24.xml", + "upstreamSha256": "d5e18165543a3fe85b92f83a50a2543c8612573727eb2879d082351a16621b5e", + "localSha256": "f5fb8e9831a60c0eacd783d9d924c91ba3d01b71c987f10406134b8ab46a4b1e", + "orderedPathDataSha256": "bfd8b520e3892989c26a2eebd270736145b35e0a021e99bc024806a708ed5c27", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/upload_file.xml", + "upstreamIcon": "upload_file", + "upstreamPath": "android/file/upload_file/materialicons/black/res/drawable/baseline_upload_file_24.xml", + "upstreamSha256": "772105695f721e48e97959b0c4cb7c4b0421bd88c324ad48cddfe272e317e024", + "localSha256": "13e1ff770aa90c691833bb96205316e27e548c8fb7d5e7c6082753e0752d4118", + "orderedPathDataSha256": "a06129b4b719ec138030b78c4881b75776ed8ce9e5dc6b066ce4becc9f53667e", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/upload.xml", + "upstreamIcon": "upload", + "upstreamPath": "android/file/upload/materialicons/black/res/drawable/baseline_upload_24.xml", + "upstreamSha256": "9022e42020b286bff1b85f14b58414a110963c44dee78a7f4e16a8b85531c577", + "localSha256": "3dbf951ad85e574e5f700956a868b5463886cec01639bbaeef583b6e5363af34", + "orderedPathDataSha256": "9464388ecd8744535141601df9a79b6c078b650d5c7ed859e8fa29ecbcba6447", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/usb_off.xml", + "upstreamIcon": "usb_off", + "upstreamPath": "android/device/usb_off/materialicons/black/res/drawable/baseline_usb_off_24.xml", + "upstreamSha256": "47e7411b19d22a828fe54a371553fecbde6291215be2fdb618fcf6b83805eb18", + "localSha256": "70e87a5bee358d2fce3aedd6ce331c8457069c59254515997786c8146cd1eea1", + "orderedPathDataSha256": "3e6fa67e39a8fedbd02cb690e9b7619aaafdea389305890ddf906dd06ea84d47", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/usb.xml", + "upstreamIcon": "usb", + "upstreamPath": "android/device/usb/materialicons/black/res/drawable/baseline_usb_24.xml", + "upstreamSha256": "7c304a6282e434068a47376c9b9b9aa5af36c1a7943b6685b9c7a43c1af34dcc", + "localSha256": "177602d7b3e6c2c981d75f4637bfd6da270b82047ba82df998bac32a9d6e1e15", + "orderedPathDataSha256": "f3f73d7bb8bd593d37790e7dc0b30c08e1e7257860d8f28e23f481f54884d674", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/vaccines.xml", + "upstreamIcon": "vaccines", + "upstreamPath": "android/social/vaccines/materialicons/black/res/drawable/baseline_vaccines_24.xml", + "upstreamSha256": "1f5d8695a6d31f1146ea3762dc68c23f14954f1490fc154aa6acdf0140e49610", + "localSha256": "c3220a0996573d1182648335ea05288a423f885f80e1220e108ee6414e157acd", + "orderedPathDataSha256": "f06c9a9c1d78671cfbf7d0ef72c5ab4cbf78c7dbf94c8c79a4fd412af4c38b1e", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/vape_free.xml", + "upstreamIcon": "vape_free", + "upstreamPath": "android/places/vape_free/materialicons/black/res/drawable/baseline_vape_free_24.xml", + "upstreamSha256": "237ebe04d4b4de642e67e02bbe24200e58ff082ea36e0c71e109e13b4391a91d", + "localSha256": "348f0d3e2da41cdba07ec376474d2770dde4359b20809e59a1a7623fafcf87aa", + "orderedPathDataSha256": "b1207520ad3d69e8921dde9874fa34f4a43996c2cfb8adafe7a4dbe1e4e903f3", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/vaping_rooms.xml", + "upstreamIcon": "vaping_rooms", + "upstreamPath": "android/places/vaping_rooms/materialicons/black/res/drawable/baseline_vaping_rooms_24.xml", + "upstreamSha256": "06903ac4fc590566a98d5de6afd68a69d403ddb56008a4ca3fd4c10f60862fe1", + "localSha256": "a6f5dc2aba78eb3298d10bd92d2acc846222ffd8ed81dac97e125e58fd4bfd77", + "orderedPathDataSha256": "7d0422e4adb54330105defe5a00a925f67a802a8ff42de2322e0b3005e97cfd3", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/verified_user.xml", + "upstreamIcon": "verified_user", + "upstreamPath": "android/action/verified_user/materialicons/black/res/drawable/baseline_verified_user_24.xml", + "upstreamSha256": "a92a47d97ff95a37c450b51d14affae9d98f600b9a1c512509ce624efa3dc1ab", + "localSha256": "60cd3070dc5f288d720f1b92bb9222e7b19c15a93639e557f7dc0b47ac6866e5", + "orderedPathDataSha256": "36f6cfd460123c718a198f18e4784977b8e577a396c9bc5e385f6586928ccf4e", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/verified.xml", + "upstreamIcon": "verified", + "upstreamPath": "android/action/verified/materialicons/black/res/drawable/baseline_verified_24.xml", + "upstreamSha256": "efa154d43b2c105c5a4053bb1d143c7c609332a6a35fb450ee850b6105a03c26", + "localSha256": "6d7802a72599bd6f538281afa64eaf21880b3eaaef84f7e2c034e1aedcd2072c", + "orderedPathDataSha256": "7ad20dabad7439c1d2729b3e3d8e0913f060fb38a34ba7245f7c900f02b605ec", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/vertical_align_bottom.xml", + "upstreamIcon": "vertical_align_bottom", + "upstreamPath": "android/editor/vertical_align_bottom/materialicons/black/res/drawable/baseline_vertical_align_bottom_24.xml", + "upstreamSha256": "2336d84dd0ff9ebf342cc7e2d1e12a673205090c7095a6e4edda0c4c70d588c6", + "localSha256": "9a506417bbfd5d94f9a5be1d66619e382d60061681973a3a8b426a6894d38dd8", + "orderedPathDataSha256": "f60c7bfbfbd31661703574c3e31a26d6b81358ebd969623ef236ee992eb90973", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/vertical_align_center.xml", + "upstreamIcon": "vertical_align_center", + "upstreamPath": "android/editor/vertical_align_center/materialicons/black/res/drawable/baseline_vertical_align_center_24.xml", + "upstreamSha256": "042cd3d9bff09a16a8808abef2140fb7bd4b935b98e6d87b30bcd2d369fae1b2", + "localSha256": "316c57c11ca7ba49a12dd513787bf5558ca22c0223a38d590e0fb9a0c3c0366b", + "orderedPathDataSha256": "79d731955a898d05b81ac8cce0d3f3dcfa7a42073e5de84b3e4402904e139b46", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/vertical_align_top.xml", + "upstreamIcon": "vertical_align_top", + "upstreamPath": "android/editor/vertical_align_top/materialicons/black/res/drawable/baseline_vertical_align_top_24.xml", + "upstreamSha256": "a28b1283d1206ff6ac6e45f341bee3ac88778ab1c10248a9f8a7877ec49d3a76", + "localSha256": "36527546f3b4b6248c2f3276920682ee566c52bb40dab3fe38bd39406058c677", + "orderedPathDataSha256": "f95ead3ba4dcebd904cddc8f7c877ba147100eb4b51081f190a759667d735798", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/vertical_distribute.xml", + "upstreamIcon": "vertical_distribute", + "upstreamPath": "android/editor/vertical_distribute/materialicons/black/res/drawable/baseline_vertical_distribute_24.xml", + "upstreamSha256": "a0766b82ae33c02c7adda798c838bcf3e459a85ec7b74908df6c8341034738c9", + "localSha256": "a128a97bf4b0017ee9db217e78927787821a8624048c8e1dc45c361a8b56431f", + "orderedPathDataSha256": "fdf5a92711cf0f5ebc26b0915d3ee4afcd21d9ded09dfc7081e1d70e96b1dd43", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/vertical_shades_closed.xml", + "upstreamIcon": "vertical_shades_closed", + "upstreamPath": "android/home/vertical_shades_closed/materialicons/black/res/drawable/baseline_vertical_shades_closed_24.xml", + "upstreamSha256": "5379670dc302af7a2f2c5322cc2767e5f0947af8ccf73e9ab0185efdb6c889ff", + "localSha256": "35c90979cac44d22ee689d2d121d440399f6ea441b6456ec2a87159f96ef2c24", + "orderedPathDataSha256": "bc03b5fbac4cfa5660ead69cc311b76a5f186d8cd7abeaa0de97b9cfcd451bf1", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/vertical_shades.xml", + "upstreamIcon": "vertical_shades", + "upstreamPath": "android/home/vertical_shades/materialicons/black/res/drawable/baseline_vertical_shades_24.xml", + "upstreamSha256": "c9095b33026b20401509624a4b7ebbd925b7a50b94279da7ab9a8ed68fb26307", + "localSha256": "fe5807f7717181b9efc8a42e2bea460f80b2f123e149bf308b492e299d9f713a", + "orderedPathDataSha256": "e634bf3ab9d9b64f42230eb72326f0b646ebb25dfe4144da011544162ffe3f3c", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/vertical_split.xml", + "upstreamIcon": "vertical_split", + "upstreamPath": "android/action/vertical_split/materialicons/black/res/drawable/baseline_vertical_split_24.xml", + "upstreamSha256": "735c16f98234b31ba1b22a88e42a9c8111a47c868c56d84e40ac8fdaf423dd94", + "localSha256": "0c4783dea56fa16dffaf53448bff3f7ddc3edae6db87e12d75a3835a785933d7", + "orderedPathDataSha256": "308f8f8bba10a23a1c1e5f790f9a107328b3550bf14cce98421fb23c6c695576", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/vibration.xml", + "upstreamIcon": "vibration", + "upstreamPath": "android/notification/vibration/materialicons/black/res/drawable/baseline_vibration_24.xml", + "upstreamSha256": "180dc60ae68ee2aa254d5a3cab2cfec992b8ef6feca657d35376a80a358ab115", + "localSha256": "484d848ea0c5bd979c9f2380f5da9ec380da951821bfef4e77d7ac2881780976", + "orderedPathDataSha256": "0c7af93c8c89d8e3a9303c04ecc5b00447d36251b815c7cbec705f3ec9943654", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/video_call.xml", + "upstreamIcon": "video_call", + "upstreamPath": "android/av/video_call/materialicons/black/res/drawable/baseline_video_call_24.xml", + "upstreamSha256": "ea652ab31761a549d6e29a1560b6dd49e7a639d45a779b90e38d10401870f721", + "localSha256": "67da7f0ed596b4ca2d5bc6b8aa649ca0d6b9fa40487ff0ef1a2711010a5e22bc", + "orderedPathDataSha256": "3cf2ed42e574f9c2dec954b8f81c8633f69d8e0a847c9d0d9285adb9902d6b43", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/video_camera_back.xml", + "upstreamIcon": "video_camera_back", + "upstreamPath": "android/image/video_camera_back/materialicons/black/res/drawable/baseline_video_camera_back_24.xml", + "upstreamSha256": "b5c0100da2f857994b9dbcee17ec87bae83bd9a95ae72a33503f92e66ad8eb54", + "localSha256": "45e0ef895d19f9e2ffe332b659a1fda2f6ce485fa6ca7f3bff8994b120e919d7", + "orderedPathDataSha256": "80542072d6b67637e2b3cdae37d4618c5637d1a49d784ccea12d52c841dca264", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/video_camera_front.xml", + "upstreamIcon": "video_camera_front", + "upstreamPath": "android/image/video_camera_front/materialicons/black/res/drawable/baseline_video_camera_front_24.xml", + "upstreamSha256": "ee67ce29e6d1280976feaf43c1af97ce24fdf7964063a5493b1e8fba723eab33", + "localSha256": "8b778da9b5aba88f456a797e67fe03964e3e45955c5ce2fff7de44136efc170b", + "orderedPathDataSha256": "d25fef906e88e55e0abbcfca4b9588b611b60decd44578f63b84da14b9bfcaca", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/video_chat.xml", + "upstreamIcon": "video_chat", + "upstreamPath": "android/notification/video_chat/materialicons/black/res/drawable/baseline_video_chat_24.xml", + "upstreamSha256": "49e6719db109f7f1dcaf093cfc3a255c2c30d02b84c3d8ef88bb3fe174e1c33c", + "localSha256": "17f823cd6a0b79b6164fed92ca611fc8614631d3929af5c3499ece470def5503", + "orderedPathDataSha256": "e8fa248296d0e9b95a37f17c60773ad503f40da080abbf1cc41d03299b8c1b24", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/video_file.xml", + "upstreamIcon": "video_file", + "upstreamPath": "android/av/video_file/materialicons/black/res/drawable/baseline_video_file_24.xml", + "upstreamSha256": "950b83843c10839a93f526378339394c41e6e3a10449965d5f0087edd5b851ba", + "localSha256": "6d866a15d0f65bc44cb14320fc857063eceedd22a84822d4bc24ed761d68ba78", + "orderedPathDataSha256": "6ce327570ac89801f9fe3b8afe7aa4dee9e22637a18d2a9e7ef8a6504514a335", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/video_label.xml", + "upstreamIcon": "video_label", + "upstreamPath": "android/av/video_label/materialicons/black/res/drawable/baseline_video_label_24.xml", + "upstreamSha256": "478522cdad2e79770a6b9455e8b891fb55b3b0650970624e245e594d20dc97b8", + "localSha256": "4e954996c28f65ac575b2f8ce25645ebf0ac54ec3200fa9e2ace6b7caba4641c", + "orderedPathDataSha256": "9b6b0e4caf8ddedea201b7ae8bc7a282b0cf3816530bc81238bd30691dc3d4f2", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/video_library.xml", + "upstreamIcon": "video_library", + "upstreamPath": "android/av/video_library/materialicons/black/res/drawable/baseline_video_library_24.xml", + "upstreamSha256": "275c44edb30667073d44f12267400099376c8e2dbfc53736e4c927f592fe08a6", + "localSha256": "c11bee717a8692e2900800516bae53d0a596d7fd7001df62f5922aecf109d062", + "orderedPathDataSha256": "1fd917bbd4fbc66d7ae19e29a7ddc13858602699f2addc1196764f97d2e9943e", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/video_settings.xml", + "upstreamIcon": "video_settings", + "upstreamPath": "android/av/video_settings/materialicons/black/res/drawable/baseline_video_settings_24.xml", + "upstreamSha256": "ddc4859bd69eb1ff300b9571eec33a23c0dd05b1560356a7ef3a678869088a03", + "localSha256": "a01c537ca02a84b6e93f4037295c06664ff57931a19df194ead1f0772834ea20", + "orderedPathDataSha256": "65f6e9ad0089ae0e58c41f999cb3a1f3b1723d2c3ab1940df5862816338dc82a", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/video_stable.xml", + "upstreamIcon": "video_stable", + "upstreamPath": "android/image/video_stable/materialicons/black/res/drawable/baseline_video_stable_24.xml", + "upstreamSha256": "8ea6057f90c0144fa26bcd1a15baf8b40f5c5011ef73a98ccd3c361c1a1e030c", + "localSha256": "f24166b85c3ae2672734ecdedbe9b88e4f39bc151da43b9f3edd2e3f01d67c07", + "orderedPathDataSha256": "d16005015d7963c37550bdf4be18d5741d759e20ab366b1e99d0e6c749a1421c", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/videocam_off.xml", + "upstreamIcon": "videocam_off", + "upstreamPath": "android/av/videocam_off/materialicons/black/res/drawable/baseline_videocam_off_24.xml", + "upstreamSha256": "2ce1db18e612eedcb15b0b1eb325d5c3ff9155afed63ab3059e864d43fb23255", + "localSha256": "1bd8fc173b23fabbd4fd2959d24ab5ea9d30634ae3395293600c043f9e523ac7", + "orderedPathDataSha256": "18ff5ac3ee63d00198f1b6608c6bdf33015f79d7cdd4b32ed0f26a999c433501", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/videocam.xml", + "upstreamIcon": "videocam", + "upstreamPath": "android/av/videocam/materialicons/black/res/drawable/baseline_videocam_24.xml", + "upstreamSha256": "e13e5125a5d4cb2dde5d60a1bbf897c3f04d8e69e31c3034cbffd336cfb5e98d", + "localSha256": "a6b888d1788abb2fb744e1102dcd0ca43e0a1bc2b3ebf203e55f33d419a6cb35", + "orderedPathDataSha256": "c68281b19f82362cd45136afecbc6f4372329162c3f913b0ff9bdca4e6fe6b2f", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/videogame_asset_off.xml", + "upstreamIcon": "videogame_asset_off", + "upstreamPath": "android/hardware/videogame_asset_off/materialicons/black/res/drawable/baseline_videogame_asset_off_24.xml", + "upstreamSha256": "8b39c800e064b1e466539ff28da919b8ba507a4593e9160acb11032dbb28f5a5", + "localSha256": "faed966c1d17e88d4cb364a76f16a03b0748f4f21d1fe456eb752444a9d5dd1a", + "orderedPathDataSha256": "ba246eb7007b049a2277870e8c482638e5d963f038ac5768fa1de11096870a31", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/videogame_asset.xml", + "upstreamIcon": "videogame_asset", + "upstreamPath": "android/hardware/videogame_asset/materialicons/black/res/drawable/baseline_videogame_asset_24.xml", + "upstreamSha256": "2f44de7fbfbb50a31a7027b266091bac88c0dc16cd5ffc2d582a820e2be571f5", + "localSha256": "881bd375747cd604537052458c98160fdbeec8c7b3539b84e3f03ecf073e8c5f", + "orderedPathDataSha256": "e3f2403d88e04e66a2a54aaeab41293ae60e9e4880ad9d90af694917b7afcf96", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/view_agenda.xml", + "upstreamIcon": "view_agenda", + "upstreamPath": "android/action/view_agenda/materialicons/black/res/drawable/baseline_view_agenda_24.xml", + "upstreamSha256": "956b893bee7388ccf70e39a6c98dd59a90d6fa077083d78eb3e6a61905335a32", + "localSha256": "6f56e2f8df9902d1aff2bf6679076ff3f0b25622547fc71dde164398078c3284", + "orderedPathDataSha256": "8a32849ad3db7954eb05f52829284211a0a624b7ffc1071cb09a91d617b080a3", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/view_array.xml", + "upstreamIcon": "view_array", + "upstreamPath": "android/action/view_array/materialicons/black/res/drawable/baseline_view_array_24.xml", + "upstreamSha256": "7f2a775bd32a4ce21204fbc2e2697c5270350cc38dd2c3dec41d44015a3f4cb8", + "localSha256": "4d885d951dbbe654eeaa35710e00e085d9563b440f46bf9f9a7ab637d61588f5", + "orderedPathDataSha256": "b1eb220f1948f625993dc00dff827ef26e105d8dc50c44b071409811df984a23", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/view_carousel.xml", + "upstreamIcon": "view_carousel", + "upstreamPath": "android/action/view_carousel/materialicons/black/res/drawable/baseline_view_carousel_24.xml", + "upstreamSha256": "3210e7d8ecb3c3d150d79fb937991d19b8baa8ba8287e1a0b6d8bbbb8e083b95", + "localSha256": "43ecbb91cb2d8bcd471b98eafdbfea484af8ad5acf7b2e7b86750a3ed5080527", + "orderedPathDataSha256": "cb8295f80661c2a10227c62ba9f70a3a534a10e0ef6d4fbe188968e65446226c", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/view_column.xml", + "upstreamIcon": "view_column", + "upstreamPath": "android/action/view_column/materialicons/black/res/drawable/baseline_view_column_24.xml", + "upstreamSha256": "852eb8d771aaf2658f5273ff35e7be1c9509ff2aa11105b868f8e06e1e22d71c", + "localSha256": "57ecdc378e2f6d84b725bcc48711e57f49fef5232993f265d41c32f1eb7c93a5", + "orderedPathDataSha256": "341a51061256b876ec8c5d0a74f54106ab2cc8ca1bb0110be5d921960a015233", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/view_comfy_alt.xml", + "upstreamIcon": "view_comfy_alt", + "upstreamPath": "android/action/view_comfy_alt/materialicons/black/res/drawable/baseline_view_comfy_alt_24.xml", + "upstreamSha256": "7e6955258261bd53bb2675cfb68719e61bcaa3e9daa20b817f2cf9cba730a896", + "localSha256": "cfc8252d90198f2a2b603646bab0c37d064ca37a5746bf1fdc389977d31b99d5", + "orderedPathDataSha256": "227ddefc979dbd22cda7d04c0d7254e74d319b7fb3679f106eb09b2539cdeb9e", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/view_comfy.xml", + "upstreamIcon": "view_comfy", + "upstreamPath": "android/image/view_comfy/materialicons/black/res/drawable/baseline_view_comfy_24.xml", + "upstreamSha256": "39e351fe6be0f18881c68900067f498f05c0cf59d0d2f1ba7fb20f0689020666", + "localSha256": "71e11ca90a7ed7af7695ca478b05a7407bfa879d148eaa3c52279f39e32e94b2", + "orderedPathDataSha256": "793bc51d4733d5345fe6008e1f91cb28e70c196729015c15abeff313ac557be0", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/view_compact_alt.xml", + "upstreamIcon": "view_compact_alt", + "upstreamPath": "android/action/view_compact_alt/materialicons/black/res/drawable/baseline_view_compact_alt_24.xml", + "upstreamSha256": "e9ab5d7eca3db6f72715e72be75e6af9cb7dc69182ea61de648d6aed472cdd99", + "localSha256": "2d72f82c72c27354d659c895b4504a5dc73a4e9896a1dd76c0867612be446dfe", + "orderedPathDataSha256": "a8f8df9025b03c0bccf48e870ce1f013527fa220760ce87646c6e925c0e4d119", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/view_compact.xml", + "upstreamIcon": "view_compact", + "upstreamPath": "android/image/view_compact/materialicons/black/res/drawable/baseline_view_compact_24.xml", + "upstreamSha256": "eff8b1c21322d87187e380c008165c8a92588d474b89b576f009f0e2782a2eee", + "localSha256": "1d687629404e9939619a175ddc9c0bc4ed135a13e157ae738938cf1e0581c9e3", + "orderedPathDataSha256": "be30222e38494c1e82844d7b72e8ac457d3b77040e95b4c0be122771ecbf95c8", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/view_cozy.xml", + "upstreamIcon": "view_cozy", + "upstreamPath": "android/action/view_cozy/materialicons/black/res/drawable/baseline_view_cozy_24.xml", + "upstreamSha256": "622afa2f3fb84777901a8272951abcd79bdf1c24976b8e033ef1b3ac00de0b0b", + "localSha256": "383d757c861fc3a2ecec6bd393f92a729961210e6dafdd6c344f7a67f2cc06df", + "orderedPathDataSha256": "deabd95a1d60a99a3a9be936e4f9ae6fd6c46aa2c9bddd295b2424c347ca0ff6", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/view_day.xml", + "upstreamIcon": "view_day", + "upstreamPath": "android/action/view_day/materialicons/black/res/drawable/baseline_view_day_24.xml", + "upstreamSha256": "0bf37687193f840045f36c4a2bf934c55c2ba81707b78e3ef7eb88481c542a2c", + "localSha256": "f36085cd9b6872b96358008ca55215b878c6e63fa2c98836ecd96375dc06a8ad", + "orderedPathDataSha256": "24dcb149e1cee77841c386ed8e891681d2982d686e380163bce753856ef8d4de", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/view_headline.xml", + "upstreamIcon": "view_headline", + "upstreamPath": "android/action/view_headline/materialicons/black/res/drawable/baseline_view_headline_24.xml", + "upstreamSha256": "d9f1da9cc3ba47c0b383430aae697d615c3c2cf23667c0228e21b1109903ee3a", + "localSha256": "25214637ef99d8b0df9e7c8cd0ad517be9fe352fbc0fafd0e91a14eab729203d", + "orderedPathDataSha256": "4ae9817d7be51e07dbcc855b5af678bd6f38a091449a6428a5e23973c1f57f25", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/view_in_ar.xml", + "upstreamIcon": "view_in_ar", + "upstreamPath": "android/action/view_in_ar/materialicons/black/res/drawable/baseline_view_in_ar_24.xml", + "upstreamSha256": "0a66637bde69c2d01a1b786f44fc60d4fee504bdcedb6e131f4c4a34729d50e2", + "localSha256": "0d003c42083375ff64100f09bcaa059c5d6b343a546b61af9df91647ff814976", + "orderedPathDataSha256": "21c7e7946d988d71139c01bb028e68cb2c1801e57bd37f973414522193044de1", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/view_kanban.xml", + "upstreamIcon": "view_kanban", + "upstreamPath": "android/action/view_kanban/materialicons/black/res/drawable/baseline_view_kanban_24.xml", + "upstreamSha256": "6e9f15e17d25669ce787201151d9e55fbc6192e059029300335a73919592f148", + "localSha256": "8032919374ad31ed548e149cd2b44a5daba600bfa1f7c85fdd1ac030d5b29725", + "orderedPathDataSha256": "2de5f1b6c37f4acd0322291866a7690bc511e8a88419ee56e01c8275ee191b7a", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/view_list.xml", + "upstreamIcon": "view_list", + "upstreamPath": "android/action/view_list/materialicons/black/res/drawable/baseline_view_list_24.xml", + "upstreamSha256": "a1bfce6f58e6e1d9f6d2652559dec79207e3ccac6452597f22f8f0207ceaf038", + "localSha256": "4cf24dcd67fd1e418192064d6680bb79c700b7c636e51ad65d30a57335d47953", + "orderedPathDataSha256": "1c45b4b58fbe2b48b5d741ddf132be15aa106306dfdf62edfa2813a6da022db3", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/view_module.xml", + "upstreamIcon": "view_module", + "upstreamPath": "android/action/view_module/materialicons/black/res/drawable/baseline_view_module_24.xml", + "upstreamSha256": "37aab255445d7fc3cb0adf9343be7ac808c103e583e187eebca0f99037abcbd6", + "localSha256": "37080edf88d6975cb95d49483f61ee10264ecbb0962040f37b198727fbe0a86c", + "orderedPathDataSha256": "950651a3384bab22f6a2583423e949ba3f35dcbb40e5e4371dc2123884b159de", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/view_quilt.xml", + "upstreamIcon": "view_quilt", + "upstreamPath": "android/action/view_quilt/materialicons/black/res/drawable/baseline_view_quilt_24.xml", + "upstreamSha256": "0b413326d1d94159169967b5ef51ad5b42b541f7f8883ca1666294d41721303b", + "localSha256": "8a0107aff6043adb13a81590ddc37050494aa72550fd3a411e47ca94142e9dda", + "orderedPathDataSha256": "058b217f4cda3adb478f1bcc131b3fe32ec5f4a3978ab8df7a898aac3519707f", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/view_sidebar.xml", + "upstreamIcon": "view_sidebar", + "upstreamPath": "android/action/view_sidebar/materialicons/black/res/drawable/baseline_view_sidebar_24.xml", + "upstreamSha256": "b6d649c0175ea749aec2f503ecff7432df574e501d1bfe95961ce03292ed9926", + "localSha256": "ded222a47e18718837161d63563908b93bb928884f7be6e81646b83b5574716e", + "orderedPathDataSha256": "f181eb8187f5f540c771eb3641a4c0026c1a916ed54daa9d6300727b10e66e78", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/view_stream.xml", + "upstreamIcon": "view_stream", + "upstreamPath": "android/action/view_stream/materialicons/black/res/drawable/baseline_view_stream_24.xml", + "upstreamSha256": "18cc7312373939d0b757febd43476149f1fafc7162e6b7f8de6570e381740a99", + "localSha256": "e8c3903f9a9bb02dda710ed8b855ceaf6623aae5b7e5ab8424a48ebd0b40c2bb", + "orderedPathDataSha256": "478548e136d6b740155c9169fe51e54d8addaefc6df820a57418634640f95dcc", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/view_timeline.xml", + "upstreamIcon": "view_timeline", + "upstreamPath": "android/action/view_timeline/materialicons/black/res/drawable/baseline_view_timeline_24.xml", + "upstreamSha256": "4ff1103044f21fc3dc5e1dc719ae4621eeec720c58498947998a77d548804070", + "localSha256": "e3dc8c9ef6a39d2e5949f4789e2ff84175d3107a1855767b8991c476d21c8ca4", + "orderedPathDataSha256": "2419fc224d404c638715b90c007978392e8df9a58d971bf4fcab62b6b5842f87", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/view_week.xml", + "upstreamIcon": "view_week", + "upstreamPath": "android/action/view_week/materialicons/black/res/drawable/baseline_view_week_24.xml", + "upstreamSha256": "67b567e299a00fc0c04e68d69bc72f77b3c51c6ae5c56116574269b4c3f82369", + "localSha256": "1cd5b2bcd244e93a5b4d633da8ff53eaf28df5e6802a1ffbbb91334eb74cae72", + "orderedPathDataSha256": "d7cae11ac978dbcb309dfb2426f69ef641615e496168888e76e4ebeaa2eb33a0", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/vignette.xml", + "upstreamIcon": "vignette", + "upstreamPath": "android/image/vignette/materialicons/black/res/drawable/baseline_vignette_24.xml", + "upstreamSha256": "9038a217bda1365d7d22d60cc189c33eaa4187faa5c743a3b0bc67e630cd0ea1", + "localSha256": "c9c9548c0e0ea1ea455e966340a2f9d10b615773868b59795c0e3808eb90ebe4", + "orderedPathDataSha256": "c079f2ff340c4d603dbc066cb0b33e409f5fb604b238e98773c09ebe714f0eb8", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/villa.xml", + "upstreamIcon": "villa", + "upstreamPath": "android/places/villa/materialicons/black/res/drawable/baseline_villa_24.xml", + "upstreamSha256": "93e1d8e8e5dda7326590928d329d9fce93035f33acac4c55726a88b6e1f83e32", + "localSha256": "2176dc0a04b4aa0b1e364cc1d94cece0e78db08653f468f4cda06fcec487ee18", + "orderedPathDataSha256": "3aeb944aa6feb6be6b2a9457694b3f5af1f53da3ff8bf2924e2572efe1ff3aee", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/visibility_off.xml", + "upstreamIcon": "visibility_off", + "upstreamPath": "android/action/visibility_off/materialicons/black/res/drawable/baseline_visibility_off_24.xml", + "upstreamSha256": "9ca655891f153ac36a49750791794db722d0dcd60a8e36848e003ec92253fd64", + "localSha256": "a81bca18ed5b95aff0428e32c43ed50798e8b882b8b420b76bc56959a607da00", + "orderedPathDataSha256": "06ea8100a0194e2b8595db000caaeca389b03772e0a2f5011434c72a64a01c37", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/visibility.xml", + "upstreamIcon": "visibility", + "upstreamPath": "android/action/visibility/materialicons/black/res/drawable/baseline_visibility_24.xml", + "upstreamSha256": "ca28a5336b5c5c80369efaa9e1cffef74af9ce87eab1f3327b98f19fedd6645c", + "localSha256": "55f472d15ed482a345a76733d219dbdead5061dc87e6a62b6ad49619cf104597", + "orderedPathDataSha256": "efe6e4a613d856261a06fae75c883f8f26dfdb742d0ff09c35222d6cd4b839b0", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/voice_chat.xml", + "upstreamIcon": "voice_chat", + "upstreamPath": "android/notification/voice_chat/materialicons/black/res/drawable/baseline_voice_chat_24.xml", + "upstreamSha256": "8d302519f3c9221f7d9517ffac8dc3908b5beba95cfadcb1ba1b90298036960b", + "localSha256": "d1bc3ce0ff5237150218bd27a7c57e1a02fcbb63332bed199e66d3c3e72ceecd", + "orderedPathDataSha256": "474f6b21f2a12ebea1a2f95e7847130e6572509575454a85d99730c4e47eab5b", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/voice_over_off.xml", + "upstreamIcon": "voice_over_off", + "upstreamPath": "android/action/voice_over_off/materialicons/black/res/drawable/baseline_voice_over_off_24.xml", + "upstreamSha256": "e5bd09cb755c0484fef5852c5c0abded04e33cade86e25b879e44410a1ae0101", + "localSha256": "9c5267a3eb290b56ee51862a82ce3fde3a62c639c03158008c0b1433d73dcdf0", + "orderedPathDataSha256": "6ccee1a8003879eba2df28ae181b95f7ed59e91cf47bccd5767b20e5c41a7050", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/voicemail.xml", + "upstreamIcon": "voicemail", + "upstreamPath": "android/communication/voicemail/materialicons/black/res/drawable/baseline_voicemail_24.xml", + "upstreamSha256": "18cac42d74f6a6813b8c298955b3f551f1b0f4602d5e0b6119d4af6336e32667", + "localSha256": "857304176d476a3a78a790fe95831118e1fa342209f425208811e1b7bdc4c5fc", + "orderedPathDataSha256": "5fcafe7c166631839859dafcd43770f39b9adac4e79e3d56f6639910985dc058", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/volcano.xml", + "upstreamIcon": "volcano", + "upstreamPath": "android/social/volcano/materialicons/black/res/drawable/baseline_volcano_24.xml", + "upstreamSha256": "679095becc313387d71c7edd970f7bccc0e07dd2c43ed10577ed3a4298c6de69", + "localSha256": "34f69b01e486a06786e80e9fcb4037ea0bec462d16bca393faf140e8cfff7ab1", + "orderedPathDataSha256": "deb9c41368643147609b59af9578caa31da207f34de20a675757f5fcd7e23b7e", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/volume_down_alt.xml", + "upstreamIcon": "volume_down_alt", + "upstreamPath": "android/av/volume_down_alt/materialicons/black/res/drawable/baseline_volume_down_alt_24.xml", + "upstreamSha256": "f749fe1536c4f94b28a55be3ef5967fb594afc6e45471d5124dc81e434e1ecff", + "localSha256": "1582fc45ad87f4767cda089d88f4577b8cfa0bd014cdcf0f6ff23e991b779d2b", + "orderedPathDataSha256": "ddea76d8c39484a62f6bbdfb9a7b067be62770ae3c0af36c58dd09430fb9ab30", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/volume_down.xml", + "upstreamIcon": "volume_down", + "upstreamPath": "android/av/volume_down/materialicons/black/res/drawable/baseline_volume_down_24.xml", + "upstreamSha256": "f792b162fd3c59398f16f6a61abb7005a80c2ea9564e77fd630f0da40b48ee29", + "localSha256": "41122022dc7e9c86e8ab51b644b231e586a571a65afc693069a3c02af17439e1", + "orderedPathDataSha256": "3e4a83e0e187ee2c46ca955b3b39ba96da053f88336919bbbdea14b7376f0f32", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/volume_mute.xml", + "upstreamIcon": "volume_mute", + "upstreamPath": "android/av/volume_mute/materialicons/black/res/drawable/baseline_volume_mute_24.xml", + "upstreamSha256": "18652c07dae2b360a6086d733957d9e968a1f1afefcc43b83c00c39011b52d32", + "localSha256": "08a2ef06b6c8dc97fecfc120e6a49d303a237a89cbb0d7e496c7bb937b2a47bc", + "orderedPathDataSha256": "d123435b3fbd2c0e80762ffbb90b226cf51c971a3296f5498184a39df6e06069", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/volume_off.xml", + "upstreamIcon": "volume_off", + "upstreamPath": "android/av/volume_off/materialicons/black/res/drawable/baseline_volume_off_24.xml", + "upstreamSha256": "a9070677e583abbaf3f0ddae0080fb49d28272586412ccaf59bc75210a590f93", + "localSha256": "a47fc2169b51de1657440a3212644de524198328a1c28884f9d89d01cea91327", + "orderedPathDataSha256": "30f4be00bc5028ce536d20ff95fa965e5661f5d2acaa26bfabcf35a7512cd46f", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/volume_up.xml", + "upstreamIcon": "volume_up", + "upstreamPath": "android/av/volume_up/materialicons/black/res/drawable/baseline_volume_up_24.xml", + "upstreamSha256": "75e096e65f02338cf8416cf404f60c84da379c485e4d05e9f5f5285d8db9120c", + "localSha256": "a7c840c106f1d40c2bb688293656d9bd5fd6ad2120738ea8fd1de3f6ab39b22f", + "orderedPathDataSha256": "fade0955ed84daddbc8608b53bf4bf49f83a47c56054b11fa65877359b684ecc", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/volunteer_activism.xml", + "upstreamIcon": "volunteer_activism", + "upstreamPath": "android/maps/volunteer_activism/materialicons/black/res/drawable/baseline_volunteer_activism_24.xml", + "upstreamSha256": "cfe4ca7921271f0a10e0ef586ad6a0a134ae4ac16feeaa480b16934ebcb48de0", + "localSha256": "b46b407a02892a06977d4dfeab9aa56a9f9b8ce26c915b4223249527f2ba8f63", + "orderedPathDataSha256": "2d122e7ff7ca5b1b182ae969547f7846a94083c20fc045f3b5c65d5329a2dd80", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/vpn_key_off.xml", + "upstreamIcon": "vpn_key_off", + "upstreamPath": "android/communication/vpn_key_off/materialicons/black/res/drawable/baseline_vpn_key_off_24.xml", + "upstreamSha256": "3efb688c0c6405f7e89ea0821461d8bdefa562e74a7ed4d7abb74d0db8e2cdd6", + "localSha256": "a4a53e8741873bcc2f322a917e8b076a935f08b16c91dd1d553c6c295ac718f9", + "orderedPathDataSha256": "807260446d7703d71777d4b9de8103b485d8cb04180ab23c5b1ea2ab5ba3e5e5", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/vpn_key.xml", + "upstreamIcon": "vpn_key", + "upstreamPath": "android/communication/vpn_key/materialicons/black/res/drawable/baseline_vpn_key_24.xml", + "upstreamSha256": "313ace7116a39ad7d6b232b9c182dc492c6680efaf617312d550bd7f2f7ad825", + "localSha256": "85573d7e00f30f51e19f9dfa078fb0393812a2750703d4cebd489e7b26ae3149", + "orderedPathDataSha256": "35c6da175e897aa0f9d0315b287a5ec19793a88499436d4a22645a940080ffa2", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/vpn_lock.xml", + "upstreamIcon": "vpn_lock", + "upstreamPath": "android/notification/vpn_lock/materialicons/black/res/drawable/baseline_vpn_lock_24.xml", + "upstreamSha256": "babe473a620f62abc078b52559f50431465bbe6987db9ed8709cae0ea2aae5fd", + "localSha256": "53ba1df2e1d1cef027648bb003593d870b0579cd12a34845260aacc736ebb41b", + "orderedPathDataSha256": "f114cd462a562b83eab402ad578539a6bb4e7ba04b91c01ccebb3cdca8b470d6", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/vrpano.xml", + "upstreamIcon": "vrpano", + "upstreamPath": "android/image/vrpano/materialicons/black/res/drawable/baseline_vrpano_24.xml", + "upstreamSha256": "396a3388cd5d80224266e8ee6063def66bcb61b4286169ff5c5a78e9e56e2e29", + "localSha256": "890e7381afdaaaab3c469251154b626bf341d1d70e35a7ab5f3d72131afbab51", + "orderedPathDataSha256": "aac4e678798855a4f0af810280ce1d943a1107288a23ea29bf35b44938f094c2", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/wallet.xml", + "upstreamIcon": "wallet", + "upstreamPath": "android/social/wallet/materialicons/black/res/drawable/baseline_wallet_24.xml", + "upstreamSha256": "fe5c45e8682c803646a7cbc6bdaa8e269869ca1fad177781af99be010b9b050b", + "localSha256": "f69fb8e03445560795a2210759815f34ca069b603bc973c6cdbe7d98898a4f03", + "orderedPathDataSha256": "2ba6da3a3aad36c140c07bd47fdc10f33e9e6b3eb802f67a2a14cee0dcd81f16", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/wallpaper.xml", + "upstreamIcon": "wallpaper", + "upstreamPath": "android/device/wallpaper/materialicons/black/res/drawable/baseline_wallpaper_24.xml", + "upstreamSha256": "3b5ecdd0dc4fd8773d89fc86a1c92a4a5a2250b567690316022ba16f6bd4d023", + "localSha256": "48963ff6e2c42685d8b6b38df2ff0cb881b5f87ac26bbcdf44e65e399960779c", + "orderedPathDataSha256": "791241bf0dfe507cecd4a87de945fd082eebf152e8a6c7f823ae256bd235f184", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/warehouse.xml", + "upstreamIcon": "warehouse", + "upstreamPath": "android/maps/warehouse/materialicons/black/res/drawable/baseline_warehouse_24.xml", + "upstreamSha256": "e9c4022b5293d0b2a61dac5ed7e569207c9ce6628bdfaa23c738308f8b9ff9a6", + "localSha256": "d503ab4ab319956a5bac47ba8e6d8ba21e552ad8a3d24d536d9079acf2afaad8", + "orderedPathDataSha256": "a2cfff4028665e6e28e350d287041ca1cfada9154e339478e0439b31a689e51b", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/warning_amber.xml", + "upstreamIcon": "warning_amber", + "upstreamPath": "android/alert/warning_amber/materialicons/black/res/drawable/baseline_warning_amber_24.xml", + "upstreamSha256": "44ca50cbbf96a86d625b3dbdea5a86ec6cba2d4a90f00774ce0b049688af6847", + "localSha256": "be3cdd3ad1def790ae696b2da90309e0e93936b4fbaed303448b83fb5c14eb26", + "orderedPathDataSha256": "7b63706411a2f926b4b961278a0eec147035b380e5461d415bd318d3fc444aac", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/warning.xml", + "upstreamIcon": "warning", + "upstreamPath": "android/alert/warning/materialicons/black/res/drawable/baseline_warning_24.xml", + "upstreamSha256": "3e33b1ed909248589cac4e30bc2c8595b2ebb1d6c843beaae06f306f8ead67c3", + "localSha256": "658d80bb79a41a0f30edb8efaa77636cee3eaf630ecfe6de67a15877e4b91e85", + "orderedPathDataSha256": "faa8298199d245d4993eea26eea979cc4febe00f0cbed700d85400b8fd24bffa", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/wash.xml", + "upstreamIcon": "wash", + "upstreamPath": "android/places/wash/materialicons/black/res/drawable/baseline_wash_24.xml", + "upstreamSha256": "43e8155565bcae1ff45f90c2e45c0f0f1a9e660ad274004dfa49382bad3b311d", + "localSha256": "2c9aac125e91636f5c931c6f98669d30c460139ce1cdd2285a5e016cda7696e9", + "orderedPathDataSha256": "0d4d25d5ebee6ceceb59d9d45ead53a2f594835faa71eb450e872d34b003df88", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/watch_later.xml", + "upstreamIcon": "watch_later", + "upstreamPath": "android/action/watch_later/materialicons/black/res/drawable/baseline_watch_later_24.xml", + "upstreamSha256": "5c2a7a151f68754fe71f4350ec5c68f7834b969f424cd3357dfc8ff88a9f1c3d", + "localSha256": "07e569fb049b511535404d886192997f85578b846ab3b597ac2d71b113f5fab3", + "orderedPathDataSha256": "4a37cd16bcacfc129a3bbede2bbb024e6bf1d47061075426b153f21c68249e02", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/watch_off.xml", + "upstreamIcon": "watch_off", + "upstreamPath": "android/hardware/watch_off/materialicons/black/res/drawable/baseline_watch_off_24.xml", + "upstreamSha256": "2d2d753e0816fd9050464064446ec3b2f87af11fdadd2d2d9513c4d3aee87912", + "localSha256": "31979825499228930b06e25caa73cee0a4dd73873972444adad855cc31d15e40", + "orderedPathDataSha256": "a1e3e0c3b0174ab3bf8ce58cd3107420a48a57880887f773c039e888fd9b13c2", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/watch.xml", + "upstreamIcon": "watch", + "upstreamPath": "android/hardware/watch/materialicons/black/res/drawable/baseline_watch_24.xml", + "upstreamSha256": "905118b884cb7e84b05c3daad5ab23ee13e5bea65d4f28707a0bfaf503bd129e", + "localSha256": "433b25721d2656ea05b514575ad965d0db3a96b00b0d96c583afc04116a56b2a", + "orderedPathDataSha256": "0f6a6801ebd582b9e4de5a367d2ac9cb091c5450bcf5eb0bcfb7598db61ab480", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/water_damage.xml", + "upstreamIcon": "water_damage", + "upstreamPath": "android/places/water_damage/materialicons/black/res/drawable/baseline_water_damage_24.xml", + "upstreamSha256": "54853c16d1f8bb8867cbfb5e22bc8f661e8b7cf3a109a590afc90008f14b6863", + "localSha256": "2834bf45ceee9e99e53ab86bf4fb34cd4206ae331cee35923ff659edab2a26da", + "orderedPathDataSha256": "43c4144b2975263b374688c32eb349d46e77eb4786db555a43dc5323ee0c1cfc", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/water_drop.xml", + "upstreamIcon": "water_drop", + "upstreamPath": "android/social/water_drop/materialicons/black/res/drawable/baseline_water_drop_24.xml", + "upstreamSha256": "3ff0782a8330d033dafdfe28c7ab780a7e8d512b35c674cca51e49ede769b99c", + "localSha256": "e510b591bfdab0544ab022a358908ffa33a906c1e53c68a8e067cb6d312b3f4c", + "orderedPathDataSha256": "e688ac23ebcd83dc8b2600c7837612ed73f1217e701dbe6064d8d9c4b96750dc", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/water.xml", + "upstreamIcon": "water", + "upstreamPath": "android/device/water/materialicons/black/res/drawable/baseline_water_24.xml", + "upstreamSha256": "9e926e96322be168e817f121ace5eca451924a959f571cab52dfd0b34c57be8d", + "localSha256": "e46c96649bfceecf71a3c623f0e739141ef7c28d26266ea2128279ce06584e65", + "orderedPathDataSha256": "839ec95803654ff6e4ec8eeaf2d6e14ecc3d56a9aeeb9cef6f419d4ed8c70e67", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/waterfall_chart.xml", + "upstreamIcon": "waterfall_chart", + "upstreamPath": "android/navigation/waterfall_chart/materialicons/black/res/drawable/baseline_waterfall_chart_24.xml", + "upstreamSha256": "e6352cb4b3e0ede7984a76cdbeeeab9826dc289cf2dade22c2f40301ded70bfc", + "localSha256": "44837b8dc65726534f9b3c39ba309d054665007794617b02e1bb6fdb60ca000d", + "orderedPathDataSha256": "d7cad635fe5da8152c2ea1e2235e4e5eab7ed65fda0322cd86f406c520f9c74a", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/waves.xml", + "upstreamIcon": "waves", + "upstreamPath": "android/content/waves/materialicons/black/res/drawable/baseline_waves_24.xml", + "upstreamSha256": "1441c5abed593377c02b8d8af03b97fa615d758affb2e8e9b131a207e7cc0171", + "localSha256": "7ab583233942a8e8622c5faef072395ef456f2a9108c37ad8cc3bfbbbc71e82a", + "orderedPathDataSha256": "1472c64f3a8c9badd22d40a71ca57caabe77c23c4d14c05baa19e3f3d0243505", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/waving_hand.xml", + "upstreamIcon": "waving_hand", + "upstreamPath": "android/social/waving_hand/materialicons/black/res/drawable/baseline_waving_hand_24.xml", + "upstreamSha256": "1824bd655674f49014d003bdea9379322d34333c59c660f75be1b8a74225a3fd", + "localSha256": "36b7491241664ebc158bc451113f6f08c8971fc092e5d6daecf7b969890275ca", + "orderedPathDataSha256": "c25f13edd601bbcd9df425ad64974300340d132775771aec6e5c378277f9c281", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/wb_auto.xml", + "upstreamIcon": "wb_auto", + "upstreamPath": "android/image/wb_auto/materialicons/black/res/drawable/baseline_wb_auto_24.xml", + "upstreamSha256": "bd0d0cd53d63609773ef1cea67aa8cb122324526c91f6e6f4471c82fc80338fa", + "localSha256": "85056ce4c294a7c4a81a17e5ea60fd418a258ab04753f2f3851bac963cf48857", + "orderedPathDataSha256": "a23f2ceb7773cb851cfc0405a87f0e8ef02cc41d17ae49afbe5aa4612ce86530", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/wb_cloudy.xml", + "upstreamIcon": "wb_cloudy", + "upstreamPath": "android/image/wb_cloudy/materialicons/black/res/drawable/baseline_wb_cloudy_24.xml", + "upstreamSha256": "85cc0986ef4439cafcfb2ad5983efb323474bd845f86e431752f52875d69031e", + "localSha256": "ba045ca94de294c05238685119e100056365a2763dc2b02390877aead1e5045a", + "orderedPathDataSha256": "7de4d68cdb3e2c36586c9b79d74216774c4de3e667548c64b735a72da1bb4c96", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/wb_incandescent.xml", + "upstreamIcon": "wb_incandescent", + "upstreamPath": "android/image/wb_incandescent/materialicons/black/res/drawable/baseline_wb_incandescent_24.xml", + "upstreamSha256": "301066ea14b2a3099c67a40c9a5a5de5f8a2d1873f0aaaabcf118ccf3bfaefcf", + "localSha256": "5642b8b64702f65e683d0e2d27e49d79f2c3aa0bdb2025deb146801788aad681", + "orderedPathDataSha256": "6ddce2898502aecf14e860bc2f91bffd6cb1cdf1f85a11fc3b58958d81a47299", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/wb_iridescent.xml", + "upstreamIcon": "wb_iridescent", + "upstreamPath": "android/image/wb_iridescent/materialicons/black/res/drawable/baseline_wb_iridescent_24.xml", + "upstreamSha256": "4a90395fedeb9669151e581cf65411ead31b13c61eb472269eca5f313445014c", + "localSha256": "6f9be30802776f09ac07c3cc7e9b10659b36b8d0a9c8acbcbea8a6788aeb70f3", + "orderedPathDataSha256": "219703b837946c455d4e2e29476945f311666739b25233b80ec95fc6d9679e5c", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/wb_shade.xml", + "upstreamIcon": "wb_shade", + "upstreamPath": "android/image/wb_shade/materialicons/black/res/drawable/baseline_wb_shade_24.xml", + "upstreamSha256": "b62460065c3873277465e75245d41c128ca7ff87a822a52bca0cc636e7005d58", + "localSha256": "abf2bd041fe1f5356ec9d9fae96801f7282032ce50d73d48d0ed3e9338d45565", + "orderedPathDataSha256": "f11dd8e5bc8f1371d9579bdeee87c0b318c6b1ecd8aa055ab6e51179468d49ca", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/wb_sunny.xml", + "upstreamIcon": "wb_sunny", + "upstreamPath": "android/image/wb_sunny/materialicons/black/res/drawable/baseline_wb_sunny_24.xml", + "upstreamSha256": "91af3e42b7918f9d098b8540fd98cb17aeeef2533805e1b92af109b05ec6a8e7", + "localSha256": "3088e392298f461725cbb33f0ca2b6f843c69c25fd550258a77d7e7f258b9465", + "orderedPathDataSha256": "a944f597a3942d271d6cdb7ea7f76824125a768c29e11c31d063f2001620a256", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/wb_twighlight.xml", + "upstreamIcon": "wb_twighlight", + "upstreamPath": "android/image/wb_twighlight/materialicons/black/res/drawable/baseline_wb_twighlight_24.xml", + "upstreamSha256": "0569dc6b2261f6556e2063bce8ded89f124e2259e4b90e510ce58e8140211caf", + "localSha256": "4df8e3fcc5d75a3f26c86e41fd4fdbcecbef632b21dbc119d51faa59ed8d35ce", + "orderedPathDataSha256": "c52717d47a2d48977566ddd1ee39504ab78d4493c057d812a23309966b9ec86d", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/wb_twilight.xml", + "upstreamIcon": "wb_twilight", + "upstreamPath": "android/image/wb_twilight/materialicons/black/res/drawable/baseline_wb_twilight_24.xml", + "upstreamSha256": "9c6c7a4446b5e5208da923582caf81ca6bb5d31f09c703cbdbf8ec4446347105", + "localSha256": "491114b44e59728017b5d94f4402f3a45e0ec6f1dec4c96cebaac69ca79bd897", + "orderedPathDataSha256": "7ccaf8e10d6147db370b4f541a1c3f008ee72541bb976ac4e3e7370ab815493d", + "originalGeometryMatched": false, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/wc.xml", + "upstreamIcon": "wc", + "upstreamPath": "android/notification/wc/materialicons/black/res/drawable/baseline_wc_24.xml", + "upstreamSha256": "7f78b4da0bf5f43e3e2306ae1c4a657f19f914a2fae8bec8d2cd542c49bdaa7d", + "localSha256": "7417f844700535584ac27dfdc633a0c5a8db8b27c429854012a1f9961ad00638", + "orderedPathDataSha256": "064986d9cf8e495ffab12b568377317c814ca30dfb76b36468f2501cb36d99ec", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/web_asset_off.xml", + "upstreamIcon": "web_asset_off", + "upstreamPath": "android/av/web_asset_off/materialicons/black/res/drawable/baseline_web_asset_off_24.xml", + "upstreamSha256": "f8881d1ffc2c014700768fca14c41ae7fc6433a5c80648d72853c5a9117e3f22", + "localSha256": "535d044e520ed31971722f031acd26596d0a7eec328a249753d4505b9076244e", + "orderedPathDataSha256": "cd84790c5489e94f98963a71fdbb26f572530e3b0ead5a24409dd98c005fa808", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/web_asset.xml", + "upstreamIcon": "web_asset", + "upstreamPath": "android/av/web_asset/materialicons/black/res/drawable/baseline_web_asset_24.xml", + "upstreamSha256": "8010d8b7933dcae3a6a3c89f44988d8e4b3f9a16e6e26deebd55153831793549", + "localSha256": "59cd2d258a54a514b3d54585a678f13bd544edb0d63f56e01d7e86d0852200f0", + "orderedPathDataSha256": "2410c4e412af3f1ec08591bea699362e71726ce630f3ce63e8b8ffaddb3637e8", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/web_stories.xml", + "upstreamIcon": "web_stories", + "upstreamPath": "android/content/web_stories/materialicons/black/res/drawable/baseline_web_stories_24.xml", + "upstreamSha256": "c1dc6a8369fefae9b7f699d7561d6df435185fa2c1e814ad5d0f9fe30de5af2d", + "localSha256": "996ed133f94353ff157162724899b5630c4acf0cfc2912d1207e19356d3567f8", + "orderedPathDataSha256": "9e49e2d2a3f145f6166a6b63791d72dea46db456816622e3bf5f7b68755e2298", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/web.xml", + "upstreamIcon": "web", + "upstreamPath": "android/av/web/materialicons/black/res/drawable/baseline_web_24.xml", + "upstreamSha256": "41e680e21b4e70a1f2e85c528d946a13eb8f9af57fa16d7f95406cc738489c46", + "localSha256": "1e127e18e218835eb3a79ac0c6931f061139b785e18511a79381b47e92b51ed5", + "orderedPathDataSha256": "b53f9e979f62114aa2aa1856718b6f969c5be544f50a1b46ea4645fdb749a922", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/webhook.xml", + "upstreamIcon": "webhook", + "upstreamPath": "android/action/webhook/materialicons/black/res/drawable/baseline_webhook_24.xml", + "upstreamSha256": "6b1202ce1dd49e0049e38b057c578dfe3233563e04731ec6f99064d50d8b6a6f", + "localSha256": "15730220f80cba6b37978e493753b3127435ac1b6a6e1f50f62c221f3c3ec657", + "orderedPathDataSha256": "81930c2a9084ff78358fcc80e793eb40888e6cba5ea122a61f4ad5cf84a8e7d2", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/weekend.xml", + "upstreamIcon": "weekend", + "upstreamPath": "android/content/weekend/materialicons/black/res/drawable/baseline_weekend_24.xml", + "upstreamSha256": "d1e4f5572e5a2e9da952839b695ca03a72072a3779be2e14fa38b69811f975ce", + "localSha256": "050c5c335e52dc3896f7c19f61afd7b304b1e35df9fcf52f37dc9a4018315ec9", + "orderedPathDataSha256": "81510465dab7edd2533a0e9864c5b1d8fb6b121dda8a14e3d45490cd0483c697", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/west.xml", + "upstreamIcon": "west", + "upstreamPath": "android/navigation/west/materialicons/black/res/drawable/baseline_west_24.xml", + "upstreamSha256": "86f8b9a4fde56ffb1ce73c30ff7a1aeb96e550f084f335077315695dec9b1278", + "localSha256": "9f024307741ce88420db159b683ab78d59bfb36831dc2aefac96b0cd742a8476", + "orderedPathDataSha256": "2b852841ae360345e310424d3853fba9c7edef4baf0ecc1078697f9295cfddbc", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/whatsapp.xml", + "upstreamIcon": "whatsapp", + "upstreamPath": "android/social/whatsapp/materialicons/black/res/drawable/baseline_whatsapp_24.xml", + "upstreamSha256": "e46cf51d1f98789f4d87dcc65f7fe29ad0edea44c54a481cb0b0d9c5166a4c2e", + "localSha256": "5371d01e689f21a090ddca42ac8b867497f6c24a2e5a1bc0be7140b170fcf399", + "orderedPathDataSha256": "22f01597d37c576d893f772ac3c24883a38722f094c7196c393149b481008d94", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/whatshot.xml", + "upstreamIcon": "whatshot", + "upstreamPath": "android/social/whatshot/materialicons/black/res/drawable/baseline_whatshot_24.xml", + "upstreamSha256": "623416a13da9d1fd36ee00b883de87111d6c06fa339703a883b1d0bc7b33d663", + "localSha256": "f937cb4cb0bf2019b587ed4343a4cc95a25cc34162951a5fc358b2cd6e1e93a2", + "orderedPathDataSha256": "85405718a919075e92bf1b01293a9e51d01195e44585a3f228de4f131af717c1", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/wheelchair_pickup.xml", + "upstreamIcon": "wheelchair_pickup", + "upstreamPath": "android/places/wheelchair_pickup/materialicons/black/res/drawable/baseline_wheelchair_pickup_24.xml", + "upstreamSha256": "f2de4623bc50a867262bb75abd2230aff8133a4f9e0bda9d1c3aed0d895a5681", + "localSha256": "b170e5242ad8cab105f17210f8dcdfc1220bc197c565ca5c4ef221962ce5f723", + "orderedPathDataSha256": "89aa8266e5d4ff03b36ceb2c9e21c87d0521fde0cfa7807c76c42a8566abb357", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/where_to_vote.xml", + "upstreamIcon": "where_to_vote", + "upstreamPath": "android/content/where_to_vote/materialicons/black/res/drawable/baseline_where_to_vote_24.xml", + "upstreamSha256": "e6df76d2c3cb665c004e7457ac4584d3b8d1c0b205c08e39f4d639fb13b85d0e", + "localSha256": "2039d57857541c1424c322f78558c5b04de3bd21dce00ca57898036541e2b032", + "orderedPathDataSha256": "6508f0ba42bb3fda0a5567736f97b7b49a84325b3b7fe25d8ef193f8730b6ffc", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/widgets.xml", + "upstreamIcon": "widgets", + "upstreamPath": "android/device/widgets/materialicons/black/res/drawable/baseline_widgets_24.xml", + "upstreamSha256": "060d85bdf8d78fd26f7cbe72059de8bc4269e2ac06d6d402917e78648bd4e684", + "localSha256": "01842b1c6cf5dad39541b126b9aa6ad46b2a2e5f39be083c91c563c0a2f3314c", + "orderedPathDataSha256": "35b1ecedd83c852cd1167cf6206a74e2f1bb42bd774b34e8ca688b676450eaa0", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/width_full.xml", + "upstreamIcon": "width_full", + "upstreamPath": "android/action/width_full/materialicons/black/res/drawable/baseline_width_full_24.xml", + "upstreamSha256": "a86d4f5244cbf2a43a6140d029e5dbc56ce89591f7fd951638ba7fbe3687748d", + "localSha256": "d76b7ce586eebb5b2598336e1a0f7384484497724d88b5c746d75bfe0d13547e", + "orderedPathDataSha256": "a01973e790fa28399537076ca778257c9121f3fb31073c8455ad0a3853d560b3", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/width_normal.xml", + "upstreamIcon": "width_normal", + "upstreamPath": "android/action/width_normal/materialicons/black/res/drawable/baseline_width_normal_24.xml", + "upstreamSha256": "21781f5992b36dc95310122fba6cc712fca759de3ec3841b0f5b368197fd4c87", + "localSha256": "98296ce2b0af1c94c0f7b3e68095dc5b8e811cd6508b1e247cb6d6dde742ffb7", + "orderedPathDataSha256": "1b11b48db9700540bc2dd8d85fd8b5f5e9faa7dd01297d5566cdae1a79dd7232", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/width_wide.xml", + "upstreamIcon": "width_wide", + "upstreamPath": "android/action/width_wide/materialicons/black/res/drawable/baseline_width_wide_24.xml", + "upstreamSha256": "aad2344c00f3664e86ff28eca65aa9cebeae864a9aaa6c77c3e64c60dc57365a", + "localSha256": "82201a42e688b13e027a202e4481e5432912892b4af3d2db3637b7bd21c7b016", + "orderedPathDataSha256": "69be33f241c3daf3e309687f8baf9a82074bb2b96172253f198285ae8b50839a", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/wifi_1_bar.xml", + "upstreamIcon": "wifi_1_bar", + "upstreamPath": "android/device/wifi_1_bar/materialicons/black/res/drawable/baseline_wifi_1_bar_24.xml", + "upstreamSha256": "0bfd326fd8757e3ec7e3cf50e3f7fc8762bedc310e9a29e01681ac2009aa16fc", + "localSha256": "88eabfda7be86f46323e1bbd1082da5ae6325e734f08b4cf8274a500e78e9a85", + "orderedPathDataSha256": "7a2ea5e51593412f8e14a43dddf3d2a04ca203619b80ee04a497abce79eaa099", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/wifi_2_bar.xml", + "upstreamIcon": "wifi_2_bar", + "upstreamPath": "android/device/wifi_2_bar/materialicons/black/res/drawable/baseline_wifi_2_bar_24.xml", + "upstreamSha256": "5d675325eb1ecfb55ab2eb7fe434a9383cbbd26fa544c568f5e1113706275da0", + "localSha256": "8fcd251af722546435ada9d13ac32f5787b364995d97e53662859383e34bcd9e", + "orderedPathDataSha256": "88f936c5ed5d95cd8f3fbfbb73f90da567e7c8d6f3f9e5d9c4fed3d1b19f821e", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/wifi_calling_3.xml", + "upstreamIcon": "wifi_calling_3", + "upstreamPath": "android/device/wifi_calling_3/materialicons/black/res/drawable/baseline_wifi_calling_3_24.xml", + "upstreamSha256": "6e2caf5a60c243409245857c0c89206a594a053163dd44e900af72781c9adc33", + "localSha256": "4a3a80fa02d7ec8044008cc8de2469e2ad5a6cf7730badd476a1356864b96688", + "orderedPathDataSha256": "23c8d11994664780ea846d33d7078f9e63938839ea3e933989d69935b2c9b5c2", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/wifi_calling.xml", + "upstreamIcon": "wifi_calling", + "upstreamPath": "android/communication/wifi_calling/materialicons/black/res/drawable/baseline_wifi_calling_24.xml", + "upstreamSha256": "3d0fd3a6686837d3aed1956231b999f0925acf33fdd11ac905088c30882e7148", + "localSha256": "1cc87b4bc1f578f63e9f9c8c890b8394698f0e8d337b728ea893770d92a04783", + "orderedPathDataSha256": "45af29616c182bac401b02f0572a42ad395029681ece8381f17ed2a1d86458da", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/wifi_channel.xml", + "upstreamIcon": "wifi_channel", + "upstreamPath": "android/device/wifi_channel/materialicons/black/res/drawable/baseline_wifi_channel_24.xml", + "upstreamSha256": "0a54c2748ac7105162e503cd2317a2f8516ddedc3a2adce3d473b7228bd79e15", + "localSha256": "dafd73b5a56fc5954bda73798df70b16372b5229d695a1d75f2f994daefc6584", + "orderedPathDataSha256": "5c31b9190aeaeee7e94ae834fa98d5526eeecddda66b99d969c1a2b92189d421", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/wifi_find.xml", + "upstreamIcon": "wifi_find", + "upstreamPath": "android/device/wifi_find/materialicons/black/res/drawable/baseline_wifi_find_24.xml", + "upstreamSha256": "e504fe7d3dfe240dd3a64d4bd12c24cb16e5c6a700968ec470a724ba54b0036c", + "localSha256": "e5dfa99ef4f6a9140d0c987a4240371b6a3ae7d734171d2b3b3f6a4c316b9543", + "orderedPathDataSha256": "45bfe553c087115f2e72fb60d56c0930f373cfea0cf9b3e02e12f554fe4cce7e", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/wifi_lock.xml", + "upstreamIcon": "wifi_lock", + "upstreamPath": "android/device/wifi_lock/materialicons/black/res/drawable/baseline_wifi_lock_24.xml", + "upstreamSha256": "6b36aac9d19ff59e6fb5f213dd3bb8ec100fb45d31237b76f8fde3ca1be4c212", + "localSha256": "895f92f966b27da2b93c883bd512cefcb3f2b543ee0388842e606d28038f5376", + "orderedPathDataSha256": "14093d3908c1974f45f2d3172c721d651ecad810748c1aaa3c797d69fc4ea745", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/wifi_off.xml", + "upstreamIcon": "wifi_off", + "upstreamPath": "android/notification/wifi_off/materialicons/black/res/drawable/baseline_wifi_off_24.xml", + "upstreamSha256": "def4cc81ca9ac3d2a5a7972ea38e31238b9ecd479534dc7fcde652f0457df45b", + "localSha256": "23d8788736feda40faa0b59e0d93562bd69ebc7740bd2aea1c3a8b74b49a5733", + "orderedPathDataSha256": "b9a40a52df0d18d33add515c0ce1be0bf3093102bef734cf8b9a8e8dd99c41a3", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/wifi_password.xml", + "upstreamIcon": "wifi_password", + "upstreamPath": "android/device/wifi_password/materialicons/black/res/drawable/baseline_wifi_password_24.xml", + "upstreamSha256": "132f2213c5909670d122b2fb5a25e70ecb441e7bde2e4d1639dead5265e37325", + "localSha256": "14533cf54f4b41210443c8cb15d2e260afb57640624f25aa2be3b748bff8a76b", + "orderedPathDataSha256": "f05725846f39974a4e382a212c91027026d0a310824d049379c83e7b0fff801f", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/wifi_protected_setup.xml", + "upstreamIcon": "wifi_protected_setup", + "upstreamPath": "android/action/wifi_protected_setup/materialicons/black/res/drawable/baseline_wifi_protected_setup_24.xml", + "upstreamSha256": "ce28603d957a2a183e97497ea629ffcbc01bb6e77da08ba3a8ec6a808a37c855", + "localSha256": "7fb319d0dfdeec7597c68ab4ac58c4eb0c5ed3353b71a51329e4d3d3f932e25a", + "orderedPathDataSha256": "1bb1d898d176c069efa52817e12fc74e246595394cebb29a11d3ece844b18fcc", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/wifi_tethering_error_rounded.xml", + "upstreamIcon": "wifi_tethering_error_rounded", + "upstreamPath": "android/device/wifi_tethering_error_rounded/materialicons/black/res/drawable/baseline_wifi_tethering_error_rounded_24.xml", + "upstreamSha256": "9207a4545e06e9f3ca85a236fc552f06d25be0960801f29876c53c5451121db5", + "localSha256": "3a25878985924e1ef279540b31ea6c98d38ccba6a459e6786b9292119d7e2170", + "orderedPathDataSha256": "99ab78a89bebf7999fe5612db8832bc2f25b16fcd96749fabc83c6450989b6a9", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/wifi_tethering_error.xml", + "upstreamIcon": "wifi_tethering_error", + "upstreamPath": "android/device/wifi_tethering_error/materialicons/black/res/drawable/baseline_wifi_tethering_error_24.xml", + "upstreamSha256": "9207a4545e06e9f3ca85a236fc552f06d25be0960801f29876c53c5451121db5", + "localSha256": "cb03bff6f74a14fc10e14009e3200b1cc3be557d6311807a66ec7b00f80b9bd2", + "orderedPathDataSha256": "99ab78a89bebf7999fe5612db8832bc2f25b16fcd96749fabc83c6450989b6a9", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/wifi_tethering_off.xml", + "upstreamIcon": "wifi_tethering_off", + "upstreamPath": "android/device/wifi_tethering_off/materialicons/black/res/drawable/baseline_wifi_tethering_off_24.xml", + "upstreamSha256": "b83d446dd749e55f5720ee321142118efe7f87e16b9870bf3da475ddfbb3c23d", + "localSha256": "e87e46e64bfc025e436b5d20f347858263d0eebadc12c539cecdcf46d448ae54", + "orderedPathDataSha256": "04fc0baf82d697fdd9fc999c161070c5951327ab9fed0e9df73cd7f50a3d4078", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/wifi_tethering.xml", + "upstreamIcon": "wifi_tethering", + "upstreamPath": "android/device/wifi_tethering/materialicons/black/res/drawable/baseline_wifi_tethering_24.xml", + "upstreamSha256": "6b461cfbecec18b82c06d67cd29cb7f9f44e909e2d9765c8b3b38f64c93e3254", + "localSha256": "0bede3f515eff0a77b0d11c31558fbc09a372c65674febd19876ee1582898c4a", + "orderedPathDataSha256": "a86bc94168f24f24927d4539c937aabab21a1ef60080a2c7fd0961db2672dbd6", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/wifi.xml", + "upstreamIcon": "wifi", + "upstreamPath": "android/notification/wifi/materialicons/black/res/drawable/baseline_wifi_24.xml", + "upstreamSha256": "af8a978248b14a1e7084e6ee0bde824a15ecb80fd21ebfb4f726870e07c4995b", + "localSha256": "71ee2e76524723070fdb713cd68ddaa2eb20ca0028fa82165d36f9cbf432015c", + "orderedPathDataSha256": "03aca68fc4bfe8395ffd45482538046c7d964af992b6f285cd266d9c86ff4503", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/wind_power.xml", + "upstreamIcon": "wind_power", + "upstreamPath": "android/home/wind_power/materialicons/black/res/drawable/baseline_wind_power_24.xml", + "upstreamSha256": "4c70decf3f679fad413175e494f73479626444d14665a75f6fde3543acab411d", + "localSha256": "4be8bde9ecd257a72c194957238e36d86e5d0172ca5e54163b61840f06faab57", + "orderedPathDataSha256": "6cf8aec14a25c5e90e8f126126ef5981e2dae8456adb46c4e33c07d7875a23b2", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/window.xml", + "upstreamIcon": "window", + "upstreamPath": "android/search/window/materialicons/black/res/drawable/baseline_window_24.xml", + "upstreamSha256": "510ee1287abc12d0a634a0b81eadfb630117f749d4aaaf5b47059f3de6b2b04f", + "localSha256": "2219b67a2d7976050bfb632bf1cd22adf84bfe3d243900bc939af61f8dea750b", + "orderedPathDataSha256": "a88849b3a848b9e81d54b293a20af35e02272d5afbe8084e89fa3461cac02843", + "originalGeometryMatched": false, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/wine_bar.xml", + "upstreamIcon": "wine_bar", + "upstreamPath": "android/maps/wine_bar/materialicons/black/res/drawable/baseline_wine_bar_24.xml", + "upstreamSha256": "52fb78af938f590a986655b91fd9b63548cadf6f7f63be4a934924b3bee25086", + "localSha256": "0cffa4126a655c5bfec783362ce4a237cb76d4e94650532b23483b2cf092bc15", + "orderedPathDataSha256": "d6bc0ded44946b599f5782166fc141ddac007f8e1a8960c8c9f552d4cae37cbb", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/woman_2.xml", + "upstreamIcon": "woman_2", + "upstreamPath": "android/social/woman_2/materialicons/black/res/drawable/baseline_woman_2_24.xml", + "upstreamSha256": "0a6e347fd63d033da7fe16abd68880f5bf050c30af7584865b578bec62b33cbe", + "localSha256": "ecc8f8c3e803488a61180366a620fb8bab17752d9a28eb7342028ca161bd901d", + "orderedPathDataSha256": "e2cf7f3e5ff823d33ace1113754e13b36a4b4642c23e06ca086c6846817cf0b5", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/woman.xml", + "upstreamIcon": "woman", + "upstreamPath": "android/social/woman/materialicons/black/res/drawable/baseline_woman_24.xml", + "upstreamSha256": "864f10a0b6b39a9f048d0a6ad13e95a99ff56b142363445c8362c9a747547389", + "localSha256": "a9042504d9b7a92fbfad4e3842751eb7d1d8db8fa86dc2a33583e160353692b4", + "orderedPathDataSha256": "14aeaa6fefa64d983aaa3486f6adef4c3fec0772032ad06b5fd92be56c5109c3", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/work_history.xml", + "upstreamIcon": "work_history", + "upstreamPath": "android/action/work_history/materialicons/black/res/drawable/baseline_work_history_24.xml", + "upstreamSha256": "e09698212350650aaa38d547e77718da0d679f90aacf38d8b47c76596ad16bc2", + "localSha256": "d697db825e3ae4b3cc3773ab2e79637a03035370c16fd65af245a057f1087177", + "orderedPathDataSha256": "d206255cfa9798b346dfca41d2b81ba37efa4f5ff289302ff7bf5bb16a121e63", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/work_off.xml", + "upstreamIcon": "work_off", + "upstreamPath": "android/action/work_off/materialicons/black/res/drawable/baseline_work_off_24.xml", + "upstreamSha256": "5cb65e12d5b5e8b90601e072fbec8c9c0173ed2062dde8a559f50e339c59a4bc", + "localSha256": "949c0eb5adb71334d445a32b25f9c974c2990d95232fe6a7a16b0508e15724b4", + "orderedPathDataSha256": "e94bb085fafd106eccd5105f404b61fc369b468f166a93a868c7758ce8e13122", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/work_outline.xml", + "upstreamIcon": "work_outline", + "upstreamPath": "android/action/work_outline/materialicons/black/res/drawable/baseline_work_outline_24.xml", + "upstreamSha256": "454f56dc1862de0733fdc436973d1a552d0fd9b022b9c80b1d5bcdeb597f9a59", + "localSha256": "f18b780d6919c95b8e0db75cdef9683ad4c3b13ee1de9a644abb4d922c528ff1", + "orderedPathDataSha256": "a31fd3a5a1fe8f79480f2f20aee727615c1d956b808aa5e3e8065eab27fe4501", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillType", + "value": "evenOdd" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/work.xml", + "upstreamIcon": "work", + "upstreamPath": "android/action/work/materialicons/black/res/drawable/baseline_work_24.xml", + "upstreamSha256": "faef847dd6bc4b2cdb74db9ca9638ccfcc0fbfa16b614d8d1ea8f4904978e7e7", + "localSha256": "4279c7bb954e3b6210c871377721bef0a647e26f80298c6cac3756124aeb51bd", + "orderedPathDataSha256": "cbedfd7efca26c0d556cafaf808e38f9d3ce1d579db31edab9e9536b40f667d6", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/workspace_premium.xml", + "upstreamIcon": "workspace_premium", + "upstreamPath": "android/social/workspace_premium/materialicons/black/res/drawable/baseline_workspace_premium_24.xml", + "upstreamSha256": "033137a7f50f549300cb12a9c455c1aa330b3d799d260b47cbae349565044d12", + "localSha256": "e240d406ba5f043b8fc876021a1f80156dc91af7fbc3ef53b52dcec16c32de6e", + "orderedPathDataSha256": "02062d3c5b6f42fefe71ec226ad23ddb07f5b3c532045f1ffb088002d6f1e391", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/workspaces_filled.xml", + "upstreamIcon": "workspaces_filled", + "upstreamPath": "android/file/workspaces_filled/materialicons/black/res/drawable/baseline_workspaces_filled_24.xml", + "upstreamSha256": "1698d8afa5d989890a1bd39c2604df4f8adcf53b9c0aaa348989de53c43cab18", + "localSha256": "a4c7a18ec3e3835193edca04227ca75a530759ef715a38b238854fd615e76bed", + "orderedPathDataSha256": "30dc5782c4bf875fc51361b694772c062c7921fab68e1772982992d95391fb59", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/workspaces_outline.xml", + "upstreamIcon": "workspaces_outline", + "upstreamPath": "android/file/workspaces_outline/materialicons/black/res/drawable/baseline_workspaces_outline_24.xml", + "upstreamSha256": "a6309756c71f0c766ebf7c75f94e7d8a44f58a46da7c745e4e41ccd31c6bf5ca", + "localSha256": "ac930ca817a15982bb57ba2db44a9bbe6aa0732551fd9aa4464644dce1aac944", + "orderedPathDataSha256": "8e4f983866b277fa782fae322db00ef74a3a48e8298b7f154bc387522340fff5", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/workspaces.xml", + "upstreamIcon": "workspaces", + "upstreamPath": "android/file/workspaces/materialicons/black/res/drawable/baseline_workspaces_24.xml", + "upstreamSha256": "903b70080cf3efcd4be9ed5eaed0cb3110b4a57454d7a3450ef9fb6c55712bbb", + "localSha256": "23b762e624e2f379030da6bdb4211adec3c13420150b6c9b230803577d8c7c0a", + "orderedPathDataSha256": "f46c090edbadfa074ac7572db84c917e49a3e3731b10e5d504140af0f0426385", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/wrap_text.xml", + "upstreamIcon": "wrap_text", + "upstreamPath": "android/editor/wrap_text/materialicons/black/res/drawable/baseline_wrap_text_24.xml", + "upstreamSha256": "6dfdb0cf51c05828bb00464e8ffda2d055310273c823756a574eb91f4760cae1", + "localSha256": "11db141fba634f76536ed2ecf84901c312faa5698db35b9fe1f7b1f93cb8bc7a", + "orderedPathDataSha256": "e6755ab424fd31f7e5d030648246ab8ad64b8226f928656abc45d892ad9f24d6", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/wrong_location.xml", + "upstreamIcon": "wrong_location", + "upstreamPath": "android/maps/wrong_location/materialicons/black/res/drawable/baseline_wrong_location_24.xml", + "upstreamSha256": "80e251d8243d8030cccfc007bb0502bf5da68b93c20cf1bb59e70fd2e32d1239", + "localSha256": "77fa677b8c601f0d4029938f294ce9b3744cf4cbd46efd9ec77083b54dec77a7", + "orderedPathDataSha256": "f09cf3dcc8123856338e4fb0a58137e06190750626766af614866a86c5059e6d", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/wysiwyg.xml", + "upstreamIcon": "wysiwyg", + "upstreamPath": "android/action/wysiwyg/materialicons/black/res/drawable/baseline_wysiwyg_24.xml", + "upstreamSha256": "c9a930467fcced28f93e669cb77f2a598580dd81b35bd4b51196a3a6cf5bc4c5", + "localSha256": "56d65c76e712550b96fef7d7063af443bb0d54e18d591e5e29ca368cfb5f9d8d", + "orderedPathDataSha256": "0a8b1747b669e36e610401e0bc8aafcf84398ca9b2888aaaaa9500f9a23550fe", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/yard.xml", + "upstreamIcon": "yard", + "upstreamPath": "android/search/yard/materialicons/black/res/drawable/baseline_yard_24.xml", + "upstreamSha256": "76e227506e3f180d3f1c23cf4e93e1aa212ae9a3c2e2f4d7895ba41d031f8f30", + "localSha256": "18c46900f18adf0655f9991dceb363308e4e6f4e4ba2606172929f951a873944", + "orderedPathDataSha256": "291395a883fac1d5cb905cec5c7a5207fd96c0ae94e4f8b0e39adf924f9f2844", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/youtube_searched_for.xml", + "upstreamIcon": "youtube_searched_for", + "upstreamPath": "android/action/youtube_searched_for/materialicons/black/res/drawable/baseline_youtube_searched_for_24.xml", + "upstreamSha256": "09c4e54e54d2594cc85638bd530b13cb00030745c0fa682b5461566fe3185fff", + "localSha256": "39191aa002ad66925e11719bb9f4833384dfec6aded9e97b4c07204e7d6a5ac4", + "orderedPathDataSha256": "cb366b281991b6a5aea2bba04ec5a148abe46a00bcbdda3aff8858233d80d03d", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/zoom_in_map.xml", + "upstreamIcon": "zoom_in_map", + "upstreamPath": "android/maps/zoom_in_map/materialicons/black/res/drawable/baseline_zoom_in_map_24.xml", + "upstreamSha256": "b5ea608506f2a4792c97bcd543bc27c7893f148e5b08421a8f727c4d4b9cb3f1", + "localSha256": "46502eef7afc51fdc24910e4a7d9bcca479975e1b8b48c7d256525a10437a0a7", + "orderedPathDataSha256": "96e56045d5b43c2bcc0ee4fede5c306dc8cceabf3a53e2443b8d6a802fa69918", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/zoom_in.xml", + "upstreamIcon": "zoom_in", + "upstreamPath": "android/action/zoom_in/materialicons/black/res/drawable/baseline_zoom_in_24.xml", + "upstreamSha256": "7bbeab077b5107709ce2511c983c97cc8790ba9a2af874ce1751d3c4e9a0d614", + "localSha256": "4bc2c7ddee3db81eb9934e4d75ad51e29018cefe8878c398bd0c3cf24d5fb3b9", + "orderedPathDataSha256": "33dde5eb656757542109e90dec229733332f87eb4c0129c90ccb2ee8dc4e2c6b", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/zoom_out_map.xml", + "upstreamIcon": "zoom_out_map", + "upstreamPath": "android/maps/zoom_out_map/materialicons/black/res/drawable/baseline_zoom_out_map_24.xml", + "upstreamSha256": "47bc298dde32fadcb266a46628b435382500a12949cf780b60f6f0f817d87d9e", + "localSha256": "7a346305979fee3c98de0ddb3370066d13a5c8d3209e7ba29502b638db20cd65", + "orderedPathDataSha256": "7fc27ea257052653311d90ad9efdeb1916366ae6be42900f52d0dd3875a74f25", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + }, + { + "resource": "qqq/android/mobileapp/src/main/res/drawable/zoom_out.xml", + "upstreamIcon": "zoom_out", + "upstreamPath": "android/action/zoom_out/materialicons/black/res/drawable/baseline_zoom_out_24.xml", + "upstreamSha256": "2cea55414971a72da68aa1a2d563b12fb96f67e7acb0c2fb7add1bdfd2259cc4", + "localSha256": "242e3e316a4263e7cbe11b7d50664faf33591064058c4d6c9c058698253a975a", + "orderedPathDataSha256": "0313bfca6c417a4abac07255fd1b8a18726828634d694fb863f34b7abf08d5d4", + "originalGeometryMatched": true, + "styling": [ + { + "element": "vector", + "attribute": "width", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "height", + "value": "24dp" + }, + { + "element": "vector", + "attribute": "viewportWidth", + "value": "24" + }, + { + "element": "vector", + "attribute": "viewportHeight", + "value": "24" + }, + { + "element": "path", + "attribute": "fillColor", + "value": "#FF000000" + } + ] + } + ] +} diff --git a/docs/test-barcodes/leading-zero-qr.png b/docs/test-barcodes/leading-zero-qr.png new file mode 100644 index 0000000..8c08da0 Binary files /dev/null and b/docs/test-barcodes/leading-zero-qr.png differ diff --git a/docs/third-party/APPAUTH-VERIFICATION.md b/docs/third-party/APPAUTH-VERIFICATION.md new file mode 100644 index 0000000..1cc763c --- /dev/null +++ b/docs/third-party/APPAUTH-VERIFICATION.md @@ -0,0 +1,22 @@ +# AppAuth 0.11.1 package verification + +Read-only verification on October 31, 2026. This records attribution evidence, not legal clearance. It supplements the earlier 130-entry/native qualification with the new OAuth2 dependency. + +- Resolved `net.openid:appauth:0.11.1` AAR SHA-256: `D9FF43B14F7EE8E81BC802148190AD808BEB5389953E6E6FFA53CD5575EA611E`. +- POM SHA-256: `F1D8F1CC0A94E0F6FDF74B8C094F0FF37887B91D5C12B2B7E7B0436F39C76C3D`. It identifies AppAuth for Android, Iain McGinniss, the OpenID repository and Apache Software License 2.0. +- The AAR and nested classes.jar contain no separate LICENSE/NOTICE entry; the AAR contains no native library. +- Upstream tag `0.11.1`, tree `5966cc7efc1c7cacf78598ecae45b5e7d9365f9c`, contains root LICENSE and no separate NOTICE. Its LICENSE blob is `2bb9ad240fa04c8cf706a4901c4807878e90c2dc`, 10,172 bytes, SHA-256 `59899C6091B540582ED617E8EEAAC4919DC985CCFC35459EE9752B699BE5205B`. +- The bundled Apache text contains those complete terms plus the standard application appendix. Different full-file hashes do not indicate missing license terms. + +The inspected debug and E2E APKs each contain the generated `res/raw/aboutlibraries.json` byte-for-byte: 131 component entries, comprising 126 external runtime entries and five supplemental notices, with nine complete license/notice texts. AppAuth records its exact coordinate/version, author, description and website/SCM with an Apache-2.0 reference. Every referenced text is nonempty. Settings' existing offline license viewer uses these bundled definitions. + +| Artifact | SHA-256 | +| --- | --- | +| Debug APK | `CD048AA081E6F34DC53A17F5C535C10116E7C2CF51E1E0234A3330596E979A25` | +| Debug notice report and APK resource | `F624D7996198AD9A47DBB21D8400E7630DE7A251E4AB808D8860B34C0631F4D8` | +| E2E APK | `608F07B898ACE1F2E91263749C2B46D5F4015828CD8646A3377C14A77506D7C5` | +| E2E notice report and APK resource | `4880E92145CB314BF8D31AAB23E014A38E68B2D9BBF9DF9095BEDFB3E0964A6F` | + +Both APKs contain exactly eight native libraries, all matching the prior [native provenance inventory](native-binaries-provenance.json). AppAuth adds none. These hashes identify the inspected bytes; subsequent rebuilds require their own byte verification. The earlier unsigned release APK was not rebuilt for this addition and is not an AppAuth-enabled release. Production signing and distribution remain deferred. + +Primary evidence: [tagged upstream source](https://github.com/openid/AppAuth-Android/tree/0.11.1), [tagged license](https://github.com/openid/AppAuth-Android/blob/0.11.1/LICENSE). diff --git a/docs/third-party/NATIVE-NOTICES.md b/docs/third-party/NATIVE-NOTICES.md new file mode 100644 index 0000000..9d1946d --- /dev/null +++ b/docs/third-party/NATIVE-NOTICES.md @@ -0,0 +1,46 @@ +# Native binary attribution review — 2026-10-31 + +The scanner contains two native libraries for four ABIs each. This review follows the actual binaries beyond their Maven POM declarations. [The provenance manifest](native-binaries-provenance.json) records all eight `.so` hashes, source hashes, exact AAR URLs/hashes, and the inspected APK hash. Every inspected APK native entry matches its official Google Maven AAR byte for byte. No native library was rebuilt, replaced or relicensed. + +| Published artifact | Cached and independently downloaded AAR SHA-256 | Release source revision | +| --- | --- | --- | +| `androidx.graphics:graphics-path:1.0.1` | `8CA4032B6D79B351F0B59AD4B580EDDBB9423E1652F7C958830687F1EEE2EC03` | `8a05a22af450d589ef911d772a001a49dcb05b71` | +| `androidx.datastore:datastore-core-android:1.1.1` | `883ABC911E4B14119959E44E20A520523F59C303E834D6B325007B3EE5E9CB6C` | `4e91af5f5597ac6275559f2ce4bc2f5cc852bddb` | + +The source revisions come from Google's exact-version release links: [Graphics Path 1.0.1](https://developer.android.com/jetpack/androidx/releases/graphics#graphics-path-1.0.1) and [DataStore 1.1.1](https://developer.android.com/jetpack/androidx/releases/datastore#1.1.1), both released May 1, 2024. Their source JARs omit the C++ implementation, so the review also read the pinned upstream native sources and build files. This establishes a published artifact/source association, not an independently reproduced build or compiler attestation. + +## Native implementation and included code + +Graphics Path builds `Conic.cpp`, `PathIterator.cpp` and `pathway.cpp` with local headers. Its included `math/vec2.h`, `TVecHelpers.h` and `compiler.h` are Filament math headers under Apache-2.0 with Android Open Source Project copyright notices from 2013 and 2017. The path/conic implementation retains 2022 and 2006 AOSP notices. All examined implementation and local headers are Apache-2.0; the minimum Skia structure declarations in `Path.h` do not establish that a separate Skia binary is distributed. [Pinned native tree](https://android.googlesource.com/platform/frameworks/support/+/8a05a22af450d589ef911d772a001a49dcb05b71/graphics/graphics-path/src/main/cpp/). + +DataStore builds `shared_counter.cc` and `jni/androidx_datastore_core_SharedCounter.cc`, with its local header and NDK `<atomic>`/JNI headers. Its implementation is Apache-2.0, copyright 2022 AOSP. The exact NDK JNI header is Apache-2.0, copyright 2006 AOSP. [Pinned native tree](https://android.googlesource.com/platform/frameworks/support/+/4e91af5f5597ac6275559f2ce4bc2f5cc852bddb/datastore/datastore-core/src/androidMain/cpp/). + +AboutLibraries supplemental records merge these notices into the existing two dependency entries, placing the native copyright/full Apache text first so its stock viewer displays it. The Maven artifact license remains Apache-2.0. + +## Toolchain and startup support + +The standard `readelf.py` from pyelftools 0.32 inspected dynamic dependencies, symbols, `.note.android.ident` and `.comment` for every ABI. All eight binaries identify **NDK r25c, build 9519653**, with Android Clang 14.0.7 (`9352603`, based on `r450784d1`) and LLVM source revision `4c603efb0cca074e9238af8b4106c30add4418f6`. Google's [pinned NDK prebuilt](https://android.googlesource.com/toolchain/prebuilts/ndk/r25/+/1622e087e1b881a0c7c744091d314662d12f0997/source.properties) confirms version `25.2.9519653`. Its ARM64 API21 `crtbegin_so.o` has the same Android build-identification note and compiler identity as the inspected native libraries. + +All eight ELF `DT_NEEDED` lists contain only `libm.so`, `libdl.so` and `libc.so`. The APK contains no separate `libc++_shared.so`. Graphics Path explicitly uses `-nostdlib++`, disables exceptions/RTTI and removes unused sections in its [pinned build configuration](https://android.googlesource.com/platform/frameworks/support/+/8a05a22af450d589ef911d772a001a49dcb05b71/graphics/graphics-path/build.gradle). These facts do **not** prove that no header-generated or statically linked compiler support exists; the following notices cover that support separately. + +- **Bionic startup/termination/build-identification objects:** the `crtbegin_so.c`, `crtend_so.S` and `crtbrand.S` source headers retain BSD-2-Clause notices, copyright 2012, 2013 and 2015 AOSP. The included `atexit.h` and `__dso_handle_so.h` share the 2012 notice; `pthread_atfork.h` uses Apache-2.0 (2015 AOSP), and its body is conditional on API23 or a forced CRT flag. The [pinned reference sources](https://android.googlesource.com/platform/bionic/+/0b981d1ec055efaef86d8a5d402cf1b3167ba10b/libc/arch-common/bionic/) and the exact NDK's NOTICE corroborate these terms. [The retained BSD notices](native-AOSP-BSD-2-Clause.txt) appear in the separate **Android NDK Bionic startup support** viewer entry. This does not claim that the device's system libc/libm/libdl implementations are shipped by the application. +- **LLVM C++ headers and compiler runtime:** the exact NDK `<atomic>` header declares `Apache-2.0 WITH LLVM-exception`. The [matching LLVM source](https://android.googlesource.com/toolchain/llvm-project/+/4c603efb0cca074e9238af8b4106c30add4418f6/) provides full libc++ and compiler-rt licenses, including the object-code exception and retained historical terms. Both complete upstream files are retained as [libc++](native-LLVM-libcxx-LICENSE.txt) and [compiler-rt](native-LLVM-compiler-rt-LICENSE.txt), and appear together in the **Android NDK LLVM runtime and C++ headers** entry. Including them avoids relying on an inferred absence of embedded support or applying the compiler exception as a blanket waiver. It does not claim the whole LLVM toolchain is bundled. + +The corresponding SPDX allowances are restricted to those exact supplemental entries. The build also pins this native review to Graphics Path 1.0.1, DataStore Core Android 1.1.1 and NDK 25.2.9519653. Changing either dependency requires renewed native/source/toolchain review; a new dependency cannot inherit the BSD or LLVM allowance silently. + +## Verification and limits + +Before adding the native notices, negative build checks removed one real runtime dependency and then blanked Apache license text in generated output. Each failed for the intended reason; generated JSON was restored byte for byte, all three positive variant checks passed, and the already-tested E2E APK stayed unchanged. After the native additions, debug, release and E2E metadata checks pass with **125 resolved runtime dependencies and 130 notice entries**, including five supplemental components. The two native dependency overrides merge existing entries instead of inflating the runtime count. + +Final bounded packaging passed on 2026-10-31: debug APK, E2E APK/test APK, unsigned release APK and `lintRelease` (zero errors/warnings), 273 tasks in 2m32s. The manifest retains the earlier device-tested APK as historical native-byte evidence and separately records all final package hashes. Each final host APK contains **130 entries and nine complete license/notice texts**, byte-for-byte identical to its validated variant report. All eight native hashes match the reviewed AARs in every APK; no MP3 recordings remain. Release resource optimization renames the notice file to `res/M7.json`; SDK `aapt2 dump resources` resolves it from `raw/aboutlibraries`, so verification does not assume the debug ZIP path. + +| Final artifact | SHA-256 | +| --- | --- | +| Debug APK | `E12CFB7F078AD0C5F28EED717880187F394379C9532EA2D5828A228D1E4A134F` | +| E2E APK | `733285E6BE30B67A46BF2810F07376379C94E4AE529746F321262AB86CCF0740` | +| E2E instrumentation APK | `E697023F2F31F98F5F4A9A82E4A91FE8A8F5B48B08687DD784FE9960947EED35` | +| Unsigned release APK | `924D7EC15F93957073F0D9B47348F0E4CF7F272FBB4EBE4100FEDCBD8DB027A2` | + +SDK `apkanalyzer` confirms the actual release APK is non-debuggable; its decoded application manifest sets `usesCleartextTraffic`, `allowBackup` and `fullBackupContent` to false, with no overriding network security configuration. SDK `aapt2` decoding confirms both cloud-backup and device-transfer exclusions for root, file, database, sharedpref and external domains at path `.`. SDK `apksigner` confirms the expected absence of a signature. No signing environment, key or identity was changed. Final production signing/distribution and upgrade acceptance remain separate gates. + +The prior offline viewer test passed on TC22; this final packaging pass performed no device actions. No general legal clearance or claim of a fully reproduced upstream toolchain build is made. Stripped binaries limit instruction-level source attribution; the review conservatively retains identified runtime/header/startup notices instead of treating a Maven POM or missing dynamic symbol as complete evidence. diff --git a/docs/third-party/material-design-icons-LICENSE.txt b/docs/third-party/material-design-icons-LICENSE.txt new file mode 100644 index 0000000..7a4a3ea --- /dev/null +++ b/docs/third-party/material-design-icons-LICENSE.txt @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. \ No newline at end of file diff --git a/docs/third-party/native-AOSP-BSD-2-Clause.txt b/docs/third-party/native-AOSP-BSD-2-Clause.txt new file mode 100644 index 0000000..600a780 --- /dev/null +++ b/docs/third-party/native-AOSP-BSD-2-Clause.txt @@ -0,0 +1,84 @@ +crtbegin_so.c +Copyright (C) 2012 The Android Open Source Project +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS +OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED +AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT +OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +SUCH DAMAGE. + +============================================================ + +crtend_so.S +Copyright (C) 2013 The Android Open Source Project +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS +OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED +AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT +OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +SUCH DAMAGE. + +============================================================ + +crtbrand.S +Copyright (C) 2015 The Android Open Source Project +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS +OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED +AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT +OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +SUCH DAMAGE. diff --git a/docs/third-party/native-LLVM-compiler-rt-LICENSE.txt b/docs/third-party/native-LLVM-compiler-rt-LICENSE.txt new file mode 100644 index 0000000..5a79a1b --- /dev/null +++ b/docs/third-party/native-LLVM-compiler-rt-LICENSE.txt @@ -0,0 +1,311 @@ +============================================================================== +The LLVM Project is under the Apache License v2.0 with LLVM Exceptions: +============================================================================== + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + +---- LLVM Exceptions to the Apache 2.0 License ---- + +As an exception, if, as a result of your compiling your source code, portions +of this Software are embedded into an Object form of such source code, you +may redistribute such embedded portions in such Object form without complying +with the conditions of Sections 4(a), 4(b) and 4(d) of the License. + +In addition, if you combine or link compiled forms of this Software with +software that is licensed under the GPLv2 ("Combined Software") and if a +court of competent jurisdiction determines that the patent provision (Section +3), the indemnity provision (Section 9) or other Section of the License +conflicts with the conditions of the GPLv2, you may retroactively and +prospectively choose to deem waived or otherwise exclude such Section(s) of +the License, but only in their entirety and only with respect to the Combined +Software. + +============================================================================== +Software from third parties included in the LLVM Project: +============================================================================== +The LLVM Project contains third party software which is under different license +terms. All such code will be identified clearly using at least one of two +mechanisms: +1) It will be in a separate directory tree with its own `LICENSE.txt` or + `LICENSE` file at the top containing the specific license and restrictions + which apply to that software, or +2) It will contain specific license and restriction terms at the top of every + file. + +============================================================================== +Legacy LLVM License (https://llvm.org/docs/DeveloperPolicy.html#legacy): +============================================================================== + +The compiler_rt library is dual licensed under both the University of Illinois +"BSD-Like" license and the MIT license. As a user of this code you may choose +to use it under either license. As a contributor, you agree to allow your code +to be used under both. + +Full text of the relevant licenses is included below. + +============================================================================== + +University of Illinois/NCSA +Open Source License + +Copyright (c) 2009-2019 by the contributors listed in CREDITS.TXT + +All rights reserved. + +Developed by: + + LLVM Team + + University of Illinois at Urbana-Champaign + + http://llvm.org + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal with +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimers. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimers in the + documentation and/or other materials provided with the distribution. + + * Neither the names of the LLVM Team, University of Illinois at + Urbana-Champaign, nor the names of its contributors may be used to + endorse or promote products derived from this Software without specific + prior written permission. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE +SOFTWARE. + +============================================================================== + +Copyright (c) 2009-2015 by the contributors listed in CREDITS.TXT + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/docs/third-party/native-LLVM-libcxx-LICENSE.txt b/docs/third-party/native-LLVM-libcxx-LICENSE.txt new file mode 100644 index 0000000..e159d28 --- /dev/null +++ b/docs/third-party/native-LLVM-libcxx-LICENSE.txt @@ -0,0 +1,311 @@ +============================================================================== +The LLVM Project is under the Apache License v2.0 with LLVM Exceptions: +============================================================================== + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + +---- LLVM Exceptions to the Apache 2.0 License ---- + +As an exception, if, as a result of your compiling your source code, portions +of this Software are embedded into an Object form of such source code, you +may redistribute such embedded portions in such Object form without complying +with the conditions of Sections 4(a), 4(b) and 4(d) of the License. + +In addition, if you combine or link compiled forms of this Software with +software that is licensed under the GPLv2 ("Combined Software") and if a +court of competent jurisdiction determines that the patent provision (Section +3), the indemnity provision (Section 9) or other Section of the License +conflicts with the conditions of the GPLv2, you may retroactively and +prospectively choose to deem waived or otherwise exclude such Section(s) of +the License, but only in their entirety and only with respect to the Combined +Software. + +============================================================================== +Software from third parties included in the LLVM Project: +============================================================================== +The LLVM Project contains third party software which is under different license +terms. All such code will be identified clearly using at least one of two +mechanisms: +1) It will be in a separate directory tree with its own `LICENSE.txt` or + `LICENSE` file at the top containing the specific license and restrictions + which apply to that software, or +2) It will contain specific license and restriction terms at the top of every + file. + +============================================================================== +Legacy LLVM License (https://llvm.org/docs/DeveloperPolicy.html#legacy): +============================================================================== + +The libc++ library is dual licensed under both the University of Illinois +"BSD-Like" license and the MIT license. As a user of this code you may choose +to use it under either license. As a contributor, you agree to allow your code +to be used under both. + +Full text of the relevant licenses is included below. + +============================================================================== + +University of Illinois/NCSA +Open Source License + +Copyright (c) 2009-2019 by the contributors listed in CREDITS.TXT + +All rights reserved. + +Developed by: + + LLVM Team + + University of Illinois at Urbana-Champaign + + http://llvm.org + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal with +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimers. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimers in the + documentation and/or other materials provided with the distribution. + + * Neither the names of the LLVM Team, University of Illinois at + Urbana-Champaign, nor the names of its contributors may be used to + endorse or promote products derived from this Software without specific + prior written permission. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE +SOFTWARE. + +============================================================================== + +Copyright (c) 2009-2014 by the contributors listed in CREDITS.TXT + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/docs/third-party/native-binaries-provenance.json b/docs/third-party/native-binaries-provenance.json new file mode 100644 index 0000000..d6433b0 --- /dev/null +++ b/docs/third-party/native-binaries-provenance.json @@ -0,0 +1,268 @@ +{ + "reviewedAt": "2026-10-31", + "verifiedApk": "scanner-host/build/outputs/apk/e2e/scanner-host-e2e.apk", + "verifiedApkSha256": "38A91781F4B4DDBD4260FEE34A5C2362D46ACB9F2E602C6582C31A9E462616AA", + "ndkRevision": "25.2.9519653", + "ndkPrebuiltRevision": "1622e087e1b881a0c7c744091d314662d12f0997", + "llvmRevision": "4c603efb0cca074e9238af8b4106c30add4418f6", + "bionicReferenceRevision": "0b981d1ec055efaef86d8a5d402cf1b3167ba10b", + "artifacts": [ + { + "artifact": "graphics-path-1.0.1", + "url": "https://dl.google.com/dl/android/maven2/androidx/graphics/graphics-path/1.0.1/graphics-path-1.0.1.aar", + "aarSha256": "8CA4032B6D79B351F0B59AD4B580EDDBB9423E1652F7C958830687F1EEE2EC03", + "entry": "jni/x86_64/libandroidx.graphics.path.so", + "bytes": 10760, + "nativeSha256": "4E56C996F13670E70082658DE7880C4020EABF4F25E43387F88ED78A713FC9F0", + "apkEntry": "lib/x86_64/libandroidx.graphics.path.so", + "neededLibraries": [ + "libm.so", + "libdl.so", + "libc.so" + ], + "sourceRevision": "8a05a22af450d589ef911d772a001a49dcb05b71" + }, + { + "artifact": "graphics-path-1.0.1", + "url": "https://dl.google.com/dl/android/maven2/androidx/graphics/graphics-path/1.0.1/graphics-path-1.0.1.aar", + "aarSha256": "8CA4032B6D79B351F0B59AD4B580EDDBB9423E1652F7C958830687F1EEE2EC03", + "entry": "jni/arm64-v8a/libandroidx.graphics.path.so", + "bytes": 10096, + "nativeSha256": "41E9A793C43A0F4FDDB19E33F346BACE464F30F888BA7B9EAF96294EA115BFB6", + "apkEntry": "lib/arm64-v8a/libandroidx.graphics.path.so", + "neededLibraries": [ + "libm.so", + "libdl.so", + "libc.so" + ], + "sourceRevision": "8a05a22af450d589ef911d772a001a49dcb05b71" + }, + { + "artifact": "graphics-path-1.0.1", + "url": "https://dl.google.com/dl/android/maven2/androidx/graphics/graphics-path/1.0.1/graphics-path-1.0.1.aar", + "aarSha256": "8CA4032B6D79B351F0B59AD4B580EDDBB9423E1652F7C958830687F1EEE2EC03", + "entry": "jni/armeabi-v7a/libandroidx.graphics.path.so", + "bytes": 7252, + "nativeSha256": "41399EBA6FC2A60F6F14642375C1824F3CF25EB8FEC7397D753730A3CEDA3E2B", + "apkEntry": "lib/armeabi-v7a/libandroidx.graphics.path.so", + "neededLibraries": [ + "libm.so", + "libdl.so", + "libc.so" + ], + "sourceRevision": "8a05a22af450d589ef911d772a001a49dcb05b71" + }, + { + "artifact": "graphics-path-1.0.1", + "url": "https://dl.google.com/dl/android/maven2/androidx/graphics/graphics-path/1.0.1/graphics-path-1.0.1.aar", + "aarSha256": "8CA4032B6D79B351F0B59AD4B580EDDBB9423E1652F7C958830687F1EEE2EC03", + "entry": "jni/x86/libandroidx.graphics.path.so", + "bytes": 9284, + "nativeSha256": "EB0570B41FD3BFF25D8204A967C03BD7550719E768B791F680CC40CBE35F29AF", + "apkEntry": "lib/x86/libandroidx.graphics.path.so", + "neededLibraries": [ + "libm.so", + "libdl.so", + "libc.so" + ], + "sourceRevision": "8a05a22af450d589ef911d772a001a49dcb05b71" + }, + { + "artifact": "datastore-core-android-1.1.1", + "url": "https://dl.google.com/dl/android/maven2/androidx/datastore/datastore-core-android/1.1.1/datastore-core-android-1.1.1.aar", + "aarSha256": "883ABC911E4B14119959E44E20A520523F59C303E834D6B325007B3EE5E9CB6C", + "entry": "jni/arm64-v8a/libdatastore_shared_counter.so", + "bytes": 7112, + "nativeSha256": "D3E48717C9AA147E0AB21063BA0E8E0211CABF8BF40B222640829519EDBF58E1", + "apkEntry": "lib/arm64-v8a/libdatastore_shared_counter.so", + "neededLibraries": [ + "libm.so", + "libdl.so", + "libc.so" + ], + "sourceRevision": "4e91af5f5597ac6275559f2ce4bc2f5cc852bddb" + }, + { + "artifact": "datastore-core-android-1.1.1", + "url": "https://dl.google.com/dl/android/maven2/androidx/datastore/datastore-core-android/1.1.1/datastore-core-android-1.1.1.aar", + "aarSha256": "883ABC911E4B14119959E44E20A520523F59C303E834D6B325007B3EE5E9CB6C", + "entry": "jni/armeabi-v7a/libdatastore_shared_counter.so", + "bytes": 4416, + "nativeSha256": "716C5D8D2CAC8CA0EDF65DA8F139C7886B726AC79D542A14EDEB94994BA6D3DC", + "apkEntry": "lib/armeabi-v7a/libdatastore_shared_counter.so", + "neededLibraries": [ + "libm.so", + "libdl.so", + "libc.so" + ], + "sourceRevision": "4e91af5f5597ac6275559f2ce4bc2f5cc852bddb" + }, + { + "artifact": "datastore-core-android-1.1.1", + "url": "https://dl.google.com/dl/android/maven2/androidx/datastore/datastore-core-android/1.1.1/datastore-core-android-1.1.1.aar", + "aarSha256": "883ABC911E4B14119959E44E20A520523F59C303E834D6B325007B3EE5E9CB6C", + "entry": "jni/x86/libdatastore_shared_counter.so", + "bytes": 5148, + "nativeSha256": "CD4A1649E2C8350703146F94A6EE2BF4C3C8C9F172159F805B61A4A2ABDF0659", + "apkEntry": "lib/x86/libdatastore_shared_counter.so", + "neededLibraries": [ + "libm.so", + "libdl.so", + "libc.so" + ], + "sourceRevision": "4e91af5f5597ac6275559f2ce4bc2f5cc852bddb" + }, + { + "artifact": "datastore-core-android-1.1.1", + "url": "https://dl.google.com/dl/android/maven2/androidx/datastore/datastore-core-android/1.1.1/datastore-core-android-1.1.1.aar", + "aarSha256": "883ABC911E4B14119959E44E20A520523F59C303E834D6B325007B3EE5E9CB6C", + "entry": "jni/x86_64/libdatastore_shared_counter.so", + "bytes": 6224, + "nativeSha256": "FB6C9208988C49AE94943BC3236FA763BA584722E044FA4EA9A12D2941027105", + "apkEntry": "lib/x86_64/libdatastore_shared_counter.so", + "neededLibraries": [ + "libm.so", + "libdl.so", + "libc.so" + ], + "sourceRevision": "4e91af5f5597ac6275559f2ce4bc2f5cc852bddb" + } + ], + "sourceFiles": [ + { + "url": "https://android.googlesource.com/platform/frameworks/support/+/4e91af5f5597ac6275559f2ce4bc2f5cc852bddb/datastore/datastore-core/src/androidMain/cpp/jni/androidx_datastore_core_SharedCounter.cc", + "sha256": "ADDE5C7D79854F584E413277A03BD25BA4055C110D70C327D42F496E8FC4CE93" + }, + { + "url": "https://android.googlesource.com/platform/frameworks/support/+/4e91af5f5597ac6275559f2ce4bc2f5cc852bddb/datastore/datastore-core/src/androidMain/cpp/shared_counter.cc", + "sha256": "DE6380BC98DF78F37DEAFF1B85B03D0309D911EA973449B2E828115145D02166" + }, + { + "url": "https://android.googlesource.com/platform/frameworks/support/+/4e91af5f5597ac6275559f2ce4bc2f5cc852bddb/datastore/datastore-core/src/androidMain/cpp/shared_counter.h", + "sha256": "81A607D69505F760D51CC1C4477FFB6F5269EDA72811B3E9D71C7F1117A5A158" + }, + { + "url": "https://android.googlesource.com/platform/frameworks/support/+/8a05a22af450d589ef911d772a001a49dcb05b71/graphics/graphics-path/src/main/cpp/math/compiler.h", + "sha256": "D53E85383580E5DBF81CBCB24426B0FE1BF419B4837540242DBDCA3F1DF4CF66" + }, + { + "url": "https://android.googlesource.com/platform/frameworks/support/+/8a05a22af450d589ef911d772a001a49dcb05b71/graphics/graphics-path/src/main/cpp/Conic.cpp", + "sha256": "49B3DA93AA43480CF9CD481590BE48705CB9340C52E5D09635EFBD0ECE07BE83" + }, + { + "url": "https://android.googlesource.com/platform/frameworks/support/+/8a05a22af450d589ef911d772a001a49dcb05b71/graphics/graphics-path/src/main/cpp/Conic.h", + "sha256": "CD315AD7C8D030C72E96893E9A0FEEC463D72D2066209A203DEDCF0925398A6F" + }, + { + "url": "https://android.googlesource.com/platform/frameworks/support/+/8a05a22af450d589ef911d772a001a49dcb05b71/graphics/graphics-path/src/main/cpp/Path.h", + "sha256": "4EE841338063D8C6F71FF4C655ECF52559F6C6DF9AF79835388DAE1EBCD8B982" + }, + { + "url": "https://android.googlesource.com/platform/frameworks/support/+/8a05a22af450d589ef911d772a001a49dcb05b71/graphics/graphics-path/src/main/cpp/PathIterator.cpp", + "sha256": "3705946B43BF894E013F46CCC940F9923F43285340F8FC2128F95C59238EC7F8" + }, + { + "url": "https://android.googlesource.com/platform/frameworks/support/+/8a05a22af450d589ef911d772a001a49dcb05b71/graphics/graphics-path/src/main/cpp/PathIterator.h", + "sha256": "A16E99B0273FB7205607EB0CF51FC7BE518A55F3446A304F92ECAB353E77BE6F" + }, + { + "url": "https://android.googlesource.com/platform/frameworks/support/+/8a05a22af450d589ef911d772a001a49dcb05b71/graphics/graphics-path/src/main/cpp/pathway.cpp", + "sha256": "4BE68D6FDB6376E95560F7C49A79AA0CD97218D758CF11EA3230AC9124485800" + }, + { + "url": "https://android.googlesource.com/platform/frameworks/support/+/8a05a22af450d589ef911d772a001a49dcb05b71/graphics/graphics-path/src/main/cpp/scalar.h", + "sha256": "B1D2BBA80A4C9272D84473B6F09F700972B016F7579842D3A87BDBBDB2AF1EDC" + }, + { + "url": "https://android.googlesource.com/platform/frameworks/support/+/8a05a22af450d589ef911d772a001a49dcb05b71/graphics/graphics-path/src/main/cpp/math/TVecHelpers.h", + "sha256": "1B0D6B06C5BBD6B438F9D8440AC78CF93FB8A713761BADC59A4412B6457C1014" + }, + { + "url": "https://android.googlesource.com/platform/frameworks/support/+/8a05a22af450d589ef911d772a001a49dcb05b71/graphics/graphics-path/src/main/cpp/math/vec2.h", + "sha256": "09E1A8EB3F8FDF9C1071500F1A4933F67CAEB6D0F765D5C44BA968370DE9FCB1" + } + ], + "supportSources": [ + { + "url": "https://android.googlesource.com/toolchain/llvm-project/+/4c603efb0cca074e9238af8b4106c30add4418f6/libcxx/LICENSE.TXT", + "sha256": "539DD7AED86E8A4F12CBDD0E6C50C189C7D74847E4FECC64CE2C6EE3A01DA38B" + }, + { + "url": "https://android.googlesource.com/toolchain/llvm-project/+/4c603efb0cca074e9238af8b4106c30add4418f6/compiler-rt/LICENSE.TXT", + "sha256": "1A8F1058753F1BA890DE984E48F0242A3A5C29A6A8F2ED9FD813F36985387E8D" + }, + { + "url": "https://android.googlesource.com/toolchain/prebuilts/ndk/r25/+/1622e087e1b881a0c7c744091d314662d12f0997/NOTICE", + "sha256": "31B13387E6BDE5C7E7006B63EA762020CE583BE32E4D62417584C03AC3D3F19A" + }, + { + "url": "https://android.googlesource.com/toolchain/prebuilts/ndk/r25/+/1622e087e1b881a0c7c744091d314662d12f0997/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/aarch64-linux-android/21/crtbegin_so.o", + "sha256": "2AF3D92CFCB5A8521AD75A0F838CFAD752F7D5656566C43B0B447C972DEBED27" + } + ], + "packagedArtifacts": [ + { + "variant": "debug", + "apk": "scanner-host/build/outputs/apk/debug/scanner-host-debug.apk", + "apkSha256": "E12CFB7F078AD0C5F28EED717880187F394379C9532EA2D5828A228D1E4A134F", + "apkBytes": 18751646, + "noticeEntry": "res/raw/aboutlibraries.json", + "noticeSha256": "336FABEE90462B49E639247029F53260A6CD21BD5090F0F74F79A556E212552F", + "noticeEntries": 130, + "fullLicenseTexts": 9, + "nativeHashesVerified": 8, + "unknownMp3Files": 0 + }, + { + "variant": "e2e", + "apk": "scanner-host/build/outputs/apk/e2e/scanner-host-e2e.apk", + "apkSha256": "733285E6BE30B67A46BF2810F07376379C94E4AE529746F321262AB86CCF0740", + "apkBytes": 18810342, + "noticeEntry": "res/raw/aboutlibraries.json", + "noticeSha256": "666D3E7648DA96B26760E5D3FD41F2ABFE5B08E0E56BD5D4B0C7748A754FB474", + "noticeEntries": 130, + "fullLicenseTexts": 9, + "nativeHashesVerified": 8, + "unknownMp3Files": 0 + }, + { + "variant": "release", + "apk": "scanner-host/build/outputs/apk/release/scanner-host-release-unsigned.apk", + "apkSha256": "924D7EC15F93957073F0D9B47348F0E4CF7F272FBB4EBE4100FEDCBD8DB027A2", + "apkBytes": 14447558, + "noticeEntry": "res/M7.json", + "noticeSha256": "3EAA50C774B452BA89CE7516F695BDE9788088767F6A1B9A54DCC87F31394758", + "noticeEntries": 130, + "fullLicenseTexts": 9, + "nativeHashesVerified": 8, + "unknownMp3Files": 0 + } + ], + "packagingQualification": { + "date": "2026-10-31", + "gradleResult": "BUILD SUCCESSFUL", + "duration": "2m 32s", + "actionableTasks": 273, + "maxWorkers": 2, + "parallel": false, + "lintReleaseErrors": 0, + "lintReleaseWarnings": 0, + "releaseSigning": "unsigned; apksigner verify returns DOES NOT VERIFY / Missing META-INF/MANIFEST.MF", + "releaseDebuggable": false, + "releaseAllowBackup": false, + "releaseFullBackupContent": false, + "releaseUsesCleartextTraffic": false, + "releaseNetworkSecurityConfigOverride": false, + "releaseDataExtractionPolicy": "cloud-backup and device-transfer each exclude root/file/database/sharedpref/external at path .", + "manifestValidationTools": [ + "Android SDK apkanalyzer", + "Android SDK Build Tools 35.0.0 aapt2", + "Android SDK Build Tools 35.0.0 apksigner" + ] + }, + "instrumentationApk": { + "apk": "scanner-host/build/outputs/apk/androidTest/e2e/scanner-host-e2e-androidTest.apk", + "sha256": "E697023F2F31F98F5F4A9A82E4A91FE8A8F5B48B08687DD784FE9960947EED35", + "bytes": 1060060 + } +} diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 0000000..20e2a01 --- /dev/null +++ b/gradle.properties @@ -0,0 +1,23 @@ +# Project-wide Gradle settings. +# IDE (e.g. Android Studio) users: +# Gradle settings configured through the IDE *will override* +# any settings specified in this file. +# For more details on how to configure your build environment visit +# http://www.gradle.org/docs/current/userguide/build_environment.html +# Specifies the JVM arguments used for the daemon process. +# The setting is particularly useful for tweaking memory settings. +org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8 +# When configured, Gradle will run in incubating parallel mode. +# This option should only be used with decoupled projects. For more details, visit +# https://developer.android.com/r/tools/gradle-multi-project-decoupled-projects +# org.gradle.parallel=true +# AndroidX package structure to make it clearer which packages are bundled with the +# Android operating system, and which are packaged with your app's APK +# https://developer.android.com/topic/libraries/support-library/androidx-rn +android.useAndroidX=true +# Kotlin code style for this project: "official" or "obsolete": +kotlin.code.style=official +# Enables namespacing of each library's R class so that its R class includes only the +# resources declared in the library itself and none from the library's dependencies, +# thereby reducing the size of the R class for that library +android.nonTransitiveRClass=true \ No newline at end of file diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml new file mode 100644 index 0000000..343842e --- /dev/null +++ b/gradle/libs.versions.toml @@ -0,0 +1,80 @@ +[versions] +agp = "8.6.0" +coilCompose = "3.0.4" +coilNetworkOkhttp = "3.0.4" +coilSvg = "3.0.4" +datastorePreferences = "1.1.1" +kotlin = "1.9.0" +coreKtx = "1.13.1" +junit = "4.13.2" +junitVersion = "1.2.1" +espressoCore = "3.6.1" +kotlinxSerializationJson = "1.5.1" +lifecycleRuntimeKtx = "2.8.5" +activityCompose = "1.9.2" +composeBom = "2024.04.01" +appcompat = "1.7.0" +lifecycleViewmodelCompose = "2.6.1" +material = "1.12.0" +runtimeAndroid = "1.7.2" +uiAndroid = "1.6.6" +material3Android = "1.3.0" +junitJupiter = "5.8.1" +auth0 = "3.0.0" +uiToolingPreviewAndroid = "1.6.6" +navigationCompose = "2.8.3" +okhttp = "4.12.0" +junitJunit = "4.12" +jsonTest = "20240303" +coroutinesTest = "1.9.0" +aboutLibraries = "10.9.2" +appauth = "0.11.1" +zebraEmdk = "11.0.134" + +[libraries] +zebra-emdk = { module = "com.symbol:emdk", version.ref = "zebraEmdk" } +appauth = { module = "net.openid:appauth", version.ref = "appauth" } +aboutlibraries-compose = { module = "com.mikepenz:aboutlibraries-compose", version.ref = "aboutLibraries" } +okhttp = { module = "com.squareup.okhttp3:okhttp", version.ref = "okhttp" } +okhttp-mockwebserver = { module = "com.squareup.okhttp3:mockwebserver", version.ref = "okhttp" } +json-test = { module = "org.json:json", version.ref = "jsonTest" } +kotlinx-coroutines-test = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-test", version.ref = "coroutinesTest" } +androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" } +androidx-datastore = { module = "androidx.datastore:datastore", version.ref = "datastorePreferences" } +androidx-datastore-preferences = { module = "androidx.datastore:datastore-preferences", version.ref = "datastorePreferences" } +androidx-lifecycle-viewmodel-compose = { module = "androidx.lifecycle:lifecycle-viewmodel-compose", version.ref = "lifecycleViewmodelCompose" } +androidx-ui-text-google-fonts = { module = "androidx.compose.ui:ui-text-google-fonts" } +coil-compose = { module = "io.coil-kt.coil3:coil-compose", version.ref = "coilCompose" } +coil-network-okhttp = { module = "io.coil-kt.coil3:coil-network-okhttp", version.ref = "coilNetworkOkhttp" } +coil-svg = { module = "io.coil-kt.coil3:coil-svg", version.ref = "coilSvg" } +junit = { group = "junit", name = "junit", version.ref = "junit" } +androidx-junit = { group = "androidx.test.ext", name = "junit", version.ref = "junitVersion" } +androidx-espresso-core = { group = "androidx.test.espresso", name = "espresso-core", version.ref = "espressoCore" } +androidx-lifecycle-runtime-ktx = { group = "androidx.lifecycle", name = "lifecycle-runtime-ktx", version.ref = "lifecycleRuntimeKtx" } +androidx-activity-compose = { group = "androidx.activity", name = "activity-compose", version.ref = "activityCompose" } +androidx-compose-bom = { group = "androidx.compose", name = "compose-bom", version.ref = "composeBom" } +androidx-ui = { group = "androidx.compose.ui", name = "ui" } +androidx-ui-graphics = { group = "androidx.compose.ui", name = "ui-graphics" } +androidx-ui-tooling = { group = "androidx.compose.ui", name = "ui-tooling" } +androidx-ui-tooling-preview = { group = "androidx.compose.ui", name = "ui-tooling-preview" } +androidx-ui-test-manifest = { group = "androidx.compose.ui", name = "ui-test-manifest" } +androidx-ui-test-junit4 = { group = "androidx.compose.ui", name = "ui-test-junit4" } +androidx-material3 = { group = "androidx.compose.material3", name = "material3" } +androidx-appcompat = { group = "androidx.appcompat", name = "appcompat", version.ref = "appcompat" } +kotlinx-serialization-json = { module = "org.jetbrains.kotlinx:kotlinx-serialization-json", version.ref = "kotlinxSerializationJson" } +material = { group = "com.google.android.material", name = "material", version.ref = "material" } +androidx-runtime-android = { group = "androidx.compose.runtime", name = "runtime-android", version.ref = "runtimeAndroid" } +androidx-ui-android = { group = "androidx.compose.ui", name = "ui-android", version.ref = "uiAndroid" } +androidx-material3-android = { group = "androidx.compose.material3", name = "material3-android", version.ref = "material3Android" } +junit-jupiter = { group = "org.junit.jupiter", name = "junit-jupiter", version.ref = "junitJupiter" } +auth0 = { group = "com.auth0.android", name = "auth0", version.ref = "auth0" } +androidx-ui-tooling-preview-android = { group = "androidx.compose.ui", name = "ui-tooling-preview-android", version.ref = "uiToolingPreviewAndroid" } +androidx-navigation-compose = { group = "androidx.navigation", name = "navigation-compose", version.ref = "navigationCompose" } +junit-junit = { group = "junit", name = "junit", version.ref = "junitJunit" } + +[plugins] +aboutlibraries = { id = "com.mikepenz.aboutlibraries.plugin", version.ref = "aboutLibraries" } +android-application = { id = "com.android.application", version.ref = "agp" } +kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" } +android-library = { id = "com.android.library", version.ref = "agp" } + diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000..e644113 Binary files /dev/null and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..0790b38 --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,7 @@ +#Fri Sep 20 14:25:53 CDT 2024 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip +distributionSha256Sum=544c35d6bd849ae8a5ed0bcea39ba677dc40f49df7d1835561582da2009b961d +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew new file mode 100755 index 0000000..4f906e0 --- /dev/null +++ b/gradlew @@ -0,0 +1,185 @@ +#!/usr/bin/env sh + +# +# Copyright 2015 the original author or authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin or MSYS, switch paths to Windows format before running java +if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=`expr $i + 1` + done + case $i in + 0) set -- ;; + 1) set -- "$args0" ;; + 2) set -- "$args0" "$args1" ;; + 3) set -- "$args0" "$args1" "$args2" ;; + 4) set -- "$args0" "$args1" "$args2" "$args3" ;; + 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=`save "$@"` + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 0000000..107acd3 --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,89 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto execute + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/qqq/android/core/.gitignore b/qqq/android/core/.gitignore new file mode 100644 index 0000000..42afabf --- /dev/null +++ b/qqq/android/core/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/qqq/android/core/build.gradle.kts b/qqq/android/core/build.gradle.kts new file mode 100644 index 0000000..a855937 --- /dev/null +++ b/qqq/android/core/build.gradle.kts @@ -0,0 +1,92 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2004-2026. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +plugins { + alias(libs.plugins.android.library) + alias(libs.plugins.kotlin.android) + kotlin("plugin.serialization") + id("kotlinx-serialization") + id("com.vanniktech.maven.publish") version "0.30.0" +} + +publishing { + repositories { + maven { + // Gitea Maven registry of the repository owner. CI sets giteaMavenUrl, giteaUsername + // and giteaPassword (ci-workflows android.yaml, publish-tasks on vX.Y.Z tags). + name = "gitea" + url = uri(providers.gradleProperty("giteaMavenUrl").getOrElse("https://git.kof22.com/api/packages/QRun-IO/maven")) + credentials(PasswordCredentials::class) + } + } +} + +android { + namespace = "com.kingsrook.qqq.frontend.android.core" + compileSdk = 35 + + defaultConfig { + minSdk = 26 + + testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + consumerProguardFiles("consumer-rules.pro") + } + + buildTypes { + release { + isMinifyEnabled = false + proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro") + } + } + compileOptions { + sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 + } + kotlinOptions { + jvmTarget = "1.8" + } +} + +dependencies { + + implementation(libs.androidx.core.ktx) + implementation(libs.androidx.appcompat) + implementation(libs.material) + + testImplementation(libs.junit) + testImplementation(libs.okhttp.mockwebserver) + testImplementation("org.json:json:20240303") + testImplementation(libs.junit.jupiter) + androidTestImplementation(libs.androidx.junit) + androidTestImplementation(libs.androidx.espresso.core) + + // Kotlin serialization + implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.5.1") + + // Retrofit + implementation("com.squareup.retrofit2:retrofit:2.9.0") + + // Retrofit with Kotlin serialization Converter + implementation("com.jakewharton.retrofit:retrofit2-kotlinx-serialization-converter:1.0.0") + implementation(libs.okhttp) + + implementation("org.jetbrains.kotlin:kotlin-reflect:2.0.20") +} diff --git a/qqq/android/core/consumer-rules.pro b/qqq/android/core/consumer-rules.pro new file mode 100644 index 0000000..e69de29 diff --git a/qqq/android/core/gradle.properties b/qqq/android/core/gradle.properties new file mode 100644 index 0000000..e868a2d --- /dev/null +++ b/qqq/android/core/gradle.properties @@ -0,0 +1,21 @@ + +GROUP=com.kingsrook.qqq-android +POM_ARTIFACT_ID=qqq-android-core +VERSION_NAME=0.1.1-SNAPSHOT + +## POM_NAME=QQQ Android Core +## POM_DESCRIPTION=Core library for developing Android frontends that use a QQQ Backend +## POM_INCEPTION_YEAR=2024 +## POM_URL=https://github.com/Kingsrook/qqq-android + +## POM_LICENSE_NAME=Apache License, Version 2.0 +## POM_LICENSE_URL=https://www.apache.org/licenses/LICENSE-2.0 +## POM_LICENSE_DIST=repo + +## POM_SCM_URL=https://github.com/Kingsrook/qqq-android +## POM_SCM_CONNECTION=scm:git:git://github.com/username/mylibrary.git +## POM_SCM_DEV_CONNECTION=scm:git:ssh://git@github.com/username/mylibrary.git + +## POM_DEVELOPER_ID= +## POM_DEVELOPER_NAME=User Name +## POM_DEVELOPER_URL=https://github.com/username/ \ No newline at end of file diff --git a/qqq/android/core/proguard-rules.pro b/qqq/android/core/proguard-rules.pro new file mode 100644 index 0000000..481bb43 --- /dev/null +++ b/qqq/android/core/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/qqq/android/core/src/androidTest/java/com/kingsrook/qqq/frontend/android/core/ExampleInstrumentedTest.kt b/qqq/android/core/src/androidTest/java/com/kingsrook/qqq/frontend/android/core/ExampleInstrumentedTest.kt new file mode 100644 index 0000000..a8f27b9 --- /dev/null +++ b/qqq/android/core/src/androidTest/java/com/kingsrook/qqq/frontend/android/core/ExampleInstrumentedTest.kt @@ -0,0 +1,47 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2024-2024. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.kingsrook.qqq.frontend.android.core + +import androidx.test.platform.app.InstrumentationRegistry +import androidx.test.ext.junit.runners.AndroidJUnit4 + +import org.junit.Test +import org.junit.runner.RunWith + +import org.junit.Assert.assertEquals + +/******************************************************************************* + ** Instrumented test, which will execute on an Android device. + ** See [testing documentation](http://d.android.com/tools/testing). + *******************************************************************************/ +@RunWith(AndroidJUnit4::class) +class ExampleInstrumentedTest { + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun useAppContext() { + // Context of the app under test. + val appContext = InstrumentationRegistry.getInstrumentation().targetContext + assertEquals("com.kingsrook.qqq.frontend.android.core.test", appContext.packageName) + } +} diff --git a/qqq/android/core/src/main/AndroidManifest.xml b/qqq/android/core/src/main/AndroidManifest.xml new file mode 100644 index 0000000..a5918e6 --- /dev/null +++ b/qqq/android/core/src/main/AndroidManifest.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8"?> +<manifest xmlns:android="http://schemas.android.com/apk/res/android"> + +</manifest> \ No newline at end of file diff --git a/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/controllers/NetworkQQQRepository.kt b/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/controllers/NetworkQQQRepository.kt new file mode 100644 index 0000000..48e5087 --- /dev/null +++ b/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/controllers/NetworkQQQRepository.kt @@ -0,0 +1,412 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2004-2024. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package com.kingsrook.qqq.frontend.android.core.controllers + +import com.jakewharton.retrofit2.converter.kotlinx.serialization.asConverterFactory +import com.kingsrook.qqq.frontend.android.core.model.Environment +import com.kingsrook.qqq.frontend.android.core.model.metadata.QInstance +import com.kingsrook.qqq.frontend.android.core.model.metadata.QProcessMetaData +import com.kingsrook.qqq.frontend.android.core.model.metadata.authentication.BaseAuthenticationMetaData +import com.kingsrook.qqq.frontend.android.core.model.metadata.authentication.ManageSessionRequest +import com.kingsrook.qqq.frontend.android.core.model.metadata.authentication.ManageSessionResponse +import com.kingsrook.qqq.frontend.android.core.model.metadata.authentication.NativeLogout +import com.kingsrook.qqq.frontend.android.core.model.metadata.authentication.NativeLogoutRequest +import com.kingsrook.qqq.frontend.android.core.model.metadata.authentication.NativeLogoutResponse +import com.kingsrook.qqq.frontend.android.core.model.metadata.authentication.NativeLogoutData +import com.kingsrook.qqq.frontend.android.core.model.processes.ProcessStepResult +import kotlinx.serialization.json.Json +import okhttp3.Credentials +import okhttp3.Cookie +import okhttp3.MediaType.Companion.toMediaType +import okhttp3.MultipartBody +import okhttp3.OkHttpClient +import okhttp3.RequestBody +import okhttp3.RequestBody.Companion.toRequestBody +import org.json.JSONObject +import retrofit2.Retrofit +import java.util.TimeZone +import java.util.concurrent.ConcurrentHashMap + + +/******************************************************************************* + *******************************************************************************/ +class NetworkQQQRepository(private var baseUrl: String, @Volatile var requestObserver: (RequestOutcome) -> Unit = {}, private val compatibility: UiApiCompatibility? = null, private val additionalHeaders: (String) -> Map<String, String> = { emptyMap() }) : QQQRepository { + private val sessionUUIDs = ConcurrentHashMap<String, String>() + private val retroJson = Json { ignoreUnknownKeys = true } + private val compatibilityByServer = ConcurrentHashMap<String, UiApiCompatibility>() + + private val qqqApiServiceMap: MutableMap<String, QQQApiService> = mutableMapOf() + + /******************************************************************************* + *******************************************************************************/ + override fun setEnvironment(environment: Environment) { + baseUrl = environment.baseUrl + + if (qqqApiServiceMap[baseUrl] == null) { + val thisRetrofit = buildRetrofit(baseUrl) + val thisQQQApiService = thisRetrofit.create(QQQApiService::class.java) + qqqApiServiceMap[baseUrl] = thisQQQApiService + } + + // retrofit = buildRetrofit() + // retrofit.create(QQQApiService::class.java) + } + + /******************************************************************************* + *******************************************************************************/ + private fun buildRetrofit(baseUrl: String): Retrofit { + return Retrofit.Builder() + .addConverterFactory(retroJson.asConverterFactory("application/json".toMediaType())) + .client( + OkHttpClient.Builder() + .followRedirects(false) + .followSslRedirects(false) + .addInterceptor { chain -> + compatibilityByServer.getOrPut(baseUrl) { + compatibility?.takeIf { it.server == baseUrl } ?: UiApiCompatibility(baseUrl, observer = { requestObserver(it) }) + }.verify() + chain.proceed(chain.request()) + } + .addInterceptor(UiApiErrorInterceptor()) + .addInterceptor(RequestOutcomeInterceptor { requestObserver(it) }) + .addInterceptor { chain -> + val request = chain.request().newBuilder() + val deferredSession = chain.request().tag(DeferredSessionCookie::class.java) != null + if (!deferredSession) sessionUUIDs[baseUrl]?.takeIf { it.isNotBlank() }?.let { request.header("Cookie", "sessionUUID=$it") } + additionalHeaders(baseUrl).forEach { (name, value) -> request.header(name, value) } + request.header("X-QQQ-Client", ANDROID_CLIENT) + request.header("X-QQQ-UserTimezone", TimeZone.getDefault().toZoneId().toString()) + val response = chain.proceed(request.build()) + response.headers("Set-Cookie").forEach { header -> + Cookie.parse(response.request.url, header)?.let { cookie -> + if (!deferredSession && cookie.name == "sessionUUID" && cookie.matches(response.request.url)) { + sessionUUIDs[baseUrl] = cookie.value + } + } + } + response + } + // Last, so a caller-supplied additional header can never override the request's own origin. + .addInterceptor(SameOriginInterceptor()) + .build() + ) + .baseUrl(baseUrl) + .build() + } + + /******************************************************************************* + *******************************************************************************/ + override fun setSessionUUID(sessionUUID: String) { + sessionUUIDs[baseUrl] = sessionUUID + } + + /******************************************************************************* + ** Bounded, stably ordered read-only pages retain normal session/device guards. + *******************************************************************************/ + override suspend fun getTableMetaData(tableName: String) = qqqApiServiceMap[baseUrl]!!.getTableMetaData(tableName) + + override suspend fun queryRecords(tableName: String, primaryKey: String, offset: Int, limit: Int): List<com.kingsrook.qqq.frontend.android.core.model.RecordData> { + require(offset >= 0 && limit in 1..100 && primaryKey.isNotBlank()) + val filter = JSONObject().put("skip", offset).put("limit", limit) + .put("orderBys", org.json.JSONArray().put(JSONObject().put("fieldName", primaryKey).put("isAscending", true))) + val body = JSONObject().put("filter", filter).toString().toRequestBody("application/json".toMediaType()) + return qqqApiServiceMap[baseUrl]!!.queryRecords(tableName, body).records + } + + override suspend fun getRecord(tableName: String, recordId: String) = qqqApiServiceMap[baseUrl]!!.getRecord(tableName, recordId).record + + override suspend fun searchRecords(tableName: String, primaryKey: String, search: com.kingsrook.qqq.frontend.android.core.model.RecordSearch, offset: Int, limit: Int): List<com.kingsrook.qqq.frontend.android.core.model.RecordData> { + require(offset >= 0 && limit in 1..100 && primaryKey.isNotBlank()) + val filter = search.filter().put("skip", offset).put("limit", limit) + .put("orderBys", org.json.JSONArray().put(JSONObject().put("fieldName", primaryKey).put("isAscending", true))) + val body = JSONObject().put("filter", filter).toString().toRequestBody("application/json".toMediaType()) + return qqqApiServiceMap[baseUrl]!!.queryRecords(tableName, body).records + } + + override suspend fun countRecords(tableName: String, search: com.kingsrook.qqq.frontend.android.core.model.RecordSearch): Long { + val body = JSONObject().put("filter", search.filter()).toString().toRequestBody("application/json".toMediaType()) + return qqqApiServiceMap[baseUrl]!!.countRecords(tableName, body).count.also { require(it >= 0) } + } + + override suspend fun queryRelatedRecords(tableName: String, primaryKey: String, matches: Map<String, kotlinx.serialization.json.JsonElement>, offset: Int, limit: Int): List<com.kingsrook.qqq.frontend.android.core.model.RecordData> { + require(offset >= 0 && limit in 1..100 && primaryKey.isNotBlank() && matches.isNotEmpty()) + val criteria = org.json.JSONArray() + matches.forEach { (field, value) -> + require(field.isNotBlank() && value is kotlinx.serialization.json.JsonPrimitive && value != kotlinx.serialization.json.JsonNull) + criteria.put(JSONObject().put("fieldName", field).put("operator", "EQUALS") + .put("values", org.json.JSONArray("[$value]"))) + } + val filter = JSONObject().put("skip", offset).put("limit", limit).put("booleanOperator", "AND").put("criteria", criteria) + .put("orderBys", org.json.JSONArray().put(JSONObject().put("fieldName", primaryKey).put("isAscending", true))) + val body = JSONObject().put("filter", filter).toString().toRequestBody("application/json".toMediaType()) + return qqqApiServiceMap[baseUrl]!!.queryRecords(tableName, body).records + } + + /******************************************************************************* + *******************************************************************************/ + override suspend fun getAuthenticationMetaData(): BaseAuthenticationMetaData { + return qqqApiServiceMap[baseUrl]!!.getAuthenticationMetaData() + } + + /******************************************************************************* + *******************************************************************************/ + override suspend fun manageSession(body: ManageSessionRequest): ManageSessionResponse { + val service = requireNotNull(qqqApiServiceMap[baseUrl]) + return resolveSession(service.manageSession(body, DeferredSessionCookie())) + } + + /******************************************************************************* + ** Discover native session and nonce-validation support before starting browser authorization. + *******************************************************************************/ + override suspend fun verifyNativeSessionLogin() = verifyNativeSessionLoginAt(baseUrl) + + /******************************************************************************* + ** Check the captured origin's capability without allowing a later server switch to redirect the exchange. + *******************************************************************************/ + private suspend fun verifyNativeSessionLoginAt(server: String) = kotlinx.coroutines.withContext(kotlinx.coroutines.Dispatchers.IO) + { + val version = compatibilityByServer.getOrPut(server) { + compatibility?.takeIf { it.server == server } ?: UiApiCompatibility(server, observer = { requestObserver(it) }) + }.verify() + UiApiCompatibility.validateNativeSessionLogin(version) + } + + /******************************************************************************* + ** Return a provisional session from the initiating origin; only the current login attempt may adopt it. + *******************************************************************************/ + override suspend fun exchangeNativeSession(body: ManageSessionRequest): ManageSessionResponse { + require( + body.authenticationFlow == com.kingsrook.qqq.frontend.android.core.model.metadata.authentication.OAuth2AuthenticationMetaData.SESSION_FLOW && + com.kingsrook.qqq.frontend.android.core.model.metadata.authentication.isValidExpectedNonce(body.expectedNonce) + ) { + "Native sign-in requires its original nonce" + } + val server = baseUrl + val service = requireNotNull(qqqApiServiceMap[server]) + verifyNativeSessionLoginAt(server) + val response = service.exchangeNativeSession(body, DeferredSessionCookie()) + return resolveSession(response) + } + + /******************************************************************************* + ** Login cookies remain provisional until the initiating ViewModel accepts the response. + *******************************************************************************/ + private fun resolveSession(response: retrofit2.Response<ManageSessionResponse>): ManageSessionResponse { + if (!response.isSuccessful) throw retrofit2.HttpException(response) + val result = response.body() ?: throw IllegalStateException("Sign-in response did not establish a session") + val requestUrl = response.raw().request.url + val cookie = response.headers().values("Set-Cookie").mapNotNull { Cookie.parse(requestUrl, it) } + .lastOrNull { it.name == "sessionUUID" && it.matches(requestUrl) }?.value?.takeIf { it.isNotBlank() } + return result.copy(uuid = cookie ?: result.uuid?.takeIf { it.isNotBlank() } + ?: throw IllegalStateException("Sign-in response did not establish a session")) + } + + /******************************************************************************* + ** Revoke an abandoned exchange at its original server without activating its response cookie. + *******************************************************************************/ + override suspend fun discardNativeSession(server: String, session: String) { + val service = qqqApiServiceMap[server] ?: return + service.discardNativeSession("sessionUUID=$session", DeferredSessionCookie()).close() + } + + /******************************************************************************* + ** Send credentials only to the session endpoint, never to subsequent requests. + *******************************************************************************/ + override suspend fun loginWithPassword(username: String, password: String): ManageSessionResponse { + val service = requireNotNull(qqqApiServiceMap[baseUrl]) + return resolveSession(service.loginWithPassword(Credentials.basic(username, password, Charsets.UTF_8), emptyMap(), DeferredSessionCookie())) + } + + /******************************************************************************* + ** Preserve the cookie until the server has received the revocation request. + *******************************************************************************/ + override suspend fun logout() { + val server = baseUrl + val session = sessionUUIDs[server] + try { + if (!session.isNullOrBlank()) discardNativeSession(server, session) + } finally { + if (session != null) sessionUUIDs.remove(server, session) + } + } + + /******************************************************************************* + ** Capture the original origin/cookie; neither a response cookie nor a server switch can adopt a session. + *******************************************************************************/ + override suspend fun logoutWithProvider(postLogoutRedirectUri: String): NativeLogoutData? { + val server = baseUrl + val session = sessionUUIDs[server] ?: return null + try { + val supported = supportsNativeSessionLogoutAt(server) + if (!supported) { + discardNativeSession(server, session) + return null + } + return requireNotNull(qqqApiServiceMap[server]).logoutWithProvider( + "sessionUUID=$session", + NativeLogoutRequest(NativeLogout(postLogoutRedirectUri)), DeferredSessionCookie() + ).use { response -> + // Parse privately: serialization errors may include input fragments, so never propagate them. + val source = response.source() + source.request(65537) + if (source.buffer.size > 65536) return@use null + try { + retroJson.decodeFromString<NativeLogoutResponse>(source.readUtf8()).nativeLogoutData + } catch (exception: Exception) { + null + } + } + } catch (exception: UiApiException) { + throw java.io.IOException("Company sign-out request failed") + } finally { + sessionUUIDs.remove(server, session) + } + } + + /******************************************************************************* + ** Discover optional company sign-out independently from native login support. + *******************************************************************************/ + override suspend fun supportsNativeSessionLogout(): Boolean = supportsNativeSessionLogoutAt(baseUrl) + + /******************************************************************************* + ** Use the captured server's public capability before sending its existing session for company sign-out. + *******************************************************************************/ + private suspend fun supportsNativeSessionLogoutAt(server: String): Boolean = kotlinx.coroutines.withContext(kotlinx.coroutines.Dispatchers.IO) + { + try { + val version = compatibilityByServer.getOrPut(server) { + compatibility?.takeIf { it.server == server } ?: UiApiCompatibility(server, observer = { requestObserver(it) }) + }.verify() + UiApiCompatibility.validateNativeSessionLogout(version) + true + } catch (exception: UiApiCompatibilityException) { + false + } + } + + /******************************************************************************* + *******************************************************************************/ + override suspend fun getMetaData( + frontendName: String, frontendVersion: String, applicationName: String, applicationVersion: String + ): QInstance { + return qqqApiServiceMap[baseUrl]!!.getMetaData(frontendName, frontendVersion, applicationName, applicationVersion) + } + + /******************************************************************************* + *******************************************************************************/ + override suspend fun getProcessMetaData(processName: String): QProcessMetaData { + return qqqApiServiceMap[baseUrl]!!.getProcessMetaData(processName) + } + + /******************************************************************************* + *******************************************************************************/ + override suspend fun processInit(processName: String, values: Map<String, Any?>, recordsParam: String?, recordIds: String?, filterJSON: String?, stepTimeoutMillis: Int?): ProcessStepResult { + return qqqApiServiceMap[baseUrl]!!.processInit(processName, buildProcessInitOrStepRequestBodyV1(values, recordsParam, recordIds, filterJSON, stepTimeoutMillis)) + } + + /******************************************************************************* + *******************************************************************************/ + override suspend fun processStep(processName: String, processUUID: String, stepName: String, values: Map<String, Any?>, stepTimeoutMillis: Int?): ProcessStepResult { + return qqqApiServiceMap[baseUrl]!!.processStep(processName, processUUID, stepName, buildProcessInitOrStepRequestBodyV1(values, stepTimeoutMillis = stepTimeoutMillis)) + } + + /******************************************************************************* + *******************************************************************************/ + override suspend fun processCancel(processName: String, processUUID: String) { + qqqApiServiceMap[baseUrl]!!.processCancel(processName, processUUID).close() + } + + /******************************************************************************* + ** Options use the semantic `{options:[{id,label}]}` response; ids stay JSON scalars so they round-trip unchanged. + *******************************************************************************/ + override suspend fun processPossibleValues(processName: String, fieldName: String, values: Map<String, Any?>, processValues: Map<String, Any?>): List<com.kingsrook.qqq.frontend.android.core.model.QPossibleValue> { + fun json(map: Map<String, Any?>) = JSONObject().apply { map.forEach { (key, value) -> put(key, value ?: JSONObject.NULL) } } + val request = JSONObject().put("values", json(values)).put("processValues", json(processValues)).put("useCase", "form") + val body = qqqApiServiceMap[baseUrl]!!.processPossibleValues( + processName, fieldName, request.toString().toRequestBody("application/json".toMediaType()) + ).use { JSONObject(it.string()) } + // The server omits `options` when empty. + val options = body.optJSONArray("options") ?: return emptyList() + return (0 until options.length()).map { options.getJSONObject(it) }.map { option -> + val id = option.get("id") + com.kingsrook.qqq.frontend.android.core.model.QPossibleValue( + id as? java.io.Serializable ?: id.toString(), option.optString("label", id.toString())) + } + } + + /******************************************************************************* + ** Poll the exact process/job identity supplied by the server instead of assuming background completion. + *******************************************************************************/ + override suspend fun processJobStatus(processName: String, processUUID: String, jobUUID: String): ProcessStepResult { + return qqqApiServiceMap[baseUrl]!!.processJobStatus(processName, processUUID, jobUUID) + } + + /******************************************************************************* + *******************************************************************************/ + private fun buildProcessInitOrStepRequestBodyV1(values: Map<String, Any?>, recordsParam: String? = null, recordIds: String? = null, filterJSON: String? = null, stepTimeoutMillis: Int? = null): RequestBody { + val bodyBuilder = MultipartBody.Builder() + .setType(MultipartBody.FORM) + + if (!values.isEmpty()) { + val valuesJson = JSONObject() + for (entry in values.entries) { + valuesJson.put(entry.key, entry.value ?: JSONObject.NULL) + } + bodyBuilder.addFormDataPart("values", valuesJson.toString()) + } + + if (recordsParam != null) { + bodyBuilder.addFormDataPart("recordsParam", recordsParam) + } + + if (recordIds != null) { + bodyBuilder.addFormDataPart("recordIds", recordIds) + } + + if (filterJSON != null) { + bodyBuilder.addFormDataPart("filterJSON", filterJSON) + } + + if (stepTimeoutMillis != null) { + bodyBuilder.addFormDataPart("stepTimeoutMillis", stepTimeoutMillis.toString()) + } + + val requestBody: RequestBody = bodyBuilder.build() + return requestBody + } + + /******************************************************************************* + *******************************************************************************/ + + + /******************************************************************************* + *******************************************************************************/ + override fun getURI(path: String): String { + val uri = java.net.URI(baseUrl).resolve(path) + require(uri.scheme in setOf("https", "http") && uri.userInfo == null && uri.host != null) { "Unsupported media URL" } + return uri.toASCIIString() + } + + /******************************************************************************* + *******************************************************************************/ +} diff --git a/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/controllers/QQQApiService.kt b/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/controllers/QQQApiService.kt new file mode 100644 index 0000000..5061f95 --- /dev/null +++ b/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/controllers/QQQApiService.kt @@ -0,0 +1,200 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2004-2024. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package com.kingsrook.qqq.frontend.android.core.controllers + +import com.kingsrook.qqq.frontend.android.core.model.metadata.QInstance +import com.kingsrook.qqq.frontend.android.core.model.metadata.QProcessMetaData +import com.kingsrook.qqq.frontend.android.core.model.metadata.authentication.BaseAuthenticationMetaData +import com.kingsrook.qqq.frontend.android.core.model.metadata.authentication.ManageSessionRequest +import com.kingsrook.qqq.frontend.android.core.model.metadata.authentication.ManageSessionResponse +import com.kingsrook.qqq.frontend.android.core.model.processes.ProcessStepResult +import okhttp3.RequestBody +import okhttp3.ResponseBody +import retrofit2.http.Body +import retrofit2.http.GET +import retrofit2.http.Header +import retrofit2.http.POST +import retrofit2.http.Path +import retrofit2.http.Query + +const val BASE_PATH = "/qqq/v1/" + +/******************************************************************************* + ** A login response is adopted only after its initiating ViewModel accepts it. + *******************************************************************************/ +class DeferredSessionCookie + +/******************************************************************************* + ** Class (interface?) that instructs retrofit how to make HTTP requests + ** to a QQQ middleware server. + *******************************************************************************/ +interface QQQApiService { + ////////////////////////////// + // authentication endpoints // + ////////////////////////////// + /******************************************************************************* + ** Discover the versioned server authentication contract before submitting credentials. + *******************************************************************************/ + @GET(BASE_PATH + "metaData/authentication") + suspend fun getAuthenticationMetaData(): BaseAuthenticationMetaData + + /******************************************************************************* + ** Exchange authentication data for a provisional QQQ session without adopting a cookie implicitly. + *******************************************************************************/ + @POST(BASE_PATH + "manageSession") + suspend fun manageSession( + @Body body: ManageSessionRequest, + @retrofit2.http.Tag cookiePolicy: DeferredSessionCookie + ): retrofit2.Response<ManageSessionResponse> + + /******************************************************************************* + ** Send the native authorization exchange only to the versioned session endpoint. + *******************************************************************************/ + @POST(BASE_PATH + "manageSession") + suspend fun exchangeNativeSession( + @Body body: ManageSessionRequest, + @retrofit2.http.Tag cookiePolicy: DeferredSessionCookie + ): retrofit2.Response<ManageSessionResponse> + + /******************************************************************************* + ** Keep password credentials confined to the session endpoint rather than ordinary process requests. + *******************************************************************************/ + @POST(BASE_PATH + "manageSession") + suspend fun loginWithPassword( + @Header("Authorization") authorization: String, @Body body: Map<String, String>, + @retrofit2.http.Tag cookiePolicy: DeferredSessionCookie + ): retrofit2.Response<ManageSessionResponse> + + /******************************************************************************* + ** Revoke the supplied QQQ session before its caller discards local credentials. + *******************************************************************************/ + @POST(BASE_PATH + "logout") + suspend fun logout(): ResponseBody + + /******************************************************************************* + ** Request optional company sign-out using the existing session and a registered callback. + *******************************************************************************/ + @POST(BASE_PATH + "logout") + @retrofit2.http.Streaming + suspend fun logoutWithProvider( + @Header("Cookie") cookie: String, + @Body body: com.kingsrook.qqq.frontend.android.core.model.metadata.authentication.NativeLogoutRequest, + @retrofit2.http.Tag cookiePolicy: DeferredSessionCookie + ): ResponseBody + + /******************************************************************************* + ** Revoke a captured abandoned session without installing its cookie in the active repository. + *******************************************************************************/ + @POST(BASE_PATH + "logout") + suspend fun discardNativeSession( + @Header("Cookie") cookie: String, + @retrofit2.http.Tag cookiePolicy: DeferredSessionCookie + ): ResponseBody + + /////////////////// + // qqq meta data // + /////////////////// + /******************************************************************************* + ** Load semantic metadata with explicit frontend and application versions for compatibility decisions. + *******************************************************************************/ + @GET(BASE_PATH + "metaData") + suspend fun getMetaData( + @Query("frontendName") frontendName: String, + @Query("frontendVersion") frontendVersion: String, + @Query("applicationName") applicationName: String, + @Query("applicationVersion") applicationVersion: String, + ): QInstance + + /////////////// + // processes // + /////////////// + /******************************************************************************* + ** Read the server-defined process contract rather than deriving behavior from its name. + *******************************************************************************/ + @GET(BASE_PATH + "metaData/process/{processName}") + suspend fun getProcessMetaData(@Path(value = "processName") processName: String): QProcessMetaData + + /******************************************************************************* + ** Registered table metadata/query/get operations; no alternative record API. + *******************************************************************************/ + @GET(BASE_PATH + "metaData/table/{tableName}") + suspend fun getTableMetaData(@Path("tableName") tableName: String): com.kingsrook.qqq.frontend.android.core.model.metadata.QTableMetaData + + @POST(BASE_PATH + "table/{tableName}/query") + suspend fun queryRecords(@Path("tableName") tableName: String, @Body body: RequestBody): com.kingsrook.qqq.frontend.android.core.model.RecordQueryResponse + + @POST(BASE_PATH + "table/{tableName}/count") + suspend fun countRecords(@Path("tableName") tableName: String, @Body body: RequestBody): com.kingsrook.qqq.frontend.android.core.model.RecordCountResponse + + @GET(BASE_PATH + "table/{tableName}/{recordId}") + suspend fun getRecord(@Path("tableName") tableName: String, @Path("recordId") recordId: String): com.kingsrook.qqq.frontend.android.core.model.RecordGetResponse + + /******************************************************************************* + ** Start process execution with explicit record selection and values, returning authoritative server step state. + *******************************************************************************/ + @POST(BASE_PATH + "processes/{processName}/init") + suspend fun processInit( + @Path(value = "processName") processName: String, + @Body body: RequestBody + ): ProcessStepResult + + /******************************************************************************* + ** Submit values to the identified server process instance and step. + *******************************************************************************/ + @POST(BASE_PATH + "processes/{processName}/{processUUID}/step/{stepName}") + suspend fun processStep( + @Path(value = "processName") processName: String, + @Path(value = "processUUID") processUUID: String, + @Path(value = "stepName") stepName: String, + @Body body: RequestBody + ): ProcessStepResult + + /******************************************************************************* + ** Poll the identified server job within its owning process instance. + *******************************************************************************/ + @GET(BASE_PATH + "processes/{processName}/{processUUID}/status/{jobUUID}") + suspend fun processJobStatus( + @Path(value = "processName") processName: String, + @Path(value = "processUUID") processUUID: String, + @Path(value = "jobUUID") jobUUID: String, + ): ProcessStepResult + + /******************************************************************************* + ** Published operation `searchProcessPossibleValues`: JSON body {values, processValues, useCase, searchTerm, ids}. + *******************************************************************************/ + @POST(BASE_PATH + "processes/{processName}/possibleValues/{fieldName}") + suspend fun processPossibleValues( + @Path(value = "processName") processName: String, + @Path(value = "fieldName") fieldName: String, + @Body body: RequestBody + ): ResponseBody + + /******************************************************************************* + ** Cancel the identified server process explicitly instead of dropping only client navigation. + *******************************************************************************/ + @POST(BASE_PATH + "processes/{processName}/{processUUID}/cancel") + suspend fun processCancel(@Path("processName") processName: String, @Path("processUUID") processUUID: String): ResponseBody + + +} + diff --git a/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/controllers/QQQRepository.kt b/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/controllers/QQQRepository.kt new file mode 100644 index 0000000..afd85c8 --- /dev/null +++ b/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/controllers/QQQRepository.kt @@ -0,0 +1,165 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2004-2024. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package com.kingsrook.qqq.frontend.android.core.controllers + +import com.kingsrook.qqq.frontend.android.core.model.Environment +import com.kingsrook.qqq.frontend.android.core.model.metadata.QInstance +import com.kingsrook.qqq.frontend.android.core.model.metadata.QProcessMetaData +import com.kingsrook.qqq.frontend.android.core.model.metadata.authentication.BaseAuthenticationMetaData +import com.kingsrook.qqq.frontend.android.core.model.metadata.authentication.ManageSessionRequest +import com.kingsrook.qqq.frontend.android.core.model.metadata.authentication.ManageSessionResponse +import com.kingsrook.qqq.frontend.android.core.model.processes.ProcessStepResult + +/******************************************************************************* + ** interface that defines the interaction points we have with a QQQ backend. + *******************************************************************************/ +interface QQQRepository { + /******************************************************************************* + ** Select the server environment before requests; implementations must isolate session state by server. + *******************************************************************************/ + fun setEnvironment(environment: Environment) + + /******************************************************************************* + ** Activate only a session accepted by the current login attempt, never an abandoned provisional response. + *******************************************************************************/ + fun setSessionUUID(sessionUUID: String) + + /******************************************************************************* + ** Discover the server's authentication contract without submitting credentials. + *******************************************************************************/ + suspend fun getAuthenticationMetaData(): BaseAuthenticationMetaData + + /******************************************************************************* + ** Return a provisional session; the initiating login must accept it before calling setSessionUUID. + *******************************************************************************/ + suspend fun manageSession(body: ManageSessionRequest): ManageSessionResponse + + /******************************************************************************* + ** Native browser sign-in requires explicit version/feature discovery before authorization. + *******************************************************************************/ + suspend fun verifyNativeSessionLogin() { + throw UnsupportedOperationException("Native browser sign-in is unavailable") + } + + /******************************************************************************* + ** Return the new session without activating it; the caller must validate its pending login first. + *******************************************************************************/ + suspend fun exchangeNativeSession(body: ManageSessionRequest): ManageSessionResponse = + throw UnsupportedOperationException("Native browser sign-in is unavailable") + + /******************************************************************************* + ** Revoke an abandoned exchange at its original server without activating its cookie. + *******************************************************************************/ + suspend fun discardNativeSession(server: String, session: String) {} + + /******************************************************************************* + ** Authenticate without retaining the password or adopting the provisional response cookie. + *******************************************************************************/ + suspend fun loginWithPassword(username: String, password: String): ManageSessionResponse = + throw UnsupportedOperationException("Password authentication is unavailable") + + /******************************************************************************* + ** End the server session before discarding local credentials. + *******************************************************************************/ + suspend fun logout() {} + + /******************************************************************************* + ** Public discovery only. Absence retains ordinary local sign-out. + *******************************************************************************/ + suspend fun supportsNativeSessionLogout(): Boolean = false + + /******************************************************************************* + ** Explicit optional company sign-out. Unsupported repositories still perform ordinary logout. + *******************************************************************************/ + suspend fun logoutWithProvider(postLogoutRedirectUri: String): com.kingsrook.qqq.frontend.android.core.model.metadata.authentication.NativeLogoutData? { + logout() + return null + } + + /******************************************************************************* + ** Load the semantic application model with explicit client identity for server compatibility decisions. + *******************************************************************************/ + suspend fun getMetaData(frontendName: String, frontendVersion: String, applicationName: String, applicationVersion: String): QInstance + + /******************************************************************************* + ** Resolve the server-defined process contract instead of deriving actions from its name. + *******************************************************************************/ + suspend fun getProcessMetaData(processName: String): QProcessMetaData + + /******************************************************************************* + ** Read-only table navigation uses the core API and its normal permissions. + *******************************************************************************/ + suspend fun getTableMetaData(tableName: String): com.kingsrook.qqq.frontend.android.core.model.metadata.QTableMetaData = + throw UnsupportedOperationException("Table browsing is unavailable") + + suspend fun queryRecords(tableName: String, primaryKey: String, offset: Int, limit: Int = 25): List<com.kingsrook.qqq.frontend.android.core.model.RecordData> = + throw UnsupportedOperationException("Table browsing is unavailable") + + suspend fun getRecord(tableName: String, recordId: String): com.kingsrook.qqq.frontend.android.core.model.RecordData = + throw UnsupportedOperationException("Record viewing is unavailable") + + suspend fun searchRecords(tableName: String, primaryKey: String, search: com.kingsrook.qqq.frontend.android.core.model.RecordSearch, offset: Int, limit: Int = 25): List<com.kingsrook.qqq.frontend.android.core.model.RecordData> = + throw UnsupportedOperationException("Record search is unavailable") + + suspend fun countRecords(tableName: String, search: com.kingsrook.qqq.frontend.android.core.model.RecordSearch): Long = + throw UnsupportedOperationException("Record counts are unavailable") + + suspend fun queryRelatedRecords(tableName: String, primaryKey: String, matches: Map<String, kotlinx.serialization.json.JsonElement>, offset: Int, limit: Int = 10): List<com.kingsrook.qqq.frontend.android.core.model.RecordData> = + throw UnsupportedOperationException("Related records are unavailable") + + /******************************************************************************* + ** Start server-defined process execution with explicit values and record selection; return authoritative step state. + *******************************************************************************/ + suspend fun processInit(processName: String, values: Map<String, Any?>, recordsParam: String? = null, recordIds: String? = null, filterJSON: String? = null, stepTimeoutMillis: Int? = 3000): ProcessStepResult + + /******************************************************************************* + ** Submit to the existing process instance and server-named step, preserving the caller's timeout policy. + *******************************************************************************/ + suspend fun processStep(processName: String, processUUID: String, stepName: String, values: Map<String, Any?>, stepTimeoutMillis: Int?): ProcessStepResult + + /******************************************************************************* + ** Cancel the existing server process explicitly; unsupported implementations must fail visibly. + *******************************************************************************/ + suspend fun processCancel(processName: String, processUUID: String) { + throw UnsupportedOperationException("Process cancellation is unavailable") + } + + /******************************************************************************* + ** Search a process field's server possible-value source (`searchProcessPossibleValues`) with the current form values + ** (`values`, used for dependsOn/filter inputs) and scalar process values, using the FORM use case. + *******************************************************************************/ + suspend fun processPossibleValues(processName: String, fieldName: String, values: Map<String, Any?>, processValues: Map<String, Any?> = emptyMap()): List<com.kingsrook.qqq.frontend.android.core.model.QPossibleValue> = + throw UnsupportedOperationException("Remote possible values are unavailable") + + /******************************************************************************* + ** Poll the server-issued job within its process instance instead of inferring asynchronous completion. + *******************************************************************************/ + suspend fun processJobStatus(processName: String, processUUID: String, jobUUID: String): ProcessStepResult + + + /******************************************************************************* + ** Resolve a repository resource path against the currently selected server environment. + *******************************************************************************/ + fun getURI(path: String): String +} + diff --git a/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/controllers/RequestOutcomeInterceptor.kt b/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/controllers/RequestOutcomeInterceptor.kt new file mode 100644 index 0000000..abda969 --- /dev/null +++ b/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/controllers/RequestOutcomeInterceptor.kt @@ -0,0 +1,36 @@ +/* Copyright (c) 2026 QRunIO. SPDX-License-Identifier: Apache-2.0 */ +package com.kingsrook.qqq.frontend.android.core.controllers + +import java.io.IOException +import okhttp3.Interceptor +import okhttp3.Response + +/******************************************************************************* + ** Deliberately excludes URLs, headers, bodies, and exception messages. Null status means transport failure. + *******************************************************************************/ +data class RequestOutcome(val httpStatus: Int?, val elapsedMillis: Long) + +/******************************************************************************* + ** Optional diagnostics must never change request behavior, even if an observer throws. + *******************************************************************************/ +class RequestOutcomeInterceptor(private val observer: (RequestOutcome) -> Unit) : Interceptor { + /******************************************************************************* + ** Observe status and monotonic duration without retaining sensitive request data or changing HTTP behavior. + *******************************************************************************/ + override fun intercept(chain: Interceptor.Chain): Response { + val started = System.nanoTime() + + /******************************************************************************* + ** Isolate observer failures so optional diagnostics cannot fail the original request. + *******************************************************************************/ + fun report(status: Int?) { + runCatching { observer(RequestOutcome(status, (System.nanoTime() - started) / 1_000_000)) } + } + try { + return chain.proceed(chain.request()).also { report(it.code) } + } catch (exception: IOException) { + report(null) + throw exception + } + } +} diff --git a/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/controllers/SameOriginInterceptor.kt b/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/controllers/SameOriginInterceptor.kt new file mode 100644 index 0000000..394583c --- /dev/null +++ b/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/controllers/SameOriginInterceptor.kt @@ -0,0 +1,31 @@ +/* Copyright (c) 2026 QRunIO. SPDX-License-Identifier: Apache-2.0 */ +package com.kingsrook.qqq.frontend.android.core.controllers + +import okhttp3.HttpUrl +import okhttp3.Interceptor +import okhttp3.Response + +/******************************************************************************* + ** Native requests have no browser to supply `Origin`, yet cookie-bearing QQQ mutations must present their own origin. + ** The value is always the canonical scheme/host/port of the actual request URL: never credentials, input or header state. + ** Install it only on clients that talk to the selected QQQ server, never on provider, logo or download clients, and + ** after any header-adding interceptor so that it has the final say. + *******************************************************************************/ +class SameOriginInterceptor : Interceptor { + /******************************************************************************* + ** Replace any existing `Origin` with the origin of the URL being requested; redirects stay refused by the clients. + *******************************************************************************/ + override fun intercept(chain: Interceptor.Chain): Response = + chain.proceed(chain.request().newBuilder().header("Origin", httpOrigin(chain.request().url)).build()) + + companion object { + /******************************************************************************* + ** `scheme://host[:port]` with the scheme's default port omitted and IPv6 hosts bracketed. + *******************************************************************************/ + fun httpOrigin(url: HttpUrl): String { + val host = if (url.host.contains(':')) "[${url.host}]" else url.host + val port = if (url.port == HttpUrl.defaultPort(url.scheme)) "" else ":${url.port}" + return "${url.scheme}://$host$port" + } + } +} diff --git a/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/controllers/UiApiCompatibility.kt b/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/controllers/UiApiCompatibility.kt new file mode 100644 index 0000000..a40dddb --- /dev/null +++ b/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/controllers/UiApiCompatibility.kt @@ -0,0 +1,128 @@ +/* Copyright (c) 2026 QRunIO. SPDX-License-Identifier: Apache-2.0 */ +package com.kingsrook.qqq.frontend.android.core.controllers + +import java.io.IOException +import java.util.concurrent.TimeUnit +import kotlinx.serialization.Serializable +import kotlinx.serialization.json.Json +import okhttp3.OkHttpClient +import okhttp3.Request + +const val ANDROID_CLIENT = "android/qqq-mobile" +const val MOBILE_SCANNERS_PATH = "/qqq/v1/qbit/mobile-scanners" + +/******************************************************************************* + ** Carry the named extension's version and registered path prefix for pre-credential compatibility checks. + *******************************************************************************/ +@Serializable +data class UiApiExtension(val name: String, val version: String, val pathPrefix: String) + +/******************************************************************************* + ** Represent public server capabilities independently of any authenticated session. + *******************************************************************************/ +@Serializable +data class UiApiVersion( + val apiVersion: String, val features: List<String> = emptyList(), val extensions: List<UiApiExtension> = emptyList(), + val clientChannels: List<String> = emptyList() +) + +/******************************************************************************* + ** Stop unsupported client/server combinations with a safe operator-facing explanation. + *******************************************************************************/ +class UiApiCompatibilityException(message: String) : IOException(message) + +/******************************************************************************* + ** One origin and one host lifetime. Discovery uses a separate client with no credentials or cookies. + *******************************************************************************/ +class UiApiCompatibility( + val server: String, private val requireMobileScanners: Boolean = false, + private val observer: (RequestOutcome) -> Unit = {} +) { + private val client = OkHttpClient.Builder().followRedirects(false).followSslRedirects(false) + .callTimeout(5, TimeUnit.SECONDS).addInterceptor(RequestOutcomeInterceptor(observer)).build() + + @Volatile + private var verified: UiApiVersion? = null + + /******************************************************************************* + ** Non-blocking view of an already verified result; never performs discovery, so it is safe on the UI thread. + *******************************************************************************/ + fun verifiedVersion(): UiApiVersion? = verified + + /******************************************************************************* + ** Call on an IO thread. Synchronization prevents competing startup requests bypassing discovery. + *******************************************************************************/ + @Synchronized + fun verify(): UiApiVersion { + verified?.let { return it } + val request = Request.Builder().url(server.trimEnd('/') + "/qqq/v1/version") + .header("X-QQQ-Client", ANDROID_CLIENT).header("Cache-Control", "no-store").build() + val version = client.newCall(request).execute().use { response -> + if (!response.isSuccessful) throw UiApiCompatibilityException("This server does not provide a supported QQQ UI API. Ask your administrator to upgrade the server.") + val source = response.body?.source() + source?.request(65537) + val bytes = source?.buffer?.readByteArray(minOf(source.buffer.size, 65537)) ?: byteArrayOf() + if (bytes.size > 65536) throw UiApiCompatibilityException("The server returned invalid QQQ UI API version information.") + try { + Json { ignoreUnknownKeys = true; coerceInputValues = true }.decodeFromString<UiApiVersion>(bytes.toString(Charsets.UTF_8)) + } catch (exception: Exception) { + throw UiApiCompatibilityException("The server returned invalid QQQ UI API version information.") + } + } + validate(version, requireMobileScanners) + verified = version + return version + } + + /******************************************************************************* + ** Keep supported protocol ranges and feature checks shared by startup and optional authentication discovery. + *******************************************************************************/ + companion object { + // Compiled and tested against the published 1.8.0 contract; additive 1.x versions remain compatible. + const val SUPPORTED_CORE_RANGE = ">=1.8.0 <2.0.0" + const val SUPPORTED_MOBILE_RANGE = ">=1.1.0 <2.0.0" + val REQUIRED_FEATURES = setOf("version", "metaData", "processes", "processCancel", "extensions", "widgets") + + /******************************************************************************* + ** Require the original-nonce native session contract before opening the authorization browser. + *******************************************************************************/ + fun validateNativeSessionLogin(version: UiApiVersion) { + val parts = Regex("1\\.(0|[1-9][0-9]*)\\.(0|[1-9][0-9]*)").matchEntire(version.apiVersion)?.groupValues + if (parts == null || (parts[1].toIntOrNull() ?: 0) < 10 || + !version.features.containsAll(listOf("nativeSessionLogin", "nativeSessionNonceValidation")) + ) + throw UiApiCompatibilityException("This server does not advertise native browser sign-in with required nonce validation. Ask your administrator to enable the supported login flow.") + } + + /******************************************************************************* + ** The logout capability is additive and must never be inferred from native login support. + *******************************************************************************/ + fun validateNativeSessionLogout(version: UiApiVersion) { + val parts = Regex("1\\.(0|[1-9][0-9]*)\\.(0|[1-9][0-9]*)").matchEntire(version.apiVersion)?.groupValues + if (parts == null || (parts[1].toIntOrNull() ?: 0) < 10 || "nativeSessionLogout" !in version.features) + throw UiApiCompatibilityException("This server does not advertise company sign-out.") + } + + /******************************************************************************* + ** Require compatible API semantics, Android channel and optional scanner extension before credentials are sent. + *******************************************************************************/ + fun validate(version: UiApiVersion, requireMobileScanners: Boolean) { + /******************************************************************************* + ** Accept additive versions in the supported major while rejecting malformed or overflowing version components. + *******************************************************************************/ + fun supported(value: String, minMinor: Int): Boolean { + val parts = Regex("(0|[1-9][0-9]*)\\.(0|[1-9][0-9]*)\\.(0|[1-9][0-9]*)").matchEntire(value)?.groupValues ?: return false + return parts[1] == "1" && (parts[2].toIntOrNull() ?: return false) >= minMinor && parts[3].toIntOrNull() != null + } + if (!supported(version.apiVersion, 8)) throw UiApiCompatibilityException("Unsupported QQQ UI API version. This app requires $SUPPORTED_CORE_RANGE. Update the app or ask your administrator to upgrade the server.") + if (!version.features.containsAll(REQUIRED_FEATURES)) throw UiApiCompatibilityException("This server is missing required QQQ UI API features. Ask your administrator to upgrade the server.") + if ("android" !in version.clientChannels) throw UiApiCompatibilityException("This server does not support the Android client channel. Ask your administrator to enable the android channel.") + if (requireMobileScanners) { + val extension = version.extensions.singleOrNull { it.name == "mobile-scanners" } + ?: throw UiApiCompatibilityException("This server is missing the mobile-scanners extension. Ask your administrator to install it.") + if (!supported(extension.version, 1) || extension.pathPrefix != "/qbit/mobile-scanners") + throw UiApiCompatibilityException("Unsupported mobile-scanners extension. This app requires $SUPPORTED_MOBILE_RANGE at /qbit/mobile-scanners. Update the app or server extension.") + } + } + } +} diff --git a/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/controllers/UiApiException.kt b/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/controllers/UiApiException.kt new file mode 100644 index 0000000..7d7d9a8 --- /dev/null +++ b/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/controllers/UiApiException.kt @@ -0,0 +1,67 @@ +/* Copyright (c) 2026 QRunIO. SPDX-License-Identifier: Apache-2.0 */ +package com.kingsrook.qqq.frontend.android.core.controllers + +import java.io.IOException +import kotlinx.serialization.Serializable +import kotlinx.serialization.json.Json +import okhttp3.Interceptor +import okhttp3.Response + +/******************************************************************************* + ** Associate a server validation message with its semantic field without adding it to diagnostic telemetry. + *******************************************************************************/ +@Serializable +data class UiApiFieldError(val field: String = "", val message: String = "", val code: String? = null) + +/******************************************************************************* + ** Decode the bounded semantic error envelope while tolerating additive server fields. + *******************************************************************************/ +@Serializable +private data class UiApiErrorBody( + val message: String? = null, val code: String? = null, + val fieldErrors: List<UiApiFieldError> = emptyList(), val traceId: String? = null +) + +/******************************************************************************* + ** Human-facing server errors are available to the UI, never to the diagnostic event log. + *******************************************************************************/ +class UiApiException( + val httpStatus: Int, val code: String, message: String, + val fieldErrors: List<UiApiFieldError> = emptyList(), val traceId: String? = null +) : IOException(message) { + /******************************************************************************* + ** Centralize bounded response parsing and safe fallback messages for HTTP errors. + *******************************************************************************/ + companion object { + /******************************************************************************* + ** Peek at a bounded error body without consuming response ownership and retain a safe HTTP fallback. + *******************************************************************************/ + fun from(response: Response): UiApiException { + val body = runCatching { Json { ignoreUnknownKeys = true }.decodeFromString<UiApiErrorBody>(response.peekBody(65536).string()) }.getOrNull() + val fallback = when (response.code) { + 400 -> "BAD_REQUEST"; 401 -> "UNAUTHENTICATED"; 403 -> "PERMISSION_DENIED" + 404 -> "NOT_FOUND"; 409 -> "CONFLICT"; 429 -> "RATE_LIMITED"; 500 -> "INTERNAL_ERROR"; else -> "ERROR" + } + return UiApiException( + response.code, body?.code ?: fallback, + body?.message?.takeIf { it.isNotBlank() } ?: "The server could not complete this request (HTTP ${response.code}).", + body?.fieldErrors ?: emptyList(), body?.traceId ?: response.header("X-QQQ-Trace-Id")) + } + } +} + +/******************************************************************************* + ** Convert failed responses into semantic exceptions while closing their network resources. + *******************************************************************************/ +class UiApiErrorInterceptor : Interceptor { + /******************************************************************************* + ** Return successful response ownership to the caller and close failed responses before throwing. + *******************************************************************************/ + override fun intercept(chain: Interceptor.Chain): Response { + val response = chain.proceed(chain.request()) + if (!response.isSuccessful) { + val error = UiApiException.from(response); response.close(); throw error + } + return response + } +} diff --git a/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/model/Environment.kt b/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/model/Environment.kt new file mode 100644 index 0000000..ef220ea --- /dev/null +++ b/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/model/Environment.kt @@ -0,0 +1,33 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2024-2024. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.kingsrook.qqq.frontend.android.core.model + +import kotlinx.serialization.Serializable + +/******************************************************************************* + *******************************************************************************/ +@Serializable +data class Environment( + val label: String, + val baseUrl: String, +) { +} diff --git a/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/model/GenericSerializing.kt b/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/model/GenericSerializing.kt new file mode 100644 index 0000000..f398f32 --- /dev/null +++ b/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/model/GenericSerializing.kt @@ -0,0 +1,202 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2004-2024. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package com.kingsrook.qqq.frontend.android.core.model + +import kotlinx.serialization.KSerializer +import kotlinx.serialization.Contextual +import kotlinx.serialization.Serializable +import kotlinx.serialization.SerializationException +import kotlinx.serialization.builtins.ListSerializer +import kotlinx.serialization.builtins.MapSerializer +import kotlinx.serialization.builtins.serializer +import kotlinx.serialization.descriptors.SerialDescriptor +import kotlinx.serialization.encoding.Decoder +import kotlinx.serialization.encoding.Encoder +import kotlinx.serialization.json.Json +import kotlinx.serialization.json.JsonArray +import kotlinx.serialization.json.JsonDecoder +import kotlinx.serialization.json.JsonElement +import kotlinx.serialization.json.JsonEncoder +import kotlinx.serialization.json.JsonNull +import kotlinx.serialization.json.JsonObject +import kotlinx.serialization.json.JsonPrimitive +import kotlinx.serialization.json.booleanOrNull +import kotlinx.serialization.json.doubleOrNull +import kotlinx.serialization.json.longOrNull +import kotlinx.serialization.serializer +import kotlin.reflect.full.starProjectedType + +typealias MapOfStringAny = Map<String, @Serializable(with = AnyValueSerializer::class) Any?> +typealias MutableMapOfStringAny = MutableMap<String, @Serializable(with = AnyValueSerializer::class) Any?> +typealias ListOfAny = List<@Serializable(with = AnyValueSerializer::class) Any?> + +/******************************************************************************* + ** Legacy public model retained for source compatibility; it has no special meaning in API JSON. + *******************************************************************************/ +@Serializable +data class AnyValueSurrogate(val type: String, @Contextual val value: Any?) + +/******************************************************************************* + ** Legacy null marker retained for callers; API nulls use JSON null. + *******************************************************************************/ +@Serializable +object NoneType + +/******************************************************************************* + ** Wrapper retained for clients using the original generic serializer API. + *******************************************************************************/ +@Serializable(with = AnySerializableValueSerializer::class) +data class AnySerializableValue(val value: Any?) + +/******************************************************************************* + ** Delegate wrapped values to the JSON data serializer without class discovery. + *******************************************************************************/ +object AnySerializableValueSerializer : KSerializer<AnySerializableValue> { + override val descriptor = JsonElement.serializer().descriptor + + /******************************************************************************* + ** Delegate framing to the declared JSON serializer without introducing wire-controlled JVM class discovery. + *******************************************************************************/ + override fun serialize(encoder: Encoder, value: AnySerializableValue) = AnyValueSerializer.serialize(encoder, value.value) + + /******************************************************************************* + ** Reconstruct the declared wrapper through its JSON delegate instead of resolving classes from input. + *******************************************************************************/ + override fun deserialize(decoder: Decoder) = AnySerializableValue(AnyValueSerializer.deserialize(decoder)) +} + +typealias SerializableMapType = MutableMap<String, AnySerializableValue> +typealias SerializableListType = MutableList<AnySerializableValue> + +/******************************************************************************* + ** Legacy collection declarations retain their original public API shape. + *******************************************************************************/ +@Serializable +abstract class SerializableMap : SerializableMapType + +/******************************************************************************* + ** Legacy collection declarations retain their original public API shape. + *******************************************************************************/ +@Serializable +abstract class SerializableList : SerializableListType + +/******************************************************************************* + ** Semantic API values are JSON data; business keys never select JVM classes. + *******************************************************************************/ +object AnyValueSerializer : KSerializer<Any?> { + override val descriptor: SerialDescriptor = JsonElement.serializer().descriptor + + /******************************************************************************* + ** Encode arbitrary API maps/lists without adding class-name envelopes. + *******************************************************************************/ + override fun serialize(encoder: Encoder, value: Any?) { + val json = encoder as? JsonEncoder ?: throw SerializationException("API values require JSON") + json.encodeJsonElement(toJson(value)) + } + + /******************************************************************************* + ** Decode objects uniformly, including objects whose keys happen to be type and value. + *******************************************************************************/ + override fun deserialize(decoder: Decoder): Any? { + val json = decoder as? JsonDecoder ?: throw SerializationException("API values require JSON") + return fromJson(json.decodeJsonElement()) + } + + /******************************************************************************* + ** Only serialization uses a locally supplied object's serializer; wire input never loads classes. + *******************************************************************************/ + private fun toJson(value: Any?): JsonElement = when (value) { + null -> JsonNull + is JsonElement -> value + is String -> JsonPrimitive(value) + is Boolean -> JsonPrimitive(value) + is Number -> JsonPrimitive(value) + is Map<*, *> -> JsonObject(value.entries.associate { entry -> + val name = entry.key as? String ?: throw SerializationException("JSON object keys must be strings") + name to toJson(entry.value) + }) + + is Iterable<*> -> JsonArray(value.map(::toJson)) + else -> Json.encodeToJsonElement(serializer(value::class.starProjectedType), value) + } + + /******************************************************************************* + ** Preserve integer values and nulls while keeping arbitrary nested objects as ordinary maps. + *******************************************************************************/ + private fun fromJson(value: JsonElement): Any? = when (value) { + JsonNull -> null + is JsonObject -> value.mapValues { fromJson(it.value) } + is JsonArray -> value.map(::fromJson) + is JsonPrimitive -> if (value.isString) value.content else + value.booleanOrNull ?: value.longOrNull ?: value.doubleOrNull + ?: throw SerializationException("Invalid JSON primitive") + } +} + +/******************************************************************************* + ** Wrapper retained for callers that serialize arbitrary JSON object values. + *******************************************************************************/ +@Serializable(with = MapStringAnySerializer::class) +data class MapStringAny(val entries: Map<String, Any?> = emptyMap()) + +/******************************************************************************* + ** Delegate object framing to the standard map serializer. + *******************************************************************************/ +object MapStringAnySerializer : KSerializer<MapStringAny> { + private val delegate = MapSerializer(String.serializer(), AnyValueSerializer) + override val descriptor = delegate.descriptor + + /******************************************************************************* + ** Delegate framing to the declared JSON serializer without introducing wire-controlled JVM class discovery. + *******************************************************************************/ + override fun serialize(encoder: Encoder, value: MapStringAny) = delegate.serialize(encoder, value.entries) + + /******************************************************************************* + ** Reconstruct the declared wrapper through its JSON delegate instead of resolving classes from input. + *******************************************************************************/ + override fun deserialize(decoder: Decoder) = MapStringAny(delegate.deserialize(decoder)) +} + +/******************************************************************************* + ** Wrapper retained for callers that serialize arbitrary JSON lists. + *******************************************************************************/ +@Serializable(with = ListAnySerializer::class) +data class ListAny(val entries: List<Any?> = emptyList()) + +/******************************************************************************* + ** Delegate list framing to the standard list serializer. + *******************************************************************************/ +object ListAnySerializer : KSerializer<ListAny> { + private val delegate = ListSerializer(AnyValueSerializer) + override val descriptor = delegate.descriptor + + /******************************************************************************* + ** Delegate framing to the declared JSON serializer without introducing wire-controlled JVM class discovery. + *******************************************************************************/ + override fun serialize(encoder: Encoder, value: ListAny) = delegate.serialize(encoder, value.entries) + + /******************************************************************************* + ** Reconstruct the declared wrapper through its JSON delegate instead of resolving classes from input. + *******************************************************************************/ + override fun deserialize(decoder: Decoder) = ListAny(delegate.deserialize(decoder)) +} diff --git a/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/model/QPossibleValue.kt b/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/model/QPossibleValue.kt new file mode 100644 index 0000000..d8cee57 --- /dev/null +++ b/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/model/QPossibleValue.kt @@ -0,0 +1,34 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2024-2024. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.kingsrook.qqq.frontend.android.core.model + +import java.io.Serializable + +/******************************************************************************* + *******************************************************************************/ +@kotlinx.serialization.Serializable +data class QPossibleValue( + val id: Serializable, + val label: String +) { + +} diff --git a/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/model/RecordData.kt b/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/model/RecordData.kt new file mode 100644 index 0000000..82e33ab --- /dev/null +++ b/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/model/RecordData.kt @@ -0,0 +1,30 @@ +/* Copyright (c) 2026 QRunIO. SPDX-License-Identifier: Apache-2.0 */ +package com.kingsrook.qqq.frontend.android.core.model + +import kotlinx.serialization.Serializable +import kotlinx.serialization.json.JsonElement +import kotlinx.serialization.json.JsonPrimitive +import kotlinx.serialization.json.contentOrNull + +/******************************************************************************* + ** Versioned table responses preserve opaque primary keys and display values. + *******************************************************************************/ +@Serializable +data class RecordData( + val tableName: String? = null, + val recordLabel: String? = null, + val values: Map<String, JsonElement> = emptyMap(), + val displayValues: Map<String, JsonElement> = emptyMap(), +) { + fun id(primaryKey: String): String? = (values[primaryKey] as? JsonPrimitive)?.contentOrNull + fun display(field: String): String = ((displayValues[field] ?: values[field]) as? JsonPrimitive)?.contentOrNull.orEmpty() +} + +/******************************************************************************* + ** Query records are unwrapped; a get response wraps exactly one record. + *******************************************************************************/ +@Serializable +data class RecordQueryResponse(val records: List<RecordData> = emptyList()) + +@Serializable +data class RecordGetResponse(val record: RecordData) diff --git a/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/model/RecordLayout.kt b/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/model/RecordLayout.kt new file mode 100644 index 0000000..ab7ca7a --- /dev/null +++ b/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/model/RecordLayout.kt @@ -0,0 +1,41 @@ +/* Copyright (c) 2026 QRunIO. SPDX-License-Identifier: Apache-2.0 */ +package com.kingsrook.qqq.frontend.android.core.model + +import com.kingsrook.qqq.frontend.android.core.model.metadata.QFieldMetaData +import com.kingsrook.qqq.frontend.android.core.model.metadata.QRecordAssociation +import com.kingsrook.qqq.frontend.android.core.model.metadata.QTableMetaData +import kotlinx.serialization.json.JsonElement +import kotlinx.serialization.json.JsonNull +import kotlinx.serialization.json.JsonPrimitive + +data class RecordFieldGroup(val label: String, val fields: List<QFieldMetaData>) + +/** Retain metadata order, suppress hidden sections, and show ungrouped fields once. */ +fun QTableMetaData.recordGroups(): List<RecordFieldGroup> { + val sections = sections.orEmpty() + val hidden = sections.filter { it.isHidden || it.hidden }.flatMap { it.fieldNames.orEmpty() }.toSet() + val remaining = fields.filterValues { !it.isHidden && !it.isHeavy }.toMutableMap() + hidden.forEach(remaining::remove) + val groups = sections.filter { !it.isHidden && !it.hidden }.mapNotNull { section -> + val members = section.fieldNames.orEmpty().mapNotNull(remaining::remove) + if (members.isEmpty()) null else RecordFieldGroup(section.label ?: section.name, members) + }.toMutableList() + if (remaining.isNotEmpty()) groups.add(RecordFieldGroup(if (groups.isEmpty()) "Details" else "Other fields", remaining.values.toList())) + return groups +} + +/** Resolve only declared, direct equality joins. Missing values must never become an unfiltered query. */ +fun QRecordAssociation.parentMatches(parentTable: String, record: RecordData): Map<String, JsonElement>? { + val forward = join.leftTable == parentTable && join.rightTable == associatedTableName + val reverse = join.rightTable == parentTable && join.leftTable == associatedTableName + if ((!forward && !reverse) || join.joinOns.isEmpty()) return null + val matches = linkedMapOf<String, JsonElement>() + for (on in join.joinOns) { + val source = if (forward) on.leftField else on.rightField + val target = if (forward) on.rightField else on.leftField + val value = record.values[source] + if (target.isBlank() || source.isBlank() || value !is JsonPrimitive || value == JsonNull || target in matches) return null + matches[target] = value + } + return matches +} diff --git a/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/model/RecordSearch.kt b/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/model/RecordSearch.kt new file mode 100644 index 0000000..01a5b64 --- /dev/null +++ b/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/model/RecordSearch.kt @@ -0,0 +1,74 @@ +/* Copyright (c) 2026 QRunIO. SPDX-License-Identifier: Apache-2.0 */ +package com.kingsrook.qqq.frontend.android.core.model + +import com.kingsrook.qqq.frontend.android.core.model.metadata.QFieldMetaData +import com.kingsrook.qqq.frontend.android.core.model.metadata.QFieldType +import com.kingsrook.qqq.frontend.android.core.model.metadata.QTableMetaData +import kotlinx.serialization.Serializable +import kotlinx.serialization.json.JsonElement +import kotlinx.serialization.json.JsonNull +import kotlinx.serialization.json.JsonPrimitive +import org.json.JSONArray +import org.json.JSONObject +import java.text.NumberFormat +import java.time.Instant +import java.time.LocalDate +import java.time.ZoneId +import java.time.format.DateTimeFormatter +import java.time.format.FormatStyle + +/** The same predicate is used by page and count requests. Parent matches remain mandatory. */ +data class RecordSearch( + val text: String = "", + val searchFields: List<String> = emptyList(), + val matches: Map<String, JsonElement> = emptyMap(), +) { + fun filter(): JSONObject { + val criteria = JSONArray() + matches.forEach { (name, value) -> + require(name.isNotBlank() && value is JsonPrimitive && value != JsonNull) + criteria.put(JSONObject().put("fieldName", name).put("operator", "EQUALS").put("values", JSONArray("[$value]"))) + } + val result = JSONObject().put("booleanOperator", "AND").put("criteria", criteria) + if (text.isNotBlank()) { + require(searchFields.isNotEmpty() && searchFields.all(String::isNotBlank)) + val search = JSONArray() + searchFields.forEach { search.put(JSONObject().put("fieldName", it).put("operator", "CONTAINS").put("values", JSONArray().put(text))) } + result.put("subFilters", JSONArray().put(JSONObject().put("booleanOperator", "OR").put("criteria", search))) + } + return result + } +} + +@Serializable +data class RecordCountResponse(val count: Long) + +/** Search only visible scalar text fields; server metadata defines preferred fields. */ +fun QTableMetaData.textFields(): List<QFieldMetaData> = recordGroups().flatMap { it.fields } + .filter { it.type == QFieldType.STRING || it.type == QFieldType.TEXT } + +fun QTableMetaData.recordSearchFields(): List<String> { + val visible = textFields().map { it.name } + return searchFields.orEmpty().filter { it in visible }.ifEmpty { visible.take(3) } +} + +/** Preserve server formatting and identifiers. Only typed dates and numbers receive a local fallback. */ +fun RecordData.formatted(field: QFieldMetaData): String { + val value = display(field.name) + if (value.isBlank()) return "—" + if (!field.displayFormat.isNullOrBlank() && field.displayFormat != "%s") return value + return runCatching { + when (field.type) { + QFieldType.DATE -> LocalDate.parse(value).format(DateTimeFormatter.ofLocalizedDate(FormatStyle.MEDIUM)) + QFieldType.DATE_TIME -> Instant.parse(value).atZone(ZoneId.systemDefault()).format(DateTimeFormatter.ofPattern("MMM d, yyyy · h:mm a z")) + QFieldType.DECIMAL -> NumberFormat.getNumberInstance().apply { maximumFractionDigits = 8 }.format(value.toBigDecimal()) + QFieldType.BOOLEAN -> when (value) { "true" -> "Yes"; "false" -> "No"; else -> value } + else -> value + } + }.getOrDefault(value) +} + +/** Compact summaries follow metadata order, omit the primary key and never expose hidden groups. */ +fun RecordData.summary(table: QTableMetaData): String = table.recordGroups().flatMap { it.fields } + .filter { it.name != table.primaryKeyField && display(it.name).isNotBlank() && display(it.name).length <= 80 && recordLabel?.contains(display(it.name)) != true } + .take(3).joinToString(" · ") { "${it.label}: ${formatted(it)}" } diff --git a/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/model/metadata/AdornmentType.kt b/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/model/metadata/AdornmentType.kt new file mode 100644 index 0000000..dfc805d --- /dev/null +++ b/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/model/metadata/AdornmentType.kt @@ -0,0 +1,54 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2024-2024. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.kingsrook.qqq.frontend.android.core.model.metadata + +/******************************************************************************* + *******************************************************************************/ +@kotlinx.serialization.Serializable(with = AdornmentTypeSerializer::class) +enum class AdornmentType { + UNKNOWN, + LINK, + CHIP, + SIZE, + ERROR, + RENDER_HTML, + REVEAL, + CODE_EDITOR, +} + +/******************************************************************************* + ** Keep unknown server enum values representable so additive metadata fails safely at the UI boundary. + *******************************************************************************/ +object AdornmentTypeSerializer : kotlinx.serialization.KSerializer<AdornmentType> { + override val descriptor = kotlinx.serialization.descriptors.PrimitiveSerialDescriptor("AdornmentType", kotlinx.serialization.descriptors.PrimitiveKind.STRING) + + /******************************************************************************* + ** Map known wire names explicitly and preserve unsupported values through the enum's UNKNOWN member. + *******************************************************************************/ + override fun deserialize(decoder: kotlinx.serialization.encoding.Decoder): AdornmentType = + decoder.decodeString().let { value -> AdornmentType.entries.firstOrNull { it.name == value } ?: AdornmentType.UNKNOWN } + + /******************************************************************************* + ** Write the stable enum wire name rather than a JVM implementation detail. + *******************************************************************************/ + override fun serialize(encoder: kotlinx.serialization.encoding.Encoder, value: AdornmentType) = encoder.encodeString(value.name) +} diff --git a/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/model/metadata/FieldAdornment.kt b/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/model/metadata/FieldAdornment.kt new file mode 100644 index 0000000..012766e --- /dev/null +++ b/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/model/metadata/FieldAdornment.kt @@ -0,0 +1,35 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2024-2024. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.kingsrook.qqq.frontend.android.core.model.metadata + +import com.kingsrook.qqq.frontend.android.core.model.MapOfStringAny +import kotlinx.serialization.Serializable + +/******************************************************************************* + *******************************************************************************/ +@Serializable +data class FieldAdornment( + val type: AdornmentType, + val values: MapOfStringAny? = emptyMap() +) { + +} diff --git a/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/model/metadata/QAppMetaData.kt b/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/model/metadata/QAppMetaData.kt new file mode 100644 index 0000000..72d59ab --- /dev/null +++ b/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/model/metadata/QAppMetaData.kt @@ -0,0 +1,41 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2004-2024. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package com.kingsrook.qqq.frontend.android.core.model.metadata + +import kotlinx.serialization.Serializable + +/******************************************************************************* + *******************************************************************************/ +@Serializable +data class QAppMetaData( + val name: String, + val label: String, + val children: List<QAppTreeNode>? = emptyList(), + val childMap: Map<String, QAppTreeNode>? = emptyMap(), + val icon: QIcon? = null, + val widgets: List<String>? = emptyList(), + val sections: List<QAppSection>? = emptyList(), + val keywords: List<String>? = emptyList(), +) { + +} diff --git a/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/model/metadata/QAppNodeType.kt b/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/model/metadata/QAppNodeType.kt new file mode 100644 index 0000000..aa118e3 --- /dev/null +++ b/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/model/metadata/QAppNodeType.kt @@ -0,0 +1,51 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2024-2024. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.kingsrook.qqq.frontend.android.core.model.metadata + +/******************************************************************************* + *******************************************************************************/ +@kotlinx.serialization.Serializable(with = QAppNodeTypeSerializer::class) +enum class QAppNodeType { + UNKNOWN, + TABLE, + PROCESS, + REPORT, + APP, +} + +/******************************************************************************* + ** Keep unknown server enum values representable so additive metadata fails safely at the UI boundary. + *******************************************************************************/ +object QAppNodeTypeSerializer : kotlinx.serialization.KSerializer<QAppNodeType> { + override val descriptor = kotlinx.serialization.descriptors.PrimitiveSerialDescriptor("QAppNodeType", kotlinx.serialization.descriptors.PrimitiveKind.STRING) + + /******************************************************************************* + ** Map known wire names explicitly and preserve unsupported values through the enum's UNKNOWN member. + *******************************************************************************/ + override fun deserialize(decoder: kotlinx.serialization.encoding.Decoder): QAppNodeType = + decoder.decodeString().let { value -> QAppNodeType.entries.firstOrNull { it.name == value } ?: QAppNodeType.UNKNOWN } + + /******************************************************************************* + ** Write the stable enum wire name rather than a JVM implementation detail. + *******************************************************************************/ + override fun serialize(encoder: kotlinx.serialization.encoding.Encoder, value: QAppNodeType) = encoder.encodeString(value.name) +} diff --git a/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/model/metadata/QAppSection.kt b/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/model/metadata/QAppSection.kt new file mode 100644 index 0000000..6f3506a --- /dev/null +++ b/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/model/metadata/QAppSection.kt @@ -0,0 +1,51 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2004-2024. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package com.kingsrook.qqq.frontend.android.core.model.metadata + +import kotlinx.serialization.Serializable + +/******************************************************************************* + *******************************************************************************/ +@Serializable +data class QAppSection( + val name: String, + val label: String, + val icon: QIcon? = null, + val tables: List<String>? = emptyList(), + val processes: List<String>? = emptyList(), + val reports: List<String>? = emptyList(), + val apps: List<String>? = emptyList(), + val role: String? = null, + val collapsedByDefault: Boolean? = null, +) { + + /******************************************************************************* + *******************************************************************************/ + fun hasContent(): Boolean { + if (apps?.isEmpty() != false && tables?.isEmpty() != false && processes?.isEmpty() != false && reports?.isEmpty() != false) { + return (false) + } + + return (true) + } +} diff --git a/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/model/metadata/QAppTreeNode.kt b/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/model/metadata/QAppTreeNode.kt new file mode 100644 index 0000000..bab913d --- /dev/null +++ b/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/model/metadata/QAppTreeNode.kt @@ -0,0 +1,39 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2004-2024. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package com.kingsrook.qqq.frontend.android.core.model.metadata + +import kotlinx.serialization.Serializable + +/******************************************************************************* + *******************************************************************************/ +@Serializable +data class QAppTreeNode( + val name: String, + val label: String, + val type: QAppNodeType, + val children: List<QAppTreeNode>? = emptyList(), + val icon: QIcon? = null, + val keywords: List<String>? = emptyList(), +) { + +} diff --git a/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/model/metadata/QBrandingMetaData.kt b/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/model/metadata/QBrandingMetaData.kt new file mode 100644 index 0000000..25a3f8f --- /dev/null +++ b/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/model/metadata/QBrandingMetaData.kt @@ -0,0 +1,40 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2024-2024. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.kingsrook.qqq.frontend.android.core.model.metadata + +import kotlinx.serialization.Serializable + +/******************************************************************************* + *******************************************************************************/ +@Serializable +data class QBrandingMetaData( + val companyName: String? = null, + val companyUrl: String? = null, + val appName: String? = null, + val logo: String? = null, + val icon: String? = null, + val accentColor: String? = null, + val environmentBannerText: String? = null, + val environmentBannerColor: String? = null, +) { + +} diff --git a/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/model/metadata/QComponentType.kt b/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/model/metadata/QComponentType.kt new file mode 100644 index 0000000..2c9df4f --- /dev/null +++ b/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/model/metadata/QComponentType.kt @@ -0,0 +1,59 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2024-2024. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.kingsrook.qqq.frontend.android.core.model.metadata + +/******************************************************************************* + *******************************************************************************/ +@kotlinx.serialization.Serializable(with = QComponentTypeSerializer::class) +enum class QComponentType { + UNKNOWN, + HELP_TEXT, + BULK_EDIT_FORM, + BULK_LOAD_MAPPING, + VALIDATION_REVIEW_SCREEN, + EDIT_FORM, + VIEW_FORM, + DOWNLOAD_FORM, + RECORD_LIST, + PROCESS_SUMMARY_RESULTS, + GOOGLE_DRIVE_SELECT_FOLDER, + WIDGET, + HTML, +} + +/******************************************************************************* + ** Keep unknown server enum values representable so additive metadata fails safely at the UI boundary. + *******************************************************************************/ +object QComponentTypeSerializer : kotlinx.serialization.KSerializer<QComponentType> { + override val descriptor = kotlinx.serialization.descriptors.PrimitiveSerialDescriptor("QComponentType", kotlinx.serialization.descriptors.PrimitiveKind.STRING) + + /******************************************************************************* + ** Map known wire names explicitly and preserve unsupported values through the enum's UNKNOWN member. + *******************************************************************************/ + override fun deserialize(decoder: kotlinx.serialization.encoding.Decoder): QComponentType = + decoder.decodeString().let { value -> QComponentType.entries.firstOrNull { it.name == value } ?: QComponentType.UNKNOWN } + + /******************************************************************************* + ** Write the stable enum wire name rather than a JVM implementation detail. + *******************************************************************************/ + override fun serialize(encoder: kotlinx.serialization.encoding.Encoder, value: QComponentType) = encoder.encodeString(value.name) +} diff --git a/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/model/metadata/QFieldMetaData.kt b/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/model/metadata/QFieldMetaData.kt new file mode 100644 index 0000000..2a50a8e --- /dev/null +++ b/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/model/metadata/QFieldMetaData.kt @@ -0,0 +1,68 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2024-2024. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.kingsrook.qqq.frontend.android.core.model.metadata + +import com.kingsrook.qqq.frontend.android.core.model.AnyValueSerializer +import com.kingsrook.qqq.frontend.android.core.model.QPossibleValue +import kotlinx.serialization.Serializable + +/******************************************************************************* + *******************************************************************************/ +@Serializable +data class QFieldMetaData( + val name: String, + val label: String, + @Serializable(with = AnyValueSerializer::class) + val defaultValue: Any? = null, + val type: QFieldType, + val isRequired: Boolean = false, + val isEditable: Boolean = true, + val isHeavy: Boolean = false, + val possibleValueSourceName: String? = null, + val inlinePossibleValueSource: List<QPossibleValue>? = null, + // Contingent fields only: DISABLE_UNTIL_SET (default when depending) or SHOW_ALL_UNTIL_SET. + val possibleValueSourceDependsOn: List<String>? = null, + val possibleValueSourceDependencyBehavior: String? = null, + val displayFormat: String? = null, + val adornments: List<FieldAdornment>? = null, + val helpContents: List<QHelpContent>? = null, + val isHidden: Boolean = false, + val validation: FieldValidation? = null, +) { + +} + +/******************************************************************************* + ** Carry semantic field constraints so native validation follows the server contract. + *******************************************************************************/ +@Serializable +data class FieldValidation( + val required: Boolean? = null, + val maxLength: Int? = null, + val tooLongBehavior: String? = null, + val minValue: String? = null, + val maxValue: String? = null, + val minInclusive: Boolean? = null, + val maxInclusive: Boolean? = null, + val pattern: String? = null, + val patternMessage: String? = null, +) diff --git a/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/model/metadata/QFieldType.kt b/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/model/metadata/QFieldType.kt new file mode 100644 index 0000000..cdf7c08 --- /dev/null +++ b/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/model/metadata/QFieldType.kt @@ -0,0 +1,59 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2024-2024. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.kingsrook.qqq.frontend.android.core.model.metadata + +/******************************************************************************* + *******************************************************************************/ +@kotlinx.serialization.Serializable(with = QFieldTypeSerializer::class) +enum class QFieldType { + UNKNOWN, + BOOLEAN, + STRING, + INTEGER, + LONG, + DECIMAL, + DATE, + TIME, + DATE_TIME, + TEXT, + HTML, + PASSWORD, + BLOB, +} + +/******************************************************************************* + ** Keep unknown server enum values representable so additive metadata fails safely at the UI boundary. + *******************************************************************************/ +object QFieldTypeSerializer : kotlinx.serialization.KSerializer<QFieldType> { + override val descriptor = kotlinx.serialization.descriptors.PrimitiveSerialDescriptor("QFieldType", kotlinx.serialization.descriptors.PrimitiveKind.STRING) + + /******************************************************************************* + ** Map known wire names explicitly and preserve unsupported values through the enum's UNKNOWN member. + *******************************************************************************/ + override fun deserialize(decoder: kotlinx.serialization.encoding.Decoder): QFieldType = + decoder.decodeString().let { value -> QFieldType.entries.firstOrNull { it.name == value } ?: QFieldType.UNKNOWN } + + /******************************************************************************* + ** Write the stable enum wire name rather than a JVM implementation detail. + *******************************************************************************/ + override fun serialize(encoder: kotlinx.serialization.encoding.Encoder, value: QFieldType) = encoder.encodeString(value.name) +} diff --git a/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/model/metadata/QFrontendComponent.kt b/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/model/metadata/QFrontendComponent.kt new file mode 100644 index 0000000..f6f9d39 --- /dev/null +++ b/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/model/metadata/QFrontendComponent.kt @@ -0,0 +1,34 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2024-2024. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.kingsrook.qqq.frontend.android.core.model.metadata + +import com.kingsrook.qqq.frontend.android.core.model.AnyValueSerializer +import com.kingsrook.qqq.frontend.android.core.model.MapOfStringAny +import kotlinx.serialization.Serializable + +/******************************************************************************* + *******************************************************************************/ +@Serializable +data class QFrontendComponent( + val type: QComponentType, + val values: MapOfStringAny = emptyMap() +) diff --git a/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/model/metadata/QFrontendStepMetaData.kt b/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/model/metadata/QFrontendStepMetaData.kt new file mode 100644 index 0000000..3b12983 --- /dev/null +++ b/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/model/metadata/QFrontendStepMetaData.kt @@ -0,0 +1,41 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2004-2024. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package com.kingsrook.qqq.frontend.android.core.model.metadata + +import kotlinx.serialization.Serializable + +/******************************************************************************* + *******************************************************************************/ +@Serializable +data class QFrontendStepMetaData( + val name: String, + val label: String, + val format: String? = "default", + val components: List<QFrontendComponent>? = null, + val formFields: List<QFieldMetaData>? = null, + val viewFields: List<QFieldMetaData>? = null, + val recordListFields: List<QFieldMetaData>? = null, + val helpContents: List<QHelpContent>? = null, +) { + +} diff --git a/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/model/metadata/QHelpContent.kt b/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/model/metadata/QHelpContent.kt new file mode 100644 index 0000000..9a4f39e --- /dev/null +++ b/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/model/metadata/QHelpContent.kt @@ -0,0 +1,36 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2024-2024. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.kingsrook.qqq.frontend.android.core.model.metadata + +import kotlinx.serialization.Serializable + +/******************************************************************************* + *******************************************************************************/ +@Serializable +data class QHelpContent( + val content: String, + val format: String, + val roles: Set<String> = emptySet(), + val contentAsText: String? = null +) { + +} diff --git a/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/model/metadata/QIcon.kt b/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/model/metadata/QIcon.kt new file mode 100644 index 0000000..a7ec2ce --- /dev/null +++ b/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/model/metadata/QIcon.kt @@ -0,0 +1,36 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2024-2024. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.kingsrook.qqq.frontend.android.core.model.metadata + +import kotlinx.serialization.Serializable + +/******************************************************************************* + *******************************************************************************/ +@Serializable +data class QIcon( + val name: String? = null, + val path: String? = null, + val color: String? = null, + val semanticName: String? = null, +) { + +} diff --git a/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/model/metadata/QInstance.kt b/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/model/metadata/QInstance.kt new file mode 100644 index 0000000..2569d1a --- /dev/null +++ b/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/model/metadata/QInstance.kt @@ -0,0 +1,40 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2004-2024. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package com.kingsrook.qqq.frontend.android.core.model.metadata + +import kotlinx.serialization.Serializable + +/******************************************************************************* + *******************************************************************************/ +@Serializable +data class QInstance( + val tables: Map<String, QTableMetaData>? = emptyMap(), + val processes: Map<String, QProcessMetaData>? = emptyMap(), + val widgets: Map<String, QWidgetMetaData>? = emptyMap(), + val apps: Map<String, QAppMetaData>? = emptyMap(), + val appTree: List<QAppTreeNode> = emptyList(), + val branding: QBrandingMetaData? = QBrandingMetaData(), + val environmentValues: Map<String, String?> = emptyMap(), + val helpContent: Map<String, List<QHelpContent>>? = emptyMap(), +) { +} diff --git a/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/model/metadata/QProcessMetaData.kt b/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/model/metadata/QProcessMetaData.kt new file mode 100644 index 0000000..a5b9c4b --- /dev/null +++ b/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/model/metadata/QProcessMetaData.kt @@ -0,0 +1,40 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2004-2024. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package com.kingsrook.qqq.frontend.android.core.model.metadata + +import kotlinx.serialization.Serializable + +/******************************************************************************* + *******************************************************************************/ +@Serializable +data class QProcessMetaData( + val name: String, + val label: String, + val tableName: String? = null, + val icon: QIcon? = null, + val isHidden: Boolean = false, + val frontendSteps: List<QFrontendStepMetaData>? = emptyList(), + val hasPermission: Boolean = false, + val stepFlow: String = "LINEAR", +) { +} diff --git a/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/model/metadata/QProcessMetaDataWrapped.kt b/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/model/metadata/QProcessMetaDataWrapped.kt new file mode 100644 index 0000000..235d86f --- /dev/null +++ b/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/model/metadata/QProcessMetaDataWrapped.kt @@ -0,0 +1,32 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2024-2024. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.kingsrook.qqq.frontend.android.core.model.metadata + +import kotlinx.serialization.Serializable + +/******************************************************************************* + *******************************************************************************/ +@Serializable +data class QProcessMetaDataWrapped( + val process: QProcessMetaData +) { +} diff --git a/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/model/metadata/QTableMetaData.kt b/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/model/metadata/QTableMetaData.kt new file mode 100644 index 0000000..aa1dfe1 --- /dev/null +++ b/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/model/metadata/QTableMetaData.kt @@ -0,0 +1,67 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2004-2024. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package com.kingsrook.qqq.frontend.android.core.model.metadata + +import kotlinx.serialization.Serializable + +/******************************************************************************* + *******************************************************************************/ +@Serializable +data class QTableMetaData( + val name: String, + val label: String, + val icon: QIcon? = null, + val isHidden: Boolean = false, + val primaryKeyField: String? = null, + val fields: Map<String, QFieldMetaData> = emptyMap(), + val sections: List<QRecordSection>? = null, + val associations: List<QRecordAssociation>? = null, + val searchFields: List<String>? = null, +) { +} + +@Serializable +data class QRecordSection( + val name: String, + val label: String? = null, + val fieldNames: List<String>? = null, + val isHidden: Boolean = false, + val hidden: Boolean = false, +) + +@Serializable +data class QRecordAssociation( + val name: String, + val associatedTableName: String, + val join: QRecordJoin, +) + +@Serializable +data class QRecordJoin( + val leftTable: String, + val rightTable: String, + val joinOns: List<QRecordJoinOn> = emptyList(), +) + +@Serializable +data class QRecordJoinOn(val leftField: String, val rightField: String) diff --git a/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/model/metadata/QWidgetMetaData.kt b/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/model/metadata/QWidgetMetaData.kt new file mode 100644 index 0000000..1af3d74 --- /dev/null +++ b/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/model/metadata/QWidgetMetaData.kt @@ -0,0 +1,36 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2004-2024. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package com.kingsrook.qqq.frontend.android.core.model.metadata + +import kotlinx.serialization.Serializable + +/******************************************************************************* + *******************************************************************************/ +@Serializable +data class QWidgetMetaData( + val name: String, + val label: String? = null, + val icon: QIcon? = null, + val type: String, +) { +} diff --git a/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/model/metadata/authentication/Auth0AuthenticationMetaData.kt b/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/model/metadata/authentication/Auth0AuthenticationMetaData.kt new file mode 100644 index 0000000..10dc469 --- /dev/null +++ b/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/model/metadata/authentication/Auth0AuthenticationMetaData.kt @@ -0,0 +1,53 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2004-2024. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package com.kingsrook.qqq.frontend.android.core.model.metadata.authentication + +import kotlinx.serialization.Serializable + +/******************************************************************************* + *******************************************************************************/ +@Serializable +data class Auth0AuthenticationMetaData( + override val name: String, + val values: Auth0AuthenticationMetaDataValues +) : BaseAuthenticationMetaData { + override val type: String + get() = TYPE + + /******************************************************************************* + ** Keep the authentication type discriminator alongside the model consumed by polymorphic decoding. + *******************************************************************************/ + companion object { + const val TYPE = "AUTH_0" + } +} + +/******************************************************************************* + ** Carry public Auth0 client configuration without storing passwords or session credentials. + *******************************************************************************/ +@Serializable +data class Auth0AuthenticationMetaDataValues( + val baseUrl: String, + val clientId: String, + val audience: String, +) diff --git a/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/model/metadata/authentication/AuthenticationSerializer.kt b/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/model/metadata/authentication/AuthenticationSerializer.kt new file mode 100644 index 0000000..f9b2b76 --- /dev/null +++ b/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/model/metadata/authentication/AuthenticationSerializer.kt @@ -0,0 +1,49 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2024-2024. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.kingsrook.qqq.frontend.android.core.model.metadata.authentication + +import kotlinx.serialization.SerializationException +import kotlinx.serialization.json.Json +import kotlinx.serialization.json.JsonContentPolymorphicSerializer +import kotlinx.serialization.json.JsonElement +import kotlinx.serialization.json.jsonObject +import kotlinx.serialization.json.jsonPrimitive + +/******************************************************************************* + *******************************************************************************/ +object AuthenticationSerializer : JsonContentPolymorphicSerializer<BaseAuthenticationMetaData>(BaseAuthenticationMetaData::class) { + /******************************************************************************* + *******************************************************************************/ + override fun selectDeserializer(element: JsonElement) = when (element.jsonObject["type"]?.jsonPrimitive?.content) { + Auth0AuthenticationMetaData.TYPE -> Auth0AuthenticationMetaData.serializer() + OAuth2AuthenticationMetaData.TYPE -> OAuth2AuthenticationMetaData.serializer() + FullyAnonymousAuthenticationMetaData.TYPE -> FullyAnonymousAuthenticationMetaData.serializer() + TableBasedAuthenticationMetaData.TYPE, "tableBased" -> TableBasedAuthenticationMetaData.serializer() + else -> UnsupportedAuthenticationMetaData.serializer() + } +} + +/******************************************************************************* + ** Preserve an unknown authentication discriminator so unsupported methods fail explicitly in the UI. + *******************************************************************************/ +@kotlinx.serialization.Serializable +data class UnsupportedAuthenticationMetaData(override val type: String, override val name: String = "Unsupported authentication") : BaseAuthenticationMetaData diff --git a/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/model/metadata/authentication/BaseAuthenticationMetaData.kt b/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/model/metadata/authentication/BaseAuthenticationMetaData.kt new file mode 100644 index 0000000..7500d74 --- /dev/null +++ b/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/model/metadata/authentication/BaseAuthenticationMetaData.kt @@ -0,0 +1,33 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2024-2024. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.kingsrook.qqq.frontend.android.core.model.metadata.authentication + +import kotlinx.serialization.Serializable + +/******************************************************************************* + *******************************************************************************/ +@Serializable(with = AuthenticationSerializer::class) +sealed interface BaseAuthenticationMetaData { + val type: String; + val name: String; + +} diff --git a/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/model/metadata/authentication/FullyAnonymousAuthenticationMetaData.kt b/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/model/metadata/authentication/FullyAnonymousAuthenticationMetaData.kt new file mode 100644 index 0000000..4505453 --- /dev/null +++ b/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/model/metadata/authentication/FullyAnonymousAuthenticationMetaData.kt @@ -0,0 +1,41 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2024-2024. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.kingsrook.qqq.frontend.android.core.model.metadata.authentication + +import kotlinx.serialization.Serializable + +/******************************************************************************* + *******************************************************************************/ +@Serializable +data class FullyAnonymousAuthenticationMetaData( + override val name: String +) : BaseAuthenticationMetaData { + override val type: String + get() = TYPE; + + /******************************************************************************* + ** Keep the anonymous authentication discriminator aligned with polymorphic server metadata. + *******************************************************************************/ + companion object { + const val TYPE = "FULLY_ANONYMOUS" + } +} diff --git a/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/model/metadata/authentication/ManageSessionRequest.kt b/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/model/metadata/authentication/ManageSessionRequest.kt new file mode 100644 index 0000000..d021ffe --- /dev/null +++ b/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/model/metadata/authentication/ManageSessionRequest.kt @@ -0,0 +1,47 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2024-2024. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.kingsrook.qqq.frontend.android.core.model.metadata.authentication + +import kotlinx.serialization.Serializable + +/******************************************************************************* + *******************************************************************************/ +@Serializable +data class ManageSessionRequest( + val accessToken: String? = null, + val uuid: String? = null, + val code: String? = null, + val codeVerifier: String? = null, + val redirectUri: String? = null, + val authenticationFlow: String? = null, + val expectedNonce: String? = null +) { + /******************************************************************************* + ** Redact authentication material so incidental object rendering cannot expose credentials. + *******************************************************************************/ + override fun toString(): String = "ManageSessionRequest(credentials redacted)" +} + +/******************************************************************************* + ** AppAuth generates unpadded base64url; bound the semantic nonce before any code exchange. + *******************************************************************************/ +fun isValidExpectedNonce(value: String?): Boolean = value != null && Regex("[A-Za-z0-9_-]{16,512}").matches(value) diff --git a/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/model/metadata/authentication/ManageSessionResponse.kt b/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/model/metadata/authentication/ManageSessionResponse.kt new file mode 100644 index 0000000..e97b812 --- /dev/null +++ b/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/model/metadata/authentication/ManageSessionResponse.kt @@ -0,0 +1,39 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2024-2024. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.kingsrook.qqq.frontend.android.core.model.metadata.authentication + +import com.kingsrook.qqq.frontend.android.core.model.MapOfStringAny +import kotlinx.serialization.Serializable + +/******************************************************************************* + *******************************************************************************/ +@Serializable +data class ManageSessionResponse( + val uuid: String? = null, + val values: MapOfStringAny = emptyMap(), +) { + /******************************************************************************* + ** Display name from the optional values.user object; absent, non-object or blank names yield null. + *******************************************************************************/ + val userName: String? + get() = ((values["user"] as? Map<*, *>)?.get("name") as? String)?.takeIf { it.isNotBlank() } +} diff --git a/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/model/metadata/authentication/NativeLogout.kt b/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/model/metadata/authentication/NativeLogout.kt new file mode 100644 index 0000000..64747e2 --- /dev/null +++ b/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/model/metadata/authentication/NativeLogout.kt @@ -0,0 +1,31 @@ +/* Copyright (c) 2026 QRunIO. SPDX-License-Identifier: Apache-2.0 */ +package com.kingsrook.qqq.frontend.android.core.model.metadata.authentication + +import kotlinx.serialization.Serializable + +/******************************************************************************* + ** An explicit request for optional provider logout; ordinary logout retains its existing contract. + *******************************************************************************/ +@Serializable +data class NativeLogoutRequest(val nativeLogout: NativeLogout) + +/******************************************************************************* + ** Send only the explicitly selected registered callback when requesting company sign-out. + *******************************************************************************/ +@Serializable +data class NativeLogout(val postLogoutRedirectUri: String) + +/******************************************************************************* + ** Secret-bearing response: deliberately no data-class toString/copy/component methods. + *******************************************************************************/ +@Serializable +class NativeLogoutResponse(val nativeLogoutData: NativeLogoutData? = null) + +/******************************************************************************* + ** Transient original ID-token hint. Never use its claims as identity or persist/log this object. + *******************************************************************************/ +@Serializable +class NativeLogoutData( + val issuer: String, val endSessionEndpoint: String, + val postLogoutRedirectUri: String, val idTokenHint: String +) diff --git a/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/model/metadata/authentication/OAuth2AuthenticationMetaData.kt b/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/model/metadata/authentication/OAuth2AuthenticationMetaData.kt new file mode 100644 index 0000000..5c9319d --- /dev/null +++ b/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/model/metadata/authentication/OAuth2AuthenticationMetaData.kt @@ -0,0 +1,50 @@ +/* Copyright (c) 2026 QRunIO. SPDX-License-Identifier: Apache-2.0 */ +package com.kingsrook.qqq.frontend.android.core.model.metadata.authentication + +import kotlinx.serialization.Serializable + +/******************************************************************************* + ** UI API OAuth2 configuration. Native bearer and native stored-session grants are distinct. + *******************************************************************************/ +@Serializable +data class OAuth2AuthenticationMetaData( + override val name: String, + override val type: String = TYPE, + val values: Values +) : BaseAuthenticationMetaData { + /******************************************************************************* + ** Keep public OAuth client settings separate from optional stored-session login and logout capabilities. + *******************************************************************************/ + @Serializable + data class Values( + val clientId: String = "", val baseUrl: String = "", val scopes: String = "", + val nativeClientId: String? = null, val nativeClientBaseUrl: String? = null, + val bearerTokensAccepted: Boolean = false, val nativeSessionLogin: NativeSessionLogin? = null, + val nativeSessionLogout: NativeSessionLogout? = null + ) + + /******************************************************************************* + ** Carry the advertised PKCE, issuer, callback and nonce policy that gates native browser login. + *******************************************************************************/ + @Serializable + data class NativeSessionLogin( + val flow: String = "", val codeChallengeMethod: String = "", + val issuer: String = "", val discoveryUrl: String = "", val redirectUris: List<String> = emptyList(), val prompt: String = "", + val nonceValidation: String = "" + ) + + /******************************************************************************* + ** Advertise company sign-out independently with its explicitly allowed return callbacks. + *******************************************************************************/ + @Serializable + data class NativeSessionLogout(val flow: String = "", val postLogoutRedirectUris: List<String> = emptyList()) + + /******************************************************************************* + ** Keep protocol discriminators explicit so bearer grants cannot be mistaken for stored-session login. + *******************************************************************************/ + companion object { + const val TYPE = "OAUTH2" + const val SESSION_FLOW = "AUTHORIZATION_CODE_PKCE_SESSION" + const val LOGOUT_FLOW = "OIDC_RP_INITIATED_LOGOUT" + } +} diff --git a/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/model/metadata/authentication/TableBasedAuthenticationMetaData.kt b/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/model/metadata/authentication/TableBasedAuthenticationMetaData.kt new file mode 100644 index 0000000..4e446c1 --- /dev/null +++ b/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/model/metadata/authentication/TableBasedAuthenticationMetaData.kt @@ -0,0 +1,19 @@ +/* Copyright (c) 2026 QRunIO. SPDX-License-Identifier: Apache-2.0 */ +package com.kingsrook.qqq.frontend.android.core.model.metadata.authentication + +import kotlinx.serialization.Serializable + +/******************************************************************************* + ** Credentials are exchanged for a QQQ session; passwords are never persisted. + *******************************************************************************/ +@Serializable +data class TableBasedAuthenticationMetaData(override val name: String = "tableBased") : BaseAuthenticationMetaData { + override val type: String get() = TYPE + + /******************************************************************************* + ** Keep table-authentication identification independent of native browser capabilities. + *******************************************************************************/ + companion object { + const val TYPE = "TABLE_BASED" + } +} diff --git a/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/model/processes/ProcessMetaDataAdjustment.kt b/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/model/processes/ProcessMetaDataAdjustment.kt new file mode 100644 index 0000000..1d3bf59 --- /dev/null +++ b/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/model/processes/ProcessMetaDataAdjustment.kt @@ -0,0 +1,34 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2004-2026. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.kingsrook.qqq.frontend.android.core.model.processes + +import com.kingsrook.qqq.frontend.android.core.model.metadata.QFieldMetaData +import com.kingsrook.qqq.frontend.android.core.model.metadata.QFrontendStepMetaData +import kotlinx.serialization.Serializable + +/******************************************************************************* + *******************************************************************************/ +@Serializable +data class ProcessMetaDataAdjustment( + val updatedFrontendStepList: List<QFrontendStepMetaData>? = null, + val updatedFields: Map<String, QFieldMetaData>? = null, +) diff --git a/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/model/processes/ProcessStepResult.kt b/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/model/processes/ProcessStepResult.kt new file mode 100644 index 0000000..63cf6a0 --- /dev/null +++ b/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/model/processes/ProcessStepResult.kt @@ -0,0 +1,32 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2004-2026. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.kingsrook.qqq.frontend.android.core.model.processes + +import com.kingsrook.qqq.frontend.android.core.model.metadata.authentication.AuthenticationSerializer +import kotlinx.serialization.Serializable + +/******************************************************************************* + *******************************************************************************/ +@Serializable(with = ProcessStepResultSerializer::class) +sealed class ProcessStepResult() { + abstract val processUUID: String; +} diff --git a/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/model/processes/ProcessStepResultSerializer.kt b/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/model/processes/ProcessStepResultSerializer.kt new file mode 100644 index 0000000..b4730c1 --- /dev/null +++ b/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/model/processes/ProcessStepResultSerializer.kt @@ -0,0 +1,44 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2004-2024. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package com.kingsrook.qqq.frontend.android.core.model.processes + +import kotlinx.serialization.SerializationException +import kotlinx.serialization.json.JsonContentPolymorphicSerializer +import kotlinx.serialization.json.JsonElement +import kotlinx.serialization.json.jsonObject +import kotlinx.serialization.json.jsonPrimitive + +/******************************************************************************* + *******************************************************************************/ +class ProcessStepResultSerializer : JsonContentPolymorphicSerializer<ProcessStepResult>(ProcessStepResult::class) { + /******************************************************************************* + *******************************************************************************/ + override fun selectDeserializer(element: JsonElement) = when (element.jsonObject["type"]?.jsonPrimitive?.content) { + "COMPLETE" -> QJobComplete.serializer() + "JOB_STARTED" -> QJobStarted.serializer() + "RUNNING" -> QJobRunning.serializer() + "ERROR" -> QJobError.serializer() + else -> throw SerializationException("Could not ascertain ProcessStepResult type from JSON response.") + } + +} diff --git a/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/model/processes/QJobComplete.kt b/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/model/processes/QJobComplete.kt new file mode 100644 index 0000000..ff81554 --- /dev/null +++ b/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/model/processes/QJobComplete.kt @@ -0,0 +1,35 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2004-2026. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.kingsrook.qqq.frontend.android.core.model.processes + +import com.kingsrook.qqq.frontend.android.core.model.MapOfStringAny +import kotlinx.serialization.Serializable + +/******************************************************************************* + *******************************************************************************/ +@Serializable +data class QJobComplete( + override val processUUID: String, + val values: MapOfStringAny = emptyMap(), + val nextStep: String = "", + val processMetaDataAdjustment: ProcessMetaDataAdjustment? = null, +) : ProcessStepResult() diff --git a/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/model/processes/QJobError.kt b/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/model/processes/QJobError.kt new file mode 100644 index 0000000..d9a1980 --- /dev/null +++ b/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/model/processes/QJobError.kt @@ -0,0 +1,33 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2004-2026. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.kingsrook.qqq.frontend.android.core.model.processes + +import kotlinx.serialization.Serializable + +/******************************************************************************* + *******************************************************************************/ +@Serializable +data class QJobError( + override val processUUID: String, + val error: String, + val userFacingError: String? = null +) : ProcessStepResult() diff --git a/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/model/processes/QJobRunning.kt b/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/model/processes/QJobRunning.kt new file mode 100644 index 0000000..bc9997d --- /dev/null +++ b/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/model/processes/QJobRunning.kt @@ -0,0 +1,34 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2004-2026. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.kingsrook.qqq.frontend.android.core.model.processes + +import kotlinx.serialization.Serializable + +/******************************************************************************* + *******************************************************************************/ +@Serializable +data class QJobRunning( + override val processUUID: String, + val message: String = "", + val current: Int? = null, + val total: Int? = null, +) : ProcessStepResult() diff --git a/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/model/processes/QJobStarted.kt b/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/model/processes/QJobStarted.kt new file mode 100644 index 0000000..f131ac5 --- /dev/null +++ b/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/model/processes/QJobStarted.kt @@ -0,0 +1,32 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2004-2026. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.kingsrook.qqq.frontend.android.core.model.processes + +import kotlinx.serialization.Serializable + +/******************************************************************************* + *******************************************************************************/ +@Serializable +data class QJobStarted( + override val processUUID: String, + val jobUUID: String, +) : ProcessStepResult() diff --git a/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/model/widgets/WidgetBlock.kt b/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/model/widgets/WidgetBlock.kt new file mode 100644 index 0000000..eed422b --- /dev/null +++ b/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/model/widgets/WidgetBlock.kt @@ -0,0 +1,106 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2004-2024. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package com.kingsrook.qqq.frontend.android.core.model.widgets + +import com.kingsrook.qqq.frontend.android.core.model.MutableMapOfStringAny +import kotlinx.serialization.Serializable + +/******************************************************************************* + ** Represent server widget structure without selecting client classes from arbitrary payload values. + *******************************************************************************/ +@Serializable +data class WidgetBlock( + val blockId: String, + val blockType: String, + val conditional: String? = null, + val layout: String? = null, + var modalMode: String? = null, + val styles: MutableMapOfStringAny = mutableMapOf(), + val values: MutableMapOfStringAny = mutableMapOf(), + var subBlocks: List<WidgetBlock> = emptyList(), +) { + /******************************************************************************* + ** Centralize conversion of legacy map-shaped widget blocks into the semantic block model. + *******************************************************************************/ + companion object { + /******************************************************************************* + ** Rebuild nested widget structure only from map/list input, retaining unknown block types for explicit UI handling. + *******************************************************************************/ + fun fromMap(param: Any?): WidgetBlock? { + if (param is Map<*, *>) { + /******************************************************************************* + ** Preserve absent optional string values while adapting the legacy generic widget map. + *******************************************************************************/ + fun mapGetOrElse(map: Map<*, *>, key: String, elseValue: String? = null): String? { + if (map[key] != null) { + return map[key].toString() + } + + return elseValue + } + + val map = param + val blockId = if (map["blockId"] != null) "${map["blockId"]}" else "" + val blockType = if (map["blockType"] != null) "${map["blockType"]}" else "" + val conditional = if (map["conditional"] != null) "${map["conditional"]}" else null + val layout = if (map["layout"] != null) "${map["layout"]}" else null + val modalMode = mapGetOrElse(map, "modalMode") + + /******************************************************************************* + ** Copy validated JSON property names into owned mutable state; input maps + ** may be immutable or shared by another widget's decoded metadata. + *******************************************************************************/ + fun copyStringMap(value: Any?): MutableMapOfStringAny { + val source = value as? Map<*, *> ?: return mutableMapOf() + val result = mutableMapOf<String, Any?>() + source.forEach { (key, itemValue) -> + require(key is String) { "Widget property names must be strings" } + result[key] = itemValue + } + return result + } + + val styles = copyStringMap(map["styles"]) + val values = copyStringMap(map["values"]) + + val mapSubBlocks = map["subBlocks"] + + var subBlocks = emptyList<WidgetBlock>() + if (mapSubBlocks is List<*>) { + subBlocks = mutableListOf() + mapSubBlocks.forEach() + { subBlock -> + val subWidgetBlock = fromMap(subBlock) + if (subWidgetBlock != null) { + subBlocks.add(subWidgetBlock) + } + } + } + + return WidgetBlock(blockId, blockType, conditional, layout, modalMode, styles, values, subBlocks) + } + + return (null) + } + } +} diff --git a/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/utils/StringExtensions.kt b/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/utils/StringExtensions.kt new file mode 100644 index 0000000..ad24650 --- /dev/null +++ b/qqq/android/core/src/main/java/com/kingsrook/qqq/frontend/android/core/utils/StringExtensions.kt @@ -0,0 +1,33 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2024-2024. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.kingsrook.qqq.frontend.android.core.utils + +import kotlin.math.min + +/******************************************************************************* + ** string extension function to safely get firstN chars (avoid index out of + ** bounds) + *******************************************************************************/ +fun String.firstN(n: Int): String { + val actualN = min(n, this.length) + return this.substring(0, actualN) +} diff --git a/qqq/android/core/src/test/java/com/kingsrook/qqq/frontend/android/core/controllers/DeferredAuthenticationTest.kt b/qqq/android/core/src/test/java/com/kingsrook/qqq/frontend/android/core/controllers/DeferredAuthenticationTest.kt new file mode 100644 index 0000000..7d9eb20 --- /dev/null +++ b/qqq/android/core/src/test/java/com/kingsrook/qqq/frontend/android/core/controllers/DeferredAuthenticationTest.kt @@ -0,0 +1,99 @@ +/* Copyright (c) 2026 QRunIO. SPDX-License-Identifier: Apache-2.0 */ +package com.kingsrook.qqq.frontend.android.core.controllers + +import com.kingsrook.qqq.frontend.android.core.model.Environment +import com.kingsrook.qqq.frontend.android.core.model.metadata.authentication.ManageSessionRequest +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.async +import kotlinx.coroutines.runBlocking +import kotlinx.coroutines.withContext +import okhttp3.mockwebserver.MockResponse +import okhttp3.mockwebserver.MockWebServer +import org.junit.Assert.assertEquals +import org.junit.Assert.assertFalse +import org.junit.Assert.assertNull +import org.junit.Test +import java.util.concurrent.TimeUnit + +/******************************************************************************* + ** + *******************************************************************************/ +class DeferredAuthenticationTest { + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun passwordCookieAfterSwitchIsNeverAdopted() = delayedResponse(password = true, cookie = true) + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun passwordBodyAfterSwitchIsNeverAdopted() = delayedResponse(password = true, cookie = false) + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun auth0CookieAfterSwitchIsNeverAdopted() = delayedResponse(password = false, cookie = true) + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun auth0BodyAfterSwitchIsNeverAdopted() = delayedResponse(password = false, cookie = false) + + /******************************************************************************* + ** + *******************************************************************************/ + private fun delayedResponse(password: Boolean, cookie: Boolean) = runBlocking() + { + MockWebServer().use { first -> + MockWebServer().use { second -> + val origin = first.url("/").toString() + val otherOrigin = second.url("/").toString() + first.enqueue(MockResponse().setBody(VERSION_FIXTURE)) + val response = MockResponse().setBody(if (cookie) "{}" else """{"uuid":"abandoned-session"}""") + .setBodyDelay(500, TimeUnit.MILLISECONDS) + if (cookie) response.addHeader("Set-Cookie", "sessionUUID=abandoned-session; HttpOnly; Path=/") + first.enqueue(response) + first.enqueue(MockResponse().setBody("{}").addHeader("Set-Cookie", "sessionUUID=; Path=/; Max-Age=0")) + first.enqueue(MockResponse().setBody("{}")) + second.enqueue(MockResponse().setBody(VERSION_FIXTURE)) + second.enqueue(MockResponse().setBody("{}")) + val repository = NetworkQQQRepository(origin) + repository.setEnvironment(Environment("first", origin)) + val pending = async(Dispatchers.IO) { + if (password) repository.loginWithPassword("operator", "synthetic-password") + else repository.manageSession(ManageSessionRequest(accessToken = "synthetic-provider-token")) + } + withContext(Dispatchers.IO) { + assertEquals("/qqq/v1/version", first.takeRequest(5, TimeUnit.SECONDS)?.path) + val login = requireNotNull(first.takeRequest(5, TimeUnit.SECONDS)) + assertEquals("/qqq/v1/manageSession", login.path) + assertNull(login.getHeader("Cookie")) + } + repository.setEnvironment(Environment("second", otherOrigin)) + repository.setSessionUUID("current-second-session") + assertEquals("abandoned-session", pending.await().uuid) + repository.discardNativeSession(origin, "abandoned-session") + val discard = requireNotNull(first.takeRequest(5, TimeUnit.SECONDS)) + assertEquals("/qqq/v1/logout", discard.path) + assertEquals("sessionUUID=abandoned-session", discard.getHeader("Cookie")) + assertNull(discard.getHeader("Authorization")) + repository.getMetaData("test", "1", "test", "1") + assertEquals("/qqq/v1/version", second.takeRequest(5, TimeUnit.SECONDS)?.path) + val current = requireNotNull(second.takeRequest(5, TimeUnit.SECONDS)) + assertEquals("sessionUUID=current-second-session", current.getHeader("Cookie")) + assertNull(current.getHeader("Authorization")) + assertFalse(current.body.readUtf8().contains("synthetic-provider-token")) + repository.setEnvironment(Environment("first", origin)) + repository.getMetaData("test", "1", "test", "1") + assertNull( + "Returning to the original server must not resurrect the abandoned cookie", + requireNotNull(first.takeRequest(5, TimeUnit.SECONDS)).getHeader("Cookie") + ) + } + } + } +} diff --git a/qqq/android/core/src/test/java/com/kingsrook/qqq/frontend/android/core/controllers/NativeLogoutRepositoryTest.kt b/qqq/android/core/src/test/java/com/kingsrook/qqq/frontend/android/core/controllers/NativeLogoutRepositoryTest.kt new file mode 100644 index 0000000..75b0c02 --- /dev/null +++ b/qqq/android/core/src/test/java/com/kingsrook/qqq/frontend/android/core/controllers/NativeLogoutRepositoryTest.kt @@ -0,0 +1,147 @@ +/* Copyright (c) 2026 QRunIO. SPDX-License-Identifier: Apache-2.0 */ +package com.kingsrook.qqq.frontend.android.core.controllers + +import com.kingsrook.qqq.frontend.android.core.model.Environment +import com.kingsrook.qqq.frontend.android.core.model.metadata.authentication.NativeLogoutResponse +import kotlinx.coroutines.runBlocking +import kotlinx.coroutines.async +import kotlinx.coroutines.Dispatchers +import kotlinx.serialization.json.Json +import okhttp3.mockwebserver.MockResponse +import okhttp3.mockwebserver.MockWebServer +import org.junit.Assert.assertEquals +import org.junit.Assert.assertFalse +import org.junit.Assert.assertNull +import org.junit.Assert.assertTrue +import org.junit.Test + +/******************************************************************************* + ** Exercise the actual additive wire operation, cookie isolation and secret-safe diagnostics. + *******************************************************************************/ +class NativeLogoutRepositoryTest { + private val version = VERSION_FIXTURE.replace("1.8.0", "1.10.0").replace("\"widgets\"", "\"widgets\",\"nativeSessionLogout\"") + private val callback = "io.qrun.test.oauth://callback/oauth2redirect" + private val response = """{"nativeLogoutData":{"issuer":"https://identity.example","endSessionEndpoint":"https://identity.example/end-session","postLogoutRedirectUri":"$callback","idTokenHint":"synthetic.logout.hint.canary"}}""" + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun explicitLogoutReturnsTransientHintAndCannotAdoptResponseCookies() = runBlocking() + { + MockWebServer().use { server -> + server.enqueue(MockResponse().setBody(version)) + server.enqueue(MockResponse().setBody(response).setHeader("Set-Cookie", "sessionUUID=must-not-adopt; Path=/")) + server.enqueue(MockResponse().setBody("{}")) + val events = mutableListOf<RequestOutcome>() + val origin = server.url("/").toString() + val repository = NetworkQQQRepository(origin, requestObserver = { events.add(it) }) + repository.setEnvironment(Environment("test", origin)) + repository.setSessionUUID("synthetic-session") + val result = repository.logoutWithProvider(callback) + assertEquals("synthetic.logout.hint.canary", result?.idTokenHint) + assertFalse(result.toString().contains("canary")) + assertFalse(Json.decodeFromString<NativeLogoutResponse>(response).toString().contains("canary")) + assertFalse(events.toString().contains("canary")) + assertEquals("/qqq/v1/version", server.takeRequest().path) + val logout = server.takeRequest() + assertEquals("/qqq/v1/logout", logout.path) + assertEquals("POST", logout.method) + assertEquals("sessionUUID=synthetic-session", logout.getHeader("Cookie")) + assertEquals("""{"nativeLogout":{"postLogoutRedirectUri":"$callback"}}""", logout.body.readUtf8()) + repository.getMetaData("test", "1", "test", "1") + assertNull(server.takeRequest().getHeader("Cookie")) + } + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun oldServerReceivesOnlyOrdinaryLogoutAndNoOptionalBody() = runBlocking() + { + MockWebServer().use { server -> + server.enqueue(MockResponse().setBody(VERSION_FIXTURE)) + server.enqueue(MockResponse().setBody("{}")) + val origin = server.url("/").toString() + val repository = NetworkQQQRepository(origin) + repository.setEnvironment(Environment("test", origin)) + repository.setSessionUUID("synthetic-session") + assertNull(repository.logoutWithProvider(callback)) + server.takeRequest() + val request = server.takeRequest() + assertEquals("/qqq/v1/logout", request.path) + assertEquals(0L, request.bodySize) + assertEquals("sessionUUID=synthetic-session", request.getHeader("Cookie")) + } + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun failureAndMalformedMaterialDropCookiesWithoutEmittingResponseSecrets() = runBlocking() + { + for (reply in listOf( + MockResponse().setResponseCode(503).setBody("""{"message":"synthetic.logout.hint.canary"}"""), + MockResponse().setBody("""{"nativeLogoutData":{"idTokenHint":"synthetic.logout.hint.canary"}}""") + )) { + MockWebServer().use { server -> + server.enqueue(MockResponse().setBody(version)) + server.enqueue(reply) + server.enqueue(MockResponse().setBody("{}")) + val origin = server.url("/").toString() + val repository = NetworkQQQRepository(origin) + repository.setEnvironment(Environment("test", origin)) + repository.setSessionUUID("synthetic-session") + val outcome = runCatching { repository.logoutWithProvider(callback) } + assertNull(outcome.getOrNull()) + assertFalse(outcome.exceptionOrNull().toString().contains("canary")) + repository.getMetaData("test", "1", "test", "1") + server.takeRequest(); server.takeRequest() + assertNull(server.takeRequest().getHeader("Cookie")) + } + } + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun logoutRequiresBothVersionAndFeature() { + for (value in listOf( + UiApiVersion("1.9.0", listOf("nativeSessionLogout")), UiApiVersion("1.10.0"), + UiApiVersion("2.0.0", listOf("nativeSessionLogout")) + )) + assertTrue(runCatching { UiApiCompatibility.validateNativeSessionLogout(value) }.isFailure) + UiApiCompatibility.validateNativeSessionLogout(UiApiVersion("1.10.0", listOf("nativeSessionLogout"))) + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun lateResponseRemainsScopedToOriginalServerWithoutClearingNewServerCookie() = runBlocking() + { + MockWebServer().use { first -> + MockWebServer().use { second -> + first.enqueue(MockResponse().setBody(version)) + first.enqueue(MockResponse().setBody(response).setBodyDelay(150, java.util.concurrent.TimeUnit.MILLISECONDS)) + second.enqueue(MockResponse().setBody(VERSION_FIXTURE)) + second.enqueue(MockResponse().setBody("{}")) + val origin = first.url("/").toString() + val repository = NetworkQQQRepository(origin) + repository.setEnvironment(Environment("first", origin)) + repository.setSessionUUID("old-session") + val pending = async(Dispatchers.IO) { repository.logoutWithProvider(callback) } + first.takeRequest(); first.takeRequest() + repository.setEnvironment(Environment("second", second.url("/").toString())) + repository.setSessionUUID("new-session") + pending.await() + repository.getMetaData("test", "1", "test", "1") + second.takeRequest() + assertEquals("sessionUUID=new-session", second.takeRequest().getHeader("Cookie")) + } + } + } +} diff --git a/qqq/android/core/src/test/java/com/kingsrook/qqq/frontend/android/core/controllers/NativeSessionLoginTest.kt b/qqq/android/core/src/test/java/com/kingsrook/qqq/frontend/android/core/controllers/NativeSessionLoginTest.kt new file mode 100644 index 0000000..acc832b --- /dev/null +++ b/qqq/android/core/src/test/java/com/kingsrook/qqq/frontend/android/core/controllers/NativeSessionLoginTest.kt @@ -0,0 +1,151 @@ +/* Copyright (c) 2026 QRunIO. SPDX-License-Identifier: Apache-2.0 */ +package com.kingsrook.qqq.frontend.android.core.controllers + +import com.kingsrook.qqq.frontend.android.core.model.Environment +import com.kingsrook.qqq.frontend.android.core.model.metadata.authentication.BaseAuthenticationMetaData +import com.kingsrook.qqq.frontend.android.core.model.metadata.authentication.ManageSessionRequest +import com.kingsrook.qqq.frontend.android.core.model.metadata.authentication.OAuth2AuthenticationMetaData +import kotlinx.coroutines.runBlocking +import kotlinx.serialization.encodeToString +import kotlinx.serialization.json.Json +import okhttp3.mockwebserver.MockResponse +import okhttp3.mockwebserver.MockWebServer +import org.junit.Assert.assertEquals +import org.junit.Assert.assertFalse +import org.junit.Assert.assertNull +import org.junit.Assert.assertTrue +import org.junit.Test + +/******************************************************************************* + ** + *******************************************************************************/ +class NativeSessionLoginTest { + private val version = VERSION_FIXTURE.replace("1.8.0", "1.10.0").replace("\"widgets\"", "\"widgets\",\"nativeSessionLogin\",\"nativeSessionNonceValidation\"") + private val request = ManageSessionRequest( + code = "synthetic-code", codeVerifier = "v".repeat(64), + redirectUri = "io.qrun.mobile.scanner.oauth://callback/oauth2redirect", + authenticationFlow = OAuth2AuthenticationMetaData.SESSION_FLOW, expectedNonce = "original-nonce-canary-1234" + ) + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun metadataKeepsNativeBearerDistinctFromAdvertisedSessionFlow() { + val metadata = Json.decodeFromString<BaseAuthenticationMetaData>("""{"type":"OAUTH2","name":"organization","values":{"clientId":"server-client","baseUrl":"https://id.example/discovery-base/","scopes":"openid profile","nativeClientId":"public-bearer-client","nativeSessionLogin":{"flow":"AUTHORIZATION_CODE_PKCE_SESSION","codeChallengeMethod":"S256","prompt":"login","nonceValidation":"REQUIRED","issuer":"https://id.example/","discoveryUrl":"https://id.example/application/o/company/.well-known/openid-configuration","redirectUris":["io.qrun.mobile.scanner.oauth://callback/oauth2redirect"]}}}""") as OAuth2AuthenticationMetaData + assertEquals("server-client", metadata.values.clientId) + assertEquals("public-bearer-client", metadata.values.nativeClientId) + assertEquals("https://id.example/", metadata.values.nativeSessionLogin!!.issuer) + assertEquals("login", metadata.values.nativeSessionLogin!!.prompt) + assertEquals("REQUIRED", metadata.values.nativeSessionLogin!!.nonceValidation) + assertNull((Json.decodeFromString<BaseAuthenticationMetaData>("""{"type":"OAUTH2","name":"old","values":{"clientId":"server-client"}}""") as OAuth2AuthenticationMetaData).values.nativeSessionLogin) + val wire = Json.encodeToString(request) + assertTrue(wire.contains("\"authenticationFlow\":\"AUTHORIZATION_CODE_PKCE_SESSION\"")) + assertTrue(wire.contains("\"expectedNonce\":\"original-nonce-canary-1234\"")) + assertFalse(wire.contains("accessToken")) + assertFalse(wire.contains("uuid")) + assertFalse(request.toString().contains("synthetic-code")) + assertFalse(request.toString().contains("v".repeat(64))) + assertFalse(request.toString().contains("original-nonce-canary")) + assertFalse(Json.encodeToString(ManageSessionRequest(accessToken = "synthetic-legacy-token")).contains("expectedNonce")) + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun featureAndVersionAreRequiredTogether() { + val supported = Json.decodeFromString<UiApiVersion>(version) + UiApiCompatibility.validateNativeSessionLogin(supported) + for (unsupported in listOf( + supported.copy(apiVersion = "1.8.9"), supported.copy(apiVersion = "1.9.0"), supported.copy(apiVersion = "2.0.0"), + supported.copy(apiVersion = "1.10.0-preview"), supported.copy(features = supported.features - "nativeSessionLogin"), + supported.copy(features = supported.features - "nativeSessionNonceValidation") + )) + assertTrue(runCatching { UiApiCompatibility.validateNativeSessionLogin(unsupported) }.exceptionOrNull() is UiApiCompatibilityException) + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun exchangeCookieIsDeferredAndDiscardNeverChangesCurrentSession() = runBlocking { + MockWebServer().use { server -> + val origin = server.url("/").toString() + server.enqueue(MockResponse().setBody(version)) + server.enqueue(MockResponse().setBody("{}").addHeader("Set-Cookie", "sessionUUID=new-login; Path=/; HttpOnly")) + server.enqueue(MockResponse().setBody("{}").addHeader("Set-Cookie", "sessionUUID=; Path=/; Max-Age=0")) + server.enqueue(MockResponse().setBody("""{"type":"TABLE_BASED","name":"users","values":{}}""")) + val repository = NetworkQQQRepository(origin) + repository.setEnvironment(Environment("fixture", origin)) + repository.setSessionUUID("current-session") + val response = repository.exchangeNativeSession(request) + assertEquals("new-login", response.uuid) + repository.discardNativeSession(origin, response.uuid!!) + repository.getAuthenticationMetaData() + assertEquals("/qqq/v1/version", server.takeRequest().path) + val exchange = server.takeRequest() + assertEquals("/qqq/v1/manageSession", exchange.path) + assertNull(exchange.getHeader("Cookie")) + val body = Json.parseToJsonElement(exchange.body.readUtf8()).toString() + assertTrue(body.contains("authenticationFlow")) + assertTrue(body.contains("\"expectedNonce\":\"original-nonce-canary-1234\"")) + val discard = server.takeRequest() + assertEquals("/qqq/v1/logout", discard.path) + assertEquals("sessionUUID=new-login", discard.getHeader("Cookie")) + assertEquals("sessionUUID=current-session", server.takeRequest().getHeader("Cookie")) + } + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun missingFeaturePreventsSendingTheAuthorizationCode() = runBlocking { + MockWebServer().use { server -> + server.enqueue(MockResponse().setBody(VERSION_FIXTURE)) + val origin = server.url("/").toString() + val repository = NetworkQQQRepository(origin) + repository.setEnvironment(Environment("fixture", origin)) + assertTrue(runCatching { repository.exchangeNativeSession(request) }.exceptionOrNull() is UiApiCompatibilityException) + assertEquals(1, server.requestCount) + val discovery = server.takeRequest() + assertEquals("/qqq/v1/version", discovery.path) + assertEquals(0L, discovery.bodySize) + } + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun invalidOriginalNoncePreventsAnyNetworkRequest() = runBlocking { + MockWebServer().use { server -> + val origin = server.url("/").toString() + val repository = NetworkQQQRepository(origin) + repository.setEnvironment(Environment("fixture", origin)) + for (value in listOf(null, "", "n".repeat(15), "n".repeat(513), "not valid nonce", "n".repeat(20) + "=")) + assertTrue(runCatching { repository.exchangeNativeSession(request.copy(expectedNonce = value)) }.exceptionOrNull() is IllegalArgumentException) + assertEquals(0, server.requestCount) + } + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun rejectedNonceNeverRetriesAnUnprotectedExchange() = runBlocking { + MockWebServer().use { server -> + server.enqueue(MockResponse().setBody(version)) + server.enqueue(MockResponse().setResponseCode(401).setBody("""{"code":"AUTHENTICATION_FAILED","message":"Sign-in failed"}""")) + val origin = server.url("/").toString() + val repository = NetworkQQQRepository(origin) + repository.setEnvironment(Environment("fixture", origin)) + assertTrue(runCatching { repository.exchangeNativeSession(request) }.isFailure) + assertEquals(2, server.requestCount) + server.takeRequest() + assertTrue(server.takeRequest().body.readUtf8().contains("expectedNonce")) + assertNull(server.takeRequest(200, java.util.concurrent.TimeUnit.MILLISECONDS)) + } + } +} diff --git a/qqq/android/core/src/test/java/com/kingsrook/qqq/frontend/android/core/controllers/NetworkQQQRepositoryTest.kt b/qqq/android/core/src/test/java/com/kingsrook/qqq/frontend/android/core/controllers/NetworkQQQRepositoryTest.kt new file mode 100644 index 0000000..5a61098 --- /dev/null +++ b/qqq/android/core/src/test/java/com/kingsrook/qqq/frontend/android/core/controllers/NetworkQQQRepositoryTest.kt @@ -0,0 +1,306 @@ +/* Copyright (c) 2026 QRunIO. SPDX-License-Identifier: Apache-2.0 */ +package com.kingsrook.qqq.frontend.android.core.controllers + +import com.kingsrook.qqq.frontend.android.core.model.Environment +import kotlinx.coroutines.runBlocking +import okhttp3.mockwebserver.MockResponse +import okhttp3.mockwebserver.MockWebServer +import org.junit.Assert.assertEquals +import org.junit.Assert.assertNull +import org.junit.Assert.assertTrue +import org.junit.Assert.assertFalse +import org.junit.Test + +/******************************************************************************* + ** Modern servers return HttpOnly session cookies; both credentials and redirects remain origin-scoped. + *******************************************************************************/ +class NetworkQQQRepositoryTest { + @Test + fun searchAndCountKeepIdenticalPredicatesAndOpaqueParentKeys() = runBlocking() { + MockWebServer().use { server -> + server.enqueue(MockResponse().setBody(VERSION_FIXTURE)) + server.enqueue(MockResponse().setBody("{\"count\":1}")) + server.enqueue(MockResponse().setBody("{\"records\":[]}")) + val origin = server.url("/").toString() + val repository = NetworkQQQRepository(origin) + repository.setEnvironment(Environment("test", origin)) + val search = com.kingsrook.qqq.frontend.android.core.model.RecordSearch("a\"b", listOf("reference", "name"), mapOf("parent" to kotlinx.serialization.json.JsonPrimitive("0007"))) + assertEquals(1L, repository.countRecords("items", search)) + repository.searchRecords("items", "id", search, 25) + server.takeRequest() + val counted = server.takeRequest() + assertEquals("/qqq/v1/table/items/count", counted.path) + val expected = org.json.JSONObject(counted.body.readUtf8()).getJSONObject("filter") + val query = org.json.JSONObject(server.takeRequest().body.readUtf8()).getJSONObject("filter") + assertEquals(25, query.remove("skip")) + assertEquals(25, query.remove("limit")) + query.remove("orderBys") + assertTrue(expected.similar(query)) + assertEquals("0007", expected.getJSONArray("criteria").getJSONObject(0).getJSONArray("values").getString(0)) + assertEquals("OR", expected.getJSONArray("subFilters").getJSONObject(0).getString("booleanOperator")) + } + } + + @Test + fun relatedQueriesAreBoundedAndCannotDropTheParentFilter() = runBlocking() { + MockWebServer().use { server -> + server.enqueue(MockResponse().setBody(VERSION_FIXTURE)) + server.enqueue(MockResponse().setBody("""{"records":[]}""")) + val origin = server.url("/").toString() + val repository = NetworkQQQRepository(origin) + repository.setEnvironment(Environment("test", origin)) + repository.queryRelatedRecords("lines", "id", mapOf("parent" to kotlinx.serialization.json.JsonPrimitive("0007")), 10, 10) + server.takeRequest() + val request = server.takeRequest() + assertEquals("/qqq/v1/table/lines/query", request.path) + val filter = org.json.JSONObject(request.body.readUtf8()).getJSONObject("filter") + assertEquals(10, filter.getInt("skip")) + assertEquals(10, filter.getInt("limit")) + assertEquals("AND", filter.getString("booleanOperator")) + val criteria = filter.getJSONArray("criteria").getJSONObject(0) + assertEquals("parent", criteria.getString("fieldName")) + assertEquals("EQUALS", criteria.getString("operator")) + assertEquals("0007", criteria.getJSONArray("values").getString(0)) + assertTrue(runCatching { repository.queryRelatedRecords("lines", "id", emptyMap(), 0) }.isFailure) + assertTrue(runCatching { repository.queryRelatedRecords("lines", "id", mapOf("parent" to kotlinx.serialization.json.JsonNull), 0) }.isFailure) + } + } + + /******************************************************************************* + ** Native browsing retains server identity, opaque ids, bounded paging and read-only routes. + *******************************************************************************/ + @Test + fun recordBrowsingUsesSemanticRoutesAndPreservesIds() = runBlocking() { + MockWebServer().use { server -> + server.enqueue(MockResponse().setBody(VERSION_FIXTURE)) + server.enqueue(MockResponse().setBody("""{"name":"items","label":"Items","primaryKeyField":"key","fields":{"key":{"name":"key","label":"Key","type":"STRING"}}}""")) + server.enqueue(MockResponse().setBody("""{"records":[{"tableName":"items","recordLabel":"Item","values":{"key":"0007","quantity":0},"displayValues":{"quantity":"Zero"}}]}""")) + server.enqueue(MockResponse().setBody("""{"record":{"tableName":"items","values":{"key":"0007"}}}""")) + val origin = server.url("/").toString() + val repository = NetworkQQQRepository(origin, additionalHeaders = { mapOf("X-QQQ-Device-Id" to "fixture-device") }) + repository.setEnvironment(Environment("test", origin)) + repository.setSessionUUID("fixture-session") + assertEquals("key", repository.getTableMetaData("items").primaryKeyField) + val records = repository.queryRecords("items", "key", 25, 25) + assertEquals("0007", records.single().id("key")) + assertEquals("Zero", records.single().display("quantity")) + assertEquals("0007", repository.getRecord("items", "0007").id("key")) + assertEquals("/qqq/v1/version", server.takeRequest().path) + assertEquals("/qqq/v1/metaData/table/items", server.takeRequest().path) + val query = server.takeRequest() + assertEquals("/qqq/v1/table/items/query", query.path) + assertEquals("fixture-device", query.getHeader("X-QQQ-Device-Id")) + assertEquals("sessionUUID=fixture-session", query.getHeader("Cookie")) + val filter = org.json.JSONObject(query.body.readUtf8()).getJSONObject("filter") + assertEquals(25, filter.getInt("skip")) + assertEquals(25, filter.getInt("limit")) + assertEquals("key", filter.getJSONArray("orderBys").getJSONObject(0).getString("fieldName")) + val get = server.takeRequest() + assertEquals("GET", get.method) + assertEquals("/qqq/v1/table/items/0007", get.path) + assertTrue(runCatching { repository.queryRecords("items", "key", 0, 1000) }.isFailure) + } + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun clearedOptionalFieldsRemainExplicitNullsOnTheWire() = runBlocking() + { + MockWebServer().use { server -> + server.enqueue(MockResponse().setBody(VERSION_FIXTURE)) + server.enqueue(MockResponse().setBody("""{"type":"COMPLETE","processUUID":"process","nextStep":"result","values":{}}""")) + val origin = server.url("/").toString() + val repository = NetworkQQQRepository(origin) + repository.setEnvironment(Environment("test", origin)) + repository.processStep("edit", "process", "input", mapOf("notes" to null, "choice" to null, "quantity" to 0, "enabled" to false), 1000) + assertEquals("/qqq/v1/version", server.takeRequest().path) + val request = server.takeRequest() + assertEquals("/qqq/v1/processes/edit/process/step/input", request.path) + val body = request.body.readUtf8() + val json = org.json.JSONObject(body.substringAfter("\r\n\r\n").substringBefore("\r\n--")) + assertTrue("Clearing notes must overwrite the stored value", json.has("notes") && json.isNull("notes")) + assertTrue("Choosing None must overwrite the stored selection", json.has("choice") && json.isNull("choice")) + assertEquals(0, json.getInt("quantity")) + assertFalse(json.getBoolean("enabled")) + } + } + + /******************************************************************************* + ** Published `searchProcessPossibleValues`: JSON body with the parent values and FORM use case; the response is + ** `{options:[{id,label}]}` and the server omits `options` entirely when nothing matches. + *******************************************************************************/ + @Test + fun processPossibleValuesUsesThePublishedJsonOperation() = runBlocking() + { + MockWebServer().use { server -> + server.enqueue(MockResponse().setBody(VERSION_FIXTURE)) + server.enqueue(MockResponse().setHeader("Content-Type", "application/json").setBody("""{"options":[{"id":"4x6","label":"4 x 6 in"},{"id":7,"label":"Seven"}]}""")) + server.enqueue(MockResponse().setHeader("Content-Type", "application/json").setBody("{}")) + val origin = server.url("/").toString() + val repository = NetworkQQQRepository(origin) + repository.setEnvironment(Environment("test", origin)) + val options = repository.processPossibleValues("echoPrint", "mediaId", mapOf("printerId" to "printer"), mapOf("echoRunId" to "run")) + assertEquals("/qqq/v1/version", server.takeRequest().path) + val request = server.takeRequest() + assertEquals("POST", request.method) + assertEquals("/qqq/v1/processes/echoPrint/possibleValues/mediaId", request.path) + assertTrue(request.getHeader("Content-Type")!!.startsWith("application/json")) + val body = org.json.JSONObject(request.body.readUtf8()) + assertEquals("printer", body.getJSONObject("values").getString("printerId")) + assertEquals("run", body.getJSONObject("processValues").getString("echoRunId")) + assertEquals("form", body.getString("useCase")) + assertEquals(listOf("4x6", "7"), options.map { it.id.toString() }) + assertTrue("A JSON integer id must stay an integer for INTEGER fields", options[1].id is Int) + assertEquals(listOf("4 x 6 in", "Seven"), options.map { it.label }) + assertTrue(repository.processPossibleValues("echoPrint", "mediaId", emptyMap(), emptyMap()).isEmpty()) + } + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun reportsOnlyStatusAndTimingAndObserverFailuresCannotBreakRequests() = runBlocking() + { + MockWebServer().use { server -> + server.enqueue(MockResponse().setBody(VERSION_FIXTURE)) + server.enqueue(MockResponse().setBody("{}")) + server.enqueue(MockResponse().setResponseCode(503).setBody("private-response-barcode")) + val outcomes = mutableListOf<RequestOutcome>() + val origin = server.url("/").toString() + val repository = NetworkQQQRepository(origin, requestObserver = { outcomes.add(it); error("observer failed") }) + repository.setEnvironment(Environment("test", origin)) + repository.setSessionUUID("private-cookie") + repository.getMetaData("private-query", "1", "test", "1") + assertTrue(runCatching { repository.getMetaData("test", "1", "test", "1") }.isFailure) + assertEquals(listOf(200, 200, 503), outcomes.map { it.httpStatus }) + assertTrue(outcomes.all { it.elapsedMillis >= 0 }) + assertFalse(outcomes.toString().contains("private")) + assertFalse(outcomes.toString().contains("http:")) + } + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun transportFailureReportsNullStatusWithoutExceptionMessage() = runBlocking() + { + val server = MockWebServer() + server.start() + val origin = server.url("/").toString() + server.shutdown() + val outcomes = mutableListOf<RequestOutcome>() + val repository = NetworkQQQRepository(origin, requestObserver = { outcomes.add(it) }) + repository.setEnvironment(Environment("test", origin)) + assertTrue(runCatching { repository.getMetaData("test", "1", "test", "1") }.isFailure) + assertEquals(1, outcomes.size) + assertNull(outcomes.single().httpStatus) + assertFalse(outcomes.toString().contains("localhost")) + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun logoutRevokesServerSessionBeforeDroppingTheCookie() = runBlocking() + { + MockWebServer().use { server -> + server.start() + server.enqueue(MockResponse().setBody(VERSION_FIXTURE)) + server.enqueue(MockResponse().setBody("{}")) + server.enqueue(MockResponse().setHeader("Content-Type", "application/json").setBody("{}")) + val origin = server.url("/").toString() + val repository = NetworkQQQRepository(origin) + repository.setEnvironment(Environment("demo", origin)) + repository.setSessionUUID("synthetic-session") + repository.logout() + assertEquals("/qqq/v1/version", server.takeRequest().path) + val logoutRequest = server.takeRequest() + assertEquals("/qqq/v1/logout", logoutRequest.path) + assertEquals("POST", logoutRequest.method) + assertEquals("sessionUUID=synthetic-session", logoutRequest.getHeader("Cookie")) + repository.getMetaData("test", "1", "test", "1") + assertNull(server.takeRequest().getHeader("Cookie")) + } + } + + /******************************************************************************* + ** Cookie-bearing native mutations (session/process POSTs) carry the exact request origin, and a caller-supplied + ** additional header can neither add a different Origin nor remove the real one. Login (no cookie yet) carries it too. + *******************************************************************************/ + @Test + fun cookieBearingPostsCarryTheExactRequestOriginEvenIfAdditionalHeadersTryToSetOne() = runBlocking() + { + MockWebServer().use { server -> + server.start() + server.enqueue(MockResponse().setBody(VERSION_FIXTURE)) + server.enqueue(MockResponse().setHeader("Content-Type", "application/json").setBody("""{"type":"COMPLETE","processUUID":"process","nextStep":"result","values":{}}""")) + server.enqueue(MockResponse().setHeader("Content-Type", "application/json").setBody("{}")) + val origin = server.url("/").toString() + val repository = NetworkQQQRepository(origin, additionalHeaders = { mapOf("Origin" to "https://evil.example", "X-QQQ-Device-Id" to "test-device") }) + repository.setEnvironment(Environment("test", origin)) + repository.setSessionUUID("synthetic-session") + repository.processStep("edit", "process", "input", mapOf("a" to "b"), 1000) + repository.logout() + server.takeRequest() + // Forwarded debug servers may listen elsewhere (for example 8080): only the URL the client used matters. + val expected = "http://${server.hostName}:${server.port}" + listOf(server.takeRequest(), server.takeRequest()).forEach { request -> + assertEquals("POST", request.method) + assertEquals("sessionUUID=synthetic-session", request.getHeader("Cookie")) + assertEquals(expected, request.getHeader("Origin")) + assertEquals(1, request.headers.values("Origin").size) + assertEquals("http://" + request.getHeader("Host"), request.getHeader("Origin")) + assertEquals("test-device", request.getHeader("X-QQQ-Device-Id")) + } + } + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun capturesHttpOnlySessionAndDoesNotSendItToAnotherServer() = runBlocking() + { + MockWebServer().use { first -> + MockWebServer().use { second -> + first.start() + second.start() + first.enqueue(MockResponse().setBody(VERSION_FIXTURE)) + first.enqueue( + MockResponse().setHeader("Content-Type", "application/json") + .addHeader("Set-Cookie", "sessionUUID=synthetic-session; HttpOnly; Path=/").setBody("{\"values\":{}}") + ) + first.enqueue(MockResponse().setHeader("Content-Type", "application/json").setBody("{}")) + second.enqueue(MockResponse().setBody(VERSION_FIXTURE)) + second.enqueue(MockResponse().setHeader("Content-Type", "application/json").setBody("{}")) + val origin = first.url("/").toString() + val repository = NetworkQQQRepository(origin) { server -> + if (server == origin) mapOf("X-QQQ-Device-Id" to "test-device") else emptyMap() + } + repository.setEnvironment(Environment("first", origin)) + val login = repository.loginWithPassword("demo", "synthetic-password") + assertEquals("synthetic-session", login.uuid) + repository.setSessionUUID(requireNotNull(login.uuid)) + repository.getMetaData("test", "1", "test", "1") + assertEquals("/qqq/v1/version", first.takeRequest().path) + val loginRequest = first.takeRequest() + assertEquals("/qqq/v1/manageSession", loginRequest.path) + assertNull(loginRequest.getHeader("Cookie")) + val nextRequest = first.takeRequest() + assertEquals("sessionUUID=synthetic-session", nextRequest.getHeader("Cookie")) + assertNull(nextRequest.getHeader("Authorization")) + assertEquals("test-device", nextRequest.getHeader("X-QQQ-Device-Id")) + repository.setEnvironment(Environment("second", second.url("/").toString())) + repository.getMetaData("test", "1", "test", "1") + assertEquals("/qqq/v1/version", second.takeRequest().path) + val otherRequest = second.takeRequest() + assertNull(otherRequest.getHeader("Cookie")) + assertNull(otherRequest.getHeader("X-QQQ-Device-Id")) + } + } + } +} diff --git a/qqq/android/core/src/test/java/com/kingsrook/qqq/frontend/android/core/controllers/SameOriginInterceptorTest.kt b/qqq/android/core/src/test/java/com/kingsrook/qqq/frontend/android/core/controllers/SameOriginInterceptorTest.kt new file mode 100644 index 0000000..69e921f --- /dev/null +++ b/qqq/android/core/src/test/java/com/kingsrook/qqq/frontend/android/core/controllers/SameOriginInterceptorTest.kt @@ -0,0 +1,70 @@ +/* Copyright (c) 2026 QRunIO. SPDX-License-Identifier: Apache-2.0 */ +package com.kingsrook.qqq.frontend.android.core.controllers + +import okhttp3.HttpUrl.Companion.toHttpUrl +import okhttp3.OkHttpClient +import okhttp3.Request +import okhttp3.mockwebserver.MockResponse +import okhttp3.mockwebserver.MockWebServer +import org.junit.Assert.assertEquals +import org.junit.Assert.assertNull +import org.junit.Test + +/******************************************************************************* + ** Native clients present the exact origin of the URL they actually request, canonicalized like a browser. + *******************************************************************************/ +class SameOriginInterceptorTest { + /******************************************************************************* + ** The origin comes only from scheme/host/port: a debug loopback forward keeps its device-side port + ** (whatever the server listens on behind it), defaults are omitted, and IPv6 hosts stay bracketed. + *******************************************************************************/ + @Test + fun originIsTheCanonicalSchemeHostAndPortOfTheRequestUrl() { + fun origin(url: String) = SameOriginInterceptor.httpOrigin(url.toHttpUrl()) + assertEquals("http://127.0.0.1:57832", origin("http://127.0.0.1:57832/qqq/v1/manageSession")) + assertEquals("http://127.0.0.1", origin("http://127.0.0.1:80/")) + assertEquals("https://qqq.example.test", origin("https://qqq.example.test/")) + assertEquals("https://qqq.example.test", origin("https://qqq.example.test:443/path")) + assertEquals("https://qqq.example.test:8443", origin("https://qqq.example.test:8443/")) + assertEquals("http://qqq.example.test:443", origin("http://QQQ.Example.Test:443/")) + assertEquals("http://[::1]:57832", origin("http://[::1]:57832/")) + assertEquals("https://[2001:db8::1]", origin("https://[2001:db8::1]:443/")) + assertEquals("Credentials, path, query and fragment are never part of an origin", "http://127.0.0.1:57832", + origin("http://user:secret@127.0.0.1:57832/a/b?token=x#fragment")) + } + + /******************************************************************************* + ** The header the interceptor sets is final, even when an earlier layer tried to supply a different one. + *******************************************************************************/ + @Test + fun overridesAnyExistingOriginAndMatchesTheServerRequestHost() { + MockWebServer().use { server -> + server.enqueue(MockResponse().setBody("{}")) + server.start() + val client = OkHttpClient.Builder().followRedirects(false).followSslRedirects(false).addInterceptor(SameOriginInterceptor()).build() + client.newCall(Request.Builder().url(server.url("/")).header("Origin", "https://evil.example").build()).execute().close() + val request = server.takeRequest() + assertEquals("http://" + request.getHeader("Host"), request.getHeader("Origin")) + assertEquals(1, request.headers.values("Origin").size) + } + } + + /******************************************************************************* + ** A redirect is still refused, so neither the cookie nor this origin reaches another server. + *******************************************************************************/ + @Test + fun refusedRedirectNeverReachesAnotherOrigin() { + MockWebServer().use { first -> + MockWebServer().use { other -> + first.start() + other.start() + first.enqueue(MockResponse().setResponseCode(307).setHeader("Location", other.url("/stolen").toString())) + val client = OkHttpClient.Builder().followRedirects(false).followSslRedirects(false).addInterceptor(SameOriginInterceptor()).build() + client.newCall(Request.Builder().url(first.url("/")).header("Cookie", "sessionUUID=synthetic").build()).execute().use { assertEquals(307, it.code) } + assertEquals(1, first.requestCount) + assertEquals(0, other.requestCount) + assertNull(other.takeRequest(100, java.util.concurrent.TimeUnit.MILLISECONDS)) + } + } + } +} diff --git a/qqq/android/core/src/test/java/com/kingsrook/qqq/frontend/android/core/controllers/UiApiCompatibilityTest.kt b/qqq/android/core/src/test/java/com/kingsrook/qqq/frontend/android/core/controllers/UiApiCompatibilityTest.kt new file mode 100644 index 0000000..1f1b45c --- /dev/null +++ b/qqq/android/core/src/test/java/com/kingsrook/qqq/frontend/android/core/controllers/UiApiCompatibilityTest.kt @@ -0,0 +1,159 @@ +/* Copyright (c) 2026 QRunIO. SPDX-License-Identifier: Apache-2.0 */ +package com.kingsrook.qqq.frontend.android.core.controllers + +import com.kingsrook.qqq.frontend.android.core.model.Environment +import com.kingsrook.qqq.frontend.android.core.model.metadata.AdornmentType +import com.kingsrook.qqq.frontend.android.core.model.metadata.QAppNodeType +import com.kingsrook.qqq.frontend.android.core.model.metadata.QComponentType +import com.kingsrook.qqq.frontend.android.core.model.metadata.QFieldMetaData +import com.kingsrook.qqq.frontend.android.core.model.metadata.QFieldType +import com.kingsrook.qqq.frontend.android.core.model.metadata.QFrontendComponent +import kotlinx.coroutines.runBlocking +import kotlinx.serialization.json.Json +import okhttp3.mockwebserver.MockResponse +import okhttp3.mockwebserver.MockWebServer +import org.junit.Assert.assertEquals +import org.junit.Assert.assertFalse +import org.junit.Assert.assertNull +import org.junit.Assert.assertTrue +import org.junit.Test + +internal const val VERSION_FIXTURE = """{"apiVersion":"1.8.0","features":["version","metaData","processes","processCancel","extensions","widgets"],"clientChannels":["web","api","android"],"extensions":[{"name":"mobile-scanners","version":"1.1.0","pathPrefix":"/qbit/mobile-scanners"}]}""" + +/******************************************************************************* + ** + *******************************************************************************/ +class UiApiCompatibilityTest { + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun incompatibleDiscoveryNeverSendsCredentialsOrMetadata() = runBlocking() + { + val incompatible = listOf( + VERSION_FIXTURE.replace("1.8.0", "2.0.0"), + VERSION_FIXTURE.replace("1.8.0", "1.7.9"), + VERSION_FIXTURE.replace("1.8.0", "1.8.0-preview"), + VERSION_FIXTURE.replace("\"widgets\"", "\"other\""), + VERSION_FIXTURE.replace("mobile-scanners", "other"), + VERSION_FIXTURE.replace("1.1.0", "2.0.0"), + VERSION_FIXTURE.replace("1.1.0", "1.0.0"), + VERSION_FIXTURE.replace("/qbit/mobile-scanners", "/evil"), + VERSION_FIXTURE.replace("\"android\"", "\"future-client\""), + ) + for (payload in incompatible) MockWebServer().use { server -> + server.enqueue(MockResponse().setBody(payload)) + val origin = server.url("/").toString() + val gate = UiApiCompatibility(origin, true) + val repository = NetworkQQQRepository(origin, compatibility = gate) { mapOf("X-QQQ-Device-Token" to "private-token") } + repository.setEnvironment(Environment("test", origin)) + repository.setSessionUUID("private-session") + val result = runCatching { repository.loginWithPassword("private-user", "private-password") } + assertTrue(result.exceptionOrNull() is UiApiCompatibilityException) + val request = server.takeRequest() + assertEquals("/qqq/v1/version", request.path) + assertEquals(ANDROID_CLIENT, request.getHeader("X-QQQ-Client")) + listOf("Cookie", "Authorization", "X-QQQ-Device-Token").forEach { assertNull(request.getHeader(it)) } + assertEquals(0L, request.bodySize) + assertEquals(1, server.requestCount) + } + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun acceptsAdditiveVersionFeaturesAndUnknownMetadataEnums() { + val json = Json { ignoreUnknownKeys = true } + val version = json.decodeFromString<UiApiVersion>(VERSION_FIXTURE.replace("1.8.0", "1.99.9").replace("1.1.0", "1.12.1")) + UiApiCompatibility.validate(version.copy(features = version.features + "futureFeature"), true) + assertEquals(QComponentType.UNKNOWN, json.decodeFromString<QFrontendComponent>("""{"type":"FUTURE_COMPONENT","future":true}""").type) + assertEquals(QFieldType.UNKNOWN, json.decodeFromString<QFieldMetaData>("""{"name":"x","label":"Future field","type":"FUTURE_FIELD"}""").type) + assertEquals(QAppNodeType.UNKNOWN, json.decodeFromString<QAppNodeType>("\"FUTURE_NODE\"")) + val auth = json.decodeFromString<com.kingsrook.qqq.frontend.android.core.model.metadata.authentication.BaseAuthenticationMetaData>("""{"type":"FUTURE_PROVIDER","values":{"future":true}}""") + assertEquals("FUTURE_PROVIDER", auth.type) + assertEquals(AdornmentType.UNKNOWN, json.decodeFromString<AdornmentType>("\"FUTURE_ADORNMENT\"")) + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun discoveryIsCachedOnlyForItsOriginAndCarriesNoCookies() { + MockWebServer().use { first -> + MockWebServer().use { second -> + first.enqueue(MockResponse().setBody(VERSION_FIXTURE).addHeader("Set-Cookie", "sessionUUID=untrusted; Path=/")) + second.enqueue(MockResponse().setBody(VERSION_FIXTURE)) + val gate = UiApiCompatibility(first.url("/").toString(), true) + gate.verify(); gate.verify() + UiApiCompatibility(second.url("/").toString(), true).verify() + assertEquals(1, first.requestCount) + assertNull(second.takeRequest().getHeader("Cookie")) + } + } + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun nullExtensionsAreAnEmptyAdvertisementRatherThanMalformedDiscovery() { + val payload = VERSION_FIXTURE.replace("\"extensions\":[{\"name\":\"mobile-scanners\",\"version\":\"1.1.0\",\"pathPrefix\":\"/qbit/mobile-scanners\"}]", "\"extensions\":null") + MockWebServer().use { server -> + server.enqueue(MockResponse().setBody(payload)) + assertTrue(UiApiCompatibility(server.url("/").toString()).verify().extensions.isEmpty()) + } + MockWebServer().use { server -> + server.enqueue(MockResponse().setBody(payload)) + val error = runCatching { UiApiCompatibility(server.url("/").toString(), true).verify() }.exceptionOrNull() + assertTrue(error is UiApiCompatibilityException) + assertTrue(error?.message.orEmpty().startsWith("This server is missing the mobile-scanners extension.")) + assertEquals(1, server.requestCount) + assertNull(server.takeRequest().getHeader("Authorization")) + } + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun cancellationUsesPublishedOperationAndSemanticErrorsRemainStructured() = runBlocking() + { + MockWebServer().use { server -> + server.enqueue(MockResponse().setBody(VERSION_FIXTURE)) + server.enqueue(MockResponse().setBody("{}")) + server.enqueue(MockResponse().setResponseCode(400).setBody("""{"message":"Fix the reference","code":"FUTURE_VALIDATION","fieldErrors":[{"field":"reference","message":"Required","code":"REQUIRED"}],"traceId":"trace-123","future":true}""")) + val origin = server.url("/").toString() + val outcomes = mutableListOf<RequestOutcome>() + val repository = NetworkQQQRepository(origin, requestObserver = { outcomes.add(it) }) + repository.setEnvironment(Environment("test", origin)) + repository.setSessionUUID("synthetic-session") + repository.processCancel("capture", "synthetic-process") + assertEquals("/qqq/v1/version", server.takeRequest().path) + val cancellation = server.takeRequest() + assertEquals("POST", cancellation.method) + assertEquals("/qqq/v1/processes/capture/synthetic-process/cancel", cancellation.path) + assertEquals(ANDROID_CLIENT, cancellation.getHeader("X-QQQ-Client")) + val error = runCatching { repository.getMetaData("test", "1", "test", "1") }.exceptionOrNull() as UiApiException + assertEquals(400, error.httpStatus) + assertEquals("FUTURE_VALIDATION", error.code) + assertEquals("Fix the reference", error.message) + assertEquals(UiApiFieldError("reference", "Required", "REQUIRED"), error.fieldErrors.single()) + assertEquals("trace-123", error.traceId) + assertFalse(outcomes.toString().contains("reference")) + assertFalse(outcomes.toString().contains("trace-123")) + } + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun metadataMediaReferencesResolveWithoutInventingApiRoutes() { + val repository = NetworkQQQRepository("https://server.example/") + assertEquals("https://cdn.example/logo.png", repository.getURI("https://cdn.example/logo.png")) + assertEquals("https://server.example/qqq/v1/avatars/test", repository.getURI("/qqq/v1/avatars/test")) + assertTrue(runCatching { repository.getURI("file:///private") }.isFailure) + assertTrue(runCatching { repository.getURI("https://user:secret@cdn.example/logo") }.isFailure) + } +} diff --git a/qqq/android/core/src/test/java/com/kingsrook/qqq/frontend/android/core/model/GenericSerializingTest.kt b/qqq/android/core/src/test/java/com/kingsrook/qqq/frontend/android/core/model/GenericSerializingTest.kt new file mode 100644 index 0000000..1c5b08f --- /dev/null +++ b/qqq/android/core/src/test/java/com/kingsrook/qqq/frontend/android/core/model/GenericSerializingTest.kt @@ -0,0 +1,155 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2004-2026. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.kingsrook.qqq.frontend.android.core.model + + +import com.kingsrook.qqq.frontend.android.core.model.metadata.QComponentType +import com.kingsrook.qqq.frontend.android.core.model.metadata.QFrontendComponent +import com.kingsrook.qqq.frontend.android.core.model.processes.QJobComplete +import kotlinx.serialization.ExperimentalSerializationApi +import kotlinx.serialization.Serializable +import kotlinx.serialization.encodeToString +import kotlinx.serialization.json.Json +import org.junit.Assert.assertEquals +import org.junit.Assert.assertNull +import org.junit.Test + +/******************************************************************************* + ** + *******************************************************************************/ +class GenericSerializingTest { + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun testThatCameWithCode() { + /******************************************************************************* + ** + *******************************************************************************/ + @Serializable + data class MySerializableData( + val mapValues: Map<String, @Serializable(with = AnyValueSerializer::class) Any?> + ) + + /******************************************************************************* + ** + *******************************************************************************/ + @Serializable + @ExperimentalSerializationApi + data class OtherDataClass( + val intVal: Int, + val strVal: String, + @Serializable(with = AnyValueSerializer::class) + val anyVal: Any? = null, + ) + + + val map = mapOf<String, Any?>( + "Foo" to "bar", + "One" to 1L, // note, Int comes through as Long, so, Long... + "Two dot zero" to 2.0, + "True" to true, + "None" to null, + "Data" to mapOf("intVal" to 5L, "strVal" to "Cinque") + ) + val mapData = MySerializableData(map) + + val encoded = Json.encodeToString(mapData) + + val decoded = Json.decodeFromString<MySerializableData>(encoded) + + assertEquals(mapData, decoded) + + val mapStringAny = MapStringAny(map) + val encoded2 = Json.encodeToString(mapStringAny) + + val decoded2 = Json.decodeFromString<MapStringAny>(encoded2) + + assertEquals(mapStringAny, decoded2) + } + + /******************************************************************************* + ** Business discriminator keys remain data, including class-like strings and nested nulls. + *******************************************************************************/ + @Test + fun typeAndValueObjectsNeverSelectRuntimeClasses() { + val payload = """{"processUUID":"p","values":{"weight":{"type":"weight","value":12},"nested":{"type":"java.lang.Runtime","value":{"type":7,"value":null}}}}""" + val decoded = Json.decodeFromString<QJobComplete>(payload) + assertEquals(mapOf("type" to "weight", "value" to 12L), decoded.values["weight"]) + assertEquals(mapOf("type" to "java.lang.Runtime", "value" to mapOf("type" to 7L, "value" to null)), decoded.values["nested"]) + val roundTrip = Json.decodeFromString<QJobComplete>(Json.encodeToString(decoded)) + assertEquals(decoded, roundTrip) + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun testQFrontendComponent() { + val component = Json.decodeFromString<QFrontendComponent>( + """ + { + "type": "HELP_TEXT", + "values": + { + "helpText": "Lorem ipsum" + } + }""" + ) + + assertEquals(QComponentType.HELP_TEXT, component.type) + assertEquals(mapOf("helpText" to "Lorem ipsum"), component.values) + assertEquals(1, component.values.size) + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun testQJobCompleteWithArray() { + val jobComplete = Json.decodeFromString<QJobComplete>( + """ + { + "processUUID": "123-123-123-123", + "nextStep": "Underpants", + "values": + { + "someString": "Nylon", + "someArray": + [ + {"foo": "bar", "one": 1} + ], + "someObject": {"foo": "bar", "one": 1}, + "someNull": null + } + }""" + ) + + assertEquals("123-123-123-123", jobComplete.processUUID) + assertEquals("Underpants", jobComplete.nextStep) + assertEquals("Nylon", jobComplete.values["someString"]) + assertEquals(listOf(mapOf("foo" to "bar", "one" to 1L)), jobComplete.values["someArray"]) + assertEquals(mapOf("foo" to "bar", "one" to 1L), jobComplete.values["someObject"]) + assertNull(jobComplete.values["someNull"]) + + } +} diff --git a/qqq/android/core/src/test/java/com/kingsrook/qqq/frontend/android/core/model/MobileProtocolTest.kt b/qqq/android/core/src/test/java/com/kingsrook/qqq/frontend/android/core/model/MobileProtocolTest.kt new file mode 100644 index 0000000..be9295b --- /dev/null +++ b/qqq/android/core/src/test/java/com/kingsrook/qqq/frontend/android/core/model/MobileProtocolTest.kt @@ -0,0 +1,62 @@ +/* Copyright (c) 2026 QRunIO. SPDX-License-Identifier: Apache-2.0 */ +package com.kingsrook.qqq.frontend.android.core.model + +import com.kingsrook.qqq.frontend.android.core.model.metadata.authentication.BaseAuthenticationMetaData +import com.kingsrook.qqq.frontend.android.core.model.metadata.QInstance +import com.kingsrook.qqq.frontend.android.core.model.metadata.QProcessMetaData +import com.kingsrook.qqq.frontend.android.core.model.widgets.WidgetBlock +import com.kingsrook.qqq.frontend.android.core.model.metadata.authentication.TableBasedAuthenticationMetaData +import com.kingsrook.qqq.frontend.android.core.model.processes.ProcessStepResult +import com.kingsrook.qqq.frontend.android.core.model.processes.QJobComplete +import kotlinx.serialization.decodeFromString +import kotlinx.serialization.json.Json +import org.junit.Assert.assertEquals +import org.junit.Assert.assertTrue +import org.junit.Test + +/******************************************************************************* + ** Fixtures cover wire differences observed against the current QQQ demo server. + *******************************************************************************/ +class MobileProtocolTest { + private val json = Json { ignoreUnknownKeys = true } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun acceptsTableBasedAuthenticationMetadata() { + val metadata = json.decodeFromString<BaseAuthenticationMetaData>("""{"name":"users","type":"TABLE_BASED","values":{}}""") + assertTrue(metadata is TableBasedAuthenticationMetaData) + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun terminalProcessCompletionMayOmitNextStep() { + val result = json.decodeFromString<ProcessStepResult>("""{"type":"COMPLETE","processUUID":"test-process","values":{}}""") + assertEquals("", (result as QJobComplete).nextStep) + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun rendersContractCapturedFromTheLiveDemo() { + val metadata = json.decodeFromString<QInstance>(fixture("metadata")) + assertTrue(metadata.apps!!.containsKey("mobileScanApp")) + val process = json.decodeFromString<QProcessMetaData>(fixture("process")) + assertEquals("scanner", process.frontendSteps!!.first().format) + val init = json.decodeFromString<ProcessStepResult>(fixture("init")) as QJobComplete + assertEquals("scan", init.nextStep) + val composite = WidgetBlock.fromMap(init.values["mobileScanner"])!! + assertEquals("SCANNER", composite.subBlocks.single().blockType) + assertEquals("Scan a barcode", composite.subBlocks.single().values["title"]) + } + + /******************************************************************************* + ** These sanitized fixtures contain demo metadata only, never sessions or device tokens. + *******************************************************************************/ + private fun fixture(name: String): String = + requireNotNull(javaClass.getResourceAsStream("/mobile-contract/$name.json")).bufferedReader().use { it.readText() } +} diff --git a/qqq/android/core/src/test/java/com/kingsrook/qqq/frontend/android/core/model/RecordLayoutTest.kt b/qqq/android/core/src/test/java/com/kingsrook/qqq/frontend/android/core/model/RecordLayoutTest.kt new file mode 100644 index 0000000..9b349ba --- /dev/null +++ b/qqq/android/core/src/test/java/com/kingsrook/qqq/frontend/android/core/model/RecordLayoutTest.kt @@ -0,0 +1,41 @@ +/* Copyright (c) 2026 QRunIO. SPDX-License-Identifier: Apache-2.0 */ +package com.kingsrook.qqq.frontend.android.core.model + +import com.kingsrook.qqq.frontend.android.core.model.metadata.QTableMetaData +import com.kingsrook.qqq.frontend.android.core.model.metadata.QRecordAssociation +import kotlinx.serialization.json.Json +import kotlinx.serialization.json.JsonPrimitive +import org.junit.Assert.assertEquals +import org.junit.Assert.assertNull +import org.junit.Test + +class RecordLayoutTest { + @Test + fun sectionsPreserveOrderWithoutLeakingHiddenOrDuplicatingFields() { + val table = Json.decodeFromString<QTableMetaData>("""{ + "name":"orders","label":"Orders","fields":{ + "id":{"name":"id","label":"ID","type":"INTEGER"}, + "secret":{"name":"secret","label":"Secret","type":"STRING"}, + "other":{"name":"other","label":"Other","type":"STRING"}}, + "sections":[{"name":"hidden","hidden":true,"fieldNames":["secret"]}, + {"name":"overview","label":"Overview","fieldNames":["id","id","missing"]}] + }""") + assertEquals(listOf("Overview", "Other fields"), table.recordGroups().map { it.label }) + assertEquals(listOf("id", "other"), table.recordGroups().flatMap { it.fields }.map { it.name }) + } + + @Test + fun relationshipsRespectDirectionTypesAndMissingParentKeys() { + val association = Json.decodeFromString<QRecordAssociation>("""{ + "name":"Lines","associatedTableName":"lines", + "join":{"leftTable":"orders","rightTable":"lines","joinOns":[{"leftField":"key","rightField":"orderKey"}]} + }""") + val record = RecordData(values = mapOf("key" to JsonPrimitive("0007"))) + assertEquals(mapOf("orderKey" to JsonPrimitive("0007")), association.parentMatches("orders", record)) + assertNull(association.parentMatches("unrelated", record)) + assertNull(association.parentMatches("orders", RecordData())) + val reversed = association.copy(join = association.join.copy(leftTable = "lines", rightTable = "orders", + joinOns = association.join.joinOns.map { it.copy(leftField = it.rightField, rightField = it.leftField) })) + assertEquals(association.parentMatches("orders", record), reversed.parentMatches("orders", record)) + } +} diff --git a/qqq/android/core/src/test/java/com/kingsrook/qqq/frontend/android/core/model/RecordPresentationTest.kt b/qqq/android/core/src/test/java/com/kingsrook/qqq/frontend/android/core/model/RecordPresentationTest.kt new file mode 100644 index 0000000..88a017c --- /dev/null +++ b/qqq/android/core/src/test/java/com/kingsrook/qqq/frontend/android/core/model/RecordPresentationTest.kt @@ -0,0 +1,46 @@ +/* Copyright (c) 2026 QRunIO. SPDX-License-Identifier: Apache-2.0 */ +package com.kingsrook.qqq.frontend.android.core.model + +import com.kingsrook.qqq.frontend.android.core.model.metadata.QFieldMetaData +import com.kingsrook.qqq.frontend.android.core.model.metadata.QFieldType +import com.kingsrook.qqq.frontend.android.core.model.metadata.QRecordSection +import com.kingsrook.qqq.frontend.android.core.model.metadata.QTableMetaData +import kotlinx.serialization.json.JsonPrimitive +import kotlinx.serialization.json.JsonArray +import org.junit.Assert.assertEquals +import org.junit.Assert.assertFalse +import org.junit.Assert.assertTrue +import org.junit.Test + +class RecordPresentationTest { + @Test + fun typedDatesFormatEvenWhenTheirRawJsonRepresentationDiffersFromDisplayText() { + val record = RecordData(values = mapOf("date" to JsonArray(listOf(JsonPrimitive(2026), JsonPrimitive(1), JsonPrimitive(2)))), + displayValues = mapOf("date" to JsonPrimitive("2026-01-02"), "time" to JsonPrimitive("2026-01-02T11:30:00Z"))) + // The semantic server supplies %s for fields without a custom display format. + val date = record.formatted(QFieldMetaData("date", "Date", type = QFieldType.DATE, displayFormat = "%s")) + assertTrue(date.contains("2026")) + assertFalse(date.contains("2026-01-02")) + assertFalse(record.formatted(QFieldMetaData("time", "Time", type = QFieldType.DATE_TIME, displayFormat = "%s")).contains("T11:30")) + } + + @Test + fun formattingPreservesIdentifiersAndServerCurrencyAndMakesEmptyValuesExplicit() { + val record = RecordData(values = mapOf("key" to JsonPrimitive("000026"), "amount" to JsonPrimitive(3.5), "enabled" to JsonPrimitive(true)), displayValues = mapOf("amount" to JsonPrimitive("$3.50"))) + assertEquals("000026", record.formatted(QFieldMetaData("key", "Key", type = QFieldType.STRING))) + assertEquals("$3.50", record.formatted(QFieldMetaData("amount", "Amount", type = QFieldType.DECIMAL, displayFormat = "$%,.2f"))) + assertEquals("Yes", record.formatted(QFieldMetaData("enabled", "Enabled", type = QFieldType.BOOLEAN))) + assertEquals("—", record.formatted(QFieldMetaData("missing", "Missing", type = QFieldType.STRING))) + } + + @Test + fun searchAndSummaryNeverExposeHiddenSectionFields() { + val field = QFieldMetaData("visible", "Visible", type = QFieldType.STRING) + val hidden = field.copy(name = "secret", label = "Secret") + val table = QTableMetaData("test", "Test", fields = mapOf("visible" to field, "secret" to hidden), + searchFields = listOf("secret", "visible"), sections = listOf(QRecordSection("hidden", fieldNames = listOf("secret"), hidden = true))) + val record = RecordData(values = mapOf("visible" to JsonPrimitive("public"), "secret" to JsonPrimitive("private"))) + assertEquals(listOf("visible"), table.recordSearchFields()) + assertEquals("Visible: public", record.summary(table)) + } +} diff --git a/qqq/android/core/src/test/java/com/kingsrook/qqq/frontend/android/core/model/metadata/QAppSectionTest.kt b/qqq/android/core/src/test/java/com/kingsrook/qqq/frontend/android/core/model/metadata/QAppSectionTest.kt new file mode 100644 index 0000000..d0388f8 --- /dev/null +++ b/qqq/android/core/src/test/java/com/kingsrook/qqq/frontend/android/core/model/metadata/QAppSectionTest.kt @@ -0,0 +1,48 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2004-2024. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package com.kingsrook.qqq.frontend.android.core.model.metadata + + +import org.junit.Assert.assertFalse +import org.junit.Assert.assertTrue +import org.junit.Test + +/******************************************************************************* + ** + *******************************************************************************/ +class QAppSectionTest { + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun testHasContent() { + assertFalse(QAppSection("test", "Test").hasContent()) + assertFalse(QAppSection("test", "Test", tables = null, processes = null, reports = null).hasContent()) + + assertTrue(QAppSection("test", "Test", apps = listOf("childApp")).hasContent()) + assertTrue(QAppSection("test", "Test", tables = listOf("myTable")).hasContent()) + assertTrue(QAppSection("test", "Test", processes = listOf("myProcess")).hasContent()) + assertTrue(QAppSection("test", "Test", reports = listOf("myReport")).hasContent()) + assertTrue(QAppSection("test", "Test", tables = listOf("myTable"), processes = listOf("myProcess"), reports = listOf("myReport")).hasContent()) + } +} diff --git a/qqq/android/core/src/test/java/com/kingsrook/qqq/frontend/android/core/model/metadata/authentication/AuthenticationSerializerTest.kt b/qqq/android/core/src/test/java/com/kingsrook/qqq/frontend/android/core/model/metadata/authentication/AuthenticationSerializerTest.kt new file mode 100644 index 0000000..9119ef1 --- /dev/null +++ b/qqq/android/core/src/test/java/com/kingsrook/qqq/frontend/android/core/model/metadata/authentication/AuthenticationSerializerTest.kt @@ -0,0 +1,58 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2004-2024. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package com.kingsrook.qqq.frontend.android.core.model.metadata.authentication + +import kotlinx.serialization.json.Json +import org.junit.Test + +import org.junit.Assert.assertEquals +import org.junit.Assert.assertTrue + +/******************************************************************************* + ** + *******************************************************************************/ +class AuthenticationSerializerTest { + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun testDecodeAuth0() { + val json = """ + { + "name":"auth0", + "type":"AUTH_0", + "values": + { + "baseUrl":"https://auth.coldtrack-dev.com/", + "clientId":"Q7hjPeDrfq11EgZyFxpoXQRTPhTn3KzN", + "audience":"https://www.nutrifresh-one-dev.com" + } + } + """ + + val withUnknownKeys = Json { ignoreUnknownKeys = true } + val parsedItem = withUnknownKeys.decodeFromString<BaseAuthenticationMetaData>(json) + assertTrue(parsedItem is Auth0AuthenticationMetaData) + assertEquals("Q7hjPeDrfq11EgZyFxpoXQRTPhTn3KzN", (parsedItem as Auth0AuthenticationMetaData).values.clientId) + } +} diff --git a/qqq/android/core/src/test/java/com/kingsrook/qqq/frontend/android/core/model/widgets/WidgetBlockTest.kt b/qqq/android/core/src/test/java/com/kingsrook/qqq/frontend/android/core/model/widgets/WidgetBlockTest.kt new file mode 100644 index 0000000..9f02b60 --- /dev/null +++ b/qqq/android/core/src/test/java/com/kingsrook/qqq/frontend/android/core/model/widgets/WidgetBlockTest.kt @@ -0,0 +1,88 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2004-2024. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package com.kingsrook.qqq.frontend.android.core.model.widgets + +import org.junit.Test + +import org.junit.Assert.assertEquals +import org.junit.Assert.assertNotNull +import org.junit.Assert.assertNull + +/******************************************************************************* + ** + *******************************************************************************/ +class WidgetBlockTest { + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun testFromMap() { + val widgetBlock = WidgetBlock.fromMap( + mapOf( + "blockType" to "TEXT", + "styles" to mapOf( + "foo" to "bar" + ), + "values" to mapOf( + "text" to "this is my text" + ), + ) + ) + + assertNotNull(widgetBlock) + if (widgetBlock != null) { + assertEquals("", widgetBlock.blockId) + assertEquals("TEXT", widgetBlock.blockType) + assertNull(widgetBlock.conditional) + assertNotNull(widgetBlock.styles) + assertEquals("bar", widgetBlock.styles["foo"]) + assertEquals("this is my text", widgetBlock.values["text"]) + assertEquals(emptyList<WidgetBlock>(), widgetBlock.subBlocks) + } + } + + /******************************************************************************* + ** Widget edits must not mutate immutable or shared decoded server metadata. + *******************************************************************************/ + @Test + fun inputMapsBecomeOwnedMutableWidgetState() { + val styles = mapOf("foo" to "bar") + val values = mapOf("text" to "original") + val block = requireNotNull(WidgetBlock.fromMap(mapOf("styles" to styles, "values" to values))) + block.styles["foo"] = "changed" + block.values["text"] = "edited" + assertEquals("bar", styles["foo"]) + assertEquals("original", values["text"]) + assertEquals("changed", block.styles["foo"]) + assertEquals("edited", block.values["text"]) + } + + + /******************************************************************************* + ** JSON property names are strings; malformed legacy maps must fail explicitly. + *******************************************************************************/ + @Test(expected = IllegalArgumentException::class) + fun nonStringPropertyNamesAreRejected() { + WidgetBlock.fromMap(mapOf("values" to mapOf(42 to "invalid"))) + } +} diff --git a/qqq/android/core/src/test/java/com/kingsrook/qqq/frontend/android/core/utils/StringExtensionsTest.kt b/qqq/android/core/src/test/java/com/kingsrook/qqq/frontend/android/core/utils/StringExtensionsTest.kt new file mode 100644 index 0000000..6b42842 --- /dev/null +++ b/qqq/android/core/src/test/java/com/kingsrook/qqq/frontend/android/core/utils/StringExtensionsTest.kt @@ -0,0 +1,48 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2024-2024. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.kingsrook.qqq.frontend.android.core.utils + +import org.junit.Assert.assertEquals +import org.junit.Test + +/******************************************************************************* + ** + *******************************************************************************/ +class StringExtensionsTest { + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun testFirstN() { + assertEquals("", "".firstN(0)); + assertEquals("", "".firstN(1)); + assertEquals("", "".firstN(100)); + + assertEquals("", "A".firstN(0)); + assertEquals("A", "A".firstN(1)); + assertEquals("A", "A".firstN(100)); + + assertEquals("", "ABC".firstN(0)); + assertEquals("A", "ABC".firstN(1)); + assertEquals("ABC", "ABC".firstN(100)); + } +} diff --git a/qqq/android/core/src/test/resources/mobile-contract/init.json b/qqq/android/core/src/test/resources/mobile-contract/init.json new file mode 100644 index 0000000..b3c6511 --- /dev/null +++ b/qqq/android/core/src/test/resources/mobile-contract/init.json @@ -0,0 +1,27 @@ +{ + "values": {"mobileScanner": { + "footerHTML": null, + "dropdownLabelList": null, + "dropdownNeedsSelectedText": null, + "blockType": "COMPOSITE", + "dropdownNameList": null, + "subBlocks": [{ + "blockId": "barcodeScanner", + "blockType": "SCANNER", + "values": { + "instructions": "Scan with the trigger or enter a barcode. Saved scans appear in Mobile Scanner Administration.", + "title": "Scan a barcode" + } + }], + "label": null, + "type": "composite", + "sublabel": null, + "dropdownDefaultValueList": null, + "csvData": null, + "hasPermission": null, + "dropdownDataList": null + }}, + "processUUID": "00000000-0000-4000-8000-000000000001", + "nextStep": "scan", + "type": "COMPLETE" +} \ No newline at end of file diff --git a/qqq/android/core/src/test/resources/mobile-contract/metadata.json b/qqq/android/core/src/test/resources/mobile-contract/metadata.json new file mode 100644 index 0000000..8e25e81 --- /dev/null +++ b/qqq/android/core/src/test/resources/mobile-contract/metadata.json @@ -0,0 +1,287 @@ +{ + "appTree": [{ + "children": [{ + "name": "mobileScanCapture", + "label": "Scan Capture", + "type": "PROCESS" + }], + "name": "mobileScanApp", + "icon": {"name": "qr_code_scanner"}, + "label": "Scan Capture", + "type": "APP" + }], + "processes": { + "mobileDeviceCredential.bulkDelete": { + "durableJobAlways": false, + "stepFlow": "LINEAR", + "durableJobEligible": false, + "hasPermission": false, + "name": "mobileDeviceCredential.bulkDelete", + "label": "Device Credentials Bulk Delete", + "tableName": "mobileDeviceCredential", + "isHidden": true + }, + "mobileDeviceCredential.bulkEdit": { + "durableJobAlways": false, + "stepFlow": "LINEAR", + "durableJobEligible": false, + "hasPermission": false, + "name": "mobileDeviceCredential.bulkEdit", + "label": "Device Credentials Bulk Edit", + "tableName": "mobileDeviceCredential", + "isHidden": true + }, + "mobileScan.bulkEditWithFile": { + "durableJobAlways": false, + "stepFlow": "LINEAR", + "durableJobEligible": false, + "hasPermission": false, + "name": "mobileScan.bulkEditWithFile", + "label": "Barcode Scans Bulk Edit With File", + "tableName": "mobileScan", + "isHidden": true + }, + "demoUser.bulkDelete": { + "durableJobAlways": false, + "stepFlow": "LINEAR", + "durableJobEligible": false, + "hasPermission": false, + "name": "demoUser.bulkDelete", + "label": "Demo User Bulk Delete", + "tableName": "demoUser", + "isHidden": true + }, + "demoSession.bulkEditWithFile": { + "durableJobAlways": false, + "stepFlow": "LINEAR", + "durableJobEligible": false, + "hasPermission": false, + "name": "demoSession.bulkEditWithFile", + "label": "Demo Session Bulk Edit With File", + "tableName": "demoSession", + "isHidden": true + }, + "demoUser.bulkInsert": { + "durableJobAlways": false, + "stepFlow": "LINEAR", + "durableJobEligible": false, + "iconName": "library_add", + "hasPermission": false, + "name": "demoUser.bulkInsert", + "icon": { + "semanticName": "library-add", + "name": "library_add" + }, + "label": "Demo User Bulk Insert", + "iconSemanticName": "library-add", + "tableName": "demoUser", + "isHidden": true + }, + "demoSession.bulkInsert": { + "durableJobAlways": false, + "stepFlow": "LINEAR", + "durableJobEligible": false, + "iconName": "library_add", + "hasPermission": false, + "name": "demoSession.bulkInsert", + "icon": { + "semanticName": "library-add", + "name": "library_add" + }, + "label": "Demo Session Bulk Insert", + "iconSemanticName": "library-add", + "tableName": "demoSession", + "isHidden": true + }, + "demoUser.bulkEditWithFile": { + "durableJobAlways": false, + "stepFlow": "LINEAR", + "durableJobEligible": false, + "hasPermission": false, + "name": "demoUser.bulkEditWithFile", + "label": "Demo User Bulk Edit With File", + "tableName": "demoUser", + "isHidden": true + }, + "mobileScanCapture": { + "durableJobAlways": false, + "stepFlow": "LINEAR", + "durableJobEligible": false, + "hasPermission": true, + "name": "mobileScanCapture", + "label": "Scan Capture", + "isHidden": false + }, + "mobileDevice.bulkInsert": { + "durableJobAlways": false, + "stepFlow": "LINEAR", + "durableJobEligible": false, + "iconName": "library_add", + "hasPermission": false, + "name": "mobileDevice.bulkInsert", + "icon": { + "semanticName": "library-add", + "name": "library_add" + }, + "label": "Mobile Devices Bulk Insert", + "iconSemanticName": "library-add", + "tableName": "mobileDevice", + "isHidden": true + }, + "mobileDeviceCredential.bulkInsert": { + "durableJobAlways": false, + "stepFlow": "LINEAR", + "durableJobEligible": false, + "iconName": "library_add", + "hasPermission": false, + "name": "mobileDeviceCredential.bulkInsert", + "icon": { + "semanticName": "library-add", + "name": "library_add" + }, + "label": "Device Credentials Bulk Insert", + "iconSemanticName": "library-add", + "tableName": "mobileDeviceCredential", + "isHidden": true + }, + "mobileScan.bulkEdit": { + "durableJobAlways": false, + "stepFlow": "LINEAR", + "durableJobEligible": false, + "hasPermission": false, + "name": "mobileScan.bulkEdit", + "label": "Barcode Scans Bulk Edit", + "tableName": "mobileScan", + "isHidden": true + }, + "mobileDevice.bulkDelete": { + "durableJobAlways": false, + "stepFlow": "LINEAR", + "durableJobEligible": false, + "hasPermission": false, + "name": "mobileDevice.bulkDelete", + "label": "Mobile Devices Bulk Delete", + "tableName": "mobileDevice", + "isHidden": true + }, + "mobileDevice.bulkEditWithFile": { + "durableJobAlways": false, + "stepFlow": "LINEAR", + "durableJobEligible": false, + "hasPermission": false, + "name": "mobileDevice.bulkEditWithFile", + "label": "Mobile Devices Bulk Edit With File", + "tableName": "mobileDevice", + "isHidden": true + }, + "mobileScan.bulkInsert": { + "durableJobAlways": false, + "stepFlow": "LINEAR", + "durableJobEligible": false, + "iconName": "library_add", + "hasPermission": false, + "name": "mobileScan.bulkInsert", + "icon": { + "semanticName": "library-add", + "name": "library_add" + }, + "label": "Barcode Scans Bulk Insert", + "iconSemanticName": "library-add", + "tableName": "mobileScan", + "isHidden": true + }, + "mobileScan.bulkDelete": { + "durableJobAlways": false, + "stepFlow": "LINEAR", + "durableJobEligible": false, + "hasPermission": false, + "name": "mobileScan.bulkDelete", + "label": "Barcode Scans Bulk Delete", + "tableName": "mobileScan", + "isHidden": true + }, + "demoSession.bulkEdit": { + "durableJobAlways": false, + "stepFlow": "LINEAR", + "durableJobEligible": false, + "hasPermission": false, + "name": "demoSession.bulkEdit", + "label": "Demo Session Bulk Edit", + "tableName": "demoSession", + "isHidden": true + }, + "demoSession.bulkDelete": { + "durableJobAlways": false, + "stepFlow": "LINEAR", + "durableJobEligible": false, + "hasPermission": false, + "name": "demoSession.bulkDelete", + "label": "Demo Session Bulk Delete", + "tableName": "demoSession", + "isHidden": true + }, + "mobileDevice.bulkEdit": { + "durableJobAlways": false, + "stepFlow": "LINEAR", + "durableJobEligible": false, + "hasPermission": false, + "name": "mobileDevice.bulkEdit", + "label": "Mobile Devices Bulk Edit", + "tableName": "mobileDevice", + "isHidden": true + }, + "mobileDeviceCredential.bulkEditWithFile": { + "durableJobAlways": false, + "stepFlow": "LINEAR", + "durableJobEligible": false, + "hasPermission": false, + "name": "mobileDeviceCredential.bulkEditWithFile", + "label": "Device Credentials Bulk Edit With File", + "tableName": "mobileDeviceCredential", + "isHidden": true + }, + "demoUser.bulkEdit": { + "durableJobAlways": false, + "stepFlow": "LINEAR", + "durableJobEligible": false, + "hasPermission": false, + "name": "demoUser.bulkEdit", + "label": "Demo User Bulk Edit", + "tableName": "demoUser", + "isHidden": true + } + }, + "metaDataGeneration": 0, + "widgets": {"mobileScanner": { + "showReloadButton": true, + "hasPermission": true, + "name": "mobileScanner", + "storeDropdownSelections": false, + "isCard": false, + "label": "Scan a barcode", + "showExportButton": false, + "type": "composite" + }}, + "apps": {"mobileScanApp": { + "children": [{ + "name": "mobileScanCapture", + "label": "Scan Capture", + "type": "PROCESS" + }], + "name": "mobileScanApp", + "icon": {"name": "qr_code_scanner"}, + "childMap": {"mobileScanCapture": { + "name": "mobileScanCapture", + "label": "Scan Capture", + "type": "PROCESS" + }}, + "label": "Scan Capture", + "sections": [{ + "processes": ["mobileScanCapture"], + "role": "PRIMARY", + "name": "scan", + "label": "Scanning", + "collapsedByDefault": false + }] + }} +} \ No newline at end of file diff --git a/qqq/android/core/src/test/resources/mobile-contract/process.json b/qqq/android/core/src/test/resources/mobile-contract/process.json new file mode 100644 index 0000000..b8ac4f9 --- /dev/null +++ b/qqq/android/core/src/test/resources/mobile-contract/process.json @@ -0,0 +1 @@ +{"frontendSteps":[{"name":"scan","format":"scanner","label":"Scan a barcode","components":[{"type":"WIDGET","values":{"widgetName":"mobileScanner"}}]}],"name":"mobileScanCapture","label":"Scan Capture","stepFlow":"LINEAR","durableJobEligible":false,"durableJobAlways":false,"isHidden":false,"hasPermission":true} \ No newline at end of file diff --git a/qqq/android/mobileapp/.gitignore b/qqq/android/mobileapp/.gitignore new file mode 100644 index 0000000..42afabf --- /dev/null +++ b/qqq/android/mobileapp/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/qqq/android/mobileapp/.gradle/8.6/checksums/checksums.lock b/qqq/android/mobileapp/.gradle/8.6/checksums/checksums.lock new file mode 100644 index 0000000..09bd482 Binary files /dev/null and b/qqq/android/mobileapp/.gradle/8.6/checksums/checksums.lock differ diff --git a/qqq/android/mobileapp/.gradle/8.6/fileChanges/last-build.bin b/qqq/android/mobileapp/.gradle/8.6/fileChanges/last-build.bin new file mode 100644 index 0000000..f76dd23 Binary files /dev/null and b/qqq/android/mobileapp/.gradle/8.6/fileChanges/last-build.bin differ diff --git a/qqq/android/mobileapp/.gradle/8.6/fileHashes/fileHashes.lock b/qqq/android/mobileapp/.gradle/8.6/fileHashes/fileHashes.lock new file mode 100644 index 0000000..43edf5c Binary files /dev/null and b/qqq/android/mobileapp/.gradle/8.6/fileHashes/fileHashes.lock differ diff --git a/qqq/android/mobileapp/.gradle/8.6/gc.properties b/qqq/android/mobileapp/.gradle/8.6/gc.properties new file mode 100644 index 0000000..e69de29 diff --git a/qqq/android/mobileapp/.gradle/vcs-1/gc.properties b/qqq/android/mobileapp/.gradle/vcs-1/gc.properties new file mode 100644 index 0000000..e69de29 diff --git a/qqq/android/mobileapp/build.gradle.kts b/qqq/android/mobileapp/build.gradle.kts new file mode 100644 index 0000000..e3110e0 --- /dev/null +++ b/qqq/android/mobileapp/build.gradle.kts @@ -0,0 +1,111 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2004-2026. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +plugins { + alias(libs.plugins.android.library) + alias(libs.plugins.kotlin.android) + kotlin("plugin.serialization") + id("kotlinx-serialization") + id("com.vanniktech.maven.publish") version "0.30.0" +} + +publishing { + repositories { + maven { + // Gitea Maven registry of the repository owner. CI sets giteaMavenUrl, giteaUsername + // and giteaPassword (ci-workflows android.yaml, publish-tasks on vX.Y.Z tags). + name = "gitea" + url = uri(providers.gradleProperty("giteaMavenUrl").getOrElse("https://git.kof22.com/api/packages/QRun-IO/maven")) + credentials(PasswordCredentials::class) + } + } +} + +android { + namespace = "com.kingsrook.qqq.frontend.android.mobileapp" + compileSdk = 35 + + defaultConfig { + minSdk = 26 + + testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + consumerProguardFiles("consumer-rules.pro") + + manifestPlaceholders["auth0Domain"] = "placeholder.domain" + manifestPlaceholders["auth0Scheme"] = "placeholderscheme" + } + + buildTypes { + release { + isMinifyEnabled = false + proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro") + } + } + compileOptions { + sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 + } + buildFeatures { + compose = true + } + composeOptions { + kotlinCompilerExtensionVersion = "1.5.1" + } + kotlinOptions { + jvmTarget = "1.8" + } + testOptions { + unitTests.isReturnDefaultValues = true + } +} + +dependencies { + + implementation(libs.appauth) + implementation(libs.androidx.activity.compose) + implementation(libs.androidx.core.ktx) + implementation(libs.androidx.appcompat) + implementation(libs.material) + implementation(libs.androidx.runtime.android) + implementation(libs.androidx.ui.android) + implementation(libs.androidx.material3.android) + implementation(libs.androidx.ui.tooling.preview.android) + implementation(libs.androidx.navigation.compose) + testImplementation(libs.junit) + testImplementation(libs.junit.junit) + testImplementation("org.jetbrains.kotlinx:kotlinx-coroutines-test:1.9.0") + androidTestImplementation(libs.androidx.junit) + androidTestImplementation(libs.androidx.espresso.core) + + // Kotlin serialization + implementation(libs.kotlinx.serialization.json) + + implementation(libs.androidx.datastore.preferences) + implementation(libs.androidx.datastore) + + implementation(libs.coil.network.okhttp) // Only available on Android/JVM. + implementation(libs.coil.compose) + implementation(libs.coil.svg) + + implementation(project(":qqq:android:core")) + implementation("com.squareup.retrofit2:retrofit:2.9.0") + implementation(libs.auth0) +} diff --git a/qqq/android/mobileapp/consumer-rules.pro b/qqq/android/mobileapp/consumer-rules.pro new file mode 100644 index 0000000..e69de29 diff --git a/qqq/android/mobileapp/gradle.properties b/qqq/android/mobileapp/gradle.properties new file mode 100644 index 0000000..94a2b16 --- /dev/null +++ b/qqq/android/mobileapp/gradle.properties @@ -0,0 +1,21 @@ + +GROUP=com.kingsrook.qqq-android +POM_ARTIFACT_ID=qqq-android-mobileapp +VERSION_NAME=0.1.1-SNAPSHOT + +## POM_NAME=QQQ Android Mobileapp +## POM_DESCRIPTION=Basic components for an Android mobile app using QQQ +## POM_INCEPTION_YEAR=2024 +## POM_URL=https://github.com/Kingsrook/qqq-android + +## POM_LICENSE_NAME=Apache License, Version 2.0 +## POM_LICENSE_URL=https://www.apache.org/licenses/LICENSE-2.0 +## POM_LICENSE_DIST=repo + +## POM_SCM_URL=https://github.com/Kingsrook/qqq-android +## POM_SCM_CONNECTION=scm:git:git://github.com/username/mylibrary.git +## POM_SCM_DEV_CONNECTION=scm:git:ssh://git@github.com/username/mylibrary.git + +## POM_DEVELOPER_ID= +## POM_DEVELOPER_NAME=User Name +## POM_DEVELOPER_URL=https://github.com/username/ \ No newline at end of file diff --git a/qqq/android/mobileapp/proguard-rules.pro b/qqq/android/mobileapp/proguard-rules.pro new file mode 100644 index 0000000..481bb43 --- /dev/null +++ b/qqq/android/mobileapp/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/qqq/android/mobileapp/src/androidTest/java/com/kingsrook/qqq/frontend/android/mobileapp/ExampleInstrumentedTest.kt b/qqq/android/mobileapp/src/androidTest/java/com/kingsrook/qqq/frontend/android/mobileapp/ExampleInstrumentedTest.kt new file mode 100644 index 0000000..58edf25 --- /dev/null +++ b/qqq/android/mobileapp/src/androidTest/java/com/kingsrook/qqq/frontend/android/mobileapp/ExampleInstrumentedTest.kt @@ -0,0 +1,47 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2024-2024. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.kingsrook.qqq.frontend.android.mobileapp + +import androidx.test.platform.app.InstrumentationRegistry +import androidx.test.ext.junit.runners.AndroidJUnit4 + +import org.junit.Test +import org.junit.runner.RunWith + +import org.junit.Assert.assertEquals + +/******************************************************************************* + ** Instrumented test, which will execute on an Android device. + ** See [testing documentation](http://d.android.com/tools/testing). + *******************************************************************************/ +@RunWith(AndroidJUnit4::class) +class ExampleInstrumentedTest { + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun useAppContext() { + // Context of the app under test. + val appContext = InstrumentationRegistry.getInstrumentation().targetContext + assertEquals("com.kingsrook.qqq.frontend.android.mobileapp.test", appContext.packageName) + } +} diff --git a/qqq/android/mobileapp/src/main/AndroidManifest.xml b/qqq/android/mobileapp/src/main/AndroidManifest.xml new file mode 100644 index 0000000..aeeb9e0 --- /dev/null +++ b/qqq/android/mobileapp/src/main/AndroidManifest.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8"?> +<manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools"> + <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> + <application> + <activity android:name="net.openid.appauth.RedirectUriReceiverActivity" tools:node="remove" /> + <activity android:name="com.kingsrook.qqq.frontend.android.mobileapp.ui.authentication.OAuth2RedirectActivity" + android:exported="true" android:excludeFromRecents="true"> + <intent-filter> + <action android:name="android.intent.action.VIEW" /> + <category android:name="android.intent.category.DEFAULT" /> + <category android:name="android.intent.category.BROWSABLE" /> + <data android:scheme="${applicationId}.oauth" android:host="callback" android:path="/oauth2redirect" /> + </intent-filter> + </activity> + </application> +</manifest> diff --git a/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/QMobileAppMain.kt b/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/QMobileAppMain.kt new file mode 100644 index 0000000..0edf00a --- /dev/null +++ b/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/QMobileAppMain.kt @@ -0,0 +1,274 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2004-2024. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package com.kingsrook.qqq.frontend.android.mobileapp + +import androidx.activity.compose.BackHandler +import androidx.compose.animation.AnimatedVisibility +import androidx.compose.animation.ExitTransition +import androidx.compose.animation.core.FastOutSlowInEasing +import androidx.compose.animation.core.tween +import androidx.compose.animation.fadeIn +import androidx.compose.animation.fadeOut +import androidx.compose.animation.slideInVertically +import androidx.compose.foundation.Image +import androidx.compose.foundation.clickable +import androidx.compose.foundation.indication +import androidx.compose.foundation.interaction.MutableInteractionSource +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.padding +import androidx.compose.material3.Scaffold +import androidx.compose.material3.AlertDialog +import androidx.compose.material3.HorizontalDivider +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.ModalNavigationDrawer +import androidx.compose.material3.ModalDrawerSheet +import androidx.compose.material3.DrawerValue +import androidx.compose.material3.NavigationDrawerItem +import androidx.compose.material3.Text +import androidx.compose.material3.TextButton +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.verticalScroll +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.mutableIntStateOf +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.ui.Modifier +import androidx.compose.ui.layout.onSizeChanged +import androidx.compose.ui.graphics.painter.Painter +import androidx.compose.ui.platform.testTag +import androidx.compose.ui.unit.dp +import com.kingsrook.qqq.frontend.android.mobileapp.ui.authentication.QAuthenticationWrapper +import com.kingsrook.qqq.frontend.android.mobileapp.ui.horseshoe.QTopAppBar +import com.kingsrook.qqq.frontend.android.mobileapp.ui.horseshoe.LeaveProcessDialog +import com.kingsrook.qqq.frontend.android.mobileapp.ui.horseshoe.LocalBusinessNavigationEnabled +import com.kingsrook.qqq.frontend.android.mobileapp.ui.horseshoe.LocalOpenDiagnostics +import com.kingsrook.qqq.frontend.android.mobileapp.ui.LocalProcessInputAllowed +import com.kingsrook.qqq.frontend.android.mobileapp.ui.LocalNavigationBackAction +import androidx.compose.runtime.CompositionLocalProvider +import com.kingsrook.qqq.frontend.android.mobileapp.ui.horseshoe.MenuDialog +import com.kingsrook.qqq.frontend.android.mobileapp.viewmodel.LoadState +import com.kingsrook.qqq.frontend.android.core.model.metadata.QInstance +import com.kingsrook.qqq.frontend.android.core.model.metadata.QAppNodeType +import com.kingsrook.qqq.frontend.android.mobileapp.viewmodel.QViewModel +import com.kingsrook.qqq.frontend.android.mobileapp.viewmodel.TopLevelAppState +import kotlinx.coroutines.delay + +/******************************************************************************* + ** Keep the optional splash transition separate from authentication and business-navigation state. + *******************************************************************************/ +enum class SplashState { + INITIAL, ACTIVE, DONE +} + +/******************************************************************************* + *******************************************************************************/ +@Composable +fun QMobileAppMain(qViewModel: QViewModel, title: String, splashImage: Painter? = null, showNetworkDialog: Boolean = true) { + val splashState = remember { mutableStateOf(if (splashImage == null || qViewModel.didRunSplashAnimation) SplashState.DONE else SplashState.INITIAL) } + val splashFadeOutMillis = remember { mutableIntStateOf(1500) } + val splashDurationMillis = 3000L + val splashSlideInMillis = 2500 + + LaunchedEffect(splashState.value) + { + when (splashState.value) { + SplashState.INITIAL -> { + if (!qViewModel.didRunSplashAnimation) { + qViewModel.didRunSplashAnimation = true; + splashState.value = SplashState.ACTIVE + } + } + + SplashState.ACTIVE -> { + delay(splashDurationMillis) + splashState.value = SplashState.DONE + } + + SplashState.DONE -> { + ////////// + // noop // + ////////// + } + } + } + + if (splashImage != null) { + AnimatedVisibility( + splashState.value == SplashState.ACTIVE, + enter = slideInVertically(animationSpec = tween(splashSlideInMillis, easing = FastOutSlowInEasing), initialOffsetY = { it }), + exit = fadeOut(animationSpec = tween(splashFadeOutMillis.intValue)) + ) + { + Image( + painter = splashImage, + contentDescription = null, // decorative element + modifier = Modifier + .fillMaxSize() + .padding(20.dp) + .indication(indication = null, interactionSource = remember { MutableInteractionSource() }) // try to make no ripple - but not working... + .clickable() + { + splashState.value = SplashState.DONE + splashFadeOutMillis.intValue = 250 + } + ) + } + } + + val scope = rememberCoroutineScope() + val topLevelAppState = remember(qViewModel, scope) { TopLevelAppState(coroutineScope = scope, qViewModel = qViewModel) } + val settingsOpen = remember { mutableStateOf(false) } + val diagnosticsOpen = remember { mutableStateOf(false) } + val accountOpen = remember { mutableStateOf(false) } + val drawerWidth = remember { mutableIntStateOf(0) } + val parentInputAllowed = LocalProcessInputAllowed.current + val openDiagnostics = LocalOpenDiagnostics.current + val businessReady = LocalBusinessNavigationEnabled.current && qViewModel.isAuthenticated && !qViewModel.isLogoutRequested + + /******************************************************************************* + ** Block process input during partial drawer gestures and animations, not only when the drawer is fully open. + *******************************************************************************/ + fun drawerActive(): Boolean { + val drawer = topLevelAppState.navDrawerState + return topLevelAppState.drawerRequested || drawer.isOpen || drawer.targetValue == DrawerValue.Open || + drawer.isAnimationRunning || + // Material's closed anchor is minus the measured width, including partial swipes. + (drawerWidth.intValue > 0 && drawer.currentOffset > -drawerWidth.intValue.toFloat()) + } + + val navigateBack: () -> Unit = { + if (drawerActive()) topLevelAppState.closeNavDrawer() else qViewModel.qNavigator.popStack() + } + LaunchedEffect(qViewModel.isAuthenticated, qViewModel.isLogoutRequested, businessReady) + { + if (!businessReady) topLevelAppState.closeNavDrawer() + if (!qViewModel.isAuthenticated || qViewModel.isLogoutRequested) { + qViewModel.qNavigator.recordWorkBlock = null + qViewModel.qNavigator.blockedNavigationMessage = null + } + if (qViewModel.isLogoutRequested) { + settingsOpen.value = false + diagnosticsOpen.value = false + } + } + + AnimatedVisibility( + splashState.value == SplashState.DONE, + enter = fadeIn(animationSpec = tween(splashFadeOutMillis.intValue)), + exit = ExitTransition.None + ) + { + ModalNavigationDrawer( + drawerState = topLevelAppState.navDrawerState, + drawerContent = { + ModalDrawerSheet(Modifier.onSizeChanged { drawerWidth.intValue = it.width }) { + Column(Modifier.fillMaxSize()) { + Text(title, Modifier.padding(16.dp), style = MaterialTheme.typography.titleMedium) + Column(Modifier.weight(1f).verticalScroll(rememberScrollState())) { + if (businessReady) { + NavigationDrawerItem( + modifier = Modifier.testTag("drawer.home"), label = { Text("All apps") }, + selected = qViewModel.qNavigator.atHome, onClick = { + topLevelAppState.closeNavDrawer(); qViewModel.qNavigator.goHome() + }) + val instance = (qViewModel.qInstanceLoadState as? LoadState.Success<QInstance>)?.value + instance?.appTree?.filter { it.type == QAppNodeType.APP }?.forEach { app -> + NavigationDrawerItem( + modifier = Modifier.testTag("drawer.app:${app.name}"), label = { Text(app.label) }, + selected = qViewModel.qNavigator.currentAppName == app.name, onClick = { + topLevelAppState.closeNavDrawer(); qViewModel.qNavigator.navigateToApp(app.name, app.label) + }) + } + } + } + HorizontalDivider() + Column(Modifier.padding(vertical = 8.dp)) { + NavigationDrawerItem(modifier = Modifier.testTag("drawer.settings"), label = { Text("Settings") }, selected = false, onClick = { + topLevelAppState.closeNavDrawer(); settingsOpen.value = true + }) + NavigationDrawerItem(modifier = Modifier.testTag("drawer.diagnostics"), label = { Text("Diagnostics") }, selected = false, onClick = { + topLevelAppState.closeNavDrawer() + if (openDiagnostics != null) openDiagnostics() else diagnosticsOpen.value = true + }) + } + } + } + }) { + CompositionLocalProvider(LocalNavigationBackAction provides navigateBack) { + Scaffold( + Modifier.fillMaxSize(), + topBar = { + QTopAppBar( + qViewModel, + navMenuCallback = topLevelAppState::openNavDrawer, + defaultTitle = title, + qNavigator = qViewModel.qNavigator, + showNetworkDialog = showNetworkDialog, + accountOpenState = accountOpen + ) + } + ) { innerPadding -> + Column( + Modifier + .padding(innerPadding) + .fillMaxSize() + ) + { + CompositionLocalProvider(LocalProcessInputAllowed provides { + parentInputAllowed() && businessReady && qViewModel.isAuthenticated && !qViewModel.isLogoutRequested && + !drawerActive() && drawerWidth.intValue > 0 && topLevelAppState.navDrawerState.currentOffset.isFinite() && + !settingsOpen.value && !diagnosticsOpen.value && !accountOpen.value && + qViewModel.qNavigator.leaveRequest == null + }) { + QAuthenticationWrapper( + qViewModel, + Modifier + .fillMaxSize(), + qNavigator = qViewModel.qNavigator, + ) + } + } + } + } + } + // Authenticated content can register later; both handlers use the same live priority. + BackHandler(enabled = drawerActive(), onBack = navigateBack) + if (settingsOpen.value) MenuDialog(qViewModel, title, settingsOpen) + if (diagnosticsOpen.value) AlertDialog( + onDismissRequest = { diagnosticsOpen.value = false }, + title = { Text("Diagnostics") }, text = { Text("Server: ${qViewModel.environment.baseUrl}\nApplication version: ${QViewModel.applicationVersion}") }, + confirmButton = { TextButton(onClick = { diagnosticsOpen.value = false }) { Text("Close") } }) + LeaveProcessDialog(qViewModel) + qViewModel.qNavigator.blockedNavigationMessage?.let { message -> + AlertDialog(onDismissRequest = { qViewModel.qNavigator.blockedNavigationMessage = null }, + title = { Text("Photo in progress") }, text = { Text(message) }, + confirmButton = { TextButton(onClick = { qViewModel.qNavigator.blockedNavigationMessage = null }) { Text("Return to photo") } }) + } + } + +} + + diff --git a/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/QMobileApplication.kt b/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/QMobileApplication.kt new file mode 100644 index 0000000..9396411 --- /dev/null +++ b/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/QMobileApplication.kt @@ -0,0 +1,39 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2024-2024. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.kingsrook.qqq.frontend.android.mobileapp + +import android.app.Application +import com.kingsrook.qqq.frontend.android.mobileapp.container.QAppContainer +import com.kingsrook.qqq.frontend.android.mobileapp.container.QDefaultAppContainer + +/******************************************************************************* + *******************************************************************************/ +class QMobileApplication : Application() { + lateinit var container: QAppContainer + + /******************************************************************************* + *******************************************************************************/ + override fun onCreate() { + super.onCreate() + container = QDefaultAppContainer() + } +} diff --git a/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/container/QAppContainer.kt b/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/container/QAppContainer.kt new file mode 100644 index 0000000..1de22e5 --- /dev/null +++ b/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/container/QAppContainer.kt @@ -0,0 +1,38 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2024-2024. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.kingsrook.qqq.frontend.android.mobileapp.container + +import com.kingsrook.qqq.frontend.android.core.controllers.QQQRepository +import com.kingsrook.qqq.frontend.android.core.model.Environment + +/******************************************************************************* + *******************************************************************************/ +interface QAppContainer { + val qqqRepository: QQQRepository + + /******************************************************************************* + ** Share configured application environments explicitly rather than deriving a server from UI state. + *******************************************************************************/ + companion object { + lateinit var availableEnvironments: List<Environment> + } +} diff --git a/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/container/QDefaultAppContainer.kt b/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/container/QDefaultAppContainer.kt new file mode 100644 index 0000000..3774a0c --- /dev/null +++ b/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/container/QDefaultAppContainer.kt @@ -0,0 +1,36 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2024-2024. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.kingsrook.qqq.frontend.android.mobileapp.container + +import com.kingsrook.qqq.frontend.android.core.controllers.NetworkQQQRepository +import com.kingsrook.qqq.frontend.android.core.controllers.QQQRepository +import com.kingsrook.qqq.frontend.android.mobileapp.container.QAppContainer.Companion.availableEnvironments + +/******************************************************************************* + *******************************************************************************/ +class QDefaultAppContainer : QAppContainer { + override val qqqRepository: QQQRepository by lazy() + { + NetworkQQQRepository(availableEnvironments[0].baseUrl) + } + +} diff --git a/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/data/MockPreferencesDataStore.kt b/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/data/MockPreferencesDataStore.kt new file mode 100644 index 0000000..c16f55c --- /dev/null +++ b/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/data/MockPreferencesDataStore.kt @@ -0,0 +1,47 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2024-2024. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.kingsrook.qqq.frontend.android.mobileapp.data + +import androidx.datastore.core.DataStore +import androidx.datastore.preferences.core.Preferences +import androidx.datastore.preferences.core.preferencesOf +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.flowOf + +/******************************************************************************* + *******************************************************************************/ +class MockPreferencesDataStore : DataStore<Preferences> { + var preferences: Preferences = preferencesOf().toMutablePreferences() + + /******************************************************************************* + *******************************************************************************/ + override val data: Flow<Preferences> + get() = flowOf(preferences) + + /******************************************************************************* + *******************************************************************************/ + override suspend fun updateData(transform: suspend (t: Preferences) -> Preferences): Preferences { + preferences = transform.invoke(preferences) + return preferences + } +} + diff --git a/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/data/SettingsRepository.kt b/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/data/SettingsRepository.kt new file mode 100644 index 0000000..8e8bd2b --- /dev/null +++ b/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/data/SettingsRepository.kt @@ -0,0 +1,92 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2024-2024. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.kingsrook.qqq.frontend.android.mobileapp.data + +import androidx.datastore.core.DataStore +import androidx.datastore.preferences.core.Preferences +import androidx.datastore.preferences.core.edit +import androidx.datastore.preferences.core.stringPreferencesKey +import com.kingsrook.qqq.frontend.android.core.model.Environment +import kotlinx.coroutines.flow.first +import kotlinx.serialization.encodeToString +import kotlinx.serialization.json.Json + + +val SESSION_UUID_KEY = stringPreferencesKey("session_uuid") +val SESSION_USER_FULL_NAME_KEY = stringPreferencesKey("session_user_full_name") + +val ENVIRONMENT_JSON_KEY = stringPreferencesKey("environment_json") + +/******************************************************************************* + *******************************************************************************/ +class SettingsRepository( + private val dataStore: DataStore<Preferences>, +) { + + /******************************************************************************* + *******************************************************************************/ + suspend fun getSessionUUID(): String { + return (dataStore.data.first()[SESSION_UUID_KEY] ?: "") + } + + /******************************************************************************* + *******************************************************************************/ + suspend fun setSessionUUID(sessionUUID: String) { + dataStore.edit { preferences -> + preferences[SESSION_UUID_KEY] = sessionUUID + } + } + + /******************************************************************************* + *******************************************************************************/ + suspend fun getSessionUserFullName(): String { + return (dataStore.data.first()[SESSION_USER_FULL_NAME_KEY] ?: "") + } + + /******************************************************************************* + *******************************************************************************/ + suspend fun setSessionUserFullName(value: String) { + dataStore.edit { preferences -> + preferences[SESSION_USER_FULL_NAME_KEY] = value + } + } + + /******************************************************************************* + *******************************************************************************/ + suspend fun getEnvironment(): Environment? { + val environmentJsonString = (dataStore.data.first()[ENVIRONMENT_JSON_KEY] ?: "") + if (environmentJsonString == "") { + return null + } + + return Json.decodeFromString(environmentJsonString) + } + + /******************************************************************************* + *******************************************************************************/ + suspend fun setEnvironment(value: Environment) { + dataStore.edit { preferences -> + preferences[ENVIRONMENT_JSON_KEY] = Json.encodeToString(value) + } + } + +} diff --git a/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/HostExtensions.kt b/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/HostExtensions.kt new file mode 100644 index 0000000..87f2428 --- /dev/null +++ b/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/HostExtensions.kt @@ -0,0 +1,35 @@ +/* Copyright (c) 2026 QRunIO. SPDX-License-Identifier: Apache-2.0 */ +package com.kingsrook.qqq.frontend.android.mobileapp.ui + +import androidx.compose.runtime.Composable +import androidx.compose.runtime.staticCompositionLocalOf +import androidx.compose.runtime.compositionLocalOf +import androidx.compose.ui.Modifier +import com.kingsrook.qqq.frontend.android.mobileapp.ui.widgets.blocks.WidgetBlockParameters +import com.kingsrook.qqq.frontend.android.mobileapp.viewmodel.QViewModel + +/******************************************************************************* + ** Applications can enforce device enrollment before exposing native QQQ content. + *******************************************************************************/ +val LocalAuthenticatedContent = staticCompositionLocalOf<@Composable (QViewModel, @Composable () -> Unit) -> Unit>() +{ + { _, content -> content() } +} + +/******************************************************************************* + ** Unknown widgets can be implemented by a host without forking the standard renderer. + *******************************************************************************/ +val LocalCustomWidgetRenderer = staticCompositionLocalOf<@Composable (WidgetBlockParameters, Modifier, Boolean) -> Boolean>() +{ + { _, _, _ -> false } +} + +/******************************************************************************* + ** Live surface availability for asynchronous input; nested hosts must preserve the parent's gate. + *******************************************************************************/ +val LocalProcessInputAllowed = compositionLocalOf<() -> Boolean> { { true } } + +/******************************************************************************* + ** Host surface priority shared by toolbar and system Back, independent of callback registration order. + *******************************************************************************/ +internal val LocalNavigationBackAction = compositionLocalOf<(() -> Unit)?> { null } diff --git a/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/QNavigator.kt b/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/QNavigator.kt new file mode 100644 index 0000000..7f4b597 --- /dev/null +++ b/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/QNavigator.kt @@ -0,0 +1,286 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2004-2024. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package com.kingsrook.qqq.frontend.android.mobileapp.ui + +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.setValue +import androidx.lifecycle.ViewModel +import androidx.navigation.NavHostController +import androidx.navigation.NavController +import androidx.navigation.NavDestination.Companion.hasRoute +import androidx.navigation.toRoute +import com.kingsrook.qqq.frontend.android.core.model.metadata.QInstance +import com.kingsrook.qqq.frontend.android.mobileapp.ui.horseshoe.AppRoute +import com.kingsrook.qqq.frontend.android.mobileapp.ui.horseshoe.HomeRoute +import com.kingsrook.qqq.frontend.android.mobileapp.ui.horseshoe.ProcessRoute +import com.kingsrook.qqq.frontend.android.mobileapp.ui.horseshoe.TableRoute +import com.kingsrook.qqq.frontend.android.mobileapp.ui.horseshoe.RecordRoute +import com.kingsrook.qqq.frontend.android.mobileapp.viewmodel.LoadState +import com.kingsrook.qqq.frontend.android.mobileapp.viewmodel.ProcessViewModel +import com.kingsrook.qqq.frontend.android.mobileapp.viewmodel.QViewModel + +/******************************************************************************* + *******************************************************************************/ +class QNavigator(initialController: NavHostController?, val qViewModel: QViewModel) : ViewModel() { + var navDepth: Int by mutableStateOf(0) + private set + + var atHome: Boolean by mutableStateOf(true) + private set + + var titleStack: List<String?> by mutableStateOf(mutableListOf()) + private set + + var navigationRevision: Long by mutableStateOf(0L) + private set + var currentAppName: String? by mutableStateOf(null) + private set + + /******************************************************************************* + ** A destination is applied only after the current process confirms cancellation. + *******************************************************************************/ + class LeaveRequest(val title: String, val confirmLabel: String, val action: () -> Unit) + + var leaveRequest: LeaveRequest? by mutableStateOf(null) + private set + + var recordWorkBlock: String? by mutableStateOf(null) + var blockedNavigationMessage: String? by mutableStateOf(null) + + /******************************************************************************* + ** Dismiss confirmation only while cancellation is idle, preserving the in-flight process ownership decision. + *******************************************************************************/ + fun dismissLeave() { + if (qViewModel.activeProcessViewModel?.cancelling != true) leaveRequest = null + } + + /******************************************************************************* + ** Apply the same guarded process-exit policy before every destination or sign-out action. + *******************************************************************************/ + fun requestLeave(title: String, confirmLabel: String = "Leave process", alwaysConfirm: Boolean = false, action: () -> Unit) { + recordWorkBlock?.let { blockedNavigationMessage = it; return } + if (leaveRequest != null || qViewModel.logoutInProgress) return + val process = qViewModel.activeProcessViewModel + if (alwaysConfirm || process != null && !process.getNoMoreSteps()) + leaveRequest = LeaveRequest(title, confirmLabel, action) + else finishLeave(action) + } + + /******************************************************************************* + ** Honor the pending destination only after current client work permits process cancellation. + *******************************************************************************/ + fun confirmLeave() { + val request = leaveRequest ?: return + val process = qViewModel.activeProcessViewModel + if (process?.navigationBlockReason() != null || process?.cancelling == true) return + finishLeave(request.action) + } + + /******************************************************************************* + ** A second explicit choice after failed cancellation; this does not claim the server stopped. + *******************************************************************************/ + fun leaveAnyway() { + val request = leaveRequest ?: return + val process = qViewModel.activeProcessViewModel ?: return + if (!process.cancellationFailed || process.cancelling || process.navigationBlockReason() != null) return + process.reset() + qViewModel.activeProcessViewModel = null + leaveRequest = null + request.action() + } + + /******************************************************************************* + ** Wait for process cancellation before applying the destination and dropping its active ViewModel. + *******************************************************************************/ + private fun finishLeave(action: () -> Unit) { + val process = qViewModel.activeProcessViewModel + if (process != null && !process.getNoMoreSteps()) { + process.closeProcessCallback = { + qViewModel.activeProcessViewModel = null + leaveRequest = null + action() + } + process.cancel() + } else { + qViewModel.activeProcessViewModel = null + leaveRequest = null + action() + } + } + + /******************************************************************************* + ** Route sign-out through explicit process-exit confirmation so pending work is not silently abandoned. + *******************************************************************************/ + fun requestSignOut() = requestLeave("Sign out?", "Sign out", alwaysConfirm = true) { qViewModel.requestLogout() } + + /******************************************************************************* + ** The same guarded leave/cancel policy applies to explicitly enabled provider sign-out. + *******************************************************************************/ + fun requestCompanySignOut(binding: com.kingsrook.qqq.frontend.android.mobileapp.ui.authentication.OAuth2LogoutBinding) = + requestLeave("Sign out of company?", "Sign out of company", alwaysConfirm = true) { qViewModel.requestCompanyLogout(binding) } + + private val destinationListener = NavController.OnDestinationChangedListener { controller, _, _ -> reconcile(controller) } + var navController: NavHostController? = null + set(value) { + if (field === value) return + field?.removeOnDestinationChangedListener(destinationListener) + field = value + value?.addOnDestinationChangedListener(destinationListener) + if (value?.currentBackStackEntry == null) clearDestination() + } + + init { + navController = initialController + } + + /******************************************************************************* + ** NavController is authoritative, including Android Back and restored controller state. + *******************************************************************************/ + private fun reconcile(controller: NavController) { + val entry = controller.currentBackStackEntry ?: return clearDestination() + val instance = (qViewModel.qInstanceLoadState as? LoadState.Success<QInstance>)?.value + val processName = if (entry.destination.hasRoute<ProcessRoute>()) entry.toRoute<ProcessRoute>().name else null + val appName = if (entry.destination.hasRoute<AppRoute>()) entry.toRoute<AppRoute>().name else + if (entry.destination.hasRoute<ProcessRoute>()) entry.toRoute<ProcessRoute>().appName else + if (entry.destination.hasRoute<TableRoute>()) entry.toRoute<TableRoute>().appName else + if (entry.destination.hasRoute<RecordRoute>()) entry.toRoute<RecordRoute>().appName else null + atHome = entry.destination.hasRoute<HomeRoute>() + navDepth = if (atHome) 0 else 1 + currentAppName = if (atHome) null else appName + val label = entry.savedStateHandle.get<String>("qqqTitle") ?: processName?.let { instance?.processes?.get(it)?.label ?: it } + ?: appName?.let { instance?.apps?.get(it)?.label ?: it } + titleStack = if (atHome) emptyList() else listOf(label) + navigationRevision++ + qViewModel.topBarStatusText = null + qViewModel.activeProcessViewModel?.let { process -> + if (process.processName != processName) { + process.reset() + qViewModel.activeProcessViewModel = null + } + } + } + + /******************************************************************************* + ** Reset the derived navigation summary when the controller has no authoritative destination. + *******************************************************************************/ + private fun clearDestination() { + atHome = true + navDepth = 0 + titleStack = emptyList() + currentAppName = null + navigationRevision++ + } + + /******************************************************************************* + *******************************************************************************/ + fun navigateToApp(name: String, label: String) { + if (currentAppName == name && navController?.currentDestination?.hasRoute<AppRoute>() == true) return + requestLeave("Switch app?") { + homeNow() + navigateToRoute(AppRoute(name), label) + } + } + + /******************************************************************************* + ** Records use ordinary navigation, preserving any active work before leaving. + *******************************************************************************/ + fun navigateToTable(name: String, label: String) = requestLeave("Open table?") { + navigateToRoute(TableRoute(name, currentAppName), label) + } + + fun navigateToRecord(table: String, id: String, hasParent: Boolean = false) = requestLeave("Open record?") { + // Navigation titles feed session activity. Never place record values in telemetry. + navigateToRoute(RecordRoute(table, id, currentAppName, hasParent), "Record") + } + + /******************************************************************************* + ** As part of preserving the process view-model in case of activity restarts + ** (e.g., when screen orientation changes) - manage the lifecycle of the + ** active process view model in here - activating a new one when navigating. + *******************************************************************************/ + fun navigateToProcess(name: String, label: String, processViewModel: ProcessViewModel) { + if (qViewModel.activeProcessViewModel != null || leaveRequest != null) return + processViewModel.reset() + processViewModel.qqqRepository = qViewModel.qqqRepository + processViewModel.qInstance = (qViewModel.qInstanceLoadState as LoadState.Success<QInstance>).value + processViewModel.processName = name + processViewModel.qViewModel = qViewModel + processViewModel.supportedCustomWidgetTypes = qViewModel.supportedCustomWidgetTypes + + processViewModel.closeProcessCallback = + { + qViewModel.activeProcessViewModel = null + navController?.popBackStack() + } + + processViewModel.doInit() + + qViewModel.activeProcessViewModel = processViewModel + + navigateToRoute(ProcessRoute(name, currentAppName), label) + } + + /******************************************************************************* + *******************************************************************************/ + private fun navigateToRoute(route: Any, label: String) { + navController?.let { controller -> + controller.navigate(route) + controller.currentBackStackEntry?.savedStateHandle?.set("qqqTitle", label) + reconcile(controller) + } + } + + /******************************************************************************* + *******************************************************************************/ + fun popStack() { + if (atHome) return + val title = titleStack.lastOrNull() ?: "process" + requestLeave("Leave $title?") { navController?.popBackStack() } + } + + /******************************************************************************* + *******************************************************************************/ + fun goHome(cancelActiveProcess: Boolean = true) { + if (!cancelActiveProcess) { + leaveRequest = null + qViewModel.activeProcessViewModel?.reset() + qViewModel.activeProcessViewModel = null + homeNow() + return + } + requestLeave("Return to Apps?") { homeNow() } + } + + /******************************************************************************* + ** Navigate home through the existing controller while resetting derived destination state consistently. + *******************************************************************************/ + private fun homeNow() { + navController?.let { controller -> + if (!controller.popBackStack<HomeRoute>(inclusive = false) && !atHome) { + controller.navigate(HomeRoute) { popUpTo(controller.graph.id) { inclusive = true } } + } + } + } + +} diff --git a/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/apps/QAppHome.kt b/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/apps/QAppHome.kt new file mode 100644 index 0000000..810af9b --- /dev/null +++ b/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/apps/QAppHome.kt @@ -0,0 +1,40 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2004-2024. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package com.kingsrook.qqq.frontend.android.mobileapp.ui.apps + +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import com.kingsrook.qqq.frontend.android.core.model.metadata.QAppMetaData +import com.kingsrook.qqq.frontend.android.core.model.metadata.QInstance +import com.kingsrook.qqq.frontend.android.mobileapp.ui.QNavigator + +/******************************************************************************* + ** screen that renders an app (e.g., a QQQAppMetaData) + *******************************************************************************/ +@Composable +fun QAppHome(qInstance: QInstance, modifier: Modifier = Modifier, app: QAppMetaData? = null, qNavigator: QNavigator? = null) { + /////////////////////////////////////////////////////////////////////// + // idk, in case we do other layouts in the future, simple layer here // + /////////////////////////////////////////////////////////////////////// + QAppHomeGridLayout(qInstance, modifier, app, qNavigator) +} diff --git a/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/apps/QAppHomeGridLayout.kt b/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/apps/QAppHomeGridLayout.kt new file mode 100644 index 0000000..efab0c1 --- /dev/null +++ b/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/apps/QAppHomeGridLayout.kt @@ -0,0 +1,291 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2004-2024. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package com.kingsrook.qqq.frontend.android.mobileapp.ui.apps + +import androidx.compose.foundation.background +import androidx.compose.foundation.border +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.ExperimentalLayoutApi +import androidx.compose.foundation.layout.FlowRow +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.width +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Info +import androidx.compose.material3.AlertDialog +import androidx.compose.material3.Icon +import androidx.compose.material3.Text +import androidx.compose.material3.TextButton +import androidx.compose.runtime.Composable +import androidx.compose.runtime.MutableState +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.platform.testTag +import androidx.compose.ui.text.font.FontStyle +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.text.style.TextOverflow +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import androidx.lifecycle.viewmodel.compose.viewModel +import com.kingsrook.qqq.frontend.android.core.model.metadata.QAppMetaData +import com.kingsrook.qqq.frontend.android.core.model.metadata.QAppNodeType +import com.kingsrook.qqq.frontend.android.core.model.metadata.QIcon +import com.kingsrook.qqq.frontend.android.core.model.metadata.QInstance +import com.kingsrook.qqq.frontend.android.mobileapp.R +import com.kingsrook.qqq.frontend.android.mobileapp.ui.QNavigator +import com.kingsrook.qqq.frontend.android.mobileapp.ui.utils.DynamicIcon +import com.kingsrook.qqq.frontend.android.mobileapp.viewmodel.ProcessViewModel + +/******************************************************************************* + ** Standard screen for an app - shows icons in a grid. + *******************************************************************************/ +@OptIn(ExperimentalLayoutApi::class) // for FlowRow +@Composable +fun QAppHomeGridLayout(qInstance: QInstance, modifier: Modifier = Modifier, app: QAppMetaData? = null, qNavigator: QNavigator? = null) { + val childList = app?.let { app.children } ?: qInstance.appTree + val widgetList = app?.let { app.widgets } ?: emptyList() + + val childApps = childList.filter { child -> child.type == QAppNodeType.APP } + val sectionNames = app?.sections.orEmpty().flatMap { it.tables.orEmpty() + it.processes.orEmpty() + it.reports.orEmpty() }.toSet() + val otherChildren = childList.filter { it.type != QAppNodeType.APP && it.name !in sectionNames } + + val isNotYetImplementedDialogOpen = remember { mutableStateOf(false) } + val notYetImplementedDialogTitle = remember { mutableStateOf("") } + val notYetImplementedDialogBody = remember { mutableStateOf("") } + + val generalSize = 100 + + LazyColumn(modifier.fillMaxWidth().padding(top = 8.dp)) + { + /////////////////////////////////////////////////////////////////////////////////////////////////// + // at this point in time, we're doing the title in the topBar, so, redundant to be on-screen too // + /////////////////////////////////////////////////////////////////////////////////////////////////// + /* + item() + { + Text( + title, + fontSize = 24.sp, + fontWeight = FontWeight.SemiBold, + modifier = Modifier + .padding(8.dp) + .testTag("appHome.appLabel") + ) + } + */ + + if (widgetList.isNotEmpty()) { + item { Text("This app includes home widgets unavailable in this client.", Modifier.padding(8.dp)) } + } + if (childList.isEmpty() && app?.sections?.isEmpty() != false && widgetList.isEmpty()) { + item() + { + Text( + if (app == null) "No apps are available for this account." else "You do not have access to anything in this app.", + fontSize = 16.sp, + fontStyle = FontStyle.Italic, + modifier = Modifier + .padding(8.dp) + .testTag("appHome.noAccess") + ) + if (app == null) TextButton(onClick = { qNavigator?.qViewModel?.loadQInstance() }) { Text("Retry loading apps") } + } + } + + item() + { + FlowRow(modifier = Modifier.fillMaxWidth()) + { + /////////////////////////// + // first show child-apps // + /////////////////////////// + for (childApp in childApps) { + Tile(childApp.label, childApp.icon, generalSize, "appHome.rowForApp:" + childApp.name) + { + qNavigator?.navigateToApp(childApp.name, childApp.label) + } + } + for (child in otherChildren) { + val processViewModel: ProcessViewModel = viewModel(factory = ProcessViewModel.factory) + Tile(child.label, child.icon, generalSize, "appHome.rowFor${child.type.name.lowercase().replaceFirstChar { it.uppercase() }}:" + child.name) + { + if (child.type == QAppNodeType.PROCESS) qNavigator?.navigateToProcess(child.name, child.label, processViewModel) + else if (child.type == QAppNodeType.TABLE) qNavigator?.navigateToTable(child.name, child.label) + else { + notYetImplementedDialogTitle.value = child.label + notYetImplementedDialogBody.value = "This type of screen is unavailable in this client." + isNotYetImplementedDialogOpen.value = true + } + } + } + } + } + + //////////////////////////////////////////////////// + // app sections (with tables, processes, reports) // + //////////////////////////////////////////////////// + app?.sections?.forEach() + { section -> + if (section.hasContent()) { + item() + { + FlowRow(Modifier.fillMaxWidth()) + { + section.apps.orEmpty().forEach { name -> + qInstance.apps?.get(name)?.let { child -> + Tile(child.label, child.icon, generalSize, "appHome.sectionApp:" + name) { qNavigator?.navigateToApp(name, child.label) } + } + } + section.reports.orEmpty().forEach { name -> + val label = childList.firstOrNull { it.name == name && it.type == QAppNodeType.REPORT }?.label ?: "Report" + Text("$label: Reports are unavailable in this client.", Modifier.padding(8.dp)) + } + } + } + item() + { + Text( + section.label, fontWeight = FontWeight.Bold, fontSize = 20.sp, modifier = Modifier + .padding(horizontal = 8.dp, vertical = 4.dp) + ) + } + + //////////// + // tables // + //////////// + item() + { + FlowRow(modifier = Modifier.fillMaxWidth()) + { + section.tables?.forEach() + { tableName -> + val table = qInstance.tables?.get(tableName) + table?.let() + { + Tile(table.label, table.icon, generalSize, "appHome.rowForTable:" + tableName) + { + qNavigator?.navigateToTable(table.name, table.label) + } + } + } + } + } + + /////////////// + // processes // + /////////////// + item() + { + FlowRow(modifier = Modifier.fillMaxWidth()) + { + section.processes?.forEach() + { processName -> + val process = qInstance.processes?.get(processName) + process?.let() + { + val processViewModel: ProcessViewModel = viewModel(factory = ProcessViewModel.factory) + Tile(process.label, process.icon, generalSize, "appHome.rowForProcess:" + processName) + { + qNavigator?.navigateToProcess(process.name, process.label, processViewModel) + } + } + } + } + } + } + } + } + + if (isNotYetImplementedDialogOpen.value) { + NotYetImplementedDialog(notYetImplementedDialogTitle.value, notYetImplementedDialogBody.value, isNotYetImplementedDialogOpen) + } + +} + +/******************************************************************************* + *******************************************************************************/ +@Composable +private fun Tile(label: String, icon: QIcon?, generalSize: Int, testTag: String, onClick: () -> Unit) { + Column( + modifier = Modifier + .padding(8.dp) + .width(generalSize.dp) + .testTag(testTag) + .clickable { onClick() } + ) + { + Box( + modifier = Modifier + .fillMaxWidth() + .width((generalSize - 12).dp) + .height(generalSize.dp) + .align(Alignment.CenterHorizontally) + ) + { + Box( + Modifier + .background(Color(0xFe, 0xFe, 0xFe), RoundedCornerShape(16.dp)) + .border(2.dp, Color(0xf0, 0xf0, 0xf0), RoundedCornerShape(16.dp)) + .padding(12.dp) + ) + { + DynamicIcon(icon, R.drawable.apps, Modifier.fillMaxSize()) + } + } + Text( + label, + softWrap = true, + fontSize = 12.sp, + lineHeight = 18.sp, + textAlign = TextAlign.Center, + maxLines = 3, + overflow = TextOverflow.Ellipsis, + modifier = Modifier.fillMaxWidth() + ) + } +} + + +/******************************************************************************* + *******************************************************************************/ +@Composable +fun NotYetImplementedDialog(title: String, body: String, isOpen: MutableState<Boolean>) { + AlertDialog( + icon = { Icon(imageVector = Icons.Default.Info, contentDescription = "Info") }, + title = { Text(title) }, + text = { Text(body) }, + onDismissRequest = { isOpen.value = false }, + dismissButton = { TextButton(onClick = { isOpen.value = false }) { Text("Dismiss") } }, + confirmButton = { } + ) +} diff --git a/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/authentication/Auth0Browser.kt b/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/authentication/Auth0Browser.kt new file mode 100644 index 0000000..0f895fe --- /dev/null +++ b/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/authentication/Auth0Browser.kt @@ -0,0 +1,43 @@ +/* Copyright (c) 2026 QRunIO. SPDX-License-Identifier: Apache-2.0 */ +package com.kingsrook.qqq.frontend.android.mobileapp.ui.authentication + +import android.content.Context +import androidx.compose.runtime.staticCompositionLocalOf +import com.auth0.android.Auth0 +import com.auth0.android.authentication.AuthenticationException +import com.auth0.android.callback.Callback +import com.auth0.android.provider.WebAuthProvider +import com.auth0.android.result.Credentials + +/******************************************************************************* + ** Platform boundary: production always uses Auth0's external browser implementation. + *******************************************************************************/ +interface Auth0Browser { + /******************************************************************************* + ** Launch the configured provider through the platform browser boundary and return its result to the owning attempt. + *******************************************************************************/ + fun login(context: Context, account: Auth0, audience: String, scheme: String, callback: Callback<Credentials, AuthenticationException>) + + /******************************************************************************* + ** Request provider sign-out through the platform browser boundary without recreating a QQQ session. + *******************************************************************************/ + fun logout(context: Context, account: Auth0, scheme: String, callback: Callback<Void?, AuthenticationException>) +} + +val LocalAuth0Browser = staticCompositionLocalOf<Auth0Browser> { + object : Auth0Browser { + /******************************************************************************* + ** Launch the configured provider through the platform browser boundary and return its result to the owning attempt. + *******************************************************************************/ + override fun login(context: Context, account: Auth0, audience: String, scheme: String, callback: Callback<Credentials, AuthenticationException>) { + WebAuthProvider.login(account).withAudience(audience).withScheme(scheme).start(context, callback) + } + + /******************************************************************************* + ** Request provider sign-out through the platform browser boundary without recreating a QQQ session. + *******************************************************************************/ + override fun logout(context: Context, account: Auth0, scheme: String, callback: Callback<Void?, AuthenticationException>) { + WebAuthProvider.logout(account).withScheme(scheme).start(context, callback) + } + } +} diff --git a/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/authentication/OAuth2LoginAttempt.kt b/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/authentication/OAuth2LoginAttempt.kt new file mode 100644 index 0000000..f2e78b8 --- /dev/null +++ b/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/authentication/OAuth2LoginAttempt.kt @@ -0,0 +1,122 @@ +/* Copyright (c) 2026 QRunIO. SPDX-License-Identifier: Apache-2.0 */ +package com.kingsrook.qqq.frontend.android.mobileapp.ui.authentication + +import java.net.URI +import com.kingsrook.qqq.frontend.android.core.model.metadata.authentication.OAuth2AuthenticationMetaData +import com.kingsrook.qqq.frontend.android.core.model.metadata.authentication.isValidExpectedNonce + +/******************************************************************************* + ** Expose one native login lifecycle so recreation cannot launch competing browser exchanges. + *******************************************************************************/ +enum class OAuth2LoginPhase { READY, PREPARING, BROWSER, EXCHANGING } + +/******************************************************************************* + ** Identity of one server-advertised login configuration, never inferred from a provider brand. + *******************************************************************************/ +data class OAuth2LoginBinding( + val server: String, + val providerName: String, + val issuer: String, + val discoveryUrl: String, + val clientId: String, + val scopes: String, + val redirectUri: String, + val prompt: String, + val nonceValidation: String = "" +) + +/******************************************************************************* + ** Only an explicit compatible semantic grant enables sign-in; a bearer client is never a fallback. + *******************************************************************************/ +fun oauth2LoginBinding(metadata: OAuth2AuthenticationMetaData, server: String, packageName: String): OAuth2LoginBinding? { + val grant = metadata.values.nativeSessionLogin ?: return null + val redirect = oauth2RedirectUri(packageName) + if (grant.flow != OAuth2AuthenticationMetaData.SESSION_FLOW || grant.codeChallengeMethod != "S256" || grant.prompt != "login" || + grant.nonceValidation != "REQUIRED" || + redirect !in grant.redirectUris || !isOAuth2HttpsUrl(server) || !isOAuth2HttpsUrl(grant.issuer) || + !isOAuth2HttpsUrl(grant.discoveryUrl) || metadata.values.clientId.isBlank() || + "openid" !in metadata.values.scopes.split(' ') + ) return null + return OAuth2LoginBinding( + server, metadata.name, grant.issuer, grant.discoveryUrl, metadata.values.clientId, + metadata.values.scopes, redirect, grant.prompt, grant.nonceValidation + ) +} + +/******************************************************************************* + ** One in-memory browser attempt. Activity recreation retains it; process death requires a new login. + *******************************************************************************/ +class OAuth2LoginAttempt(private val nowMillis: () -> Long = { System.nanoTime() / 1_000_000 }) { + /******************************************************************************* + ** Keep the original state, nonce, verifier and provider binding only for the lifetime of one login attempt. + *******************************************************************************/ + private class Pending( + val binding: OAuth2LoginBinding, val state: String, val nonce: String, + val verifier: String, val startedAt: Long + ) + + private var pending: Pending? = null + + /******************************************************************************* + ** Bind fresh state, nonce and PKCE verifier to the advertised configuration before opening the browser. + *******************************************************************************/ + fun begin(binding: OAuth2LoginBinding, state: String, nonce: String, verifier: String) { + require(state.length >= 16 && isValidExpectedNonce(nonce) && binding.nonceValidation == "REQUIRED") + require(Regex("[A-Za-z0-9._~-]{43,128}").matches(verifier)) + check(pending == null) + pending = Pending(binding, state, nonce, verifier, nowMillis()) + } + + /******************************************************************************* + ** Consume even rejected callbacks so a stale or failed attempt cannot later establish a session. + *******************************************************************************/ + fun consume( + binding: OAuth2LoginBinding, state: String?, requestState: String?, requestNonce: String?, + requestClientId: String, requestRedirectUri: String, requestPrompt: String?, code: String? + ): Exchange? { + val attempt = pending ?: return null + pending = null + val age = nowMillis() - attempt.startedAt + if (age !in 0..300_000 || binding != attempt.binding || state != attempt.state || requestState != attempt.state || + requestNonce != attempt.nonce || requestClientId != binding.clientId || requestRedirectUri != binding.redirectUri || + requestPrompt != binding.prompt || code.isNullOrBlank() + ) return null + return Exchange(code, attempt.verifier, attempt.binding.redirectUri, attempt.nonce) + } + + /******************************************************************************* + ** Drop the pending exchange material so an abandoned callback cannot later establish identity. + *******************************************************************************/ + fun cancel() { + pending = null + } + + /******************************************************************************* + ** Not a data class: credentials must not appear in an automatically generated toString(). + *******************************************************************************/ + class Exchange(val code: String, val verifier: String, val redirectUri: String, val expectedNonce: String) +} + +/******************************************************************************* + ** Fixed package identity is the callback transport; the server must explicitly advertise this exact URI. + *******************************************************************************/ +fun oauth2RedirectUri(packageName: String): String = "$packageName.oauth://callback/oauth2redirect" + +/******************************************************************************* + ** Match only this application's exact callback authority/path and reject opaque or fragment-bearing results. + *******************************************************************************/ +fun isOAuth2Callback(uri: String, packageName: String): Boolean = runCatching { + val actual = URI(uri) + val expected = URI(oauth2RedirectUri(packageName)) + actual.scheme == expected.scheme && actual.rawAuthority == expected.rawAuthority && actual.rawPath == expected.rawPath && + actual.rawFragment == null && !actual.isOpaque +}.getOrDefault(false) + +/******************************************************************************* + ** Reject credentials, query strings and fragments in configured issuer/server URLs. + *******************************************************************************/ +fun isOAuth2HttpsUrl(value: String): Boolean = runCatching { + val uri = URI(value) + uri.scheme == "https" && !uri.host.isNullOrBlank() && uri.rawUserInfo == null && uri.rawQuery == null && + uri.rawFragment == null && uri.port in -1..65535 && uri.port != 0 && !uri.isOpaque +}.getOrDefault(false) diff --git a/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/authentication/OAuth2LogoutAttempt.kt b/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/authentication/OAuth2LogoutAttempt.kt new file mode 100644 index 0000000..9cb5d95 --- /dev/null +++ b/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/authentication/OAuth2LogoutAttempt.kt @@ -0,0 +1,79 @@ +/* Copyright (c) 2026 QRunIO. SPDX-License-Identifier: Apache-2.0 */ +package com.kingsrook.qqq.frontend.android.mobileapp.ui.authentication + +import com.kingsrook.qqq.frontend.android.core.model.metadata.authentication.NativeLogoutData +import com.kingsrook.qqq.frontend.android.core.model.metadata.authentication.OAuth2AuthenticationMetaData + +/******************************************************************************* + ** Track optional company sign-out independently from ordinary local session invalidation. + *******************************************************************************/ +enum class OAuth2LogoutPhase { IDLE, PREPARING, BROWSER, FINISHED } + +/******************************************************************************* + ** Contains public configuration only; login registration alone never authorizes a logout callback. + *******************************************************************************/ +data class OAuth2LogoutBinding(val login: OAuth2LoginBinding, val postLogoutRedirectUri: String) + +/******************************************************************************* + ** An optional explicit capability, independent of the host's choice of when to invoke it. + *******************************************************************************/ +fun oauth2LogoutBinding(metadata: OAuth2AuthenticationMetaData, server: String, packageName: String): OAuth2LogoutBinding? { + val login = oauth2LoginBinding(metadata, server, packageName) ?: return null + val logout = metadata.values.nativeSessionLogout ?: return null + if (logout.flow != OAuth2AuthenticationMetaData.LOGOUT_FLOW || login.redirectUri !in logout.postLogoutRedirectUris) return null + return OAuth2LogoutBinding(login, login.redirectUri) +} + +/******************************************************************************* + ** Compare the server response to independent discovery and the originally selected server/provider. + *******************************************************************************/ +fun validOAuth2LogoutData( + data: NativeLogoutData, binding: OAuth2LogoutBinding, + discoveryIssuer: String?, discoveryEndSessionEndpoint: String? +): Boolean = + data.issuer == binding.login.issuer && discoveryIssuer == binding.login.issuer && + data.endSessionEndpoint == discoveryEndSessionEndpoint && isOAuth2HttpsUrl(data.endSessionEndpoint) && + data.postLogoutRedirectUri == binding.postLogoutRedirectUri && data.idTokenHint.isNotBlank() && + data.idTokenHint.length <= 32768 && data.idTokenHint.none { it.isWhitespace() || it.isISOControl() } + +/******************************************************************************* + ** Single-use state-only completion. No token or provider hint is retained here or in saved state. + *******************************************************************************/ +class OAuth2LogoutAttempt(private val nowMillis: () -> Long = { System.nanoTime() / 1_000_000 }) { + /******************************************************************************* + ** Retain only public binding and single-use state for the current end-session response. + *******************************************************************************/ + private class Pending(val binding: OAuth2LogoutBinding, val endpoint: String, val state: String, val startedAt: Long) + + private var pending: Pending? = null + + /******************************************************************************* + ** Bind a fresh state to the chosen HTTPS end-session endpoint before starting company sign-out. + *******************************************************************************/ + fun begin(binding: OAuth2LogoutBinding, endpoint: String, state: String) { + require(state.length >= 16 && isOAuth2HttpsUrl(endpoint)) + check(pending == null) + pending = Pending(binding, endpoint, state, nowMillis()) + } + + /******************************************************************************* + ** A rejected response consumes the attempt too; a duplicate can never change the outcome. + *******************************************************************************/ + fun consume( + binding: OAuth2LogoutBinding, state: String?, requestState: String?, + requestEndpoint: String?, requestRedirect: String? + ): Boolean { + val current = pending ?: return false + pending = null + return nowMillis() - current.startedAt in 0..300_000 && binding == current.binding && + state == current.state && requestState == current.state && requestEndpoint == current.endpoint && + requestRedirect == current.binding.postLogoutRedirectUri + } + + /******************************************************************************* + ** Consume pending company sign-out state without claiming the provider completed logout. + *******************************************************************************/ + fun cancel() { + pending = null + } +} diff --git a/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/authentication/OAuth2RedirectActivity.kt b/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/authentication/OAuth2RedirectActivity.kt new file mode 100644 index 0000000..d44b96a --- /dev/null +++ b/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/authentication/OAuth2RedirectActivity.kt @@ -0,0 +1,28 @@ +/* Copyright (c) 2026 QRunIO. SPDX-License-Identifier: Apache-2.0 */ +package com.kingsrook.qqq.frontend.android.mobileapp.ui.authentication + +import android.app.Activity +import android.content.Intent +import android.os.Bundle +import net.openid.appauth.AuthorizationManagementActivity + +/******************************************************************************* + ** Validate explicit intents too: Android intent filters alone do not protect an exported callback. + *******************************************************************************/ +class OAuth2RedirectActivity : Activity() { + /******************************************************************************* + ** Deliver only the expected native callback transport to AppAuth, then finish this transient activity. + *******************************************************************************/ + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + val callback = intent.data + if (intent.action == Intent.ACTION_VIEW && callback != null && isOAuth2Callback(callback.toString(), packageName) && + listOf("state", "code", "error").all { callback.getQueryParameters(it).size <= 1 } && + callback.getQueryParameter("state")?.isNotBlank() == true && + (callback.getQueryParameter("code") == null || callback.getQueryParameter("error") == null) + ) { + startActivity(AuthorizationManagementActivity.createResponseHandlingIntent(this, callback)) + } + finish() + } +} diff --git a/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/authentication/QAuth0Login.kt b/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/authentication/QAuth0Login.kt new file mode 100644 index 0000000..756ea6e --- /dev/null +++ b/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/authentication/QAuth0Login.kt @@ -0,0 +1,102 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2004-2024. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package com.kingsrook.qqq.frontend.android.mobileapp.ui.authentication + +import androidx.compose.material3.Button +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.setValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.runtime.DisposableEffect +import androidx.compose.runtime.mutableIntStateOf +import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalContext +import com.auth0.android.authentication.AuthenticationException +import com.auth0.android.callback.Callback +import com.auth0.android.result.Credentials +import com.kingsrook.qqq.frontend.android.core.model.metadata.authentication.Auth0AuthenticationMetaData +import com.kingsrook.qqq.frontend.android.mobileapp.ui.common.FullScreenLoading +import com.kingsrook.qqq.frontend.android.mobileapp.ui.common.FullSizedAllCenteredColumn +import com.kingsrook.qqq.frontend.android.mobileapp.viewmodel.LoadState +import com.kingsrook.qqq.frontend.android.mobileapp.viewmodel.QViewModel +import kotlinx.coroutines.launch + +/******************************************************************************* + ** Bind the provider browser result to the current server/login attempt before exchanging it for QQQ identity. + *******************************************************************************/ +@Composable +fun QAuth0Login(qViewModel: QViewModel, modifier: Modifier = Modifier) { + val metadata = (qViewModel.authenticationMetaDataLoadState as? LoadState.Success)?.value as? Auth0AuthenticationMetaData ?: return + val context = LocalContext.current + val launcher = LocalAuth0Browser.current + val scope = rememberCoroutineScope() + var retry by remember { mutableIntStateOf(0) } + var failed by remember { mutableStateOf(false) } + var exchanging by remember { mutableStateOf(false) } + DisposableEffect(qViewModel, qViewModel.environment.baseUrl, metadata, retry) + { + val attempt = qViewModel.prepareAuthentication() + if (attempt != null) { + val callback = object : Callback<Credentials, AuthenticationException> { + /******************************************************************************* + ** Cancel only the owning attempt and display a safe failure without exposing provider exception text. + *******************************************************************************/ + override fun onFailure(error: AuthenticationException) { + scope.launch { + if (qViewModel.isCurrentAuthentication(attempt)) { + qViewModel.cancelAuthentication(attempt) + failed = true + } + } + } + + /******************************************************************************* + ** Accept browser credentials only through the original current authentication attempt. + *******************************************************************************/ + override fun onSuccess(result: Credentials) { + scope.launch { + if (qViewModel.isCurrentAuthentication(attempt)) { + exchanging = true + qViewModel.completeAuth0Login(attempt, result.accessToken, result.user.nickname ?: "Unknown") + } + } + } + } + try { + launcher.login(context, QAuth0Service.makeAuth0Instance(qViewModel), metadata.values.audience, QAuth0Service.scheme, callback) + } catch (exception: Exception) { + qViewModel.cancelAuthentication(attempt); failed = true + } + } + onDispose { if (attempt != null) qViewModel.cancelAuthentication(attempt) } + } + if (failed || (exchanging && qViewModel.manageSessionLoadState is LoadState.Error)) { + FullSizedAllCenteredColumn(modifier) { + Text("Sign-in failed. Please try again.") + Button(onClick = { failed = false; exchanging = false; retry++ }) { Text("Try again") } + } + } else FullScreenLoading(if (exchanging) "Creating Application Session…" else "Logging in…", modifier) +} diff --git a/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/authentication/QAuth0Logout.kt b/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/authentication/QAuth0Logout.kt new file mode 100644 index 0000000..19dcfac --- /dev/null +++ b/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/authentication/QAuth0Logout.kt @@ -0,0 +1,81 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2024-2024. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.kingsrook.qqq.frontend.android.mobileapp.ui.authentication + +import androidx.compose.material3.Button +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.setValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalContext +import com.auth0.android.authentication.AuthenticationException +import com.auth0.android.callback.Callback +import com.kingsrook.qqq.frontend.android.mobileapp.ui.common.FullSizedAllCenteredColumn +import com.kingsrook.qqq.frontend.android.mobileapp.viewmodel.QViewModel +import kotlinx.coroutines.launch + +/******************************************************************************* + ** Complete local QQQ invalidation before the explicitly selected provider browser sign-out. + *******************************************************************************/ +@Composable +fun QAuth0Logout(qViewModel: QViewModel, modifier: Modifier = Modifier) { + val context = LocalContext.current + val launcher = LocalAuth0Browser.current + val scope = rememberCoroutineScope() + var providerMessage by remember { mutableStateOf("Provider sign-out has not been confirmed.") } + LaunchedEffect(qViewModel) + { + // Local QQQ sign-out must not depend on a browser callback (including cancellation or failure). + qViewModel.logOut() + if (!qViewModel.claimAuth0ProviderLogout()) return@LaunchedEffect + val callback = object : Callback<Void?, AuthenticationException> { + /******************************************************************************* + ** Report provider sign-out failure without restoring the already invalidated QQQ identity. + *******************************************************************************/ + override fun onFailure(error: AuthenticationException) { + scope.launch { providerMessage = "Provider sign-out could not be confirmed. Your provider may still be signed in." } + } + + /******************************************************************************* + ** Record provider completion without adopting credentials or reopening private navigation. + *******************************************************************************/ + override fun onSuccess(result: Void?) { + scope.launch { providerMessage = "Provider sign-out confirmed." } + } + } + try { + launcher.logout(context, QAuth0Service.makeAuth0Instance(qViewModel), QAuth0Service.scheme, callback) + } catch (exception: Exception) { + providerMessage = "Provider sign-out could not be started." + } + } + FullSizedAllCenteredColumn(modifier) { + Text(qViewModel.logoutMessage.ifBlank { "Signing out…" }) + Text(providerMessage) + Button(onClick = { qViewModel.requestLogin() }, enabled = !qViewModel.logoutInProgress) { Text("Log back in") } + } +} diff --git a/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/authentication/QAuth0Service.kt b/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/authentication/QAuth0Service.kt new file mode 100644 index 0000000..e6fe25c --- /dev/null +++ b/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/authentication/QAuth0Service.kt @@ -0,0 +1,63 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2004-2024. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package com.kingsrook.qqq.frontend.android.mobileapp.ui.authentication + +import android.util.Log +import com.auth0.android.Auth0 +import com.kingsrook.qqq.frontend.android.core.model.metadata.authentication.Auth0AuthenticationMetaData +import com.kingsrook.qqq.frontend.android.mobileapp.viewmodel.LoadState +import com.kingsrook.qqq.frontend.android.mobileapp.viewmodel.QViewModel + + +/******************************************************************************* + ** class to work with auth0 + *******************************************************************************/ +object QAuth0Service { + lateinit var scheme: String + + private const val TAG = "QAuth0Service" + + /******************************************************************************* + *******************************************************************************/ + fun makeAuth0Instance(qViewModel: QViewModel): Auth0 { + if (!::scheme.isInitialized) { + throw (IllegalStateException("QAuth0Service.scheme was not initialized!")) + } + + when (val loadState = qViewModel.authenticationMetaDataLoadState) { + is LoadState.Success -> { + val authenticationMetaData = loadState.value as Auth0AuthenticationMetaData + val auth0Instance: Auth0 = Auth0.getInstance(authenticationMetaData.values.clientId, authenticationMetaData.values.baseUrl) + Log.d(TAG, "clientId: ${auth0Instance.clientId}, domain: ${auth0Instance.domain}") + return auth0Instance + } + + else -> { + throw (IllegalStateException("authenticationMetaData is not loaded.")) + } + } + + } + + +} diff --git a/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/authentication/QAuthenticationWrapper.kt b/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/authentication/QAuthenticationWrapper.kt new file mode 100644 index 0000000..904869e --- /dev/null +++ b/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/authentication/QAuthenticationWrapper.kt @@ -0,0 +1,67 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2024-2024. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.kingsrook.qqq.frontend.android.mobileapp.ui.authentication + +import androidx.compose.foundation.layout.Column +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import com.kingsrook.qqq.frontend.android.core.model.metadata.authentication.BaseAuthenticationMetaData +import com.kingsrook.qqq.frontend.android.mobileapp.ui.QNavigator +import com.kingsrook.qqq.frontend.android.mobileapp.ui.LocalAuthenticatedContent +import com.kingsrook.qqq.frontend.android.mobileapp.ui.horseshoe.QApplicationWrapper +import com.kingsrook.qqq.frontend.android.mobileapp.ui.utils.LoadStateView +import com.kingsrook.qqq.frontend.android.mobileapp.ui.utils.Reloader +import com.kingsrook.qqq.frontend.android.mobileapp.viewmodel.LoadState +import com.kingsrook.qqq.frontend.android.mobileapp.viewmodel.QViewModel + +/******************************************************************************* + ** Composable that wraps our entire application - providing a login form + ** when needed, or a logout screen, else showing the app. + *******************************************************************************/ +@Composable +fun QAuthenticationWrapper(qViewModel: QViewModel, modifier: Modifier = Modifier, qNavigator: QNavigator? = null) { + val isAuthenticated = qViewModel.isAuthenticated; + val authenticationMetaDataLoadState = qViewModel.authenticationMetaDataLoadState; + val initialLoadFromDataStoreLoadState = qViewModel.initialLoadFromDataStoreLoadState; + val loadStates = listOf(initialLoadFromDataStoreLoadState, authenticationMetaDataLoadState); + + Column() + { + LoadStateView( + loadStates, + modifier, + reloader = Reloader("Try again", { qViewModel.reInitAfterFailure() }), + loadingText = "Authenticating app environment: ${qViewModel.environment.label}" + ) + { + val authenticationMetaData = (authenticationMetaDataLoadState as LoadState.Success<BaseAuthenticationMetaData>).value + + if (qViewModel.isLogoutRequested) { + QLogoutForm(qViewModel, authenticationMetaData) + } else if (isAuthenticated) { + LocalAuthenticatedContent.current(qViewModel) { QApplicationWrapper(qViewModel, Modifier, qNavigator) } + } else { + QLoginForm(qViewModel, authenticationMetaData) + } + } + } +} diff --git a/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/authentication/QLoginForm.kt b/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/authentication/QLoginForm.kt new file mode 100644 index 0000000..c84dea3 --- /dev/null +++ b/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/authentication/QLoginForm.kt @@ -0,0 +1,70 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2024-2024. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.kingsrook.qqq.frontend.android.mobileapp.ui.authentication + +import androidx.compose.foundation.layout.padding +import androidx.compose.material3.Button +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.unit.dp +import com.kingsrook.qqq.frontend.android.core.model.metadata.authentication.Auth0AuthenticationMetaData +import com.kingsrook.qqq.frontend.android.core.model.metadata.authentication.BaseAuthenticationMetaData +import com.kingsrook.qqq.frontend.android.core.model.metadata.authentication.FullyAnonymousAuthenticationMetaData +import com.kingsrook.qqq.frontend.android.core.model.metadata.authentication.TableBasedAuthenticationMetaData +import com.kingsrook.qqq.frontend.android.core.model.metadata.authentication.OAuth2AuthenticationMetaData +import com.kingsrook.qqq.frontend.android.mobileapp.ui.common.FullSizedAllCenteredColumn +import com.kingsrook.qqq.frontend.android.mobileapp.viewmodel.QViewModel +import java.util.UUID + + +/******************************************************************************* + ** Display an appropriate login form, based on the authenticationMetaData + ** type. + *******************************************************************************/ +@Composable +fun QLoginForm(qViewModel: QViewModel, authenticationMetaData: BaseAuthenticationMetaData, modifier: Modifier = Modifier) { + when (authenticationMetaData) { + is TableBasedAuthenticationMetaData -> QPasswordLogin(qViewModel, modifier) + is OAuth2AuthenticationMetaData -> QOAuth2Login(qViewModel, authenticationMetaData, modifier) + is Auth0AuthenticationMetaData -> { + QAuth0Login(qViewModel, modifier) + } + + is FullyAnonymousAuthenticationMetaData -> { + FullSizedAllCenteredColumn() + { + Text("Click to log in Anonymously:", modifier = Modifier.padding(bottom = 16.dp)) + + Button(onClick = { + qViewModel.doSetSessionUserFullName("Anonymous"); + qViewModel.manageSession(UUID.randomUUID().toString()) + }) { Text("Log In") } + } + } + + else -> { + Text("Error: Unrecognized AuthenticationMetaData type: ${authenticationMetaData.javaClass.simpleName}", color = Color.Red) + } + } +} diff --git a/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/authentication/QLogoutForm.kt b/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/authentication/QLogoutForm.kt new file mode 100644 index 0000000..9cd5bd7 --- /dev/null +++ b/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/authentication/QLogoutForm.kt @@ -0,0 +1,80 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2024-2024. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.kingsrook.qqq.frontend.android.mobileapp.ui.authentication + +import androidx.compose.foundation.layout.padding +import androidx.compose.material3.Button +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.unit.dp +import com.kingsrook.qqq.frontend.android.core.model.metadata.authentication.Auth0AuthenticationMetaData +import com.kingsrook.qqq.frontend.android.core.model.metadata.authentication.BaseAuthenticationMetaData +import com.kingsrook.qqq.frontend.android.core.model.metadata.authentication.FullyAnonymousAuthenticationMetaData +import com.kingsrook.qqq.frontend.android.core.model.metadata.authentication.TableBasedAuthenticationMetaData +import com.kingsrook.qqq.frontend.android.core.model.metadata.authentication.OAuth2AuthenticationMetaData +import com.kingsrook.qqq.frontend.android.mobileapp.ui.common.FullSizedAllCenteredColumn +import com.kingsrook.qqq.frontend.android.mobileapp.viewmodel.QViewModel + + +/******************************************************************************* + ** Display an appropriate logout screen/form, based on the authenticationMetaData + ** type. + *******************************************************************************/ +@Composable +fun QLogoutForm(qViewModel: QViewModel, authenticationMetaData: BaseAuthenticationMetaData, modifier: Modifier = Modifier) { + qViewModel.companyLogoutBinding?.let { + QOAuth2Logout(qViewModel, it) + return + } + when (authenticationMetaData) { + is Auth0AuthenticationMetaData -> { + QAuth0Logout(qViewModel, modifier) + } + + is FullyAnonymousAuthenticationMetaData, is TableBasedAuthenticationMetaData, is OAuth2AuthenticationMetaData -> { + LaunchedEffect(true) + { + /////////////////////////////////////////////////////////////////// + // only run the logout code the first time this code is rendered // + /////////////////////////////////////////////////////////////////// + qViewModel.logOut(); + } + + FullSizedAllCenteredColumn() + { + Text(qViewModel.logoutMessage.ifEmpty { "Signing out…" }, modifier = Modifier.padding(bottom = 16.dp)) + + Button(enabled = !qViewModel.logoutInProgress, onClick = { qViewModel.requestLogin() }) + { + Text("Log back in") + } + } + } + + else -> { + Text("Error: Unrecognized AuthenticationMetaData type: ${authenticationMetaData.javaClass.simpleName}", color = Color.Red) + } + } +} diff --git a/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/authentication/QOAuth2Login.kt b/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/authentication/QOAuth2Login.kt new file mode 100644 index 0000000..fe652d4 --- /dev/null +++ b/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/authentication/QOAuth2Login.kt @@ -0,0 +1,158 @@ +/* Copyright (c) 2026 QRunIO. SPDX-License-Identifier: Apache-2.0 */ +package com.kingsrook.qqq.frontend.android.mobileapp.ui.authentication + +import android.app.Activity +import android.content.Context +import android.content.ContextWrapper +import android.net.Uri +import androidx.activity.compose.rememberLauncherForActivityResult +import androidx.activity.result.contract.ActivityResultContracts +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.padding +import androidx.compose.material3.Button +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.DisposableEffect +import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.runtime.staticCompositionLocalOf +import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.platform.testTag +import androidx.compose.ui.unit.dp +import com.kingsrook.qqq.frontend.android.core.model.metadata.authentication.OAuth2AuthenticationMetaData +import com.kingsrook.qqq.frontend.android.core.controllers.UiApiCompatibilityException +import com.kingsrook.qqq.frontend.android.mobileapp.viewmodel.QViewModel +import kotlinx.coroutines.CancellationException +import kotlinx.coroutines.launch +import kotlinx.coroutines.suspendCancellableCoroutine +import net.openid.appauth.AuthorizationRequest +import net.openid.appauth.AuthorizationResponse +import net.openid.appauth.AuthorizationService +import net.openid.appauth.AuthorizationServiceConfiguration +import net.openid.appauth.ResponseTypeValues +import net.openid.appauth.connectivity.ConnectionBuilder +import java.net.HttpURLConnection +import java.net.URL +import kotlin.coroutines.resume +import kotlin.coroutines.resumeWithException + +/******************************************************************************* + ** Hosts/tests may supply discovery transport; returned metadata is still validated before authorization. + *******************************************************************************/ +val LocalOAuth2Discovery = staticCompositionLocalOf<suspend (OAuth2LoginBinding) -> AuthorizationServiceConfiguration> { ::discoverOAuth2 } + +/******************************************************************************* + ** Browser authorization is standard AppAuth; API1.10 exchanges the code and validates the retained original nonce. + *******************************************************************************/ +@Composable +fun QOAuth2Login(viewModel: QViewModel, metadata: OAuth2AuthenticationMetaData, modifier: Modifier = Modifier) { + val context = LocalContext.current + val binding = remember(metadata, viewModel.environment.baseUrl, context.packageName) { + oauth2LoginBinding(metadata, viewModel.environment.baseUrl, context.packageName) + } + val service = remember(context, binding) { AuthorizationService(context) } + val discover = LocalOAuth2Discovery.current + val scope = rememberCoroutineScope() + DisposableEffect(viewModel, service, binding) + { + onDispose { + service.dispose() + if (context.activity()?.isChangingConfigurations != true) viewModel.cancelOAuth2Login() + } + } + val launcher = rememberLauncherForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> + val response = runCatching { result.data?.let(AuthorizationResponse::fromIntent) }.getOrNull() + if (result.resultCode != Activity.RESULT_OK || response == null || binding == null) { + viewModel.cancelOAuth2Login("Sign-in was cancelled or could not be completed. Please try again.") + } else { + viewModel.completeOAuth2Login( + binding, response.state, response.request.state, response.request.nonce, + response.request.clientId, response.request.redirectUri.toString(), response.request.prompt, response.authorizationCode + ) + } + } + Column(modifier.padding(24.dp), verticalArrangement = Arrangement.spacedBy(12.dp)) + { + Text("Sign in") + if (binding == null) { + Text("This server has not configured compatible native browser sign-in with required nonce validation. Ask your administrator to enable it.") + } else { + Text("Continue in your browser to sign in with your organization.") + Button( + modifier = Modifier.testTag("oauth2.signIn"), enabled = viewModel.oauth2LoginPhase == OAuth2LoginPhase.READY, + onClick = { + val generation = viewModel.prepareOAuth2Login(binding) + if (generation != null) scope.launch { + try { + viewModel.qqqRepository.verifyNativeSessionLogin() + val configuration = discover(binding) + check(validOAuth2Configuration(configuration, binding)) + if (viewModel.isCurrentOAuth2Login(generation, binding)) { + val request = AuthorizationRequest.Builder( + configuration, binding.clientId, ResponseTypeValues.CODE, + Uri.parse(binding.redirectUri) + ).setScope(binding.scopes).setPrompt(binding.prompt).setResponseMode("query").build() + check(request.codeVerifierChallengeMethod == "S256") + if (viewModel.beginOAuth2Browser( + generation, binding, requireNotNull(request.state), + requireNotNull(request.nonce), requireNotNull(request.codeVerifier) + ) + ) + launcher.launch(service.getAuthorizationRequestIntent(request)) + } + } catch (exception: CancellationException) { + if (viewModel.isCurrentOAuth2Login(generation, binding) && viewModel.oauth2LoginPhase == OAuth2LoginPhase.PREPARING) + viewModel.cancelOAuth2Login() + throw exception + } catch (exception: UiApiCompatibilityException) { + if (viewModel.isCurrentOAuth2Login(generation, binding)) + viewModel.cancelOAuth2Login("This server does not support native sign-in with required nonce validation. Ask your administrator to upgrade or enable it.") + } catch (exception: Exception) { + if (viewModel.isCurrentOAuth2Login(generation, binding)) + viewModel.cancelOAuth2Login("Browser sign-in is unavailable. Check your connection, browser and server configuration.") + } + } + }) { Text(if (viewModel.oauth2LoginPhase == OAuth2LoginPhase.READY) "Sign in with organization" else "Signing in…") } + } + viewModel.oauth2LoginMessage?.let { Text(it, Modifier.testTag("oauth2.message")) } + } +} + +/******************************************************************************* + ** AppAuth parses discovery. Restrict its transport and compare issuer to the explicit semantic contract. + *******************************************************************************/ +private suspend fun discoverOAuth2(binding: OAuth2LoginBinding): AuthorizationServiceConfiguration = suspendCancellableCoroutine { continuation -> + val connection = ConnectionBuilder { uri -> + require(uri.toString() == binding.discoveryUrl && isOAuth2HttpsUrl(uri.toString())) + (URL(uri.toString()).openConnection() as HttpURLConnection).apply { + instanceFollowRedirects = false + connectTimeout = 10_000 + readTimeout = 10_000 + } + } + AuthorizationServiceConfiguration.fetchFromUrl(Uri.parse(binding.discoveryUrl), { configuration, _ -> + if (continuation.isActive) { + if (configuration != null && validOAuth2Configuration(configuration, binding)) + continuation.resume(configuration) + else continuation.resumeWithException(IllegalStateException("Invalid identity provider configuration")) + } + }, connection) +} + +/******************************************************************************* + ** Bind discovered endpoints to the advertised issuer and require direct HTTPS before authorization. + *******************************************************************************/ +private fun validOAuth2Configuration(configuration: AuthorizationServiceConfiguration, binding: OAuth2LoginBinding): Boolean = + configuration.discoveryDoc?.issuer?.toString() == binding.issuer && + isOAuth2HttpsUrl(configuration.authorizationEndpoint.toString()) && isOAuth2HttpsUrl(configuration.tokenEndpoint.toString()) + +/******************************************************************************* + ** Unwrap Android context wrappers until the external browser can use the owning activity. + *******************************************************************************/ +private fun Context.activity(): Activity? = when (this) { + is Activity -> this + is ContextWrapper -> baseContext.activity() + else -> null +} diff --git a/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/authentication/QOAuth2Logout.kt b/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/authentication/QOAuth2Logout.kt new file mode 100644 index 0000000..c1c7e38 --- /dev/null +++ b/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/authentication/QOAuth2Logout.kt @@ -0,0 +1,88 @@ +/* Copyright (c) 2026 QRunIO. SPDX-License-Identifier: Apache-2.0 */ +package com.kingsrook.qqq.frontend.android.mobileapp.ui.authentication + +import android.app.Activity +import android.net.Uri +import androidx.activity.compose.rememberLauncherForActivityResult +import androidx.activity.result.contract.ActivityResultContracts +import androidx.compose.foundation.layout.Column +import androidx.compose.material3.Button +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.DisposableEffect +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.remember +import androidx.compose.runtime.staticCompositionLocalOf +import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.platform.testTag +import com.kingsrook.qqq.frontend.android.mobileapp.viewmodel.QViewModel +import kotlinx.coroutines.CancellationException +import net.openid.appauth.AuthorizationService +import net.openid.appauth.EndSessionRequest +import net.openid.appauth.EndSessionResponse + +/******************************************************************************* + ** Explicit host policy; default UI and ordinary sign-out never invoke global provider logout. + *******************************************************************************/ +val LocalCompanySignOutEnabled = staticCompositionLocalOf { false } + +/******************************************************************************* + ** Shares the registered receiver, but consumes only AppAuth end-session responses and state. + *******************************************************************************/ +@Composable +fun QOAuth2Logout(model: QViewModel, binding: OAuth2LogoutBinding) { + val context = LocalContext.current + val service = remember(context) { AuthorizationService(context) } + val discover = LocalOAuth2Discovery.current + val generation = model.companyLogoutGeneration + val launcher = rememberLauncherForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> + val response = runCatching { result.data?.let(EndSessionResponse::fromIntent) }.getOrNull() + if (result.resultCode != Activity.RESULT_OK || response == null) + model.finishCompanyLogout(generation, binding) + else model.completeCompanyLogout( + generation, binding, response.state, response.request.state, + response.request.configuration.endSessionEndpoint?.toString(), response.request.postLogoutRedirectUri?.toString() + ) + } + DisposableEffect(service) { onDispose { service.dispose() } } + LaunchedEffect(model, binding, generation) + { + if (model.companyLogoutPhase != OAuth2LogoutPhase.PREPARING) return@LaunchedEffect + try { + val material = model.logOutWithProvider(generation, binding) + if (material == null) { + model.finishCompanyLogout(generation, binding) + return@LaunchedEffect + } + val configuration = discover(binding.login) + check( + validOAuth2LogoutData( + material, binding, configuration.discoveryDoc?.issuer?.toString(), + configuration.endSessionEndpoint?.toString() + ) + ) + // The hint crosses AppAuth Intent/saved-activity and browser URL boundaries; never log this request. + val request = EndSessionRequest.Builder(configuration).setIdTokenHint(material.idTokenHint) + .setPostLogoutRedirectUri(Uri.parse(binding.postLogoutRedirectUri)).build() + if (model.beginCompanyLogoutBrowser(generation, binding, material.endSessionEndpoint, requireNotNull(request.state))) + launcher.launch(service.getEndSessionRequestIntent(request)) + } catch (exception: CancellationException) { + // A cancelled preparation is deliberately not replayed after recreation or server changes. + model.finishCompanyLogout(generation, binding) + throw exception + } catch (exception: Exception) { + model.finishCompanyLogout(generation, binding) + } + } + Column() + { + Text(model.logoutMessage.ifEmpty { "Signing out…" }, Modifier.testTag("oauth2.logoutMessage")) + if (model.companyLogoutPhase == OAuth2LogoutPhase.BROWSER) + Button(onClick = { model.finishCompanyLogout(generation, binding) }) { Text("Cancel company sign-out") } + Button( + enabled = !model.logoutInProgress && model.companyLogoutPhase == OAuth2LogoutPhase.FINISHED, + onClick = model::requestLogin + ) { Text("Log back in") } + } +} diff --git a/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/authentication/QPasswordLogin.kt b/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/authentication/QPasswordLogin.kt new file mode 100644 index 0000000..8e1c2ae --- /dev/null +++ b/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/authentication/QPasswordLogin.kt @@ -0,0 +1,67 @@ +/* Copyright (c) 2026 QRunIO. SPDX-License-Identifier: Apache-2.0 */ +package com.kingsrook.qqq.frontend.android.mobileapp.ui.authentication + +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.imePadding +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.verticalScroll +import androidx.compose.foundation.text.KeyboardActions +import androidx.compose.foundation.text.KeyboardOptions +import androidx.compose.material3.Button +import androidx.compose.material3.OutlinedTextField +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Modifier +import androidx.compose.ui.focus.FocusDirection +import androidx.compose.ui.platform.LocalFocusManager +import androidx.compose.ui.platform.LocalSoftwareKeyboardController +import androidx.compose.ui.text.input.ImeAction +import androidx.compose.ui.text.input.KeyboardType +import androidx.compose.ui.text.input.PasswordVisualTransformation +import androidx.compose.ui.unit.dp +import com.kingsrook.qqq.frontend.android.mobileapp.viewmodel.LoadState +import com.kingsrook.qqq.frontend.android.mobileapp.viewmodel.QViewModel + +/******************************************************************************* + ** Native credential form for QQQ TABLE_BASED authentication. + *******************************************************************************/ +@Composable +fun QPasswordLogin(viewModel: QViewModel, modifier: Modifier = Modifier) { + var username by remember { mutableStateOf("") } + var password by remember { mutableStateOf("") } + var submitted by remember { mutableStateOf(false) } + val focusManager = LocalFocusManager.current + val keyboard = LocalSoftwareKeyboardController.current + val busy = submitted && viewModel.manageSessionLoadState is LoadState.Loading + Column(modifier.imePadding().verticalScroll(rememberScrollState()).padding(24.dp), verticalArrangement = Arrangement.spacedBy(12.dp)) + { + Text("Sign in") + OutlinedTextField( + username, { username = it }, label = { Text("Username") }, singleLine = true, enabled = !busy, + keyboardOptions = KeyboardOptions(imeAction = ImeAction.Next), + keyboardActions = KeyboardActions(onNext = { focusManager.moveFocus(FocusDirection.Next) }) + ) + OutlinedTextField( + password, { password = it }, label = { Text("Password") }, singleLine = true, + visualTransformation = PasswordVisualTransformation(), enabled = !busy, + keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Password, imeAction = ImeAction.Done), + keyboardActions = KeyboardActions(onDone = { focusManager.clearFocus(); keyboard?.hide() }) + ) + Button(enabled = !busy && username.isNotBlank() && password.isNotEmpty(), onClick = { + focusManager.clearFocus() + keyboard?.hide() + submitted = true + viewModel.loginWithPassword(username.trim(), password) + password = "" + }) { Text(if (busy) "Signing in…" else "Sign in") } + if (submitted && viewModel.manageSessionLoadState is LoadState.Error) { + Text("Sign-in failed. Check your credentials and connection.") + } + } +} diff --git a/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/common/FullScreenLoading.kt b/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/common/FullScreenLoading.kt new file mode 100644 index 0000000..f70a15e --- /dev/null +++ b/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/common/FullScreenLoading.kt @@ -0,0 +1,48 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2024-2024. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.kingsrook.qqq.frontend.android.mobileapp.ui.common + +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.width +import androidx.compose.material3.CircularProgressIndicator +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.unit.dp + +/******************************************************************************* + *******************************************************************************/ +@Composable +fun FullScreenLoading(loadingText: String, modifier: Modifier = Modifier) { + FullSizedAllCenteredColumn(modifier) + { + Text(loadingText, color = Color.Gray, modifier = Modifier.padding(bottom = 16.dp)) + + CircularProgressIndicator( + modifier = Modifier.width(64.dp), + color = MaterialTheme.colorScheme.secondary, + trackColor = MaterialTheme.colorScheme.surfaceVariant, + ) + } +} diff --git a/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/common/FullSizedAllCenteredColumn.kt b/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/common/FullSizedAllCenteredColumn.kt new file mode 100644 index 0000000..c3d3af4 --- /dev/null +++ b/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/common/FullSizedAllCenteredColumn.kt @@ -0,0 +1,42 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2024-2024. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.kingsrook.qqq.frontend.android.mobileapp.ui.common + +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.ColumnScope +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier + +/******************************************************************************* + *******************************************************************************/ +@Composable +fun FullSizedAllCenteredColumn(modifier: Modifier = Modifier, content: @Composable ColumnScope.() -> Unit) { + Column( + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.Center, + modifier = modifier.fillMaxSize(), + content = content + ) +} diff --git a/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/horseshoe/MenuDialog.kt b/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/horseshoe/MenuDialog.kt new file mode 100644 index 0000000..e7c912c --- /dev/null +++ b/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/horseshoe/MenuDialog.kt @@ -0,0 +1,70 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2024-2024. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.kingsrook.qqq.frontend.android.mobileapp.ui.horseshoe + +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.verticalScroll +import androidx.compose.material3.AlertDialog +import androidx.compose.material3.Text +import androidx.compose.material3.TextButton +import androidx.compose.runtime.Composable +import androidx.compose.runtime.MutableState +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.testTag +import androidx.compose.ui.unit.dp +import com.kingsrook.qqq.frontend.android.mobileapp.container.QAppContainer +import com.kingsrook.qqq.frontend.android.mobileapp.ui.utils.Dropdown +import com.kingsrook.qqq.frontend.android.mobileapp.viewmodel.QViewModel + +/******************************************************************************* + ** Secondary settings preserve the active process until a server change is confirmed. + *******************************************************************************/ +@Composable +fun MenuDialog(qViewModel: QViewModel, appTitle: String, isMenuDialogOpen: MutableState<Boolean>) { + val selected = remember { mutableStateOf(qViewModel.environment) } + AlertDialog( + onDismissRequest = { isMenuDialogOpen.value = false }, + title = { Text("Settings", Modifier.testTag("menuDialog.title")) }, + text = { + Column(Modifier.verticalScroll(rememberScrollState()), verticalArrangement = Arrangement.spacedBy(12.dp)) { + Text(appTitle) + Text("Server: ${qViewModel.environment.baseUrl}") + LocalDeviceSettings.current() + if (QAppContainer.availableEnvironments.size > 1) { + Dropdown( + value = selected.value, options = QAppContainer.availableEnvironments, + labelExtractor = { it.label }, onClick = { selected.value = it }) + TextButton(enabled = selected.value != qViewModel.environment, onClick = { + isMenuDialogOpen.value = false + qViewModel.qNavigator.requestLeave("Change server and sign out?", "Change server", alwaysConfirm = true) { + qViewModel.switchEnvironment(selected.value) {} + } + }) { Text("Switch") } + } + Text("Application version: ${QViewModel.applicationVersion}") + } + }, confirmButton = { TextButton(onClick = { isMenuDialogOpen.value = false }) { Text("Close") } }) +} diff --git a/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/horseshoe/NavigationSurfaces.kt b/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/horseshoe/NavigationSurfaces.kt new file mode 100644 index 0000000..04b63c1 --- /dev/null +++ b/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/horseshoe/NavigationSurfaces.kt @@ -0,0 +1,111 @@ +/* Copyright (c) 2026 QRunIO. SPDX-License-Identifier: Apache-2.0 */ +package com.kingsrook.qqq.frontend.android.mobileapp.ui.horseshoe + +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.verticalScroll +import androidx.compose.material3.AlertDialog +import androidx.compose.material3.Text +import androidx.compose.material3.TextButton +import androidx.compose.runtime.Composable +import androidx.compose.runtime.compositionLocalOf +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.remember +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.getValue +import androidx.compose.runtime.setValue +import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.testTag +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.unit.dp +import com.kingsrook.qqq.frontend.android.mobileapp.viewmodel.LoadState +import com.kingsrook.qqq.frontend.android.mobileapp.viewmodel.QViewModel +import com.kingsrook.qqq.frontend.android.core.model.metadata.authentication.OAuth2AuthenticationMetaData +import com.kingsrook.qqq.frontend.android.mobileapp.ui.authentication.LocalCompanySignOutEnabled +import com.kingsrook.qqq.frontend.android.mobileapp.ui.authentication.oauth2LogoutBinding + +/******************************************************************************* + ** Host-owned device settings and diagnostics; these surfaces do not change the business route. + *******************************************************************************/ +val LocalDeviceSettings = compositionLocalOf<@Composable () -> Unit> { {} } +val LocalOpenDiagnostics = compositionLocalOf<(() -> Unit)?> { null } +val LocalBusinessNavigationEnabled = compositionLocalOf { true } + +/******************************************************************************* + ** Expose account actions while keeping optional company sign-out separate from ordinary local sign-out. + *******************************************************************************/ +@Composable +internal fun AccountDialog(model: QViewModel, dismiss: () -> Unit) { + val companyLogout = if (LocalCompanySignOutEnabled.current) + ((model.authenticationMetaDataLoadState as? LoadState.Success)?.value as? OAuth2AuthenticationMetaData)?.let { + oauth2LogoutBinding(it, model.environment.baseUrl, LocalContext.current.packageName) + } else null + var supportsCompanyLogout by remember(model, companyLogout) { mutableStateOf(false) } + LaunchedEffect(model, companyLogout) + { + if (companyLogout != null) try { + supportsCompanyLogout = model.qqqRepository.supportsNativeSessionLogout() + } catch (exception: kotlinx.coroutines.CancellationException) { + throw exception + } catch (exception: Exception) { + supportsCompanyLogout = false + } + } + AlertDialog( + onDismissRequest = dismiss, title = { Text("Account", Modifier.testTag("accountDialog.title")) }, + text = { + Column { + Text(if (model.isAuthenticated) "Current User: ${model.sessionUserFullName}" else "Not currently logged in") + TextButton(enabled = model.isAuthenticated && !model.isLogoutRequested, onClick = { + dismiss() + model.qNavigator.requestSignOut() + }) { Text("Sign out") } + if (companyLogout != null && supportsCompanyLogout) + TextButton(enabled = model.isAuthenticated && !model.isLogoutRequested, onClick = { + dismiss() + model.qNavigator.requestCompanySignOut(companyLogout) + }) { Text("Sign out of company") } + } + }, confirmButton = { TextButton(onClick = dismiss) { Text("Close") } }) +} + +/******************************************************************************* + ** Make cancellation and uncertain work explicit before the requested destination replaces the current process. + *******************************************************************************/ +@Composable +internal fun LeaveProcessDialog(model: QViewModel) { + val navigator = model.qNavigator + val request = navigator.leaveRequest ?: return + val process = model.activeProcessViewModel + val blocked = process?.navigationBlockReason() + val cancelling = process?.cancelling == true + AlertDialog( + onDismissRequest = navigator::dismissLeave, title = { Text(request.title) }, + text = { + Column(Modifier.verticalScroll(rememberScrollState()), verticalArrangement = Arrangement.spacedBy(8.dp)) { + if (process != null && !process.getNoMoreSteps()) { + Text("Leaving cancels this process. Unsaved input will be lost. Saved scans and other committed records stay saved.") + process.navigationWarning()?.let { Text(it) } + if (process.unconfirmedSubmission && process.pendingStepValues == null) + Text("The last request's result is unknown. Cancellation does not undo saved changes. Ask your administrator to check process ${process.processUUID}.") + } else if (request.confirmLabel == "Sign out") Text("Sign out of this account on this device?") + if (request.confirmLabel == "Sign out of company") + Text("Sign out of QQQ and continue in your browser to sign out of your organization? This may affect other company applications in that browser.") + blocked?.let { Text(it) } + if (cancelling) Text("Waiting for the server to confirm cancellation…") + if (process?.cancellationFailed == true) + Text("The server did not confirm cancellation. You can retry cancellation or leave anyway. The server process may still be running and the scan may already be saved. Leaving anyway stops local retries; it does not undo saved changes.") + (process?.topLevelErrorState as? LoadState.Error)?.message?.let { Text(it) } + } + }, + confirmButton = { TextButton(onClick = navigator::confirmLeave, enabled = blocked == null && !cancelling) { Text(request.confirmLabel) } }, + dismissButton = { + Column { + if (process?.cancellationFailed == true) + TextButton(onClick = navigator::leaveAnyway, enabled = blocked == null && !cancelling) { Text("Leave anyway") } + TextButton(onClick = navigator::dismissLeave, enabled = !cancelling) { Text("Stay") } + } + }) +} diff --git a/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/horseshoe/NetworkPresence.kt b/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/horseshoe/NetworkPresence.kt new file mode 100644 index 0000000..2902dc4 --- /dev/null +++ b/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/horseshoe/NetworkPresence.kt @@ -0,0 +1,25 @@ +/* Copyright (c) 2026 QRunIO. SPDX-License-Identifier: Apache-2.0 */ +package com.kingsrook.qqq.frontend.android.mobileapp.ui.horseshoe + +/******************************************************************************* + ** Aggregate network callbacks: losing one transport must not hide another available network. + *******************************************************************************/ +internal class NetworkPresence { + private val handles = mutableSetOf<Long>() + + /******************************************************************************* + ** Track available networks by identity so one network's arrival cannot hide another network's loss. + *******************************************************************************/ + fun onAvailable(networkHandle: Long): Boolean { + handles.add(networkHandle) + return handles.isNotEmpty() + } + + /******************************************************************************* + ** Remove only the lost network before deriving whether any usable network remains. + *******************************************************************************/ + fun onLost(networkHandle: Long): Boolean { + handles.remove(networkHandle) + return handles.isNotEmpty() + } +} diff --git a/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/horseshoe/NoNetworkDialog.kt b/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/horseshoe/NoNetworkDialog.kt new file mode 100644 index 0000000..9995f4a --- /dev/null +++ b/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/horseshoe/NoNetworkDialog.kt @@ -0,0 +1,75 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2004-2024. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package com.kingsrook.qqq.frontend.android.mobileapp.ui.horseshoe + +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.width +import androidx.compose.material3.AlertDialog +import androidx.compose.material3.CircularProgressIndicator +import androidx.compose.material3.Icon +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import com.kingsrook.qqq.frontend.android.mobileapp.R +import com.kingsrook.qqq.frontend.android.mobileapp.viewmodel.QViewModel + +/******************************************************************************* + *******************************************************************************/ +@Composable +fun NoNetworkDialog(@Suppress("UNUSED_PARAMETER") qViewModel: QViewModel) // The caller observes connectivity; retain this published dialog signature for existing hosts. +{ + AlertDialog( + title = { }, + text = { + Column(horizontalAlignment = Alignment.CenterHorizontally) + { + Icon( + painter = painterResource(id = R.drawable.qqq_no_network), + tint = Color.Blue, + contentDescription = null, + modifier = Modifier.fillMaxWidth() + .padding(bottom = 8.dp, top = 40.dp) + ) + Text("No Network Connection", fontWeight = FontWeight.SemiBold, fontSize = 24.sp, modifier = Modifier.padding(vertical = 16.dp)) + Text("Contact support if this continues", fontSize = 16.sp, modifier = Modifier.padding(bottom = 16.dp)) + CircularProgressIndicator( + modifier = Modifier.width(32.dp).padding(bottom = 40.dp), + color = MaterialTheme.colorScheme.secondary, + trackColor = MaterialTheme.colorScheme.surfaceVariant, + ) + } + }, + onDismissRequest = { /* noop */ }, + dismissButton = { }, + confirmButton = { }, + ) +} diff --git a/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/horseshoe/QApplicationWrapper.kt b/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/horseshoe/QApplicationWrapper.kt new file mode 100644 index 0000000..38b56f2 --- /dev/null +++ b/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/horseshoe/QApplicationWrapper.kt @@ -0,0 +1,153 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2004-2024. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package com.kingsrook.qqq.frontend.android.mobileapp.ui.horseshoe + +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.padding +import androidx.compose.material3.Button +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.activity.compose.BackHandler +import androidx.compose.ui.Modifier +import androidx.compose.ui.unit.dp +import androidx.navigation.compose.NavHost +import androidx.navigation.compose.composable +import androidx.navigation.compose.rememberNavController +import androidx.navigation.toRoute +import com.kingsrook.qqq.frontend.android.core.model.metadata.QInstance +import com.kingsrook.qqq.frontend.android.mobileapp.ui.QNavigator +import com.kingsrook.qqq.frontend.android.mobileapp.ui.LocalNavigationBackAction +import com.kingsrook.qqq.frontend.android.mobileapp.ui.apps.QAppHome +import com.kingsrook.qqq.frontend.android.mobileapp.ui.common.FullSizedAllCenteredColumn +import com.kingsrook.qqq.frontend.android.mobileapp.ui.processes.QProcessHome +import com.kingsrook.qqq.frontend.android.mobileapp.ui.utils.LoadStateView +import com.kingsrook.qqq.frontend.android.mobileapp.viewmodel.LoadState +import com.kingsrook.qqq.frontend.android.mobileapp.viewmodel.QViewModel +import kotlinx.serialization.Serializable + +/******************************************************************************* + ** Composable that wraps our entire application - providing a login form + ** when needed, else showing the app. + *******************************************************************************/ +@Composable +fun QApplicationWrapper(qViewModel: QViewModel, modifier: Modifier = Modifier, qNavigator: QNavigator? = null) { + val qInstanceLoadState = qViewModel.qInstanceLoadState + val loadStates = listOf(qInstanceLoadState) + + val navController = qNavigator?.navController ?: rememberNavController() + val hostBackAction = LocalNavigationBackAction.current + BackHandler(enabled = qNavigator?.atHome == false) { + if (hostBackAction != null) hostBackAction() else qNavigator?.popStack() + } + + LoadStateView( + loadStates, + modifier, + reloader = com.kingsrook.qqq.frontend.android.mobileapp.ui.utils.Reloader("Retry loading apps", { qViewModel.loadQInstance() }), + loadingText = "Loading apps for environment: ${qViewModel.environment.label}" + ) + { + val qInstance = (qInstanceLoadState as LoadState.Success<QInstance>).value + Column(modifier = Modifier) + { + NavHost(navController, startDestination = HomeRoute, modifier = modifier) { + + composable<HomeRoute>() + { + QAppHome(qInstance, modifier, qNavigator = qNavigator) + } + + composable<AppRoute>() + { backStackEntry -> + val appRoute: AppRoute = backStackEntry.toRoute() + val app = qInstance.apps?.get(appRoute.name) + if (app != null) { + QAppHome(qInstance, modifier, app = app, qNavigator = qNavigator) + } else { + NotFound(qNavigator, "App not found (name=${appRoute.name})") + } + } + + composable<ProcessRoute>() + { backStackEntry -> + val processRoute: ProcessRoute = backStackEntry.toRoute() + val process = qInstance.processes?.get(processRoute.name) + if (process != null) { + QProcessHome(qViewModel, qInstance, modifier) + } else { + NotFound(qNavigator, "Process not found (name=${processRoute.name})") + } + } + + composable<TableRoute>() { entry -> + val route: TableRoute = entry.toRoute() + com.kingsrook.qqq.frontend.android.mobileapp.ui.records.TableScreen(qViewModel, route.name) + } + composable<RecordRoute>() { entry -> + val route: RecordRoute = entry.toRoute() + com.kingsrook.qqq.frontend.android.mobileapp.ui.records.RecordScreen(qViewModel, route.tableName, route.recordId, route.hasParent) + } + + } + } + } +} + +/******************************************************************************* + *******************************************************************************/ +@Composable +private fun NotFound(qNavigator: QNavigator?, message: String) { + FullSizedAllCenteredColumn() + { + Text(message, modifier = Modifier.padding(bottom = 16.dp)) + Button(onClick = { qNavigator?.goHome() }) + { + Text("Return Home") + } + } +} + +/******************************************************************************* + ** route/data (singleton) to represent the home screen + *******************************************************************************/ +@Serializable +object HomeRoute + +/******************************************************************************* + ** route/data to represent an app + *******************************************************************************/ +@Serializable +data class AppRoute(val name: String) + +/******************************************************************************* + ** route/data to represent a process + *******************************************************************************/ +@Serializable +data class ProcessRoute(val name: String, val appName: String? = null) + +@Serializable +data class TableRoute(val name: String, val appName: String? = null) + +@Serializable +data class RecordRoute(val tableName: String, val recordId: String, val appName: String? = null, val hasParent: Boolean = false) + diff --git a/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/horseshoe/QNavigationDrawer.kt b/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/horseshoe/QNavigationDrawer.kt new file mode 100644 index 0000000..297ecaf --- /dev/null +++ b/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/horseshoe/QNavigationDrawer.kt @@ -0,0 +1,102 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2024-2024. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.kingsrook.qqq.frontend.android.mobileapp.ui.horseshoe + +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.ColumnScope +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.AccountCircle +import androidx.compose.material.icons.filled.Close +import androidx.compose.material3.HorizontalDivider +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.ModalDrawerSheet +import androidx.compose.material3.ModalNavigationDrawer +import androidx.compose.material3.NavigationDrawerItem +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.unit.dp +import com.kingsrook.qqq.frontend.android.mobileapp.viewmodel.TopLevelAppState + +/******************************************************************************* + *******************************************************************************/ +@Composable +fun QNavigationDrawer(topLevelAppState: TopLevelAppState, content: @Composable ColumnScope.() -> Unit) { + ModalNavigationDrawer( + drawerState = topLevelAppState.navDrawerState, + drawerContent = + { + ModalDrawerSheet(modifier = Modifier.padding(top = 24.dp)) + { + Row(horizontalArrangement = Arrangement.SpaceBetween, modifier = Modifier.fillMaxWidth()) + { + Text("QNav Drawer title", fontWeight = FontWeight.Bold, modifier = Modifier.padding(16.dp)) + + IconButton(onClick = topLevelAppState::closeNavDrawer) + { + Icon(imageVector = Icons.Filled.Close, contentDescription = "Close Menu") + } + } + HorizontalDivider() + + if (topLevelAppState.isLoggedIn()) { + NavigationDrawerItem( + label = + { + Text(text = "Log Out") + }, + icon = { Icon(imageVector = Icons.Default.AccountCircle, contentDescription = "Log Out") }, + selected = false, + onClick = + { + topLevelAppState.logOut() + topLevelAppState.closeNavDrawer() + } + ) + } else { + Row( + horizontalArrangement = Arrangement.spacedBy(12.dp), + verticalAlignment = Alignment.CenterVertically, + modifier = Modifier.fillMaxWidth().padding(16.dp) + ) + { + Icon(imageVector = Icons.Default.AccountCircle, contentDescription = "Log Out", tint = Color.Gray) + Text("Log Out", color = Color.Gray) + } + } + + // ...other drawer items + } + } + ) { + Column(modifier = Modifier, content = content) + } + +} diff --git a/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/horseshoe/QTopAppBar.kt b/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/horseshoe/QTopAppBar.kt new file mode 100644 index 0000000..f9770cc --- /dev/null +++ b/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/horseshoe/QTopAppBar.kt @@ -0,0 +1,136 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2004-2024. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package com.kingsrook.qqq.frontend.android.mobileapp.ui.horseshoe + +import android.net.ConnectivityManager +import android.net.Network +import android.net.NetworkCapabilities +import android.net.NetworkRequest +import androidx.compose.foundation.layout.Row +import androidx.compose.material.icons.filled.AccountCircle +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.automirrored.filled.ArrowBack +import androidx.compose.material.icons.filled.Menu +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.material3.TopAppBar +import androidx.compose.material3.TopAppBarDefaults +import androidx.compose.runtime.Composable +import androidx.compose.runtime.MutableState +import androidx.compose.runtime.DisposableEffect +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.platform.testTag +import androidx.compose.ui.text.style.TextOverflow +import androidx.core.content.ContextCompat.getSystemService +import com.kingsrook.qqq.frontend.android.mobileapp.ui.QNavigator +import com.kingsrook.qqq.frontend.android.mobileapp.ui.LocalNavigationBackAction +import com.kingsrook.qqq.frontend.android.mobileapp.viewmodel.QViewModel + +/******************************************************************************* + *******************************************************************************/ +@OptIn(ExperimentalMaterial3Api::class) // needed for TopAppBar +@Composable +fun QTopAppBar(qViewModel: QViewModel, defaultTitle: String = "A QQQ Android Application", navMenuCallback: (() -> Unit)? = null, qNavigator: QNavigator? = null, showNetworkDialog: Boolean = true, accountOpenState: MutableState<Boolean>? = null) { + val accountOpen = accountOpenState ?: remember { mutableStateOf(false) } + val hostBackAction = LocalNavigationBackAction.current + val authenticated = qViewModel.isAuthenticated && !qViewModel.isLogoutRequested + val businessReady = authenticated && LocalBusinessNavigationEnabled.current + LaunchedEffect(qViewModel.isLogoutRequested) + { + if (qViewModel.isLogoutRequested) { + accountOpen.value = false + } + } + val title = if (businessReady) qNavigator?.titleStack?.lastOrNull() ?: "Apps" else defaultTitle + + TopAppBar( + colors = TopAppBarDefaults.topAppBarColors(containerColor = MaterialTheme.colorScheme.primaryContainer), + title = { Text(title, maxLines = 1, overflow = TextOverflow.Ellipsis, modifier = Modifier.testTag("topAppBar.title")) }, + navigationIcon = { + Row { + if (navMenuCallback != null) + IconButton(onClick = navMenuCallback, modifier = Modifier.testTag("topBar.menuIcon")) + { Icon(Icons.Default.Menu, "Open navigation menu") } + if (businessReady && qNavigator?.atHome == false) + IconButton(onClick = hostBackAction ?: qNavigator::popStack) { Icon(Icons.AutoMirrored.Filled.ArrowBack, "Go Back") } + } + }, + actions = { + IconButton(onClick = { accountOpen.value = true }, modifier = Modifier.testTag("topBar.accountIcon")) + { Icon(Icons.Default.AccountCircle, "Account") } + } + ) + if (accountOpen.value) AccountDialog(qViewModel) { accountOpen.value = false } + + if (showNetworkDialog) { + NetworkConnectionDialog(qViewModel) + } + +} + + +/******************************************************************************* + ** Legacy internet-presence prompt; hosts with server reachability monitoring can omit it. + *******************************************************************************/ +@Composable +private fun NetworkConnectionDialog(qViewModel: QViewModel) { + val networkAvailable = remember { mutableStateOf(true) } + val connectivityManager = getSystemService(LocalContext.current, ConnectivityManager::class.java) as ConnectivityManager + DisposableEffect(connectivityManager) + { + val networks = NetworkPresence() + val request = NetworkRequest.Builder() + .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) + .addTransportType(NetworkCapabilities.TRANSPORT_WIFI) + .addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR) + .build() + val callback = object : ConnectivityManager.NetworkCallback() { + /******************************************************************************* + ** Update the network-presence model when Android reports an available network. + *******************************************************************************/ + override fun onAvailable(network: Network) { + networkAvailable.value = networks.onAvailable(network.networkHandle) + } + + /******************************************************************************* + ** Update the network-presence model for this lost network instead of unconditionally declaring the device offline. + *******************************************************************************/ + override fun onLost(network: Network) { + networkAvailable.value = networks.onLost(network.networkHandle) + } + } + connectivityManager.registerNetworkCallback(request, callback) + onDispose { connectivityManager.unregisterNetworkCallback(callback) } + } + if (!networkAvailable.value) { + NoNetworkDialog(qViewModel) + } +} + diff --git a/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/processes/FrontendStepFormat.kt b/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/processes/FrontendStepFormat.kt new file mode 100644 index 0000000..d0c9381 --- /dev/null +++ b/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/processes/FrontendStepFormat.kt @@ -0,0 +1,100 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2004-2024. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package com.kingsrook.qqq.frontend.android.mobileapp.ui.processes + +import androidx.compose.ui.text.intl.Locale +import androidx.compose.ui.text.toLowerCase + +/******************************************************************************* + ** when a frontend step specifies a "format", that implies a number of + ** different settings - which this class defines and its subclasses clarify. + *******************************************************************************/ +open class FrontendStepFormat { + /******************************************************************************* + ** Let the server-selected screen format control whether the standard step heading is rendered. + *******************************************************************************/ + open fun isStepLabelDisplayed() = true + + /******************************************************************************* + ** Keep standard screen spacing overridable for formats whose controls fill the display. + *******************************************************************************/ + open fun doesScreenGetPadding() = true + + /******************************************************************************* + ** Allow specialized formats to own submission controls instead of duplicating the standard footer. + *******************************************************************************/ + open fun areStandardFooterButtonsDisplayed() = true + + /******************************************************************************* + ** Make submit audio an explicit format policy rather than an assumption about process names. + *******************************************************************************/ + open fun playOnSubmitSound() = false + + /******************************************************************************* + ** Make loading audio opt-in so ordinary metadata screens stay silent. + *******************************************************************************/ + open fun playOnLoadingSound() = false + + /******************************************************************************* + ** Resolve advertised format names through a shared default instead of inventing process-specific behavior. + *******************************************************************************/ + companion object { + /******************************************************************************* + *******************************************************************************/ + fun of(format: String?): FrontendStepFormat { + return when ((format ?: "").toLowerCase(Locale.current)) { + "scanner" -> ScannerFormat() + else -> DefaultFormat() + } + } + + } +} + +/******************************************************************************* + *******************************************************************************/ +class DefaultFormat : FrontendStepFormat() + +/******************************************************************************* + *******************************************************************************/ +class ScannerFormat : FrontendStepFormat() { + /******************************************************************************* + *******************************************************************************/ + override fun isStepLabelDisplayed() = false + + /******************************************************************************* + *******************************************************************************/ + override fun doesScreenGetPadding() = false + + /******************************************************************************* + *******************************************************************************/ + override fun areStandardFooterButtonsDisplayed() = false + + /******************************************************************************* + *******************************************************************************/ + override fun playOnSubmitSound() = true + + /******************************************************************************* + *******************************************************************************/ + override fun playOnLoadingSound() = true +} diff --git a/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/processes/ProcessBottomButtons.kt b/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/processes/ProcessBottomButtons.kt new file mode 100644 index 0000000..38656ad --- /dev/null +++ b/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/processes/ProcessBottomButtons.kt @@ -0,0 +1,58 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2004-2026. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.kingsrook.qqq.frontend.android.mobileapp.ui.processes + +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.requiredWidth +import androidx.compose.material3.Button +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.unit.dp +import com.kingsrook.qqq.frontend.android.mobileapp.viewmodel.ProcessViewModel + +/******************************************************************************* + *******************************************************************************/ +@Composable +fun ProcessBottomButtons(processViewModel: ProcessViewModel) { + Row( + horizontalArrangement = Arrangement.SpaceEvenly, + modifier = Modifier.fillMaxWidth() + ) + { + val noMoreSteps = processViewModel.getNoMoreSteps() + + Button(onClick = processViewModel::requestClose, enabled = !processViewModel.cancelling, modifier = Modifier.requiredWidth(100.dp)) + { + Text(if (noMoreSteps) "Close" else "Cancel") + } + + if (!noMoreSteps) { + Button(onClick = { processViewModel.runStep() }, enabled = !processViewModel.waitingOnBackend && !processViewModel.cancelling && processViewModel.clientWorkBlockReason == null && processViewModel.unsupportedReason() == null, modifier = Modifier.requiredWidth(100.dp)) + { + Text(processViewModel.getNextButtonLabel()) + } + } + } +} diff --git a/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/processes/ProcessSound.kt b/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/processes/ProcessSound.kt new file mode 100644 index 0000000..0e9f9ac --- /dev/null +++ b/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/processes/ProcessSound.kt @@ -0,0 +1,49 @@ +/* Copyright (c) 2026 QRunIO. SPDX-License-Identifier: Apache-2.0 */ +package com.kingsrook.qqq.frontend.android.mobileapp.ui.processes + +/******************************************************************************* + ** One sound player per composed process screen, released on stop or disposal and recreated on demand. + *******************************************************************************/ +internal class ProcessSound(private val create: () -> Playback?) { + /******************************************************************************* + ** Small platform boundary so lifecycle resource ownership can be verified without native audio. + *******************************************************************************/ + interface Playback { + /******************************************************************************* + ** Begin optional process audio through an injected resource boundary so playback behavior is testable. + *******************************************************************************/ + fun start() + + /******************************************************************************* + ** Release optional audio ownership when playback finishes or its process lifetime ends. + *******************************************************************************/ + fun release() + } + + private var player: Playback? = null + + /******************************************************************************* + ** Repeated submits/ticks reuse the same live player. + *******************************************************************************/ + fun play() { + try { + if (player == null) player = create() + player?.start() + } catch (exception: RuntimeException) { + // Optional audio feedback must not interrupt a process action when the device's audio service fails. + release() + } + } + + /******************************************************************************* + ** Stop and disposal may both fire; release each allocated player exactly once. + *******************************************************************************/ + fun release() { + val previous = player + player = null + try { + previous?.release() + } catch (exception: RuntimeException) { /* The audio service may already have reclaimed the resource. */ + } + } +} diff --git a/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/processes/ProcessStepLoading.kt b/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/processes/ProcessStepLoading.kt new file mode 100644 index 0000000..a9902a2 --- /dev/null +++ b/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/processes/ProcessStepLoading.kt @@ -0,0 +1,126 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2004-2024. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package com.kingsrook.qqq.frontend.android.mobileapp.ui.processes + +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.width +import androidx.compose.material3.CircularProgressIndicator +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.mutableIntStateOf +import androidx.compose.runtime.remember +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.unit.dp +import com.kingsrook.qqq.frontend.android.mobileapp.ui.common.FullSizedAllCenteredColumn +import com.kingsrook.qqq.frontend.android.mobileapp.viewmodel.ProcessViewModel +import kotlinx.coroutines.delay +import java.time.format.DateTimeFormatter + + +/******************************************************************************* + ** Loading screen within a process - e.g., when server-side async processing + ** is running long + *******************************************************************************/ +@Composable +fun ProcessStepLoading(processViewModel: ProcessViewModel) { + val playCount = remember { mutableIntStateOf(0) } + val playTick = rememberProcessSound(ProcessTone.LOADING) + + //////////////////////////////////////////////////////////////////////////////////////////// + // monitor the jobRunningLastUpdate timestamp - it gets updated after a checkIn completes // + // re-run checkins until the state becomes success or error // + //////////////////////////////////////////////////////////////////////////////////////////// + LaunchedEffect(processViewModel.jobRunningLastUpdated) + { + delay(1000) + if (processViewModel.waitingOnBackend) { + processViewModel.checkIn() + } + } + + ///////////////////////////////////////////////////////////////////////////////////////////////////////////////// + // use a separate effect, that will fire every second (regardless of if backend is responding), to play 'tick' // + ///////////////////////////////////////////////////////////////////////////////////////////////////////////////// + val format = FrontendStepFormat.of(processViewModel.activeStep?.format) + if (format.playOnLoadingSound()) { + LaunchedEffect(playCount.intValue) + { + if (processViewModel.waitingOnBackend) { + playTick() + delay(1000) + playCount.intValue += 1 + } + } + } + + ////////////////////////////////////////////////////////////// + // try to remove the media player when the screen goes away // + ////////////////////////////////////////////////////////////// + + val indicatorSize = 64.dp + + FullSizedAllCenteredColumn(Modifier) + { + ///////////////// + // status text // + ///////////////// + Column( + modifier = Modifier + .align(Alignment.CenterHorizontally) + .fillMaxWidth(.75f) + ) + { + val commonModifier = Modifier + .align(Alignment.CenterHorizontally) + .padding(bottom = 4.dp) + + if (processViewModel.jobRunningMessage != "") { + Text(processViewModel.jobRunningMessage, modifier = commonModifier) + } else { + Text("Working...", modifier = commonModifier) + } + + if (processViewModel.currentOfTotalMessage != "") { + Text(processViewModel.currentOfTotalMessage, modifier = commonModifier) + } + + Text("Updated at: ${processViewModel.jobRunningLastUpdated.format(DateTimeFormatter.ofPattern("h:mm:ss"))}", modifier = commonModifier) + } + + CircularProgressIndicator( + modifier = Modifier + .width(indicatorSize) + .height(indicatorSize), + color = MaterialTheme.colorScheme.secondary, + trackColor = MaterialTheme.colorScheme.surfaceVariant, + ) + androidx.compose.material3.Button(onClick = processViewModel::cancel, enabled = !processViewModel.cancelling) { Text("Cancel") } + + } +} diff --git a/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/processes/QProcessHome.kt b/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/processes/QProcessHome.kt new file mode 100644 index 0000000..385f877 --- /dev/null +++ b/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/processes/QProcessHome.kt @@ -0,0 +1,261 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2004-2024. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package com.kingsrook.qqq.frontend.android.mobileapp.ui.processes + +import android.content.Context +import android.media.AudioManager +import android.media.MediaPlayer +import android.media.ToneGenerator +import androidx.activity.compose.BackHandler +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.imePadding +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.verticalScroll +import androidx.compose.material3.Text +import androidx.compose.material3.Button +import androidx.compose.runtime.Composable +import androidx.compose.runtime.DisposableEffect +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.key +import androidx.compose.runtime.remember +import androidx.compose.ui.Modifier +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import androidx.compose.ui.zIndex +import androidx.lifecycle.Lifecycle +import androidx.lifecycle.LifecycleEventObserver +import androidx.lifecycle.compose.LocalLifecycleOwner +import com.kingsrook.qqq.frontend.android.core.model.metadata.QComponentType +import com.kingsrook.qqq.frontend.android.core.model.metadata.QInstance +import com.kingsrook.qqq.frontend.android.core.model.processes.QJobComplete +import com.kingsrook.qqq.frontend.android.core.model.processes.QJobError +import com.kingsrook.qqq.frontend.android.core.model.processes.QJobRunning +import com.kingsrook.qqq.frontend.android.core.model.processes.QJobStarted +import com.kingsrook.qqq.frontend.android.mobileapp.ui.LocalNavigationBackAction +import com.kingsrook.qqq.frontend.android.mobileapp.ui.processes.components.ProcessComponentEditForm +import com.kingsrook.qqq.frontend.android.mobileapp.ui.processes.components.ProcessComponentViewForm +import com.kingsrook.qqq.frontend.android.mobileapp.ui.processes.components.ProcessComponentHTML +import com.kingsrook.qqq.frontend.android.mobileapp.ui.processes.components.ProcessComponentHelpText +import com.kingsrook.qqq.frontend.android.mobileapp.ui.processes.components.ProcessComponentProcessSummaryResults +import com.kingsrook.qqq.frontend.android.mobileapp.ui.processes.components.ProcessComponentWidget +import com.kingsrook.qqq.frontend.android.mobileapp.ui.processes.components.UnsupportedProcessComponent +import com.kingsrook.qqq.frontend.android.mobileapp.ui.utils.Colors +import com.kingsrook.qqq.frontend.android.mobileapp.ui.utils.LoadStateView +import com.kingsrook.qqq.frontend.android.mobileapp.viewmodel.LoadState +import com.kingsrook.qqq.frontend.android.mobileapp.viewmodel.ProcessViewModel +import com.kingsrook.qqq.frontend.android.mobileapp.viewmodel.QViewModel +import kotlinx.coroutines.delay + +/******************************************************************************* + *******************************************************************************/ +@Composable +fun QProcessHome(qViewModel: QViewModel, qInstance: QInstance, modifier: Modifier = Modifier) { + val processViewModel = qViewModel.activeProcessViewModel + if (processViewModel == null) { + Text("Error: ProcessViewModel was not available.", color = Colors.ERROR) + return + } + + val processMetaDataLoadState = processViewModel.processMetaDataLoadState + val hostBackAction = LocalNavigationBackAction.current + BackHandler { if (hostBackAction != null) hostBackAction() else qViewModel.qNavigator.popStack() } + val initLoadState = processViewModel.initLoadState + val topLevelErrorState = processViewModel.topLevelErrorState + val loadStates = listOf(processMetaDataLoadState, initLoadState, topLevelErrorState) + + val playSubmitSound = rememberProcessSound(ProcessTone.SUBMIT) + processViewModel.onSubmitCallback = + { + val format = FrontendStepFormat.of(processViewModel.activeStep?.format) + if (format.playOnSubmitSound()) { + playSubmitSound() + } + } + + ////////////////////////////////////////////////////////////// + // try to remove the media player when the screen goes away // + ////////////////////////////////////////////////////////////// + + /////////////////////////////////////////////////////////////////////////////////////////// + // in case the init job has gone async - this LaunchedEffect will make us check in on it // + /////////////////////////////////////////////////////////////////////////////////////////// + LaunchedEffect(key1 = processViewModel.jobRunningLastUpdated) + { + if (processViewModel.initLoadState is LoadState.Loading && processViewModel.processUUID != null && processViewModel.waitingOnBackend && !processViewModel.cancelling) { + delay(1000) + processViewModel.checkIn() + } + } + + Column(modifier.fillMaxSize()) + { + LoadStateView( + loadStates, + modifier = Modifier.weight(1f), + reloader = processViewModel.retryLabel()?.let { label -> + com.kingsrook.qqq.frontend.android.mobileapp.ui.utils.Reloader(label, { processViewModel.retryPendingStep() }) + }, + loadingText = "Loading Process" + ) + { + val lastStepResult = processViewModel.lastStepResult + + Column() + { + /////////////////////////////////////////////////////////////////////////////////////////////////////////// + // use the step-instance-counter as key here - to help drive re-composition when advancing through steps // + /////////////////////////////////////////////////////////////////////////////////////////////////////////// + key(processViewModel.stepInstanceCounter) + { + when (lastStepResult) { + is QJobRunning, + is QJobStarted -> { + ProcessStepLoading(processViewModel) + } + + is QJobComplete -> { + ProcessFrontendStepView(processViewModel, qInstance) + } + + is QJobError -> { + Text("Error: ${lastStepResult.userFacingError ?: lastStepResult.error}") + } + } + } + } + + } + if (LoadState.areAnyErrors(loadStates) || LoadState.areAnyLoading(loadStates)) { + Button(onClick = processViewModel::requestClose, enabled = !processViewModel.cancelling) { Text("Cancel") } + } + } +} + +/******************************************************************************* + ** composable that outputs a frontend process step - its components basically + *******************************************************************************/ +@Composable +fun ProcessFrontendStepView(processViewModel: ProcessViewModel, qInstance: QInstance, modifier: Modifier = Modifier) { + val format = FrontendStepFormat.of(processViewModel.activeStep?.format) + + Column(modifier.fillMaxSize().imePadding()) + { + Column( + modifier = Modifier.weight(1f).verticalScroll(rememberScrollState()) + .padding(if (format.doesScreenGetPadding()) 8.dp else 0.dp) + .zIndex(1f) + ) + { + if (format.isStepLabelDisplayed()) { + Text(processViewModel.activeStep?.label ?: if (processViewModel.getNoMoreSteps()) "Complete" else "", fontWeight = FontWeight.Bold, fontSize = 20.sp) + } + + processViewModel.activeStep?.components?.forEach() + { component -> + when (component.type) { + QComponentType.EDIT_FORM -> ProcessComponentEditForm(processViewModel, component) + QComponentType.VIEW_FORM -> ProcessComponentViewForm(processViewModel, component) + QComponentType.HELP_TEXT -> ProcessComponentHelpText(processViewModel, component) + QComponentType.HTML -> ProcessComponentHTML(processViewModel, component) + QComponentType.PROCESS_SUMMARY_RESULTS -> ProcessComponentProcessSummaryResults(processViewModel, component) + QComponentType.WIDGET -> ProcessComponentWidget(processViewModel, qInstance, component, disableControls = processViewModel.waitingOnBackend || processViewModel.cancelling || processViewModel.unsupportedReason() != null || processViewModel.getNoMoreSteps()) + else -> UnsupportedProcessComponent(processViewModel, component) + } + } + + processViewModel.unsupportedReason()?.takeUnless { processViewModel.getNoMoreSteps() }?.let { Text(it, color = Colors.ERROR) } + processViewModel.submissionError?.let { Text(it, color = Colors.ERROR) } + } + if (format.areStandardFooterButtonsDisplayed() || processViewModel.unsupportedReason() != null || processViewModel.getNoMoreSteps()) { + ProcessBottomButtons(processViewModel) + } + } +} + +/******************************************************************************* + *******************************************************************************/ +fun createMediaPlayer(context: Context, resourceId: Int): MediaPlayer? { + val player: MediaPlayer? = MediaPlayer.create(context, resourceId) + player?.setVolume(1f, 1f) + return player +} + +/******************************************************************************* + *******************************************************************************/ +@Composable +internal fun rememberProcessSound(tone: ProcessTone): () -> Unit { + val lifecycleOwner = LocalLifecycleOwner.current + val sound = remember(tone) + { + ProcessSound { + val generator = ToneGenerator(AudioManager.STREAM_MUSIC, 50) + object : ProcessSound.Playback { + /******************************************************************************* + ** Delegate optional process audio to the current Android media player without changing process state. + *******************************************************************************/ + override fun start() { + generator.startTone(tone.platformType, tone.durationMs) + } + + /******************************************************************************* + ** Release the current media player when the process sound owner is disposed. + *******************************************************************************/ + override fun release() = generator.release() + } + } + } + DisposableEffect(lifecycleOwner, sound) + { + val observer = LifecycleEventObserver() + { _, event -> + if (event == Lifecycle.Event.ON_STOP) { + sound.release() + } + } + + lifecycleOwner.lifecycle.addObserver(observer) + + onDispose() + { + lifecycleOwner.lifecycle.removeObserver(observer) + sound.release() + } + } + return { + if (lifecycleOwner.lifecycle.currentState.isAtLeast(Lifecycle.State.STARTED)) { + sound.play() + } + } +} + +/******************************************************************************* + ** Platform-generated feedback avoids redistributing recordings of unknown origin. + *******************************************************************************/ +internal enum class ProcessTone(val platformType: Int, val durationMs: Int) { + SUBMIT(ToneGenerator.TONE_PROP_ACK, 80), + LOADING(ToneGenerator.TONE_PROP_BEEP, 25) +} + diff --git a/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/processes/components/PlainText.kt b/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/processes/components/PlainText.kt new file mode 100644 index 0000000..aa9c63a --- /dev/null +++ b/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/processes/components/PlainText.kt @@ -0,0 +1,9 @@ +/* Copyright (c) 2026 QRunIO. SPDX-License-Identifier: Apache-2.0 */ +package com.kingsrook.qqq.frontend.android.mobileapp.ui.processes.components + +import androidx.core.text.HtmlCompat + +/******************************************************************************* + ** Compatibility fallback when an older server has no semantic plain-text sibling. + *******************************************************************************/ +internal fun plainText(html: String): String = HtmlCompat.fromHtml(html, HtmlCompat.FROM_HTML_MODE_LEGACY).toString().trim() diff --git a/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/processes/components/ProcessComponentEditForm.kt b/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/processes/components/ProcessComponentEditForm.kt new file mode 100644 index 0000000..0b93739 --- /dev/null +++ b/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/processes/components/ProcessComponentEditForm.kt @@ -0,0 +1,150 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2004-2024. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package com.kingsrook.qqq.frontend.android.mobileapp.ui.processes.components + +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.text.KeyboardActions +import androidx.compose.foundation.text.KeyboardOptions +import androidx.compose.ui.platform.LocalFocusManager +import androidx.compose.ui.platform.LocalSoftwareKeyboardController +import androidx.compose.ui.text.input.ImeAction +import androidx.compose.ui.text.input.KeyboardType +import androidx.compose.material3.Checkbox +import androidx.compose.material3.DropdownMenu +import androidx.compose.material3.DropdownMenuItem +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.OutlinedButton +import androidx.compose.material3.Text +import androidx.compose.material3.TextField +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Modifier +import androidx.compose.ui.text.input.PasswordVisualTransformation +import androidx.compose.ui.text.input.VisualTransformation +import androidx.compose.ui.unit.dp +import com.kingsrook.qqq.frontend.android.core.model.metadata.QFieldType +import com.kingsrook.qqq.frontend.android.core.model.metadata.QFrontendComponent +import com.kingsrook.qqq.frontend.android.mobileapp.viewmodel.ProcessViewModel +import com.kingsrook.qqq.frontend.android.mobileapp.viewmodel.SemanticProcess +import com.kingsrook.qqq.frontend.android.mobileapp.viewmodel.semanticFieldHint +import com.kingsrook.qqq.frontend.android.mobileapp.viewmodel.semanticInitialValue + +/******************************************************************************* + ** Render server-selected editable fields and write changes into the current process values using semantic metadata. + *******************************************************************************/ +@Composable +fun ProcessComponentEditForm(processViewModel: ProcessViewModel, component: QFrontendComponent) { + val focusManager = LocalFocusManager.current + val keyboard = LocalSoftwareKeyboardController.current + Column { + (component.values["sectionLabel"] as? String)?.let { Text(it) } + SemanticProcess.fields(processViewModel.activeStep, component).forEach { field -> + var value by remember(processViewModel.stepInstanceCounter, field.name) { + mutableStateOf(semanticInitialValue(field, processViewModel.processValues)) + } + val enabled = field.isEditable && !processViewModel.waitingOnBackend && !processViewModel.cancelling && processViewModel.unsupportedReason() == null + val error = processViewModel.fieldErrors[field.name] + + /******************************************************************************* + ** Keep the displayed field value and submission map synchronized for the same semantic field. + *******************************************************************************/ + fun change(newValue: Any?) { + value = newValue + processViewModel.processValues[field.name] = newValue + // Dependent possible-value sources (for example media for a printer) re-query, disable or drop their selection. + processViewModel.fieldChanged(field.name) + } + val remote = field.possibleValueSourceName != null && field.inlinePossibleValueSource.isNullOrEmpty() + val blocked = processViewModel.remoteOptionsBlockedReason(field) + val reset = processViewModel.fieldResets[field.name] + LaunchedEffect(processViewModel.stepInstanceCounter, field.name) { + if (!processViewModel.processValues.containsKey(field.name)) processViewModel.processValues[field.name] = value + if (field.isEditable) processViewModel.registerFormFieldName(field.name) + if (remote) processViewModel.loadRemoteOptions(field) + } + // The view model cleared this selection because its controlling field changed or the choice no longer exists. + LaunchedEffect(reset) { if (reset != null) value = processViewModel.processValues[field.name] } + Column(Modifier.fillMaxWidth().padding(8.dp)) { + val options = if (remote) processViewModel.remoteOptions[field.name].orEmpty() else field.inlinePossibleValueSource.orEmpty() + if (remote || options.isNotEmpty()) { + var expanded by remember { mutableStateOf(false) } + Text(field.label) + OutlinedButton(onClick = { expanded = true }, enabled = enabled && blocked == null) { + Text(options.firstOrNull { it.id.toString() == value?.toString() }?.label ?: "Choose a value") + } + DropdownMenu(expanded = expanded, onDismissRequest = { expanded = false }) { + if (!field.isRequired && field.validation?.required != true) DropdownMenuItem(text = { Text("None") }, onClick = { change(null); expanded = false }) + options.forEach { option -> DropdownMenuItem(text = { Text(option.label) }, onClick = { change(option.id); expanded = false }) } + } + } else if (field.type == QFieldType.BOOLEAN) { + Row { Checkbox(checked = value == true || value == "true", onCheckedChange = { change(it) }, enabled = enabled); Text(field.label) } + } else { + val multiline = field.type in setOf(QFieldType.TEXT, QFieldType.HTML) + TextField( + value = value?.toString().orEmpty(), onValueChange = { change(it) }, + label = { Text(field.label + if (field.isRequired || field.validation?.required == true) " *" else "") }, + enabled = enabled, isError = error != null, + singleLine = !multiline, + keyboardOptions = KeyboardOptions( + imeAction = if (multiline) ImeAction.Default else ImeAction.Done, + keyboardType = if (field.type == QFieldType.PASSWORD) KeyboardType.Password else KeyboardType.Text + ), + keyboardActions = KeyboardActions(onDone = { focusManager.clearFocus(); keyboard?.hide() }), + visualTransformation = if (field.type == QFieldType.PASSWORD) PasswordVisualTransformation() else VisualTransformation.None, + modifier = Modifier.fillMaxWidth() + ) + } + if (error != null) Text(error, color = MaterialTheme.colorScheme.error) + blocked?.let { Text(it) } + processViewModel.remoteOptionErrors[field.name]?.let { message -> + Text(message, color = MaterialTheme.colorScheme.error) + OutlinedButton(onClick = { processViewModel.loadRemoteOptions(field) }) { Text("Retry choices") } + } + semanticFieldHint(field)?.let { Text(it) } + field.helpContents.orEmpty().forEach { Text(it.contentAsText ?: plainText(it.content)) } + } + } + } +} + +/******************************************************************************* + ** Render visible server-selected fields read-only, masking password values and stripping display HTML. + *******************************************************************************/ +@Composable +fun ProcessComponentViewForm(processViewModel: ProcessViewModel, component: QFrontendComponent) { + Column { + SemanticProcess.fields(processViewModel.activeStep, component).forEach { field -> + val value = processViewModel.processValues[field.name] + val display = field.inlinePossibleValueSource?.firstOrNull { it.id.toString() == value?.toString() }?.label + ?: if (field.type == QFieldType.PASSWORD && value != null) "••••••" else value?.toString().orEmpty() + Text("${field.label}: ${if (field.type == QFieldType.HTML) plainText(display) else display}", Modifier.padding(8.dp)) + } + } +} diff --git a/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/processes/components/ProcessComponentHTML.kt b/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/processes/components/ProcessComponentHTML.kt new file mode 100644 index 0000000..86b2149 --- /dev/null +++ b/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/processes/components/ProcessComponentHTML.kt @@ -0,0 +1,57 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2004-2024. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package com.kingsrook.qqq.frontend.android.mobileapp.ui.processes.components + +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.text.AnnotatedString +import androidx.compose.ui.text.fromHtml +import androidx.compose.ui.unit.dp +import com.kingsrook.qqq.frontend.android.core.model.metadata.QFrontendComponent +import com.kingsrook.qqq.frontend.android.mobileapp.viewmodel.ProcessViewModel + +/******************************************************************************* + *******************************************************************************/ +@Composable +fun ProcessComponentHTML(processViewModel: ProcessViewModel, @Suppress("UNUSED_PARAMETER") component: QFrontendComponent) // Keep the uniform renderer API; this renderer reads HTML from the active process values. +{ + val semanticText = processViewModel.processValues["${processViewModel.activeStep?.name}.text"] as? String + val processValue = processViewModel.processValues["${processViewModel.activeStep?.name}.html"] + val html: String = if (processValue is String) { + processValue + } else if (processValue == null) { + "" + } else { + processValue.toString() + } + + Text( + semanticText ?: plainText(html), + modifier = Modifier + .fillMaxWidth() + .padding(vertical = 12.dp) + ) +} diff --git a/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/processes/components/ProcessComponentHelpText.kt b/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/processes/components/ProcessComponentHelpText.kt new file mode 100644 index 0000000..413e6ae --- /dev/null +++ b/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/processes/components/ProcessComponentHelpText.kt @@ -0,0 +1,46 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2004-2024. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package com.kingsrook.qqq.frontend.android.mobileapp.ui.processes.components + +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.unit.dp +import com.kingsrook.qqq.frontend.android.core.model.metadata.QFrontendComponent +import com.kingsrook.qqq.frontend.android.mobileapp.viewmodel.ProcessViewModel + +/******************************************************************************* + *******************************************************************************/ +@Composable +fun ProcessComponentHelpText(processViewModel: ProcessViewModel, component: QFrontendComponent) { + Text( + (processViewModel.processValues["text"] ?: component.values["text"])?.toString().orEmpty(), + color = Color.Gray, + modifier = Modifier + .fillMaxWidth() + .padding(12.dp) + ) +} diff --git a/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/processes/components/ProcessComponentProcessSummaryResults.kt b/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/processes/components/ProcessComponentProcessSummaryResults.kt new file mode 100644 index 0000000..3beaa21 --- /dev/null +++ b/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/processes/components/ProcessComponentProcessSummaryResults.kt @@ -0,0 +1,50 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2004-2024. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package com.kingsrook.qqq.frontend.android.mobileapp.ui.processes.components + +import androidx.compose.foundation.layout.Column +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import com.kingsrook.qqq.frontend.android.core.model.metadata.QFrontendComponent +import com.kingsrook.qqq.frontend.android.mobileapp.viewmodel.ProcessViewModel + +/******************************************************************************* + ** Render the server's process summary results rather than inferring completion details from client state. + *******************************************************************************/ +@Composable +fun ProcessComponentProcessSummaryResults(processViewModel: ProcessViewModel, @Suppress("UNUSED_PARAMETER") component: QFrontendComponent) // Keep the uniform renderer API; result rows come from authoritative process values. +{ + Column { + (processViewModel.processValues["recordCount"] as? Number)?.let { Text("$it records processed") } + (processViewModel.processValues["processResults"] as? List<*>)?.forEach { result -> + if (result is Map<*, *>) { + val status = result["status"]?.toString().orEmpty() + val count = (result["count"] as? Number)?.let { "$it " }.orEmpty() + val message = result["message"]?.toString().orEmpty() + Text("$status: $count$message") + // Keep server-provided destinations visible without assuming web routes are native screens. + result["link"]?.toString()?.let { Text(it) } + } + } + } +} diff --git a/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/processes/components/ProcessComponentWidget.kt b/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/processes/components/ProcessComponentWidget.kt new file mode 100644 index 0000000..73c9f58 --- /dev/null +++ b/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/processes/components/ProcessComponentWidget.kt @@ -0,0 +1,189 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2004-2024. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package com.kingsrook.qqq.frontend.android.mobileapp.ui.processes.components + +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.remember +import androidx.compose.ui.Modifier +import androidx.compose.ui.unit.dp +import com.kingsrook.qqq.frontend.android.core.model.metadata.QFrontendComponent +import com.kingsrook.qqq.frontend.android.core.model.metadata.QInstance +import com.kingsrook.qqq.frontend.android.core.model.widgets.WidgetBlock +import com.kingsrook.qqq.frontend.android.mobileapp.ui.utils.Colors +import com.kingsrook.qqq.frontend.android.mobileapp.ui.widgets.blocks.WidgetBlockComposable +import com.kingsrook.qqq.frontend.android.mobileapp.ui.widgets.blocks.WidgetBlockParameters +import com.kingsrook.qqq.frontend.android.mobileapp.viewmodel.ProcessViewModel +import com.kingsrook.qqq.frontend.android.mobileapp.viewmodel.SemanticProcess + +/******************************************************************************* + ** process-component to render a widget + *******************************************************************************/ +@Composable +fun ProcessComponentWidget(processViewModel: ProcessViewModel, qInstance: QInstance, component: QFrontendComponent, disableControls: Boolean = false) { + val state = remember(processViewModel.stepInstanceCounter, component) { determineState(processViewModel, qInstance, component) } + + // The process owns vertical scrolling so widgets and forms share one viewport. + Column(Modifier.fillMaxWidth()) + { + (state.headerBlockList + state.bodyBlockList + state.footerBlockList).forEach() + { widgetBlock -> + WidgetBlockComposable( + WidgetBlockParameters(widgetBlock, processViewModel::actionCallback, processViewModel.qViewModel, processViewModel.processValues), + disableControls = disableControls, + modifier = Modifier, + ) + } + state.warningStrings.forEach() + { warning -> + Text(warning, color = Colors.WARNING, modifier = Modifier.padding(8.dp)) + } + } +} + +/******************************************************************************* + ** container for the state within this widget + *******************************************************************************/ +data class ProcessComponentWidgetState( + val warningStrings: List<String> = mutableListOf(), + val headerBlockList: List<WidgetBlock> = mutableListOf(), + val bodyBlockList: List<WidgetBlock> = mutableListOf(), + val footerBlockList: List<WidgetBlock> = mutableListOf(), + val needFullHeight: Boolean = false, +) + +/******************************************************************************* + ** function to figure out the (initial, and probably only) state of this + ** widget + *******************************************************************************/ +private fun determineState(processViewModel: ProcessViewModel, qInstance: QInstance, component: QFrontendComponent): ProcessComponentWidgetState { + val warningStrings = mutableListOf<String>() + val headerBlockList = mutableListOf<WidgetBlock>() + val bodyBlockList = mutableListOf<WidgetBlock>() + val footerBlockList = mutableListOf<WidgetBlock>() + val needFullHeight = false + + ////////////////////////////////////////////////////////////////////////////////////////////// + // if this component says it's a list of adhoc widgets, then do some pre-processing on them // + ////////////////////////////////////////////////////////////////////////////////////////////// + val widgetBlockList = mutableListOf<WidgetBlock>() + + if (component.values["isAdHocWidget"] == true) { + val blocks = component.values["blocks"] + if (blocks is List<*>) { + blocks.forEach() + { block -> + val widgetBlock = WidgetBlock.fromMap(block) + if (widgetBlock != null) { + widgetBlockList.add(widgetBlock) + } + } + } else { + warningStrings.add("Widget blocks was not an expected type.") + } + + } else if (component.values["widgetName"] != null) { + val widgetName = "${component.values["widgetName"]}" + val widgetMetaData = qInstance.widgets?.get(widgetName) + if (widgetMetaData == null) { + warningStrings.add("Undefined widget: ${widgetName}") + } else { + if (widgetMetaData.type == "composite") { + val widgetData = processViewModel.processValues[widgetName] + var foundBlocks = false + if (widgetData is Map<*, *>) { + val blocks = widgetData["subBlocks"] + if (blocks is List<*>) { + blocks.forEach() + { block -> + val widgetBlock = WidgetBlock.fromMap(block) + if (widgetBlock != null) { + widgetBlockList.add(widgetBlock) + foundBlocks = true + } + } + } + } + + if (!foundBlocks) { + warningStrings.add("Could not find widget block data in process.") + } + } else { + warningStrings.add("Not-yet implemented widget type: ${widgetMetaData.type}") + } + } + } else { + warningStrings.add("Missing required values in a wiget component") + } + + ///////////////////////////////////////////////////////////////////////////////////////// + // split into body & footer lists // + ///////////////////////////////////////////////////////////////////////////////////////// + evaluateWidgetBlocks(widgetBlockList, processViewModel.processValues) + bodyBlockList.addAll(widgetBlockList) + + return ProcessComponentWidgetState(warningStrings, headerBlockList, bodyBlockList, footerBlockList, needFullHeight) +} + +/******************************************************************************* + ** applies "conditional" logic to blocks; interpolate values too. + *******************************************************************************/ +fun evaluateWidgetBlocks(widgetBlockList: MutableList<WidgetBlock>, processValues: MutableMap<String, Any?>) { + val iterator = widgetBlockList.iterator() + while (iterator.hasNext()) { + val widgetBlock = iterator.next() + + //////////////////////////////////////////////////////////////////// + // if the block has a conditional, evaluate, and remove if untrue // + //////////////////////////////////////////////////////////////////// + if (!SemanticProcess.widgetVisible(widgetBlock.conditional, processValues)) { + iterator.remove() + continue + } + + if (widgetBlock.blockType == "COMPOSITE") { + ///////////////////////////////////////// + // make recursive calls for composites // + ///////////////////////////////////////// + val mutableSubBlocks = widgetBlock.subBlocks.toMutableList() + evaluateWidgetBlocks(mutableSubBlocks, processValues) + widgetBlock.subBlocks = mutableSubBlocks + } else if (widgetBlock.blockType == "INPUT_FIELD") { + ///////////////////////////////////////////////////////////////////////////////////////////////////////////// + // for input fields, put the process's value for the field-name into the block's values object as '.value' // + ///////////////////////////////////////////////////////////////////////////////////////////////////////////// + } else if (widgetBlock.blockType == "TEXT") { + var text = widgetBlock.values["text"] + if (text != null && text is String) { + for (entry in processValues.entries) { + text = (text as String).replace('$' + "{" + entry.key + "}", "${processValues[entry.key]}") + } + } + widgetBlock.values["interpolatedText"] = text + } + } +} + diff --git a/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/processes/components/UnsupportedProcessComponent.kt b/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/processes/components/UnsupportedProcessComponent.kt new file mode 100644 index 0000000..6de9937 --- /dev/null +++ b/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/processes/components/UnsupportedProcessComponent.kt @@ -0,0 +1,52 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2004-2026. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.kingsrook.qqq.frontend.android.mobileapp.ui.processes.components + +import androidx.compose.foundation.border +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.text.font.FontStyle +import androidx.compose.ui.unit.dp +import com.kingsrook.qqq.frontend.android.core.model.metadata.QFrontendComponent +import com.kingsrook.qqq.frontend.android.mobileapp.viewmodel.ProcessViewModel + +/******************************************************************************* + *******************************************************************************/ +@Composable +fun UnsupportedProcessComponent(@Suppress("UNUSED_PARAMETER") processViewModel: ProcessViewModel, component: QFrontendComponent) // Keep the uniform renderer API; unsupported metadata is displayed without touching process state. +{ + Text( + "Unsupported component type: ${component.type}", + fontStyle = FontStyle.Italic, + color = Color.Gray, + modifier = Modifier + .fillMaxWidth() + .padding(8.dp) + .border(1.dp, Color.Black, RoundedCornerShape(8.dp)) + .padding(12.dp) + ) +} diff --git a/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/records/RecordScreens.kt b/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/records/RecordScreens.kt new file mode 100644 index 0000000..4bf6004 --- /dev/null +++ b/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/records/RecordScreens.kt @@ -0,0 +1,283 @@ +/* Copyright (c) 2026 QRunIO. SPDX-License-Identifier: Apache-2.0 */ +package com.kingsrook.qqq.frontend.android.mobileapp.ui.records + +import androidx.activity.compose.BackHandler +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items +import androidx.compose.foundation.lazy.rememberLazyListState +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.verticalScroll +import androidx.compose.material3.AlertDialog +import androidx.compose.material3.Button +import androidx.compose.material3.DropdownMenu +import androidx.compose.material3.DropdownMenuItem +import androidx.compose.material3.HorizontalDivider +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.OutlinedTextField +import androidx.compose.material3.ScrollableTabRow +import androidx.compose.material3.Tab +import androidx.compose.material3.Text +import androidx.compose.material3.TextButton +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.compositionLocalOf +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.saveable.rememberSaveableStateHolder +import androidx.compose.runtime.saveable.rememberSaveable +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.testTag +import androidx.compose.ui.text.style.TextOverflow +import androidx.compose.ui.unit.dp +import com.kingsrook.qqq.frontend.android.core.model.RecordData +import com.kingsrook.qqq.frontend.android.core.model.RecordSearch +import com.kingsrook.qqq.frontend.android.core.model.formatted +import com.kingsrook.qqq.frontend.android.core.model.parentMatches +import com.kingsrook.qqq.frontend.android.core.model.recordGroups +import com.kingsrook.qqq.frontend.android.core.model.recordSearchFields +import com.kingsrook.qqq.frontend.android.core.model.summary +import com.kingsrook.qqq.frontend.android.core.model.textFields +import com.kingsrook.qqq.frontend.android.core.model.metadata.QRecordAssociation +import com.kingsrook.qqq.frontend.android.core.model.metadata.QTableMetaData +import com.kingsrook.qqq.frontend.android.mobileapp.viewmodel.QViewModel +import com.kingsrook.qqq.frontend.android.mobileapp.ui.LocalNavigationBackAction +import kotlinx.coroutines.CancellationException +import kotlinx.coroutines.delay +import kotlinx.serialization.json.JsonPrimitive + +/** Attachment state stays mounted even when another tab is selected. */ +data class RecordAttachmentUi(val photosVisible: Boolean, val captureVisible: Boolean, val closeCapture: () -> Unit, val available: (Boolean) -> Unit, val recordLabel: String) +val LocalRecordAttachments = compositionLocalOf<@Composable (QViewModel, String, String, RecordAttachmentUi) -> Unit> { { _, _, _, _ -> } } + +/** Save page, search, filter and scroll state in this navigation entry. */ +@Composable +fun TableScreen(host: QViewModel, tableName: String) { + var offset by rememberSaveable(tableName, host.sessionUUID) { mutableStateOf(0) } + var search by rememberSaveable(tableName, host.sessionUUID) { mutableStateOf("") } + var filterField by rememberSaveable(tableName, host.sessionUUID) { mutableStateOf("") } + var filterValue by rememberSaveable(tableName, host.sessionUUID) { mutableStateOf("") } + var filterOpen by remember { mutableStateOf(false) } + var reload by remember { mutableStateOf(0) } + var table by remember(tableName, host.sessionUUID) { mutableStateOf<QTableMetaData?>(null) } + var rows by remember { mutableStateOf<List<RecordData>>(emptyList()) } + var count by remember { mutableStateOf(0L) } + var loading by remember { mutableStateOf(true) } + var failed by remember { mutableStateOf(false) } + val scroll = rememberLazyListState() + LaunchedEffect(tableName, offset, search, filterField, filterValue, reload, host.sessionUUID) { + loading = true; failed = false + try { + if (search.isNotEmpty()) delay(300) + val metadata = table ?: host.qqqRepository.getTableMetaData(tableName).also { table = it } + val predicate = RecordSearch(search, metadata.recordSearchFields(), if (filterField.isNotEmpty() && filterValue.isNotEmpty()) mapOf(filterField to JsonPrimitive(filterValue)) else emptyMap()) + count = host.qqqRepository.countRecords(tableName, predicate) + if (offset > 0 && offset >= count) { offset = 0; return@LaunchedEffect } + rows = host.qqqRepository.searchRecords(tableName, requireNotNull(metadata.primaryKeyField), predicate, offset) + } catch (cancelled: CancellationException) { throw cancelled } + catch (exception: Exception) { failed = true; rows = emptyList() } + finally { loading = false } + } + Column(Modifier.fillMaxSize().padding(horizontal = 16.dp)) { + OutlinedTextField(search, { search = it; offset = 0 }, label = { Text("Search records") }, singleLine = true, + modifier = Modifier.fillMaxWidth().testTag("records.search")) + Row(verticalAlignment = Alignment.CenterVertically) { + TextButton(onClick = { filterOpen = true }, enabled = table?.textFields()?.isNotEmpty() == true) { Text(if (filterValue.isEmpty()) "Filter" else "Filter applied") } + if (search.isNotEmpty() || filterValue.isNotEmpty()) TextButton(onClick = { search = ""; filterField = ""; filterValue = ""; offset = 0 }) { Text("Clear") } + TextButton(onClick = { reload++ }) { Text("Refresh") } + } + if (loading) Text("Loading records…") + if (failed) Text("Records could not be loaded. Check your connection and access.") + if (!loading && !failed && rows.isEmpty()) Text("No matching records.") + if (loading || failed) Spacer(Modifier.weight(1f)) else LazyColumn(state = scroll, modifier = Modifier.weight(1f)) { + if (!loading && !failed) items(rows, key = { requireNotNull(table?.primaryKeyField?.let(it::id)) }) { row -> + val id = requireNotNull(table?.primaryKeyField?.let(row::id)) + RecordRow(row, table!!, "records.row:$id") { host.qNavigator.navigateToRecord(tableName, id) } + } + } + if (!failed) Paging(offset, rows.size, count, 25, loading, { offset = it }) + } + if (filterOpen && table != null) RecordFilterDialog(table!!, filterField, filterValue, { filterOpen = false }) { field, value -> + filterField = field; filterValue = value; offset = 0; filterOpen = false + } +} + +@Composable +private fun RecordFilterDialog(table: QTableMetaData, initialField: String, initialValue: String, close: () -> Unit, apply: (String, String) -> Unit) { + val fields = table.textFields() + var field by remember { mutableStateOf(fields.firstOrNull { it.name == initialField } ?: fields.first()) } + var value by remember { mutableStateOf(initialValue) } + var choose by remember { mutableStateOf(false) } + AlertDialog(onDismissRequest = close, title = { Text("Filter records") }, text = { + Column { + Box { + TextButton(onClick = { choose = true }) { Text("Field: ${field.label}") } + DropdownMenu(choose, { choose = false }) { fields.forEach { item -> DropdownMenuItem(text = { Text(item.label) }, onClick = { field = item; choose = false }) } } + } + OutlinedTextField(value, { value = it }, label = { Text("Equals") }, singleLine = true, modifier = Modifier.testTag("records.filter.value")) + } + }, confirmButton = { TextButton(onClick = { apply(field.name, value) }) { Text("Apply filter") } }, dismissButton = { TextButton(onClick = close) { Text("Cancel") } }) +} + +@Composable +private fun Paging(offset: Int, size: Int, count: Long, pageSize: Int, loading: Boolean, change: (Int) -> Unit) { + Column(Modifier.fillMaxWidth(), horizontalAlignment = Alignment.CenterHorizontally) { + Text(if (loading) "Loading…" else if (count == 0L) "0 records" else "${offset + 1}–${offset + size} of $count", style = MaterialTheme.typography.labelLarge, modifier = Modifier.testTag("records.count")) + Row(horizontalArrangement = Arrangement.SpaceBetween, modifier = Modifier.fillMaxWidth()) { + TextButton(enabled = !loading && offset > 0, onClick = { change((offset - pageSize).coerceAtLeast(0)) }) { Text("Previous") } + TextButton(enabled = !loading && offset + size < count, onClick = { change(offset + pageSize) }) { Text("Next") } + } + } +} + +@Composable +private fun RecordRow(record: RecordData, table: QTableMetaData, tag: String, open: () -> Unit) { + Row(Modifier.fillMaxWidth().testTag(tag).clickable(onClickLabel = "Open record", onClick = open).padding(vertical = 12.dp), verticalAlignment = Alignment.CenterVertically) { + Column(Modifier.weight(1f)) { + Text(record.recordLabel ?: table.primaryKeyField?.let(record::id).orEmpty(), style = MaterialTheme.typography.titleMedium, maxLines = 2, overflow = TextOverflow.Ellipsis) + Text(record.summary(table), style = MaterialTheme.typography.bodySmall, maxLines = 2, overflow = TextOverflow.Ellipsis) + } + Text("›", Modifier.padding(start = 8.dp), style = MaterialTheme.typography.titleLarge) + } + HorizontalDivider() +} + +/** Identity and Actions remain fixed above content. Record values never enter navigation telemetry. */ +@Composable +fun RecordScreen(host: QViewModel, tableName: String, recordId: String, hasParent: Boolean = false) { + // Register inside the destination, after NavHost's own callback, as process screens do. + val hostBack = LocalNavigationBackAction.current + BackHandler { if (hostBack != null) hostBack() else host.qNavigator.popStack() } + var record by remember(tableName, recordId, host.sessionUUID) { mutableStateOf<RecordData?>(null) } + var table by remember(tableName, recordId, host.sessionUUID) { mutableStateOf<QTableMetaData?>(null) } + var failed by remember { mutableStateOf(false) } + var reload by remember { mutableStateOf(0) } + var tab by rememberSaveable(tableName, recordId, host.sessionUUID) { mutableStateOf(0) } + var group by rememberSaveable(tableName, recordId, host.sessionUUID) { mutableStateOf(0) } + var actions by remember { mutableStateOf(false) } + var sections by remember { mutableStateOf(false) } + var capture by rememberSaveable(tableName, recordId, host.sessionUUID) { mutableStateOf(false) } + var photoAvailable by remember(tableName, recordId, host.sessionUUID) { mutableStateOf(false) } + val attachments = LocalRecordAttachments.current + val tabState = rememberSaveableStateHolder() + LaunchedEffect(tableName, recordId, host.sessionUUID, reload) { + failed = false + try { + val metadata = host.qqqRepository.getTableMetaData(tableName) + val loaded = host.qqqRepository.getRecord(tableName, recordId) + check(metadata.primaryKeyField?.let(loaded::id) == recordId) + check(loaded.tableName == null || loaded.tableName == tableName) + table = metadata; record = loaded + } catch (cancelled: CancellationException) { throw cancelled } + catch (exception: Exception) { failed = true } + } + val current = record + if (failed) Column(Modifier.padding(16.dp)) { + Text("This record could not be loaded. It may be unavailable or access may have changed.") + Button(onClick = { reload++ }) { Text("Retry") } + } else if (current == null) Text("Loading record…", Modifier.padding(16.dp)) + else { + val metadata = table!! + val related = metadata.associations.orEmpty() + val groups = metadata.recordGroups() + val photoTab = related.size + 1 + Column(Modifier.fillMaxSize().testTag("record.details")) { + Row(Modifier.fillMaxWidth().padding(horizontal = 16.dp, vertical = 8.dp), verticalAlignment = Alignment.CenterVertically) { + Column(Modifier.weight(1f)) { + Text(current.recordLabel ?: recordId, style = MaterialTheme.typography.titleMedium, maxLines = 2, overflow = TextOverflow.Ellipsis) + Text(metadata.label, style = MaterialTheme.typography.labelMedium) + } + Box { + TextButton(onClick = { actions = true }) { Text("Actions") } + DropdownMenu(actions, { actions = false }) { + DropdownMenuItem(text = { Text("Add photo") }, enabled = photoAvailable, onClick = { actions = false; capture = true }) + DropdownMenuItem(text = { Text("Refresh record") }, onClick = { actions = false; reload++ }) + } + } + } + if (hasParent) TextButton(onClick = { host.qNavigator.requestLeave("Back to parent?") { host.qNavigator.navController?.popBackStack() } }) { Text("Back to parent record") } + ScrollableTabRow(tab.coerceAtMost(photoTab), edgePadding = 0.dp) { + (listOf("Details") + related.map { it.name } + "Photos").forEachIndexed { index, label -> + Tab(tab == index, onClick = { tab = index }, text = { Text(label) }) + } + } + Box(Modifier.weight(1f)) { + if (tab == 0) Column(Modifier.fillMaxSize()) { + Box { + TextButton(onClick = { sections = true }) { Text("Sections (${groups.size})") } + DropdownMenu(sections, { sections = false }) { groups.forEachIndexed { index, value -> + DropdownMenuItem(text = { Text(value.label) }, onClick = { group = index; sections = false }) + } } + } + Column(Modifier.verticalScroll(rememberScrollState()).padding(horizontal = 16.dp)) { + groups.forEachIndexed { index, value -> + TextButton(onClick = { group = if (group == index) -1 else index }, modifier = Modifier.fillMaxWidth().testTag("record.section:${value.label}")) { + Text("${if (group == index) "−" else "+"} ${value.label} (${value.fields.size})", Modifier.fillMaxWidth(), style = MaterialTheme.typography.titleMedium) + } + if (group == index) value.fields.forEach { field -> + Column(Modifier.padding(vertical = 6.dp)) { + Text(field.label, style = MaterialTheme.typography.labelMedium, color = MaterialTheme.colorScheme.onSurfaceVariant) + Text(current.formatted(field)) + } + } + HorizontalDivider() + } + } + } + if (tab in 1..related.size) tabState.SaveableStateProvider("related:$tab") { RelatedRecords(host, tableName, recordId, current, related[tab - 1]) } + attachments(host, tableName, recordId, RecordAttachmentUi(tab == photoTab, capture, { capture = false }, { photoAvailable = it }, current.recordLabel ?: recordId)) + } + } + } +} + +/** Child queries and counts always use the declared parent join. */ +@Composable +private fun RelatedRecords(host: QViewModel, parentTable: String, parentId: String, parent: RecordData, association: QRecordAssociation) { + var offset by rememberSaveable(parentTable, parentId, association.name, host.sessionUUID) { mutableStateOf(0) } + var reload by remember { mutableStateOf(0) } + var rows by remember { mutableStateOf<List<RecordData>>(emptyList()) } + var table by remember { mutableStateOf<QTableMetaData?>(null) } + var count by remember { mutableStateOf(0L) } + var loading by remember { mutableStateOf(true) } + var failed by remember { mutableStateOf(false) } + val scroll = rememberLazyListState() + LaunchedEffect(parentTable, parentId, association, offset, reload, host.sessionUUID) { + loading = true; failed = false + try { + val matches = requireNotNull(association.parentMatches(parentTable, parent)) + check(matches.isNotEmpty()) + val child = host.qqqRepository.getTableMetaData(association.associatedTableName) + check(matches.keys.all { it in child.fields }) + table = child + val predicate = RecordSearch(matches = matches) + count = host.qqqRepository.countRecords(child.name, predicate) + rows = host.qqqRepository.searchRecords(child.name, requireNotNull(child.primaryKeyField), predicate, offset, 10) + } catch (cancelled: CancellationException) { throw cancelled } + catch (exception: Exception) { failed = true; rows = emptyList() } + finally { loading = false } + } + Column(Modifier.fillMaxSize().padding(horizontal = 16.dp).testTag("record.related:${association.associatedTableName}")) { + if (loading) Text("Loading related records…") + if (failed) { Text("Related records are unavailable."); TextButton(onClick = { reload++ }) { Text("Retry") } } + if (!loading && !failed && rows.isEmpty()) Text("No related records.") + LazyColumn(state = scroll, modifier = Modifier.weight(1f)) { + if (!loading && !failed) items(rows) { row -> + val id = table?.primaryKeyField?.let(row::id) + if (id != null) RecordRow(row, table!!, "record.related.row:${association.associatedTableName}:$id") { host.qNavigator.navigateToRecord(association.associatedTableName, id, true) } + } + } + if (!failed) Paging(offset, rows.size, count, 10, loading, { offset = it }) + } +} diff --git a/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/utils/BlockStyleUtils.kt b/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/utils/BlockStyleUtils.kt new file mode 100644 index 0000000..6381ee4 --- /dev/null +++ b/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/utils/BlockStyleUtils.kt @@ -0,0 +1,156 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2004-2024. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package com.kingsrook.qqq.frontend.android.mobileapp.ui.utils + +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.text.intl.Locale +import androidx.compose.ui.text.toUpperCase +import androidx.compose.ui.unit.Dp +import androidx.compose.ui.unit.DpSize +import androidx.compose.ui.unit.dp + +/******************************************************************************* + ** utility functions for working with styles in blocks + *******************************************************************************/ +object BlockStyleUtils { + + /******************************************************************************* + ** read a padding map, from a style map, reading top/bottom/left/right out + ** of it. only (optional) numeric values supported today. + *******************************************************************************/ + fun getPaddingValuesFromStyleMap(map: Map<*, *>): PaddingValues { + val paddingStyle = map["padding"] + return if (paddingStyle is Map<*, *>) { + PaddingValues( + top = getIntFromMap(paddingStyle, "top", 0).dp, + bottom = getIntFromMap(paddingStyle, "bottom", 0).dp, + start = getIntFromMap(paddingStyle, "left", 0).dp, + end = getIntFromMap(paddingStyle, "right", 0).dp + ) + } else { + PaddingValues() + } + } + + /******************************************************************************* + ** read width & height from a style map. only (optional) numeric values + ** supported today. + *******************************************************************************/ + fun getSizeFromStyleMap(map: Map<*, *>): DpSize { + val width = getOptionalIntFromMap(map, "width") + val height = getOptionalIntFromMap(map, "height") + return if (width != null && height != null) { + DpSize(width.dp, height.dp) + } else if (width != null) { + DpSize(width.dp, Dp.Unspecified) + } else if (height != null) { + DpSize(Dp.Unspecified, height.dp) + } else { + DpSize(Dp.Unspecified, Dp.Unspecified) + } + } + + + /******************************************************************************* + ** Get a Color from a string. Some named colors are supported, as well as + ** html-style RGB/RGBA, with optional # prefix. + *******************************************************************************/ + fun getColorFromString(input: String?): Color? { + return when (val string = "${input}".toUpperCase(Locale.current)) { + "SUCCESS" -> Colors.SUCCESS + "WARNING" -> Colors.WARNING + "ERROR" -> Colors.ERROR + "INFO" -> Colors.INFO + "MUTED" -> Colors.MUTED + else -> { + var hexString = string + val sixToEightHexDigits = "[0-9A-F]{6,8}" + if (hexString.matches(Regex("^#${sixToEightHexDigits}$"))) { + hexString = hexString.substring(1) + } + + if (hexString.matches(Regex("^${sixToEightHexDigits}$"))) { + val r = Integer.parseInt(hexString, 0, 2, 16) + val g = Integer.parseInt(hexString, 2, 4, 16) + val b = Integer.parseInt(hexString, 4, 6, 16) + val a = try { + Integer.parseInt(hexString, 6, 8, 16) + } catch (e: Exception) { + 255 + } + Color(r, g, b, a) + } else { + null + } + } + } + } + + + /******************************************************************************* + *******************************************************************************/ + fun getOptionalIntFromMap(map: Map<*, *>, key: String): Int? { + val valueString = "${map[key] ?: ""}" + + return if (valueString == "") { + null + } else { + try { + Integer.parseInt(valueString) + } catch (e: Exception) { + null + } + } + } + + + /******************************************************************************* + *******************************************************************************/ + fun getOptionalStringFromMap(map: Map<*, *>, key: String): String? { + val valueString = "${map[key] ?: ""}" + + return if (valueString == "") { + null + } else { + valueString + } + } + + /******************************************************************************* + *******************************************************************************/ + fun getIntFromMap(map: Map<*, *>, key: String, default: Int): Int { + val valueString = "${map[key] ?: ""}" + + return if (valueString == "") { + default + } else { + try { + Integer.parseInt(valueString) + } catch (e: Exception) { + default + } + } + } + +} diff --git a/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/utils/Colors.kt b/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/utils/Colors.kt new file mode 100644 index 0000000..75b1311 --- /dev/null +++ b/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/utils/Colors.kt @@ -0,0 +1,37 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2004-2024. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package com.kingsrook.qqq.frontend.android.mobileapp.ui.utils + +import androidx.compose.ui.graphics.Color + +/******************************************************************************* + ** define some standard colors + *******************************************************************************/ +object Colors { + val SUCCESS = Color(0x2B, 0xA3, 0x3F) + val WARNING = Color(0xCC, 0x84, 0x02) + val ERROR = Color(0xFB, 0x41, 0x41) + val INFO = Color(0x45, 0x8C, 0xFF) + val MUTED = Color(0x7b, 0x80, 0x9a) + +} diff --git a/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/utils/DrawableUtils.kt b/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/utils/DrawableUtils.kt new file mode 100644 index 0000000..7d42135 --- /dev/null +++ b/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/utils/DrawableUtils.kt @@ -0,0 +1,55 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2004-2024. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package com.kingsrook.qqq.frontend.android.mobileapp.ui.utils + +import android.annotation.SuppressLint +import android.content.Context + +/******************************************************************************* + ** utilities for working with drawable resources + *******************************************************************************/ +object DrawableUtils { + + /******************************************************************************* + ** given a name (e.g., a material icon name), get the corresponding + ** resource identifier. Null (instead of 0...) if it's not found. + *******************************************************************************/ + @SuppressLint("DiscouragedApi") // for getIdentifier... + fun loadDrawableId(context: Context, name: String?): Int? { + if (name == null) { + return (null) + } + + try { + val rs = context.resources.getIdentifier( + name, + "drawable", + context.packageName + ) + return if (rs == 0) null else rs + } catch (e: Exception) { + return null + } + } + +} diff --git a/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/utils/Dropdown.kt b/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/utils/Dropdown.kt new file mode 100644 index 0000000..b80e7fb --- /dev/null +++ b/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/utils/Dropdown.kt @@ -0,0 +1,99 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2004-2024. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package com.kingsrook.qqq.frontend.android.mobileapp.ui.utils + +import androidx.compose.foundation.border +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.width +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.KeyboardArrowDown +import androidx.compose.material.icons.filled.KeyboardArrowUp +import androidx.compose.material3.DropdownMenu +import androidx.compose.material3.DropdownMenuItem +import androidx.compose.material3.Icon +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.layout.onGloballyPositioned +import androidx.compose.ui.platform.LocalDensity +import androidx.compose.ui.unit.IntSize +import androidx.compose.ui.unit.dp + + +/******************************************************************************* + *******************************************************************************/ +@Composable +fun <T> Dropdown(value: T, options: List<T>, labelExtractor: (t: T) -> String, onClick: (t: T) -> Unit, modifier: Modifier = Modifier) { + val dropdownExpanded = remember { mutableStateOf(false) } + val textFieldSize = remember { mutableStateOf(IntSize.Zero) } + val selectedValue = remember { mutableStateOf(value) } + val icon = if (dropdownExpanded.value) Icons.Filled.KeyboardArrowUp else Icons.Filled.KeyboardArrowDown + + Box( + modifier + .fillMaxWidth() + .clickable { dropdownExpanded.value = !dropdownExpanded.value } + ) { + Row( + horizontalArrangement = Arrangement.SpaceBetween, + modifier = Modifier + .fillMaxWidth() + .border(width = 1.dp, color = Color.Black, shape = RoundedCornerShape(4.dp)) + .padding(16.dp) + .onGloballyPositioned { coordinates -> textFieldSize.value = coordinates.size }, + ) + { + Text(text = labelExtractor.invoke(selectedValue.value)) + Icon(icon, if (dropdownExpanded.value) "close" else "open") + } + + DropdownMenu( + expanded = dropdownExpanded.value, + onDismissRequest = { dropdownExpanded.value = false }, + Modifier.width((textFieldSize.value.width.toFloat() / LocalDensity.current.density).dp) + ) + { + options.forEach() + { option -> + DropdownMenuItem( + onClick = + { + selectedValue.value = option + dropdownExpanded.value = false + onClick.invoke(option) + }, + text = { Text(text = labelExtractor.invoke(option)) } + ) + } + } + } +} diff --git a/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/utils/DynamicIcon.kt b/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/utils/DynamicIcon.kt new file mode 100644 index 0000000..4ef8bef --- /dev/null +++ b/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/utils/DynamicIcon.kt @@ -0,0 +1,75 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2004-2024. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package com.kingsrook.qqq.frontend.android.mobileapp.ui.utils + +import android.util.Log +import androidx.compose.material3.Icon +import androidx.compose.runtime.Composable +import androidx.compose.runtime.remember +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.res.painterResource +import com.kingsrook.qqq.frontend.android.core.model.metadata.QIcon +import kotlinx.serialization.json.Json + +/******************************************************************************* + ** Render an icon - given a QIcon model, a defaultResourceId to use if it + ** isn't found, and so-on. + *******************************************************************************/ +@Composable +fun DynamicIcon(icon: QIcon?, defaultResourceId: Int?, modifier: Modifier = Modifier, contentDescription: String? = null, tint: Color = Color.Black) { + val context = LocalContext.current + val drawableId = remember(icon?.semanticName, icon?.name) { + DrawableUtils.loadDrawableId(context, icon?.semanticName) ?: DrawableUtils.loadDrawableId(context, icon?.name) + } + + val actualId = if (drawableId != null) drawableId else if (defaultResourceId != null) defaultResourceId else return + + Icon( + painter = painterResource(id = actualId), + tint = tint, + contentDescription = contentDescription, + modifier = modifier + ) +} + + +/******************************************************************************* + ** Convert an Any (could be a map, or a json string) into a QIcon + *******************************************************************************/ +fun makeIcon(value: Any?): QIcon? { + if (value is Map<*, *>) { + return (QIcon(value["name"]?.toString(), value["path"]?.toString(), value["color"]?.toString(), semanticName = value["semanticName"]?.toString())) + } + + if (value is String) { + try { + return Json { ignoreUnknownKeys = true }.decodeFromString<QIcon>(value) + } catch (e: Exception) { + // Unknown icon metadata is decorative; retain the caller's fallback. + } + } + + return (null) +} diff --git a/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/utils/LoadStateView.kt b/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/utils/LoadStateView.kt new file mode 100644 index 0000000..9fa22c5 --- /dev/null +++ b/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/utils/LoadStateView.kt @@ -0,0 +1,118 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2024-2024. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.kingsrook.qqq.frontend.android.mobileapp.ui.utils + +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.ColumnScope +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items +import androidx.compose.material3.Button +import androidx.compose.material3.Icon +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.scale +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import com.kingsrook.qqq.frontend.android.mobileapp.R +import com.kingsrook.qqq.frontend.android.mobileapp.ui.common.FullScreenLoading +import com.kingsrook.qqq.frontend.android.mobileapp.viewmodel.LoadState + +/******************************************************************************* + ** Composable that + *******************************************************************************/ +@Composable +fun LoadStateView( + loadStates: List<LoadState<*>>, + modifier: Modifier = Modifier, + reloader: Reloader? = null, + loadingText: String = "Loading...", + errorHeadline: String = "An Error Has Occurred", + content: @Composable ColumnScope.() -> Unit +) { + + if (LoadState.areAnyErrors(loadStates)) { + /////////////////////////////////////////////////////// + // show errors, with reload button, if one was given // + /////////////////////////////////////////////////////// + LazyColumn(modifier.padding(8.dp)) + { + item() + { + Column(horizontalAlignment = Alignment.CenterHorizontally, modifier = Modifier.fillMaxWidth()) + { + Icon( + painter = painterResource(id = R.drawable.error_outline), + tint = Color.Red, + contentDescription = "Error", + modifier = Modifier + .fillMaxWidth() + .padding(bottom = 40.dp, top = 80.dp) + .scale(4f) + ) + Text(errorHeadline, fontWeight = FontWeight.SemiBold, fontSize = 24.sp, color = Color.Red, modifier = Modifier.padding(vertical = 16.dp)) + } + } + + items(LoadState.getErrorMessages(loadStates)) + { + Column(horizontalAlignment = Alignment.CenterHorizontally, modifier = Modifier.fillMaxWidth()) + { + Text(it, fontSize = 16.sp, modifier = Modifier.padding(bottom = 16.dp)) + } + } + + if (reloader != null) { + item() + { + Row(horizontalArrangement = Arrangement.Center, modifier = Modifier.fillMaxWidth()) + { + Button(onClick = reloader.callback) + { + Text(reloader.buttonLabel) + } + } + } + } + } + + } else if (LoadState.areAnyLoading(loadStates)) { + ////////////////// + // show loading // + ////////////////// + FullScreenLoading(loadingText, modifier) + } else { + /////////////////////// + // show the content! // + /////////////////////// + Column(modifier = modifier, content = content) + } +} + diff --git a/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/utils/Reloader.kt b/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/utils/Reloader.kt new file mode 100644 index 0000000..aae51b2 --- /dev/null +++ b/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/utils/Reloader.kt @@ -0,0 +1,29 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2024-2024. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.kingsrook.qqq.frontend.android.mobileapp.ui.utils + +/******************************************************************************* + *******************************************************************************/ +data class Reloader( + val buttonLabel: String, + val callback: () -> Unit +) diff --git a/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/widgets/blocks/AudioWidgetBlock.kt b/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/widgets/blocks/AudioWidgetBlock.kt new file mode 100644 index 0000000..fef38db --- /dev/null +++ b/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/widgets/blocks/AudioWidgetBlock.kt @@ -0,0 +1,129 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2004-2024. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package com.kingsrook.qqq.frontend.android.mobileapp.ui.widgets.blocks + +import android.content.Context +import android.media.MediaPlayer +import android.net.Uri +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.DisposableEffect +import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalContext +import androidx.lifecycle.Lifecycle +import androidx.lifecycle.LifecycleEventObserver +import androidx.lifecycle.LifecycleOwner +import androidx.lifecycle.compose.LocalLifecycleOwner + + +/******************************************************************************* + *******************************************************************************/ +@Composable +fun AudioWidgetBlock(params: WidgetBlockParameters, modifier: Modifier = Modifier) { + val widgetBlock = params.widgetBlock + + val lifecycleOwner: LifecycleOwner = LocalLifecycleOwner.current + var mediaPlayer: MediaPlayer? = null + + val path = widgetBlock.values["path"] + if (path is String) { + val uri = runCatching { params.qViewModel?.getURI(path) }.getOrNull() + val context = LocalContext.current + + if (uri != null) { + /******************************************************************************* + ** Start the current widget audio resource only through its existing playback control. + *******************************************************************************/ + fun doPlay() { + mediaPlayer = createMediaPlayer(context, uri) + mediaPlayer?.start() + } + + ///////////////////////////////////////////////////////////////////////////////////////// + // use this lifecycle owner effect "stuff", to play the tone upon initial-composition, // + // and to dispose of the media player upon dispose/stop/etc // + ///////////////////////////////////////////////////////////////////////////////////////// + DisposableEffect(lifecycleOwner) + { + /////////////////////////////////////////////////////////////// + // Create an observer that triggers our remembered callbacks // + /////////////////////////////////////////////////////////////// + val observer = LifecycleEventObserver() + { _, event -> + if (event == Lifecycle.Event.ON_START) { + ////////////////////////////////////////////////////////////////////////////////////////////// + // go through the actionCallback - to try to manage making sure we only play the audio once // + // (since we'll assume that the callback runs in an object which doesn't get re-created if // + // the device orientation changes -- without this (e.g., if we just played the audio here), // + // then we re-played it upon screen rotation - which wasn't good. // + ////////////////////////////////////////////////////////////////////////////////////////////// + params.actionCallback?.invoke( + mapOf( + "registerControlCallbackName" to "AudioWidgetBlock", + "registerControlCallbackFunction" to ::doPlay + ) + ) + + params.actionCallback?.invoke( + mapOf( + "controlCode" to "invokeControlCallbackOnlyOnce:AudioWidgetBlock" + ) + ) + } else if (event == Lifecycle.Event.ON_STOP) { + mediaPlayer?.release() + mediaPlayer = null + } + } + + /////////////////////////////////////// + // Add the observer to the lifecycle // + /////////////////////////////////////// + lifecycleOwner.lifecycle.addObserver(observer) + + ///////////////////////////////////////////////////////////////// + // When the effect leaves the Composition, remove the observer // + ///////////////////////////////////////////////////////////////// + onDispose() + { + lifecycleOwner.lifecycle.removeObserver(observer) + mediaPlayer?.release() + mediaPlayer = null + } + } + } else { + Text("No uri for audio...", modifier = modifier) + } + } else { + Text("No path for audio...", modifier = modifier) + } +} + + +/******************************************************************************* + ** Create a media play for a specific URI + *******************************************************************************/ +fun createMediaPlayer(context: Context, uri: String): MediaPlayer? { + val player: MediaPlayer? = MediaPlayer.create(context, Uri.parse(uri)) + player?.setVolume(1f, 1f) + return player +} diff --git a/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/widgets/blocks/ButtonWidgetBlock.kt b/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/widgets/blocks/ButtonWidgetBlock.kt new file mode 100644 index 0000000..ed50458 --- /dev/null +++ b/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/widgets/blocks/ButtonWidgetBlock.kt @@ -0,0 +1,139 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2004-2024. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package com.kingsrook.qqq.frontend.android.mobileapp.ui.widgets.blocks + +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.Button +import androidx.compose.material3.ButtonColors +import androidx.compose.material3.FilledTonalButton +import androidx.compose.material3.OutlinedButton +import androidx.compose.material3.Text +import androidx.compose.material3.TextButton +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.text.intl.Locale +import androidx.compose.ui.text.toLowerCase +import androidx.compose.ui.unit.dp +import com.kingsrook.qqq.frontend.android.core.model.metadata.QIcon +import com.kingsrook.qqq.frontend.android.mobileapp.ui.utils.BlockStyleUtils +import com.kingsrook.qqq.frontend.android.mobileapp.ui.utils.DynamicIcon +import com.kingsrook.qqq.frontend.android.mobileapp.ui.utils.makeIcon + +/******************************************************************************* + *******************************************************************************/ +@Composable +fun ButtonWidgetBlock(params: WidgetBlockParameters, modifier: Modifier = Modifier, disableControls: Boolean = false) { + val widgetBlock = params.widgetBlock + val actionCallback = params.actionCallback + + val color = BlockStyleUtils.getColorFromString("${widgetBlock.styles["color"]}") ?: Color.Black + val format = "${widgetBlock.styles["format"]}".toLowerCase(Locale.current) + val startIcon: QIcon? = makeIcon(widgetBlock.values["startIcon"]) + val endIcon: QIcon? = makeIcon(widgetBlock.values["endIcon"]) + + /******************************************************************************* + ** handle the button being clicked - basically, just go to the actionCallback. + *******************************************************************************/ + fun onClick() { + val values = mutableMapOf("widgetBlock" to widgetBlock) + if (actionCallback != null) { + if (widgetBlock.values["actionCode"] != null || widgetBlock.values["controlCode"] != null) { + actionCallback(values) + } + } + } + + val textColor = if (format == "outlined" || format == "text") color else Color.White + val bgColor = if (format == "outlined") Color.White else color + + /******************************************************************************* + ** row of <startIcon> text <endIcon>, to display inside the button + *******************************************************************************/ + @Composable + fun ButtonContent() { + Row(verticalAlignment = Alignment.CenterVertically) + { + if (startIcon != null) { + DynamicIcon(startIcon, null, tint = textColor, modifier = Modifier.padding(end = 4.dp)) + } + + Text("${widgetBlock.values["label"] ?: widgetBlock.values["actionCode"] ?: "Button"}", color = textColor) + + if (endIcon != null) { + DynamicIcon(endIcon, null, tint = textColor, modifier = Modifier.padding(start = 4.dp)) + } + } + } + + val shape = RoundedCornerShape(12.dp) + + //////////////////////////////////////////////////////// + // choose different button composable based on format // + //////////////////////////////////////////////////////// + when (format) { + "outlined" -> { + OutlinedButton( + onClick = ::onClick, + modifier = modifier, + colors = ButtonColors(contentColor = Color.Blue, containerColor = bgColor, disabledContentColor = Color.Black, disabledContainerColor = Color.Gray), + shape = shape, + enabled = !disableControls + ) + { + ButtonContent() + } + } + + "filled" -> { + FilledTonalButton( + onClick = ::onClick, + modifier = modifier, + colors = ButtonColors(contentColor = textColor, containerColor = bgColor, disabledContentColor = Color.Black, disabledContainerColor = Color.Gray), + shape = shape, + enabled = !disableControls + ) + { + ButtonContent() + } + } + + "text" -> { + TextButton(onClick = ::onClick, modifier = modifier, enabled = !disableControls) + { + ButtonContent() + } + } + + else -> { + Button(onClick = ::onClick, modifier = modifier, shape = shape, enabled = !disableControls) + { + ButtonContent() + } + } + } + +} diff --git a/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/widgets/blocks/CompositeWidgetBlock.kt b/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/widgets/blocks/CompositeWidgetBlock.kt new file mode 100644 index 0000000..ddedcad --- /dev/null +++ b/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/widgets/blocks/CompositeWidgetBlock.kt @@ -0,0 +1,205 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2004-2024. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package com.kingsrook.qqq.frontend.android.mobileapp.ui.widgets.blocks + +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.ExperimentalLayoutApi +import androidx.compose.foundation.layout.FlowRow +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.Card +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.key +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.RectangleShape +import androidx.compose.ui.unit.dp +import androidx.compose.ui.window.Dialog +import androidx.compose.ui.window.DialogProperties +import com.kingsrook.qqq.frontend.android.core.model.widgets.WidgetBlock +import com.kingsrook.qqq.frontend.android.mobileapp.ui.utils.BlockStyleUtils + +/******************************************************************************* + ** render a block of type "Composite" - which is - a block that contains + ** child (sub) blocks. + *******************************************************************************/ +@Composable +fun CompositeWidgetBlock(params: WidgetBlockParameters, modifier: Modifier = Modifier, disableControls: Boolean = false) { + val widgetBlock = params.widgetBlock + + Box(modifier = modifier) + { + if (widgetBlock.modalMode == null) { + ContentsInLayout(params, disableControls) + } else { + when (widgetBlock.modalMode) { + "MODAL" -> { + Modal(params, disableControls) + } + } + } + } +} + +/******************************************************************************* + ** render the list of sub-blocks + *******************************************************************************/ +@Composable +fun BlockList(params: WidgetBlockParameters, subBlocks: List<WidgetBlock>, disableControls: Boolean = false) { + for (subBlock in subBlocks) { + val subParams = WidgetBlockParameters(subBlock, params.actionCallback, params.qViewModel, params.values) + WidgetBlockComposable(subParams, Modifier.padding(4.dp), disableControls) + } +} + +/******************************************************************************* + ** apply layout-specific formatting, to wrap a block-list + *******************************************************************************/ +@OptIn(ExperimentalLayoutApi::class) // for FlowRow +@Composable +fun ContentsInLayout(params: WidgetBlockParameters, disableControls: Boolean = false) { + val widgetBlock = params.widgetBlock + + ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + // start with a kinda blank modifier (but, we have to call .padding, or else we get a type that we can't call .padding on later??) // + ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + var boxModifier = Modifier.padding(0.dp) + + val backgroundColor = BlockStyleUtils.getColorFromString(BlockStyleUtils.getOptionalStringFromMap(widgetBlock.styles, "backgroundColor")) + if (backgroundColor != null) { + boxModifier = boxModifier.background(backgroundColor, RectangleShape) + } + + boxModifier = boxModifier.padding(BlockStyleUtils.getPaddingValuesFromStyleMap(widgetBlock.styles)) + + // TABLE_SUB_ROW_DETAILS, BADGES_WRAPPER + when (widgetBlock.layout) { + "FLEX_ROW_CENTER" -> FlowRow(horizontalArrangement = Arrangement.Center, modifier = boxModifier.fillMaxWidth()) + { + BlockList(params, widgetBlock.subBlocks, disableControls) + } + + "FLEX_ROW_SPACE_BETWEEN" -> Row(horizontalArrangement = Arrangement.SpaceBetween, modifier = boxModifier.fillMaxWidth()) + { + BlockList(params, widgetBlock.subBlocks, disableControls) + } + + "FLEX_ROW" -> Row(modifier = boxModifier.fillMaxWidth()) + { + BlockList(params, widgetBlock.subBlocks, disableControls) + } + + "FLEX_ROW_WRAPPED" -> FlowRow(modifier = boxModifier.fillMaxWidth()) + { + BlockList(params, widgetBlock.subBlocks, disableControls) + } + + "FLEX_COLUMN" -> Column(modifier = boxModifier.fillMaxWidth()) + { + BlockList(params, widgetBlock.subBlocks, disableControls) + } + + else -> Box(modifier = boxModifier) + { + BlockList(params, widgetBlock.subBlocks, disableControls) + } + } +} + +/******************************************************************************* + ** if the composable is modal, wrap it accordingly + *******************************************************************************/ +@Composable +fun Modal(params: WidgetBlockParameters, disableControls: Boolean = false) { + val isModalShown = remember { mutableStateOf(params.values[params.widgetBlock.blockId] == true) } + + /******************************************************************************* + ** define a callback function that the view-model can call, to tell us that + ** the modal's visible state should change + *******************************************************************************/ + fun controlCallback() { + //////////////////////////////////////////////////////// + //////////////////////////////////////////////////////// + isModalShown.value = !isModalShown.value + } + + //////////////////////////////////////////////////////////////////////////// + // upon initial composition, register the callback, based on our block id // + //////////////////////////////////////////////////////////////////////////// + LaunchedEffect(Unit) + { + params.actionCallback?.invoke( + mapOf( + "registerControlCallbackName" to params.widgetBlock.blockId, + "registerControlCallbackFunction" to ::controlCallback + ) + ) + } + + key(params.values[params.widgetBlock.blockId]) + { + if (isModalShown.value) { + Dialog( + onDismissRequest = + { + /////////////////////////////////////////////////////////////////////////////////////////////////////////////// + // go through the action-callback - so it can internally adjust whatever it needs to track if we are visible // + /////////////////////////////////////////////////////////////////////////////////////////////////////////////// + val eventValues = mapOf("controlCode" to "hideModal:${params.widgetBlock.blockId}") + params.actionCallback?.invoke(eventValues) + isModalShown.value = false + }, + + //////////////////////////////////////////////////////// + // this line lets us go full-width (esp on landscape) // + //////////////////////////////////////////////////////// + properties = DialogProperties(usePlatformDefaultWidth = false) + ) + { + Card( + modifier = Modifier + .fillMaxWidth() + .padding(8.dp), + shape = RoundedCornerShape(16.dp), + ) + { + LazyColumn() + { + item() + { + ContentsInLayout(params, disableControls) + } + } + } + } + } + } +} diff --git a/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/widgets/blocks/DividerWidgetBlock.kt b/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/widgets/blocks/DividerWidgetBlock.kt new file mode 100644 index 0000000..f7caf77 --- /dev/null +++ b/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/widgets/blocks/DividerWidgetBlock.kt @@ -0,0 +1,36 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2004-2024. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package com.kingsrook.qqq.frontend.android.mobileapp.ui.widgets.blocks + +import androidx.compose.material3.HorizontalDivider +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier + + +/******************************************************************************* + *******************************************************************************/ +@Composable +fun DividerWidgetBlock(@Suppress("UNUSED_PARAMETER") params: WidgetBlockParameters, modifier: Modifier = Modifier) // Keep the common widget renderer API; a divider consumes no server values. +{ + HorizontalDivider(modifier = modifier) +} diff --git a/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/widgets/blocks/ImageWidgetBlock.kt b/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/widgets/blocks/ImageWidgetBlock.kt new file mode 100644 index 0000000..7cd88f4 --- /dev/null +++ b/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/widgets/blocks/ImageWidgetBlock.kt @@ -0,0 +1,78 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2004-2024. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package com.kingsrook.qqq.frontend.android.mobileapp.ui.widgets.blocks + +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.runtime.Composable +import androidx.compose.runtime.DisposableEffect +import androidx.compose.runtime.remember +import androidx.compose.ui.Modifier +import androidx.compose.ui.layout.ContentScale +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.res.painterResource +import coil3.ImageLoader +import coil3.compose.AsyncImage +import coil3.request.ImageRequest +import coil3.request.crossfade +import coil3.svg.SvgDecoder +import com.kingsrook.qqq.frontend.android.mobileapp.R +import com.kingsrook.qqq.frontend.android.mobileapp.ui.utils.BlockStyleUtils + +/******************************************************************************* + *******************************************************************************/ +@Composable +fun ImageWidgetBlock(params: WidgetBlockParameters, modifier: Modifier = Modifier) { + val widgetBlock = params.widgetBlock + val qViewModel = params.qViewModel + + val context = LocalContext.current + val imageLoader = remember(context) + { + ImageLoader.Builder(context).components { add(SvgDecoder.Factory()) }.build() + } + DisposableEffect(imageLoader) { onDispose { imageLoader.shutdown() } } + + val imageModifier: Modifier = Modifier.size(BlockStyleUtils.getSizeFromStyleMap(widgetBlock.styles)) + val boxModifier = modifier.padding(BlockStyleUtils.getPaddingValuesFromStyleMap(widgetBlock.styles)) + + Box(modifier = boxModifier) + { + AsyncImage( + imageLoader = imageLoader, + model = ImageRequest.Builder(context = LocalContext.current) + .data(runCatching { qViewModel?.getURI(widgetBlock.values["path"]?.toString() ?: "") }.getOrNull()) + .crossfade(true) + .build(), + contentDescription = null, + error = painterResource(R.drawable.ic_broken_image), + placeholder = painterResource(R.drawable.loading_img), + contentScale = ContentScale.Crop, + modifier = imageModifier + // .border(1.dp, Color.Gray, RectangleShape), + // .fillMaxWidth(.75f).fillMaxHeight(.75f) + ) + } + +} diff --git a/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/widgets/blocks/InputFieldWidgetBlock.kt b/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/widgets/blocks/InputFieldWidgetBlock.kt new file mode 100644 index 0000000..e9d2d78 --- /dev/null +++ b/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/widgets/blocks/InputFieldWidgetBlock.kt @@ -0,0 +1,116 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2004-2024. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package com.kingsrook.qqq.frontend.android.mobileapp.ui.widgets.blocks + +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.text.KeyboardActions +import androidx.compose.foundation.text.KeyboardOptions +import androidx.compose.material3.Text +import androidx.compose.material3.TextField +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Modifier +import androidx.compose.ui.focus.FocusRequester +import androidx.compose.ui.focus.focusRequester +import androidx.compose.ui.input.key.Key +import androidx.compose.ui.input.key.KeyEventType +import androidx.compose.ui.input.key.key +import androidx.compose.ui.input.key.onPreviewKeyEvent +import androidx.compose.ui.input.key.type +import androidx.compose.ui.text.input.ImeAction +import androidx.compose.ui.text.input.PasswordVisualTransformation +import androidx.compose.ui.text.input.VisualTransformation +import com.kingsrook.qqq.frontend.android.core.model.metadata.QFieldType +import com.kingsrook.qqq.frontend.android.mobileapp.ui.utils.Colors +import com.kingsrook.qqq.frontend.android.mobileapp.viewmodel.SemanticProcess +import com.kingsrook.qqq.frontend.android.mobileapp.viewmodel.semanticInitialValue +import com.kingsrook.qqq.frontend.android.mobileapp.viewmodel.semanticFieldHint +import com.kingsrook.qqq.frontend.android.mobileapp.viewmodel.validateSemanticField + +/******************************************************************************* + ** A typed native input: autofocus changes focus only and never reinterprets field data as an action. + *******************************************************************************/ +@Composable +fun InputFieldWidgetBlock(params: WidgetBlockParameters, modifier: Modifier = Modifier, disableControls: Boolean = false) { + val field = SemanticProcess.inputField(params.widgetBlock.values) + if (field == null || (!field.isHidden && !SemanticProcess.supportedWidgetInput(field))) { + Text("This field requires an input control unavailable in this client.", color = Colors.ERROR) + return + } + if (field.isHidden) return + var text by remember(field.name) { mutableStateOf(semanticInitialValue(field, params.values)?.toString().orEmpty()) } + var error by remember(field.name) { mutableStateOf<String?>(null) } + val enabled = field.isEditable && !disableControls + val submitOnEnter = params.widgetBlock.values["submitOnEnter"] == true + val focusRequester = remember { FocusRequester() } + LaunchedEffect(field.name) + { + if (field.isEditable) { + if (!params.values.containsKey(field.name)) params.values[field.name] = semanticInitialValue(field, params.values) + params.qViewModel?.activeProcessViewModel?.registerFormFieldName(field.name) + if (params.widgetBlock.values["autoFocus"] == true) focusRequester.requestFocus() + } + } + + /******************************************************************************* + ** The process submission boundary also validates/converts this declared field. + *******************************************************************************/ + fun submit(value: String) { + if (!enabled) return + error = validateSemanticField(field, value) + if (error == null) params.actionCallback?.invoke(mapOf(field.name to value)) + } + + Column(modifier) + { + TextField( + value = text, + enabled = enabled, + isError = error != null, + onValueChange = { value -> + val submitted = submitOnEnter && value.endsWith('\n') + text = if (submitted) value.dropLast(1) else value + params.values[field.name] = text + if (submitted) submit(text) + }, + label = { Text(field.label) }, + singleLine = true, + visualTransformation = if (field.type == QFieldType.PASSWORD) PasswordVisualTransformation() else VisualTransformation.None, + keyboardOptions = KeyboardOptions(imeAction = if (submitOnEnter) ImeAction.Done else ImeAction.Default), + keyboardActions = KeyboardActions(onDone = { if (submitOnEnter) submit(text) }), + modifier = Modifier.fillMaxWidth().focusRequester(focusRequester).onPreviewKeyEvent { event -> + if (submitOnEnter && event.key == Key.Enter) { + if (event.type == KeyEventType.KeyUp) submit(text) + true + } else false + } + ) + error?.let { Text(it, color = Colors.ERROR) } + semanticFieldHint(field)?.let { Text(it) } + } +} diff --git a/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/widgets/blocks/TextWidgetBlock.kt b/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/widgets/blocks/TextWidgetBlock.kt new file mode 100644 index 0000000..4bb8487 --- /dev/null +++ b/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/widgets/blocks/TextWidgetBlock.kt @@ -0,0 +1,161 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2004-2024. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package com.kingsrook.qqq.frontend.android.mobileapp.ui.widgets.blocks + +import androidx.compose.foundation.background +import androidx.compose.foundation.border +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.Text +import androidx.compose.material3.Typography +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Brush +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.RectangleShape +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import com.kingsrook.qqq.frontend.android.core.model.metadata.QIcon +import com.kingsrook.qqq.frontend.android.mobileapp.ui.utils.BlockStyleUtils +import com.kingsrook.qqq.frontend.android.mobileapp.ui.utils.DynamicIcon +import com.kingsrook.qqq.frontend.android.mobileapp.ui.utils.makeIcon + +/******************************************************************************* + *******************************************************************************/ +@Composable +fun TextWidgetBlock(params: WidgetBlockParameters, modifier: Modifier = Modifier) { + val widgetBlock = params.widgetBlock + + val color = BlockStyleUtils.getColorFromString("${widgetBlock.styles["color"]}") ?: Color.Black + + val weight: FontWeight = when (widgetBlock.styles["weight"]) { + "bold" -> FontWeight.Bold + "semibold" -> FontWeight.SemiBold + "black" -> FontWeight.Black + "thin" -> FontWeight.Thin + "extrabold" -> FontWeight.ExtraBold + "extralight" -> FontWeight.ExtraLight + "medium" -> FontWeight.Medium + "100" -> FontWeight.W100 + "200" -> FontWeight.W200 + "300" -> FontWeight.W300 + "400" -> FontWeight.W400 + "500" -> FontWeight.W500 + "600" -> FontWeight.W600 + "700" -> FontWeight.W700 + "800" -> FontWeight.W800 + "900" -> FontWeight.W900 + else -> FontWeight.Normal + } + + val size = when (val blockStyleSize = "${widgetBlock.styles["size"]}") { + "largest" -> Typography().displayMedium.fontSize // 45 + "headline" -> Typography().headlineMedium.fontSize // 28 + "title" -> Typography().titleLarge.fontSize // 22 + "body" -> Typography().bodyLarge.fontSize // 16 + "smallest" -> Typography().labelMedium.fontSize // 12 + else -> { + val isNumeric = blockStyleSize.all { char -> char.isDigit() } + if (isNumeric) { + Integer.parseInt(blockStyleSize).sp + } else { + Typography().bodyLarge.fontSize + } + } + } + + val lineHeight = size * 1.2 + + //////////////////////////////////////////////////////////////////////////////////////// + // if there's interpolatedText, use that - else use the text value, else empty string // + //////////////////////////////////////////////////////////////////////////////////////// + val text = "${widgetBlock.values["interpolatedText"] ?: widgetBlock.values["text"] ?: ""}" + val startIcon: QIcon? = makeIcon(widgetBlock.values["startIcon"]) + val endIcon: QIcon? = makeIcon(widgetBlock.values["endIcon"]) + + ///////////////////////////////////////////////////////////////////// + // set attributes that need to go on the text, based on the format // + ///////////////////////////////////////////////////////////////////// + var textPadding = 0.dp + var horizontalArrangement = Arrangement.Start + + if (widgetBlock.styles["format"] == "alert") { + textPadding = 8.dp + } else if (widgetBlock.styles["format"] == "banner") { + horizontalArrangement = Arrangement.Center + textPadding = 8.dp + } + + ///////////////////////////////////////////// + // build the stuff that'll go inside a box // + ///////////////////////////////////////////// + /******************************************************************************* + ** Apply the text block's declared presentation while keeping widget rendering independent of process navigation. + *******************************************************************************/ + @Composable + fun TextComposable(textModifier: Modifier = Modifier) { + Row(horizontalArrangement = horizontalArrangement, modifier = textModifier.padding(textPadding)) + { + if (startIcon != null) { + DynamicIcon(startIcon, null, tint = color, modifier = Modifier.padding(end = 4.dp)) + } + + Text(text, color = color, fontWeight = weight, fontSize = size, lineHeight = lineHeight) + + if (endIcon != null) { + DynamicIcon(endIcon, null, tint = color, modifier = Modifier.padding(start = 4.dp)) + } + } + } + + ////////////////// + // final output // + ////////////////// + if (widgetBlock.styles["format"] == "alert") { + Box( + modifier = modifier + .padding(4.dp) + .fillMaxWidth() + .border(1.dp, color, RoundedCornerShape(4.dp)) + .background(Brush.horizontalGradient(listOf(color, color)), RoundedCornerShape(4.dp), 0.2f) + ) + { TextComposable() } + } else if (widgetBlock.styles["format"] == "banner") { + Box( + contentAlignment = Alignment.Center, modifier = modifier + .fillMaxWidth() + .background(Brush.horizontalGradient(listOf(color, color)), RectangleShape, 0.2f) + ) + { TextComposable() } + } else { + TextComposable(modifier) + } + +} + diff --git a/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/widgets/blocks/WidgetBlockComposable.kt b/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/widgets/blocks/WidgetBlockComposable.kt new file mode 100644 index 0000000..3534fe0 --- /dev/null +++ b/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/widgets/blocks/WidgetBlockComposable.kt @@ -0,0 +1,48 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2004-2024. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package com.kingsrook.qqq.frontend.android.mobileapp.ui.widgets.blocks + +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import com.kingsrook.qqq.frontend.android.mobileapp.ui.LocalCustomWidgetRenderer + +/******************************************************************************* + ** Composable that takes a widget-block, switches based on the type, and + ** then hands off to the block's composable. + *******************************************************************************/ +@Composable +fun WidgetBlockComposable(params: WidgetBlockParameters, modifier: Modifier = Modifier, disableControls: Boolean = false) { + when (params.widgetBlock.blockType) { + "AUDIO" -> AudioWidgetBlock(params, modifier) + "BUTTON" -> ButtonWidgetBlock(params, modifier, disableControls) + "COMPOSITE" -> CompositeWidgetBlock(params, modifier, disableControls) + "DIVIDER" -> DividerWidgetBlock(params, modifier) + "IMAGE" -> ImageWidgetBlock(params, modifier) + "INPUT_FIELD" -> InputFieldWidgetBlock(params, modifier, disableControls) + "TEXT" -> TextWidgetBlock(params, modifier) + else -> if (!LocalCustomWidgetRenderer.current(params, modifier, disableControls)) { + Text("Unsupported block type: ${params.widgetBlock.blockType}") + } + } +} diff --git a/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/widgets/blocks/WidgetBlockParameters.kt b/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/widgets/blocks/WidgetBlockParameters.kt new file mode 100644 index 0000000..248dbc2 --- /dev/null +++ b/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/widgets/blocks/WidgetBlockParameters.kt @@ -0,0 +1,37 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2004-2024. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package com.kingsrook.qqq.frontend.android.mobileapp.ui.widgets.blocks + +import com.kingsrook.qqq.frontend.android.core.model.widgets.WidgetBlock +import com.kingsrook.qqq.frontend.android.mobileapp.viewmodel.QViewModel + +/******************************************************************************* + ** common parameter object passed in to any of the *WidgetBlock composables. + *******************************************************************************/ +data class WidgetBlockParameters( + val widgetBlock: WidgetBlock, + val actionCallback: ((Map<String, Any>) -> Unit)? = null, + val qViewModel: QViewModel? = null, + val values: MutableMap<String, Any?> = mutableMapOf(), +) { +} diff --git a/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/viewmodel/LoadState.kt b/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/viewmodel/LoadState.kt new file mode 100644 index 0000000..e386c17 --- /dev/null +++ b/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/viewmodel/LoadState.kt @@ -0,0 +1,88 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2024-2024. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.kingsrook.qqq.frontend.android.mobileapp.viewmodel + +/******************************************************************************* + *******************************************************************************/ +sealed interface LoadState<T> { + /******************************************************************************* + ** Carry a completed value separately from loading and display-safe failure states. + *******************************************************************************/ + data class Success<T>(val value: T) : LoadState<T> + + /******************************************************************************* + ** Carry the UI failure message without requiring the presentation layer to inspect transport exceptions. + *******************************************************************************/ + data class Error<T>(val message: String) : LoadState<T> { + constructor(e: Exception, m: String) : this("${m}: ${e.message ?: "Error details not available"}") + } + + /******************************************************************************* + ** Mark an in-progress operation and retain its start time for loading presentation. + *******************************************************************************/ + data class Loading<T>(val unit: Unit) : LoadState<T> { + val start = System.currentTimeMillis() + } + + /******************************************************************************* + ** Share aggregate loading/error decisions across composed metadata and process screens. + *******************************************************************************/ + companion object { + /******************************************************************************* + *******************************************************************************/ + fun areAnyErrors(loadStates: List<LoadState<*>>): Boolean { + for (loadState in loadStates) { + if (loadState is Error) { + return (true); + } + } + + return (false); + } + + /******************************************************************************* + *******************************************************************************/ + fun getErrorMessages(loadStates: List<LoadState<*>>): List<String> { + val rs: MutableList<String> = mutableListOf(); + + for (loadState in loadStates) { + if (loadState is Error) { + rs.add(loadState.message) + } + } + + return (rs) + } + + /******************************************************************************* + *******************************************************************************/ + fun areAnyLoading(loadStates: List<LoadState<*>>): Boolean { + for (loadState in loadStates) { + if (loadState is Loading) { + return (true); + } + } + + return (false); + } + } +} diff --git a/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/viewmodel/ProcessAcknowledgment.kt b/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/viewmodel/ProcessAcknowledgment.kt new file mode 100644 index 0000000..ece5e6a --- /dev/null +++ b/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/viewmodel/ProcessAcknowledgment.kt @@ -0,0 +1,19 @@ +/* Copyright (c) 2026 QRunIO. SPDX-License-Identifier: Apache-2.0 */ +package com.kingsrook.qqq.frontend.android.mobileapp.viewmodel + +/******************************************************************************* + ** An extension action explicitly opts into acknowledged retries; ordinary form fields do not. + *******************************************************************************/ +data class ProcessAcknowledgment( + val field: String, + val expectedValue: Any, + val requiredValues: Map<String, Any> = emptyMap(), + val nonEmptyStringFields: Set<String> = emptySet() +) { + /******************************************************************************* + ** Every advertised receipt requirement must hold before the request can be discarded. + *******************************************************************************/ + fun matches(responseValues: Map<String, Any?>): Boolean = responseValues[field] == expectedValue && + requiredValues.all { (name, value) -> responseValues[name] == value } && + nonEmptyStringFields.all { name -> (responseValues[name] as? String)?.isNotBlank() == true } +} diff --git a/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/viewmodel/ProcessViewModel.kt b/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/viewmodel/ProcessViewModel.kt new file mode 100644 index 0000000..460acb0 --- /dev/null +++ b/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/viewmodel/ProcessViewModel.kt @@ -0,0 +1,852 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2004-2024. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package com.kingsrook.qqq.frontend.android.mobileapp.viewmodel + +import android.util.Log +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableIntStateOf +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.mutableStateMapOf +import androidx.compose.runtime.setValue +import androidx.lifecycle.ViewModel +import androidx.lifecycle.ViewModelProvider +import androidx.lifecycle.viewModelScope +import androidx.lifecycle.viewmodel.initializer +import androidx.lifecycle.viewmodel.viewModelFactory +import com.kingsrook.qqq.frontend.android.core.controllers.QQQRepository +import com.kingsrook.qqq.frontend.android.core.model.QPossibleValue +import com.kingsrook.qqq.frontend.android.core.model.metadata.QFieldMetaData +import com.kingsrook.qqq.frontend.android.core.model.metadata.QFrontendStepMetaData +import com.kingsrook.qqq.frontend.android.core.model.metadata.QInstance +import com.kingsrook.qqq.frontend.android.core.model.metadata.QProcessMetaData +import com.kingsrook.qqq.frontend.android.core.model.processes.ProcessStepResult +import com.kingsrook.qqq.frontend.android.core.model.processes.QJobComplete +import com.kingsrook.qqq.frontend.android.core.model.processes.QJobError +import com.kingsrook.qqq.frontend.android.core.model.processes.QJobRunning +import com.kingsrook.qqq.frontend.android.core.model.processes.QJobStarted +import com.kingsrook.qqq.frontend.android.core.model.widgets.WidgetBlock +import kotlinx.coroutines.Job +import kotlinx.coroutines.launch +import kotlinx.coroutines.cancelChildren +import java.time.LocalDateTime + + +private const val TAG = "ProcessViewModel" + +/******************************************************************************* + *******************************************************************************/ +open class ProcessViewModel : ViewModel() { + lateinit var qqqRepository: QQQRepository + lateinit var qInstance: QInstance + lateinit var processName: String + lateinit var qViewModel: QViewModel + var supportedCustomWidgetTypes: Set<String> = emptySet() + var fieldErrors: Map<String, String> by mutableStateOf(emptyMap()) + private set + var cancelling: Boolean by mutableStateOf(false) + private set + var cancellationFailed: Boolean by mutableStateOf(false) + private set + var submissionError: String? by mutableStateOf(null) + private set + /******************************************************************************* + ** Client-only widget state for this process instance. It survives step changes and recreation, is + ** replaced with the process, and is never submitted, saved, logged or shared between processes. + *******************************************************************************/ + val widgetState = mutableStateMapOf<String, Any>() + private var processComplete: Boolean by mutableStateOf(false) + private var initializing = false + + /** Options from server possible-value sources (`searchProcessPossibleValues`), keyed by field name. */ + val remoteOptions = mutableStateMapOf<String, List<QPossibleValue>>() + val remoteOptionErrors = mutableStateMapOf<String, String>() + + /** Incremented when this model clears a field's value, so the rendered control can follow. */ + val fieldResets = mutableStateMapOf<String, Int>() + private var dependencyVersion by mutableIntStateOf(0) + private val remoteOptionJobs = mutableMapOf<String, Job>() + private val remoteOptionGenerations = mutableMapOf<String, Int>() + + /******************************************************************************* + ** Fields whose choices come from a named possible-value source rather than inline metadata. + *******************************************************************************/ + private fun isRemote(field: QFieldMetaData) = field.possibleValueSourceName != null && field.inlinePossibleValueSource.isNullOrEmpty() + + /******************************************************************************* + ** DISABLE_UNTIL_SET (the default for contingent fields) offers no choices until every declared parent has a value. + *******************************************************************************/ + fun remoteOptionsBlockedReason(field: QFieldMetaData): String? { + dependencyVersion // process values are not observable state; this makes dependent controls recompose + if (!isRemote(field) || field.possibleValueSourceDependencyBehavior == "SHOW_ALL_UNTIL_SET") return null + val missing = field.possibleValueSourceDependsOn.orEmpty().filter { processValues[it].let { value -> value == null || value.toString().isEmpty() } } + if (missing.isEmpty()) return null + val labels = missing.map { name -> activeStep?.formFields?.firstOrNull { it.name == name }?.label ?: name } + return "Choose ${labels.joinToString(" and ")} first." + } + + /******************************************************************************* + ** Search the field's server source with the current form values. Only the newest request may publish, so a late + ** response for a replaced parent value can never restore choices (or a selection) that no longer apply. + *******************************************************************************/ + fun loadRemoteOptions(field: QFieldMetaData) { + if (!isRemote(field)) return + val generation = (remoteOptionGenerations[field.name] ?: 0) + 1 + remoteOptionGenerations[field.name] = generation + remoteOptionJobs.remove(field.name)?.cancel() + remoteOptionErrors.remove(field.name) + remoteOptions.remove(field.name) + if (remoteOptionsBlockedReason(field) != null) return + + val formNames = activeStep?.formFields.orEmpty().map { it.name }.toSet() + val values = formNames.filter { it != field.name }.associateWith { processValues[it] } + val scalars = processValues.filter { (key, value) -> key !in formNames && (value is String || value is Number || value is Boolean) } + remoteOptionJobs[field.name] = viewModelScope.launch { + try { + val options = qqqRepository.processPossibleValues(processName, field.name, values, scalars) + if (remoteOptionGenerations[field.name] != generation) return@launch + remoteOptions[field.name] = options + val chosen = processValues[field.name] + if (chosen != null && options.none { it.id.toString() == chosen.toString() }) clearSelection(field.name) + } catch (e: kotlinx.coroutines.CancellationException) { + throw e + } catch (e: Exception) { + if (remoteOptionGenerations[field.name] != generation) return@launch + remoteOptionErrors[field.name] = semanticError(e, "The available choices could not be loaded. Try again.") + } + } + } + + /******************************************************************************* + ** After a field changes, dependents re-query (or disable) and drop selections that belonged to the old parent value. + *******************************************************************************/ + fun fieldChanged(name: String) { + dependencyVersion++ + for (dependent in activeStep?.formFields.orEmpty().filter { isRemote(it) && name in it.possibleValueSourceDependsOn.orEmpty() }) { + if (processValues[dependent.name] != null) clearSelection(dependent.name) + loadRemoteOptions(dependent) + } + } + + /******************************************************************************* + ** Clear a selection that no longer fits, then apply the same rule to fields depending on it. + *******************************************************************************/ + private fun clearSelection(name: String) { + processValues[name] = null + fieldResets[name] = (fieldResets[name] ?: 0) + 1 + fieldChanged(name) + } + + private val clientWork = mutableStateMapOf<String, String>() + val clientWorkBlockReason: String? get() = clientWork.values.firstOrNull() + + /******************************************************************************* + ** Native controls retain their own operation identity while preventing process exit or advancement. + *******************************************************************************/ + fun setClientWork(key: String, reason: String?) { + if (reason == null) clientWork.remove(key) else clientWork[key] = reason + } + + var unconfirmedSubmission: Boolean by mutableStateOf(false) + private set + + /******************************************************************************* + ** Native navigation never interrupts a submitted mutation or pending native work. + *******************************************************************************/ + fun navigationBlockReason(): String? = when { + clientWorkBlockReason != null -> clientWorkBlockReason + waitingOnBackend && processUUID != null && initLoadState !is LoadState.Loading -> "Wait for the running request to finish before leaving." + else -> null + } + + /******************************************************************************* + ** Leaving is an explicit choice; a missing receipt is not proof that the scan was rejected. + *******************************************************************************/ + fun navigationWarning(): String? = if (pendingStepValues != null) + "The last scan is not confirmed and may already be saved. Stay to retry the same scan, or leave to stop retrying. Leaving does not undo a saved scan." + else null + + /******************************************************************************* + ** Use guarded navigation when attached to the host; standalone process owners still cancel explicitly. + *******************************************************************************/ + fun requestClose() { + if (::qViewModel.isInitialized) qViewModel.qNavigator.popStack() else cancel() + } + + ////////////////////////////////////////////////////////////////////////////////////////////////////////////// + // function that this view-model can call, if user chose, within the process, to leave the process. // + // so process can do its cleanup work, and then let the navigation event occur to go to a different screen. // + ////////////////////////////////////////////////////////////////////////////////////////////////////////////// + var closeProcessCallback: (() -> Unit)? = null + + /////////////////////////////////////////////////////////////////////// + // load-state wrapper for the fetching of the full process meta data // + /////////////////////////////////////////////////////////////////////// + var processMetaDataLoadState: LoadState<QProcessMetaData> by mutableStateOf(LoadState.Loading(Unit)) + private set + + ////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + // optional full meta-data for the process (yes, it is also in the load-state, but this is more straightforward // + // for code that can safely assume the process has been init'ed, and just needs the meta-data) // + ////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + var processMetaData: QProcessMetaData? = null + private set + + //////////////////////////////////////////////////////////////////////////////// + // load-state for the process's "init" call - e.g., the first backend step(s) // + //////////////////////////////////////////////////////////////////////////////// + var initLoadState: LoadState<ProcessStepResult> by mutableStateOf(LoadState.Loading(Unit)) + private set + + ///////////////////////////////////////////////////////////////////////////////////////////// + // a high-level "the process crashed" load-state // + // will never be "Loading", and initializes as Success - so just upon-error becomes Error. // + ///////////////////////////////////////////////////////////////////////////////////////////// + var topLevelErrorState: LoadState<Unit> by mutableStateOf(LoadState.Success(Unit)) + private set + + ///////////////////////////////////////////////////////////////////////////////////////////////////////////////// + // UUID for the process - defined upon the first response from the init step (whether complete or job-started) // + ///////////////////////////////////////////////////////////////////////////////////////////////////////////////// + var processUUID: String? = null + private set + + //////////////////////////////////////////////////////////////////////////////////// + // true when, we're waiting on the backend - so e.g., form elements are disabled. // + //////////////////////////////////////////////////////////////////////////////////// + var waitingOnBackend: Boolean by mutableStateOf(true) + private set + + ///////////////////////////////////////////////////////////////////////////// + // when waiting on a backend step that's gone async, this will be its UUID // + ///////////////////////////////////////////////////////////////////////////// + private var activeJobUUID: String by mutableStateOf("") + + //////////////////////////////////////////////////////////////////// + // message and counts from the backend when an async job is going // + //////////////////////////////////////////////////////////////////// + var jobRunningMessage: String by mutableStateOf("") + var currentOfTotalMessage: String by mutableStateOf("") + + //////////////////////////////////////////////// + // timestamp of last check-in on an async job // + //////////////////////////////////////////////// + var jobRunningLastUpdated: LocalDateTime by mutableStateOf(LocalDateTime.now()) + private set + + ////////////////////////////////////////////////////////////////////////////// + // result of the last backend call - be that complete/started/running/error // + ////////////////////////////////////////////////////////////////////////////// + var lastStepResult: ProcessStepResult by mutableStateOf(QJobComplete("", nextStep = "")) + private set + + ///////////////////////////////////////////////////////////////////////////////////////////// + // list of the process's frontend steps (which may get mutated based on backend responses) // + ///////////////////////////////////////////////////////////////////////////////////////////// + private var frontendSteps: List<QFrontendStepMetaData> = emptyList() + + /////////////////////////////////////////// + // which frontend step is actively shown // + /////////////////////////////////////////// + var activeStep: QFrontendStepMetaData? by mutableStateOf(null) + private set + + ///////////////////////////////////////////////////////////////////////////////// + // name of the active step (e.g., the frontend step that we are to be showing) // + // (only publicly settable for previews/tests...) // + ///////////////////////////////////////////////////////////////////////////////// + var activeStepName: String by mutableStateOf("") + + /////////////////////////////////////////////////////////////////////////////////// + // index of the active step (useful for looking at "last" and/or "next to last") // + /////////////////////////////////////////////////////////////////////////////////// + private var activeStepIndex: Int by mutableIntStateOf(0) + + /////////////////////////////////////////////////////////////////////////////////////////// + // counter that will increment when user moves to a next-step -- even if that step is // + // the same name or index -- but serves as a signal to views that they need to recompose // + /////////////////////////////////////////////////////////////////////////////////////////// + var stepInstanceCounter: Int by mutableIntStateOf(0) + private set + + ///////////////////////////////////////////////////////////////////////////////////////// + // map of callback functions, that controls can register into, so that they can get a // + // callback when something changes. Originally built for modal-composite blocks, so // + // they can be told when their visibility should change, e.g., in response to a button // + ///////////////////////////////////////////////////////////////////////////////////////// + private var controlCallbacks: MutableMap<String, (() -> Unit)> = mutableMapOf() + + /////////////////////////////////////////////////////////////////////////////////////// + // a callback that runs before a submit to the backend (e.g., for a next-step) fires // + /////////////////////////////////////////////////////////////////////////////////////// + var onSubmitCallback: (() -> Unit)? = null + + /////////////////////////////////////////////////////// + // the map of values for fields within this process. // + /////////////////////////////////////////////////////// + var processValues: MutableMap<String, Any?> = mutableMapOf() + + //////////////////////////////////////////////////////////////////////////////////////////////// + // set of names of fields which are "form fields" - e.g., whose entry in processValues should // + // automatically be submitted when moving to next-step. Views, if they show fields, should // + // register those field's names in this map via call to: registerFormFieldName(name) // + //////////////////////////////////////////////////////////////////////////////////////////////// + var formFieldNames: MutableSet<String> = mutableSetOf() + + private var lastInvokedControlCallbackStepInstanceValues: MutableMap<String, Any> = mutableMapOf() + + //////////////////////////////////////////////////////////////////////////// + // Note: if you add new fields - please, add them to `fun reset()` below // + //////////////////////////////////////////////////////////////////////////// + + + /******************************************************************************* + *******************************************************************************/ + fun doInit() { + viewModelScope.launch() + { + loadProcessMetaData().join() + if (processMetaData != null) { + initProcess() + } + } + } + + /******************************************************************************* + *******************************************************************************/ + fun reset() { + viewModelScope.coroutineContext.cancelChildren() + remoteOptionJobs.clear() + remoteOptionGenerations.clear() + fieldResets.clear() + remoteOptions.clear() + remoteOptionErrors.clear() + widgetState.clear() + initializing = false + unconfirmedSubmission = false + clientWork.clear() + pendingStepValues = null + pendingAcknowledgment = null + fieldErrors = emptyMap() + cancelling = false + cancellationFailed = false + submissionError = null + processComplete = false + processMetaDataLoadState = LoadState.Loading(Unit) + processMetaData = null + initLoadState = LoadState.Loading(Unit) + topLevelErrorState = LoadState.Success(Unit) + processUUID = null + waitingOnBackend = true + activeJobUUID = "" + jobRunningMessage = "" + currentOfTotalMessage = "" + jobRunningLastUpdated = LocalDateTime.now() + lastStepResult = QJobComplete("", nextStep = "") + frontendSteps = emptyList() + activeStep = null + activeStepName = "" + activeStepIndex = 0 + stepInstanceCounter = 0 + controlCallbacks = mutableMapOf() + onSubmitCallback = null + processValues = mutableMapOf() + formFieldNames = mutableSetOf() + lastInvokedControlCallbackStepInstanceValues = mutableMapOf() + } + + /******************************************************************************* + *******************************************************************************/ + private fun loadProcessMetaData(): Job { + val processViewModel = this + + return viewModelScope.launch() + { + processMetaDataLoadState = try { + val processMetaData = qqqRepository.getProcessMetaData(processName) + frontendSteps = processMetaData.frontendSteps ?: emptyList() + + processViewModel.processMetaData = processMetaData + + LoadState.Success(processMetaData) + } catch (e: kotlinx.coroutines.CancellationException) { + throw e + } catch (e: Exception) { + LoadState.Error(e, semanticError(e, "Error loading process metadata.")) + } + } + } + + /******************************************************************************* + *******************************************************************************/ + private fun initProcess(): Job { + return viewModelScope.launch() + { + try { + initializing = true + waitingOnBackend = true + initLoadState = LoadState.Loading(Unit) + + val value = qqqRepository.processInit(processName, emptyMap()) + if (cancelling) { + // Keep the response long enough to cancel the server process whose UUID was not yet known. + processUUID = value.processUUID.takeIf { it.isNotBlank() } + if (value !is QJobComplete || !SemanticProcess.terminal(value)) { + val uuid = processUUID ?: error("Initialization did not return a process identity") + qqqRepository.processCancel(processName, uuid) + } + closeProcessCallback?.invoke() + } else evaluateProcessResult(value) + } catch (e: kotlinx.coroutines.CancellationException) { + throw e + } catch (e: Exception) { + waitingOnBackend = false + cancellationFailed = cancelling + initLoadState = LoadState.Error( + e, if (cancelling) + "The server did not confirm cancellation. The process may still be running. Retry cancellation if available, or contact your administrator." + else semanticError(e, "Error launching process.") + ) + } finally { + initializing = false + cancelling = false + } + } + } + + /******************************************************************************* + *******************************************************************************/ + fun setTopLevelError(message: String) { + topLevelErrorState = LoadState.Error(message) + } + + /******************************************************************************* + *******************************************************************************/ + fun runStep(eventValues: Map<String, Any?> = emptyMap(), acknowledgment: ProcessAcknowledgment? = null) { + if (waitingOnBackend || cancelling || getNoMoreSteps()) return + if (clientWorkBlockReason != null) return + if (unconfirmedSubmission && pendingStepValues == null) return + unsupportedReason()?.let { setTopLevelError(it); return } + submissionError = null + val localProcessUUID = processUUID + val localActiveStepName = activeStepName + + if (localProcessUUID == null) { + setTopLevelError("Missing process UUID. Unable to continue running process.") + return + } + + if (localActiveStepName == "") { + setTopLevelError("Missing current step name. Unable to continue running process.") + return + } + + val valuesToSubmit: MutableMap<String, Any?> = mutableMapOf() + + val declaredFields = activeStep?.components.orEmpty() + .filter { it.type == com.kingsrook.qqq.frontend.android.core.model.metadata.QComponentType.EDIT_FORM } + .flatMap { SemanticProcess.fields(activeStep, it) } + SemanticProcess.widgetInputFields(activeStep, processValues) + val editableFields = declaredFields.filter { it.isEditable && !it.isHidden }.distinctBy { it.name } + val protectedFields = declaredFields.filter { !it.isEditable || it.isHidden }.map { it.name }.toSet() + fieldErrors = editableFields.mapNotNull { field -> + validateSemanticField(field, if (eventValues.containsKey(field.name)) eventValues[field.name] else semanticInitialValue(field, processValues))?.let { field.name to it } + }.toMap() + if (fieldErrors.isNotEmpty()) return + editableFields.forEach { formFieldNames.add(it.name) } + for (name in formFieldNames) { + if (name in protectedFields) continue + val field = editableFields.firstOrNull { it.name == name } + valuesToSubmit[name] = if (field == null) processValues[name] else semanticFieldValue(field, semanticInitialValue(field, processValues)) + } + + for (entry in eventValues.entries) { + if (entry.key in protectedFields) continue + val field = editableFields.firstOrNull { it.name == entry.key } + valuesToSubmit[entry.key] = if (field == null) entry.value else semanticFieldValue(field, entry.value) + } + + pendingAcknowledgment = acknowledgment + pendingStepValues = if (acknowledgment != null) valuesToSubmit.toMap() else null + topLevelErrorState = LoadState.Success(Unit) + + ///////////////////////////////////////// + // set state to show we're loading now // + ///////////////////////////////////////// + waitingOnBackend = true + jobRunningLastUpdated = LocalDateTime.now() + jobRunningMessage = "Working..." + + viewModelScope.launch() + { + try { + onSubmitCallback?.invoke() + + val value = qqqRepository.processStep(processName, localProcessUUID, localActiveStepName, valuesToSubmit, stepTimeoutMillis = 1000) + evaluateProcessResult(value) + } catch (e: kotlinx.coroutines.CancellationException) { + throw e + } catch (e: Exception) { + waitingOnBackend = false + if (e is com.kingsrook.qqq.frontend.android.core.controllers.UiApiException) { + fieldErrors = e.fieldErrors.associate { it.field to it.message } + if (e.fieldErrors.isNotEmpty()) submissionError = e.message + else setTopLevelError(e.message ?: "The server rejected this request.") + } else { + unconfirmedSubmission = true + setTopLevelError( + if (e is retrofit2.HttpException && e.code() in listOf(401, 403)) + "Access denied. Your session may have expired or device approval may have been revoked. Sign in again or contact your administrator." + else if (pendingStepValues != null) "The server did not confirm this request. Retry the same request when connected." + else "The server did not confirm this request. Do not submit it again. Process reference: $localProcessUUID. Contact your administrator to check its result." + ) + } + } + } + } + + /******************************************************************************* + ** Retain only the current request in memory so an uncertain response can be retried safely. + *******************************************************************************/ + var pendingStepValues: Map<String, Any?>? by mutableStateOf(null) + private set + private var pendingAcknowledgment: ProcessAcknowledgment? = null + + /******************************************************************************* + ** Explicit retries preserve the scan event ID; no background queue is created. + *******************************************************************************/ + fun retryPendingStep() { + if (waitingOnBackend || cancelling) return + if (activeJobUUID.isNotEmpty()) { + topLevelErrorState = LoadState.Success(Unit) + waitingOnBackend = true + checkIn() + } else pendingStepValues?.let { runStep(it, pendingAcknowledgment) } + } + + /******************************************************************************* + ** Polling a known job is safe even when its original action was not an idempotent scanner event. + *******************************************************************************/ + fun retryLabel(): String? = when { + activeJobUUID.isNotEmpty() -> "Check result again" + pendingStepValues != null -> "Retry same request" + else -> null + } + + /******************************************************************************* + *******************************************************************************/ + private fun evaluateProcessResult(value: ProcessStepResult) { + lastStepResult = value + + when (value) { + is QJobComplete -> { + waitingOnBackend = false + processJobCompleteResult(value) + + //////////////////////////////////////////////////////////////////////////////////////////////// + // if the initLoadState was loading, then it means we've finally completed the initial load - // + // so now we can set a few things to indicate we've progressed past that. // + //////////////////////////////////////////////////////////////////////////////////////////////// + if (initLoadState is LoadState.Loading) { + processUUID = value.processUUID + initLoadState = LoadState.Success(value) + } + } + + is QJobError -> { + waitingOnBackend = false + activeJobUUID = "" + setTopLevelError(value.userFacingError ?: value.error) + } + + is QJobStarted -> { + waitingOnBackend = true + jobRunningLastUpdated = LocalDateTime.now() + activeJobUUID = value.jobUUID + processUUID = value.processUUID + } + + is QJobRunning -> { + waitingOnBackend = true + jobRunningMessage = value.message + jobRunningLastUpdated = LocalDateTime.now() + if (jobRunningMessage == "") { + jobRunningMessage = "Working..." + } + + val localCurrent = value.current + val localTotal = value.total + currentOfTotalMessage = if (localCurrent != null && localTotal != null) { + "${localCurrent} of ${localTotal}" + } else { + "" + } + } + + else -> { + setTopLevelError("Unexpected response state on a process step call (of type: ${value.javaClass.simpleName})") + } + } + } + + /******************************************************************************* + *******************************************************************************/ + private fun processJobCompleteResult(value: QJobComplete) { + unconfirmedSubmission = false + if (pendingAcknowledgment?.matches(value.values) != false) { + pendingStepValues = null + pendingAcknowledgment = null + } else { + setTopLevelError("The server did not acknowledge this scan. Retry the same request when connected.") + return + } + frontendSteps = SemanticProcess.adjust(frontendSteps, value.processMetaDataAdjustment) + processValues = value.values.toMutableMap() + processComplete = SemanticProcess.terminal(value) + fieldErrors = emptyMap() + submissionError = null + updateActiveStepName(value.nextStep) + stepInstanceCounter++ + activeJobUUID = "" + formFieldNames = mutableSetOf() + + /////////////////////////////////////////////////////////////////////////// + // at some point, we might want to support the ability for a process // + // to make a value appear in the topBarStatusText area... but not today! // + // whenever we do that, it might not belong here anyway // + /////////////////////////////////////////////////////////////////////////// + // qViewModel.topBarStatusText = "${System.currentTimeMillis() % 100}" + + } + + /******************************************************************************* + *******************************************************************************/ + private fun updateActiveStepName(newActiveStepName: String) { + activeStepName = newActiveStepName + activeStep = null + + for ((index, qFrontendStepMetaData) in frontendSteps.withIndex()) { + if (qFrontendStepMetaData.name == activeStepName) { + activeStepIndex = index + activeStep = qFrontendStepMetaData + return + } + } + + if (!getNoMoreSteps()) setTopLevelError("The server returned an unknown process screen. Update the client or contact your administrator.") + } + + /******************************************************************************* + *******************************************************************************/ + fun checkIn() { + val localProcessUUID = processUUID + val localJobUUID = activeJobUUID + + if (localProcessUUID == null) { + setTopLevelError("Missing process UUID. Unable to continue running process.") + return + } + + if (localJobUUID.isEmpty() || cancelling) { + setTopLevelError("Missing job UUID. Unable to continue running process.") + return + } + + viewModelScope.launch() + { + try { + val value = qqqRepository.processJobStatus(processName, localProcessUUID, localJobUUID) + evaluateProcessResult(value) + } catch (e: kotlinx.coroutines.CancellationException) { + throw e + } catch (e: Exception) { + waitingOnBackend = false + setTopLevelError(semanticError(e, "The server did not confirm the running request. Retry to check the same request again.")) + } + } + } + + /******************************************************************************* + *******************************************************************************/ + fun cancel() { + if (cancelling) return + cancellationFailed = false + val uuid = processUUID + if (uuid == null && initializing) { + // Cancelling transport here could discard the only response containing the server UUID. + cancelling = true + return + } + if (uuid == null || getNoMoreSteps()) { + viewModelScope.coroutineContext.cancelChildren() + closeProcessCallback?.invoke() + return + } + cancelling = true + viewModelScope.coroutineContext.cancelChildren() + viewModelScope.launch { + try { + qqqRepository.processCancel(processName, uuid) + pendingStepValues = null + pendingAcknowledgment = null + closeProcessCallback?.invoke() + } catch (e: kotlinx.coroutines.CancellationException) { + throw e + } catch (e: Exception) { + cancellationFailed = true + waitingOnBackend = false + setTopLevelError(if (e is com.kingsrook.qqq.frontend.android.core.controllers.UiApiException) e.message ?: "Cancellation failed." else "The server did not confirm cancellation. Try again when connected.") + } finally { + cancelling = false + } + } + } + + /******************************************************************************* + *******************************************************************************/ + fun getNextButtonLabel(): String = "Next" + + /******************************************************************************* + ** Expose the server-derived completion decision instead of inferring it from the last displayed step. + *******************************************************************************/ + fun getNoMoreSteps(): Boolean = processComplete + + /******************************************************************************* + ** Validate the current server screen against native controls before allowing submission. + *******************************************************************************/ + fun unsupportedReason(): String? = SemanticProcess.unsupported( + activeStep, processValues, + if (::qInstance.isInitialized) qInstance else null, supportedCustomWidgetTypes + ) + + /******************************************************************************* + ** Expose semantic server messages only through their explicit exception type and otherwise use a safe fallback. + *******************************************************************************/ + private fun semanticError(error: Exception, fallback: String): String = + if (error is com.kingsrook.qqq.frontend.android.core.controllers.UiApiException) error.message ?: fallback else fallback + + /******************************************************************************* + ** Track editable semantic fields so the submission boundary validates the values rendered by this step. + *******************************************************************************/ + fun registerFormFieldName(name: String) { + formFieldNames.add(name) + } + + /******************************************************************************* + *******************************************************************************/ + fun actionCallback(eventValues: Map<String, Any>) { + val registerControlCallbackName = eventValues["registerControlCallbackName"] + val registerControlCallbackFunction = eventValues["registerControlCallbackFunction"] + if (registerControlCallbackName is String && registerControlCallbackFunction != null) { + require(registerControlCallbackFunction is Function0<*>) { "Control callback must take no arguments" } + controlCallbacks[registerControlCallbackName] = { registerControlCallbackFunction.invoke(); Unit } + return + } + + var valuesForRunStep: Map<String, Any?> = eventValues + var doRunStep = true + var controlCode: String? = null + var controlCallbackName: String? = null + + val widgetBlock = eventValues["widgetBlock"] + if (widgetBlock is WidgetBlock) { + if (widgetBlock.blockType == "BUTTON" && widgetBlock.values["actionCode"] != null) { + valuesForRunStep = mapOf("actionCode" to widgetBlock.values["actionCode"]) + } else if (widgetBlock.blockType == "BUTTON" && widgetBlock.values["controlCode"] != null) { + controlCode = widgetBlock.values["controlCode"].toString() + } + } + + if (eventValues["controlCode"] != null) { + controlCode = eventValues["controlCode"].toString() + } + + if (controlCode != null) { + doRunStep = false + + val split = controlCode.split(Regex(":"), 2) + if (split.size == 2) { + if (split[0] == "showModal") { + processValues[split[1]] = true + controlCallbackName = split[1] + } else if (split[0] == "hideModal") { + processValues[split[1]] = false + controlCallbackName = split[1] + } else if (split[0] == "toggleModal") { + val currentValue = processValues[split[1]] + if (currentValue is Boolean) { + processValues[split[1]] = !currentValue + } else { + processValues[split[1]] = true + } + controlCallbackName = split[1] + } else if (split[0] == "invokeControlCallbackOnlyOnce") { + controlCallbackName = split[1] + if (lastInvokedControlCallbackStepInstanceValues[controlCallbackName] == stepInstanceCounter) { + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + // if we've already invoked the named control callback on this step, then un-set the callback name, so we won't invoke it again. // + // was: if we've already played audio on this step, then un-set the callback name, so we won't play it again. // + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + controlCallbackName = null + } else { + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + // else, if we haven't invoked the named control callback on this step, then set flag to indicate that we're calling it now. // + // was: else, if we haven't played audio on this step, then set flag to indicate that we're playing it now. // + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + lastInvokedControlCallbackStepInstanceValues[controlCallbackName] = stepInstanceCounter + } + } else { + Log.w(TAG, "Unexpected part[0] (before colon) in controlCode: [${controlCode}]") + } + } else { + Log.w(TAG, "Expected controlCode to have 2 colon-delimited parts, but was: [${controlCode}]") + } + } + + if (controlCallbackName != null) { + if (controlCallbacks[controlCallbackName] != null) { + try { + controlCallbacks[controlCallbackName]?.invoke() + } catch (e: kotlinx.coroutines.CancellationException) { + throw e + } catch (e: Exception) { + Log.w(TAG, "Error calling control callback for [${controlCallbackName}]", e) + } + } + } + + if (doRunStep) { + runStep(valuesForRunStep) + } + } + + /******************************************************************************* + *******************************************************************************/ + companion object { + val factory: ViewModelProvider.Factory = viewModelFactory() + { + initializer() + { + ProcessViewModel() + } + } + } +} diff --git a/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/viewmodel/QViewModel.kt b/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/viewmodel/QViewModel.kt new file mode 100644 index 0000000..291b1c7 --- /dev/null +++ b/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/viewmodel/QViewModel.kt @@ -0,0 +1,925 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2004-2024. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package com.kingsrook.qqq.frontend.android.mobileapp.viewmodel + +import android.util.Log +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.setValue +import androidx.datastore.core.DataStore +import androidx.datastore.preferences.core.Preferences +import androidx.lifecycle.ViewModel +import androidx.lifecycle.ViewModelProvider +import androidx.lifecycle.ViewModelProvider.AndroidViewModelFactory.Companion.APPLICATION_KEY +import androidx.lifecycle.viewModelScope +import androidx.lifecycle.viewmodel.initializer +import androidx.lifecycle.viewmodel.viewModelFactory +import androidx.navigation.NavHostController +import com.kingsrook.qqq.frontend.android.core.controllers.QQQRepository +import com.kingsrook.qqq.frontend.android.core.model.Environment +import com.kingsrook.qqq.frontend.android.core.model.metadata.QInstance +import com.kingsrook.qqq.frontend.android.core.model.metadata.authentication.BaseAuthenticationMetaData +import com.kingsrook.qqq.frontend.android.core.model.metadata.authentication.ManageSessionRequest +import com.kingsrook.qqq.frontend.android.core.model.metadata.authentication.ManageSessionResponse +import com.kingsrook.qqq.frontend.android.core.utils.firstN +import com.kingsrook.qqq.frontend.android.mobileapp.QMobileApplication +import com.kingsrook.qqq.frontend.android.mobileapp.container.QAppContainer +import com.kingsrook.qqq.frontend.android.mobileapp.data.SettingsRepository +import com.kingsrook.qqq.frontend.android.mobileapp.ui.QNavigator +import com.kingsrook.qqq.frontend.android.mobileapp.ui.authentication.OAuth2LoginAttempt +import com.kingsrook.qqq.frontend.android.mobileapp.ui.authentication.OAuth2LoginBinding +import com.kingsrook.qqq.frontend.android.mobileapp.ui.authentication.OAuth2LoginPhase +import com.kingsrook.qqq.frontend.android.mobileapp.ui.authentication.OAuth2LogoutAttempt +import com.kingsrook.qqq.frontend.android.mobileapp.ui.authentication.OAuth2LogoutBinding +import com.kingsrook.qqq.frontend.android.mobileapp.ui.authentication.OAuth2LogoutPhase +import com.kingsrook.qqq.frontend.android.core.model.metadata.authentication.NativeLogoutData +import com.kingsrook.qqq.frontend.android.core.model.metadata.authentication.OAuth2AuthenticationMetaData +import kotlinx.coroutines.Job +import kotlinx.coroutines.launch +import kotlinx.coroutines.ensureActive +import kotlinx.coroutines.sync.Mutex +import kotlinx.coroutines.sync.withLock + + +private const val TAG = "QViewModel" + +/******************************************************************************* + ** Main view-model for the QQQ Mobile app: + ** - high-level data, e.g., what environment, its auth meta-data and instance + ** - user/session level status/data + *******************************************************************************/ +open class QViewModel( + val qqqRepository: QQQRepository, + private val dataStore: DataStore<Preferences> +) : ViewModel() { + private var settingsRepository: SettingsRepository = SettingsRepository(dataStore) + + //////////////////////////////////////////////////////////////////////////////////////////////////////////// + // this should not get reset ever - it's added to avoid re-running splash animation on orientation change // + //////////////////////////////////////////////////////////////////////////////////////////////////////////// + var didRunSplashAnimation = false + + var initialLoadFromDataStoreLoadState: LoadState<Unit> by mutableStateOf(LoadState.Loading(Unit)) + private set + + var isAuthenticated: Boolean by mutableStateOf(false) + private set + + var isLogoutRequested: Boolean by mutableStateOf(false) + private set + + var logoutInProgress: Boolean by mutableStateOf(false) + private set + + var logoutMessage: String by mutableStateOf("") + private set + + var sessionUUID: String by mutableStateOf("") + private set + + private var storedSessionUUIDLoadState: LoadState<String> by mutableStateOf(LoadState.Loading(Unit)) + private set + + var sessionUserFullName: String by mutableStateOf("") + + private var storedSessionUserFullName: LoadState<String> by mutableStateOf(LoadState.Loading(Unit)) + + private var storedEnvironmentLoadState: LoadState<Environment> by mutableStateOf(LoadState.Loading(Unit)) + + private var defaultEnvironment = QAppContainer.availableEnvironments[0] + + var environment: Environment by mutableStateOf(defaultEnvironment) + private set + + var authenticationMetaDataLoadState: LoadState<BaseAuthenticationMetaData> by mutableStateOf(LoadState.Loading(Unit)) + private set + + var manageSessionLoadState: LoadState<ManageSessionResponse> by mutableStateOf(LoadState.Loading(Unit)) + private set + + var qInstanceLoadState: LoadState<QInstance> by mutableStateOf(LoadState.Loading(Unit)) + private set + + var topBarStatusText: String? by mutableStateOf("") + + var qNavigator: QNavigator = QNavigator(null, this) + private set + + private var initedQNavigator = false + + var supportedCustomWidgetTypes: Set<String> = emptySet() + var activeProcessViewModel: ProcessViewModel? by mutableStateOf(null) + + /******************************************************************************* + ** A host may end its own session resources before the ordinary QQQ logout. + *******************************************************************************/ + var beforeLogout: suspend () -> Unit = {} + + /******************************************************************************* + ** Hosts refresh this action after Activity recreation; a retained leave dialog must not call an obsolete UI scope. + *******************************************************************************/ + var changeServerAction: (() -> Unit)? = null + + var oauth2LoginPhase: OAuth2LoginPhase by mutableStateOf(OAuth2LoginPhase.READY) + private set + var oauth2LoginMessage: String? by mutableStateOf(null) + private set + private val oauth2Attempt = OAuth2LoginAttempt() + private var oauth2Generation = 0L + private var oauth2Binding: OAuth2LoginBinding? = null + private var oauth2Metadata: BaseAuthenticationMetaData? = null + private var oauth2ExchangeJob: Job? = null + + var companyLogoutBinding: OAuth2LogoutBinding? by mutableStateOf(null) + private set + var companyLogoutPhase: OAuth2LogoutPhase by mutableStateOf(OAuth2LogoutPhase.IDLE) + private set + var companyLogoutGeneration = 0L + private set + private val companyLogoutAttempt = OAuth2LogoutAttempt() + + /******************************************************************************* + ** Opaque login identity: callbacks and responses belong to their initiating server and generation. + *******************************************************************************/ + class AuthenticationAttempt internal constructor( + internal val generation: Long, internal val server: String, + internal val metadata: BaseAuthenticationMetaData? + ) { + internal var exchangeStarted = false + } + + private var authenticationGeneration = 0L + private var authenticationAttempt: AuthenticationAttempt? = null + private var authenticationJob: Job? = null + private var logoutJob: Job? = null + private var lastLogoutServerConfirmed = false + private var auth0ProviderLogoutJob: Job? = null + private val settingsMutex = Mutex() + + /******************************************************************************* + ** Capture the current server and metadata only while a new authentication attempt is eligible. + *******************************************************************************/ + fun prepareAuthentication(): AuthenticationAttempt? { + if (isAuthenticated || isLogoutRequested || logoutInProgress) return null + val metadata = (authenticationMetaDataLoadState as? LoadState.Success)?.value ?: return null + cancelAuthentication() + cancelOAuth2Login() + return AuthenticationAttempt(authenticationGeneration, environment.baseUrl, metadata).also { authenticationAttempt = it } + } + + /******************************************************************************* + ** Reject results after server, metadata, generation or authentication eligibility changes. + *******************************************************************************/ + fun isCurrentAuthentication(attempt: AuthenticationAttempt): Boolean = + authenticationAttempt === attempt && attempt.generation == authenticationGeneration && + attempt.server == environment.baseUrl && attempt.metadata == (authenticationMetaDataLoadState as? LoadState.Success)?.value && + !isAuthenticated && !isLogoutRequested && !logoutInProgress + + /******************************************************************************* + ** Invalidate the attempt before cancelling its job so late responses cannot become the active session. + *******************************************************************************/ + fun cancelAuthentication(attempt: AuthenticationAttempt? = null) { + if (attempt != null && authenticationAttempt !== attempt) return + authenticationGeneration++ + authenticationAttempt = null + authenticationJob?.cancel() + authenticationJob = null + } + + /******************************************************************************* + ** Exchange browser credentials only while their initiating authentication attempt remains current. + *******************************************************************************/ + fun completeAuth0Login(attempt: AuthenticationAttempt, accessToken: String, userName: String) { + viewModelScope.launch { + if (isCurrentAuthentication(attempt)) exchangeAuthentication(attempt, userName) { + qqqRepository.manageSession(ManageSessionRequest(accessToken = accessToken, uuid = null)) + } + } + } + + /******************************************************************************* + ** Adopt a provisional session at most once for the current attempt and revoke abandoned server sessions. + *******************************************************************************/ + private fun exchangeAuthentication(attempt: AuthenticationAttempt, userName: String?, exchange: suspend () -> ManageSessionResponse) { + if (!isCurrentAuthentication(attempt) || attempt.exchangeStarted) return + attempt.exchangeStarted = true + manageSessionLoadState = LoadState.Loading(Unit) + authenticationJob = viewModelScope.launch { + var newSession: String? = null + var adopted = false + try { + val response = exchange() + newSession = response.uuid?.takeIf { it.isNotBlank() } + kotlinx.coroutines.currentCoroutineContext().ensureActive() + if (!isCurrentAuthentication(attempt)) return@launch + sessionUUID = requireNotNull(newSession) + qqqRepository.setSessionUUID(sessionUUID) + if (userName != null) doSetSessionUserFullName(userName) + manageSessionLoadState = LoadState.Success(response) + logInSuccessful() + adopted = true + authenticationAttempt = null + loadQInstance() + } catch (exception: kotlinx.coroutines.CancellationException) { + throw exception + } catch (exception: Exception) { + if (isCurrentAuthentication(attempt)) manageSessionLoadState = LoadState.Error("Sign-in failed. Check your credentials and connection.") + } finally { + if (!adopted && newSession != null) kotlinx.coroutines.withContext(kotlinx.coroutines.NonCancellable) { + try { + kotlinx.coroutines.withTimeout(3000) { qqqRepository.discardNativeSession(attempt.server, newSession) } + } catch (exception: Exception) { /* Never adopt an abandoned credential. */ + } + } + } + } + } + + //////////////////////////////////////////////////////////////////// + // note - new properties - do you want to add them to clearAll()? // + //////////////////////////////////////////////////////////////////// + + init { + val generation = authenticationGeneration + viewModelScope.launch() + { + doInitialLoadFromDataStore().join() + if (generation != authenticationGeneration) { + initialLoadFromDataStoreLoadState = LoadState.Success(Unit) + return@launch + } + loadAuthenticationMetaData().join() + if (generation != authenticationGeneration) { + initialLoadFromDataStoreLoadState = LoadState.Success(Unit) + return@launch + } + tryLoginFromDataStore().join() + } + } + + /******************************************************************************* + ** as part of not re-creating all the things upon orientation change - + ** own the qNavigator & navController here + *******************************************************************************/ + fun setNavController(navController: NavHostController?) { + if (!initedQNavigator) { + qNavigator = QNavigator(navController, this) + initedQNavigator = true + } else { + qNavigator.navController = navController + } + } + + /******************************************************************************* + *******************************************************************************/ + fun reInitAfterFailure() { + clearAll() + loadAuthenticationMetaData() + } + + + /******************************************************************************* + *******************************************************************************/ + fun resetApp() { + clearAll() + loadAuthenticationMetaData() + } + + /******************************************************************************* + *******************************************************************************/ + private fun clearAll(preserveLogoutScreen: Boolean = false) { + cancelAuthentication() + cancelOAuth2Login() + if (!preserveLogoutScreen) cancelCompanyLogout() + //////////////////////////////////////////// + // reset all the things to initial values // + //////////////////////////////////////////// + // storedSessionDance = LoadState.Loading(Unit) // well, not this one - it's only for our very first load. + isAuthenticated = false + if (!preserveLogoutScreen) isLogoutRequested = false + sessionUUID = "" + storedSessionUUIDLoadState = LoadState.Loading(Unit) + sessionUserFullName = "" + storedSessionUserFullName = LoadState.Loading(Unit) + storedEnvironmentLoadState = LoadState.Loading(Unit) + if (!preserveLogoutScreen) authenticationMetaDataLoadState = LoadState.Loading(Unit) + manageSessionLoadState = LoadState.Loading(Unit) + qInstanceLoadState = LoadState.Loading(Unit) + topBarStatusText = "" + activeProcessViewModel?.reset() + activeProcessViewModel = null + } + + /******************************************************************************* + *******************************************************************************/ + private fun loadAuthenticationMetaData(): Job { + val generation = authenticationGeneration + val server = environment.baseUrl + return viewModelScope.launch() + { + val result: LoadState<BaseAuthenticationMetaData> = try { + LoadState.Success(qqqRepository.getAuthenticationMetaData()) + } catch (e: Exception) { + Log.w(TAG, "Error loading Authentication MetaData") + LoadState.Error(e, "Error loading Authentication MetaData") + } + kotlinx.coroutines.currentCoroutineContext().ensureActive() + if (generation == authenticationGeneration && server == environment.baseUrl) authenticationMetaDataLoadState = result + } + } + + /******************************************************************************* + *******************************************************************************/ + open fun manageSession(accessToken: String) { + val attempt = prepareAuthentication() ?: return + exchangeAuthentication(attempt, sessionUserFullName.takeIf { it.isNotBlank() }) { + qqqRepository.manageSession(ManageSessionRequest(accessToken = accessToken, uuid = null)) + } + } + + /******************************************************************************* + *******************************************************************************/ + fun logInFailed() { + isAuthenticated = false + + /////////////////////////////////////////////////// + // make sure we don't have a sessionUUID stored. // + /////////////////////////////////////////////////// + storeSessionUUID("") + } + + /******************************************************************************* + *******************************************************************************/ + fun logInSuccessful() { + isAuthenticated = true + storeSessionUUID(sessionUUID) + } + + /******************************************************************************* + *******************************************************************************/ + fun requestLogout() { + cancelCompanyLogout() + cancelAuthentication() + cancelOAuth2Login() + isLogoutRequested = true + qNavigator.goHome(cancelActiveProcess = false) + } + + /******************************************************************************* + *******************************************************************************/ + fun requestLogin() { + if (companyLogoutPhase == OAuth2LogoutPhase.PREPARING || companyLogoutPhase == OAuth2LogoutPhase.BROWSER || logoutInProgress) return + cancelCompanyLogout() + isLogoutRequested = false + } + + /******************************************************************************* + *******************************************************************************/ + private fun doInitialLoadFromDataStore(): Job { + return viewModelScope.launch() + { + //////////////////////////////////////// + // load the session UUID from storage // + //////////////////////////////////////// + Log.d(TAG, "starting initialLoadFromDataStore;") + + val job1 = loadStoredSessionUUID() + val job2 = loadStoredSessionUserFullName() + val job3 = loadStoredEnvironmentOrDefault() + + job1.join() + job2.join() + job3.join() + + Log.d(TAG, "past initialLoadFromDataStore;") + } + } + + /******************************************************************************* + *******************************************************************************/ + private fun tryLoginFromDataStore(): Job { + val generation = authenticationGeneration + return viewModelScope.launch() + { + when (storedSessionUUIDLoadState) { + is LoadState.Success<String> -> { + Log.d(TAG, "loadStoredSessionUUID was success") + sessionUUID = (storedSessionUUIDLoadState as LoadState.Success<String>).value + + if (sessionUUID == "") { + Log.d(TAG, "loadStoredSessionUUID was empty - no more dance") + logInFailed() + } else { + Log.d(TAG, "loadStoredSessionUUID was set - trying to load instance now") + qqqRepository.setSessionUUID(sessionUUID) + loadQInstance().join() + if (generation != authenticationGeneration || isLogoutRequested) return@launch + + when (qInstanceLoadState) { + is LoadState.Success<QInstance> -> { + loadStoredSessionUserFullName().join() + if (generation != authenticationGeneration || isLogoutRequested) return@launch + + sessionUserFullName = when (val it = storedSessionUserFullName) { + is LoadState.Success<String> -> it.value + else -> "Unknown" + } + + Log.d(TAG, "Stored session accepted") + logInSuccessful() + } + + else -> { + qInstanceLoadState = LoadState.Loading(Unit) + Log.d(TAG, "Stored session rejected") + logInFailed() + } + } + } + } + + else -> { + /////////// + // noop. // + /////////// + Log.d(TAG, "No stored session available") + } + } + + initialLoadFromDataStoreLoadState = LoadState.Success(Unit) + } + } + + /******************************************************************************* + *******************************************************************************/ + private fun loadStoredSessionUUID(): Job { + return viewModelScope.launch() + { + storedSessionUUIDLoadState = try { + LoadState.Success(settingsRepository.getSessionUUID()) + } catch (e: Exception) { + Log.w(TAG, "Error loading stored session UUID") + LoadState.Error(e, "Error loading stored session UUID") + } + } + } + + /******************************************************************************* + *******************************************************************************/ + private fun loadStoredEnvironmentOrDefault(): Job { + return viewModelScope.launch() + { + try { + var env: Environment? = settingsRepository.getEnvironment() + + if (env == null) { + Log.d(TAG, "got null environment from settings repo. Using default.") + env = defaultEnvironment + } else { + Log.d(TAG, "Loaded environment from settings.") + } + + activateEnvironment(env).join() + } catch (e: Exception) { + Log.w(TAG, "Error loading stored environment") + storedEnvironmentLoadState = LoadState.Error(e, "Error loading stored environment") + } + } + } + + /******************************************************************************* + *******************************************************************************/ + private fun activateEnvironment(environment: Environment): Job { + return viewModelScope.launch() + { + if (this@QViewModel.environment.baseUrl != environment.baseUrl) { + authenticationMetaDataLoadState = LoadState.Loading(Unit) + manageSessionLoadState = LoadState.Loading(Unit) + } + this@QViewModel.environment = environment + qqqRepository.setEnvironment(environment) + settingsRepository.setEnvironment(environment) + storedEnvironmentLoadState = LoadState.Success(environment) + } + } + + /******************************************************************************* + *******************************************************************************/ + fun switchEnvironment(environment: Environment, postSwitchCallback: () -> Unit) { + cancelCompanyLogout() + cancelAuthentication() + cancelOAuth2Login() + qNavigator.goHome(cancelActiveProcess = false) + viewModelScope.launch() + { + logOut().join() + activateEnvironment(environment).join() + loadAuthenticationMetaData().join() + postSwitchCallback.invoke() + } + } + + /******************************************************************************* + *******************************************************************************/ + private fun loadStoredSessionUserFullName(): Job { + return viewModelScope.launch() + { + storedSessionUserFullName = try { + LoadState.Success(settingsRepository.getSessionUserFullName()) + } catch (e: Exception) { + Log.w(TAG, "Error loading stored session user full name") + LoadState.Error(e, "Error loading stored session user full name") + } + } + } + + /******************************************************************************* + *******************************************************************************/ + private fun storeSessionUUID(value: String) { + val generation = authenticationGeneration + viewModelScope.launch() + { + settingsMutex.withLock { + if (generation == authenticationGeneration) settingsRepository.setSessionUUID(value) + } + } + } + + /******************************************************************************* + *******************************************************************************/ + fun doSetSessionUserFullName(value: String) { + sessionUserFullName = value + val generation = authenticationGeneration + viewModelScope.launch() + { + settingsMutex.withLock { + if (generation == authenticationGeneration) settingsRepository.setSessionUserFullName(value) + } + } + } + + /******************************************************************************* + *******************************************************************************/ + fun logOut(): Job = performLogout() + + /******************************************************************************* + ** Host session resources end in a bounded, best-effort step; core logout and local clearing never depend on it. + *******************************************************************************/ + private suspend fun endHostSession() { + try { + kotlinx.coroutines.withTimeoutOrNull(3000) { beforeLogout() } + } catch (exception: kotlinx.coroutines.CancellationException) { + throw exception + } catch (exception: Exception) { /* Core logout and local clearing still run. */ + } + } + + /******************************************************************************* + ** Optional provider material is captured only by the initiating coroutine, never by ViewModel state. + ** Ordinary logout ends host resources first. Provider logout runs first instead: it both returns the + ** transient hint and ends the QQQ session, and a host session end (such as the scanner device-session end, + ** which itself runs the core logout server-side) would otherwise remove that session before the hint is read. + *******************************************************************************/ + private fun performLogout(providerLogout: (suspend () -> Unit)? = null): Job { + logoutJob?.takeIf { + it.isActive || (!isAuthenticated && sessionUUID.isBlank() && + authenticationAttempt == null && oauth2LoginPhase == OAuth2LoginPhase.READY) + }?.let { return it } + cancelAuthentication() + cancelOAuth2Login() + isAuthenticated = false + logoutInProgress = true + lastLogoutServerConfirmed = false + val logoutGeneration = authenticationGeneration + val logoutServer = environment.baseUrl + return viewModelScope.launch() + { + val capturedIsLogoutRequested = isLogoutRequested + val capturedAuthLoadState = authenticationMetaDataLoadState + activeProcessViewModel?.reset() + logoutMessage = "Signing out…" + var serverConfirmed = false + try { + settingsMutex.withLock { settingsRepository.setSessionUUID(""); settingsRepository.setSessionUserFullName("") } + if (providerLogout == null) endHostSession() + try { + serverConfirmed = kotlinx.coroutines.withTimeoutOrNull(3000) { + if (providerLogout == null) qqqRepository.logout() else providerLogout() + true + } ?: false + } finally { + if (providerLogout != null) endHostSession() + } + } catch (exception: kotlinx.coroutines.CancellationException) { + throw exception + } catch (exception: Exception) { /* Local sign-out still completes when the network is unavailable. */ + } finally { + val current = logoutGeneration == authenticationGeneration && logoutServer == environment.baseUrl + if (current) { + clearAll(preserveLogoutScreen = true) + qqqRepository.setSessionUUID("") + } + kotlinx.coroutines.withContext(kotlinx.coroutines.NonCancellable) { + settingsMutex.withLock { settingsRepository.setSessionUUID(""); settingsRepository.setSessionUserFullName("") } + } + if (current) { + isLogoutRequested = capturedIsLogoutRequested + authenticationMetaDataLoadState = capturedAuthLoadState + } + logoutInProgress = false + lastLogoutServerConfirmed = current && serverConfirmed + logoutMessage = if (serverConfirmed) "Signed out." + else "Signed out on this device. Server sign-out could not be confirmed." + if (companyLogoutPhase == OAuth2LogoutPhase.FINISHED) + logoutMessage += " Company sign-out did not complete. Your organization may still be signed in in the browser." + } + }.also { logoutJob = it } + } + + /******************************************************************************* + ** Invoked only by an explicit host opt-in; ordinary requestLogout remains local-only. + *******************************************************************************/ + fun requestCompanyLogout(binding: OAuth2LogoutBinding) { + if (!isAuthenticated || logoutInProgress || binding.login.server != environment.baseUrl) return + val metadata = (authenticationMetaDataLoadState as? LoadState.Success)?.value as? OAuth2AuthenticationMetaData ?: return + val logout = metadata.values.nativeSessionLogout ?: return + val login = metadata.values.nativeSessionLogin ?: return + if (binding.login != OAuth2LoginBinding( + environment.baseUrl, metadata.name, login.issuer, login.discoveryUrl, + metadata.values.clientId, metadata.values.scopes, binding.login.redirectUri, login.prompt, login.nonceValidation + ) || + login.flow != OAuth2AuthenticationMetaData.SESSION_FLOW || login.codeChallengeMethod != "S256" || login.prompt != "login" || + login.nonceValidation != "REQUIRED" || + binding.login.redirectUri !in login.redirectUris || binding.postLogoutRedirectUri != binding.login.redirectUri || + logout.flow != OAuth2AuthenticationMetaData.LOGOUT_FLOW || binding.postLogoutRedirectUri !in logout.postLogoutRedirectUris + ) return + requestLogout() + companyLogoutBinding = binding + companyLogoutPhase = OAuth2LogoutPhase.PREPARING + } + + /******************************************************************************* + ** Bind company sign-out callbacks to their original server, configuration and logout generation. + *******************************************************************************/ + fun isCurrentCompanyLogout(generation: Long, binding: OAuth2LogoutBinding): Boolean = + generation == companyLogoutGeneration && companyLogoutBinding == binding && + binding.login.server == environment.baseUrl && isLogoutRequested + + /******************************************************************************* + ** Local invalidation finishes before the browser sees the optional transient hint: the provider logout + ** request runs inside performLogout, whose completion clears local state before this returns. + *******************************************************************************/ + suspend fun logOutWithProvider(generation: Long, binding: OAuth2LogoutBinding): NativeLogoutData? { + if (!isCurrentCompanyLogout(generation, binding) || companyLogoutPhase != OAuth2LogoutPhase.PREPARING) return null + var material: NativeLogoutData? = null + try { + performLogout { material = qqqRepository.logoutWithProvider(binding.postLogoutRedirectUri) }.join() + return material.takeIf { + isCurrentCompanyLogout(generation, binding) && companyLogoutPhase == OAuth2LogoutPhase.PREPARING && + lastLogoutServerConfirmed && !isAuthenticated && !logoutInProgress + } + } finally { + material = null + } + } + + /******************************************************************************* + ** Allow the provider browser only after local identity is invalidated and the current logout is prepared. + *******************************************************************************/ + fun beginCompanyLogoutBrowser(generation: Long, binding: OAuth2LogoutBinding, endpoint: String, state: String): Boolean { + if (!isCurrentCompanyLogout(generation, binding) || companyLogoutPhase != OAuth2LogoutPhase.PREPARING || + isAuthenticated || logoutInProgress + ) return false + companyLogoutAttempt.begin(binding, endpoint, state) + companyLogoutPhase = OAuth2LogoutPhase.BROWSER + return true + } + + /******************************************************************************* + ** Dedicated end-session responses never establish QQQ identity or restore cleared private screens. + *******************************************************************************/ + fun completeCompanyLogout( + generation: Long, binding: OAuth2LogoutBinding, state: String?, requestState: String?, + requestEndpoint: String?, requestRedirect: String? + ) { + if (!isCurrentCompanyLogout(generation, binding) || companyLogoutPhase != OAuth2LogoutPhase.BROWSER) return + val verified = companyLogoutAttempt.consume(binding, state, requestState, requestEndpoint, requestRedirect) + setCompanyLogoutResult(generation, binding, verified) + } + + /******************************************************************************* + ** Cancellation/unavailable paths cannot claim successful provider logout. + *******************************************************************************/ + fun finishCompanyLogout(generation: Long, binding: OAuth2LogoutBinding) = setCompanyLogoutResult(generation, binding, false) + + /******************************************************************************* + ** Finalize company sign-out once and distinguish verified provider completion from ordinary local logout. + *******************************************************************************/ + private fun setCompanyLogoutResult(generation: Long, binding: OAuth2LogoutBinding, completed: Boolean) { + if (!isCurrentCompanyLogout(generation, binding)) return + if (companyLogoutPhase == OAuth2LogoutPhase.FINISHED) return + companyLogoutAttempt.cancel() + companyLogoutPhase = OAuth2LogoutPhase.FINISHED + logoutMessage += if (completed) " Company sign-out completed." + else " Company sign-out did not complete. Your organization may still be signed in in the browser." + } + + /******************************************************************************* + ** Invalidate pending provider state before another authentication or logout lifetime begins. + *******************************************************************************/ + private fun cancelCompanyLogout() { + companyLogoutGeneration++ + companyLogoutAttempt.cancel() + companyLogoutBinding = null + companyLogoutPhase = OAuth2LogoutPhase.IDLE + } + + /******************************************************************************* + ** Activity recreation may render logout again; each logical sign-out opens the provider only once. + *******************************************************************************/ + fun claimAuth0ProviderLogout(): Boolean { + val current = logoutJob ?: return false + if (auth0ProviderLogoutJob === current) return false + auth0ProviderLogoutJob = current + return true + } + + /******************************************************************************* + *******************************************************************************/ + fun loadQInstance(): Job { + val generation = authenticationGeneration + val server = environment.baseUrl + return viewModelScope.launch() + { + val result: LoadState<QInstance> = try { + val value = qqqRepository.getMetaData("qqq-android", "1.0", applicationName, applicationVersion) + LoadState.Success(value) + } catch (e: Exception) { + Log.w(TAG, "Error loading QInstance") + LoadState.Error(e, "Error loading QInstance") + } + kotlinx.coroutines.currentCoroutineContext().ensureActive() + if (generation == authenticationGeneration && server == environment.baseUrl) qInstanceLoadState = result + } + } + + /******************************************************************************* + ** Capture an eligible server-advertised nonce policy before beginning native browser discovery. + *******************************************************************************/ + fun prepareOAuth2Login(binding: OAuth2LoginBinding): Long? { + if (oauth2LoginPhase != OAuth2LoginPhase.READY || isAuthenticated || isLogoutRequested || logoutInProgress || + binding.server != environment.baseUrl || binding.nonceValidation != "REQUIRED" + ) return null + cancelAuthentication() + oauth2Generation++ + oauth2Binding = binding + oauth2Metadata = (authenticationMetaDataLoadState as? LoadState.Success)?.value + oauth2LoginMessage = null + oauth2LoginPhase = OAuth2LoginPhase.PREPARING + return oauth2Generation + } + + /******************************************************************************* + ** Reject results from stale server, metadata or generation even when the browser returns successfully. + *******************************************************************************/ + fun isCurrentOAuth2Login(generation: Long, binding: OAuth2LoginBinding): Boolean = + generation == oauth2Generation && binding == oauth2Binding && binding.server == environment.baseUrl && + oauth2Metadata == (authenticationMetaDataLoadState as? LoadState.Success)?.value && !isAuthenticated && !isLogoutRequested && !logoutInProgress + + /******************************************************************************* + ** Bind the original state, nonce and verifier exactly once before entering the browser phase. + *******************************************************************************/ + fun beginOAuth2Browser(generation: Long, binding: OAuth2LoginBinding, state: String, nonce: String, verifier: String): Boolean { + if (!isCurrentOAuth2Login(generation, binding) || oauth2LoginPhase != OAuth2LoginPhase.PREPARING) return false + oauth2Attempt.begin(binding, state, nonce, verifier) + oauth2LoginPhase = OAuth2LoginPhase.BROWSER + return true + } + + /******************************************************************************* + ** Invalidate browser and exchange ownership before dropping pending credentials and cancelling work. + *******************************************************************************/ + fun cancelOAuth2Login(message: String? = null) { + oauth2Generation++ + oauth2Attempt.cancel() + oauth2Binding = null + oauth2Metadata = null + oauth2LoginPhase = OAuth2LoginPhase.READY + oauth2LoginMessage = message + oauth2ExchangeJob?.cancel() + oauth2ExchangeJob = null + } + + /******************************************************************************* + ** Consume the original browser proof, exchange it once and adopt identity only for the still-current server attempt. + *******************************************************************************/ + fun completeOAuth2Login( + binding: OAuth2LoginBinding, state: String?, requestState: String?, requestNonce: String?, + requestClientId: String, requestRedirect: String, requestPrompt: String?, code: String? + ) { + val generation = oauth2Generation + if (oauth2LoginPhase != OAuth2LoginPhase.BROWSER || !isCurrentOAuth2Login(generation, binding)) return + val exchange = oauth2Attempt.consume(binding, state, requestState, requestNonce, requestClientId, requestRedirect, requestPrompt, code) + if (exchange == null) { + cancelOAuth2Login("Sign-in could not be verified. Please start again.") + return + } + oauth2LoginPhase = OAuth2LoginPhase.EXCHANGING + oauth2ExchangeJob = viewModelScope.launch { + var newSession: String? = null + var adopted = false + try { + val response = qqqRepository.exchangeNativeSession( + ManageSessionRequest( + code = exchange.code, + codeVerifier = exchange.verifier, redirectUri = exchange.redirectUri, + authenticationFlow = OAuth2AuthenticationMetaData.SESSION_FLOW, expectedNonce = exchange.expectedNonce + ) + ) + newSession = response.uuid?.takeIf { it.isNotBlank() } + kotlinx.coroutines.currentCoroutineContext().ensureActive() + if (!isCurrentOAuth2Login(generation, binding)) return@launch + sessionUUID = requireNotNull(newSession) + qqqRepository.setSessionUUID(sessionUUID) + response.userName?.let { doSetSessionUserFullName(it) } + manageSessionLoadState = LoadState.Success(response) + logInSuccessful() + adopted = true + oauth2LoginPhase = OAuth2LoginPhase.READY + oauth2Binding = null + oauth2Metadata = null + loadQInstance() + } catch (exception: kotlinx.coroutines.CancellationException) { + throw exception + } catch (exception: Exception) { + if (generation == oauth2Generation) { + oauth2LoginPhase = OAuth2LoginPhase.READY + oauth2Binding = null + oauth2Metadata = null + oauth2LoginMessage = "Sign-in failed. Check your connection or contact your administrator." + } + } finally { + if (!adopted && newSession != null) kotlinx.coroutines.withContext(kotlinx.coroutines.NonCancellable) { + try { + kotlinx.coroutines.withTimeout(3000) { qqqRepository.discardNativeSession(binding.server, newSession) } + } catch (exception: Exception) { /* Never activate an abandoned session, even when revocation cannot be confirmed. */ + } + } + } + } + } + + /******************************************************************************* + ** Password remains in this request only; the returned session drives the existing host. + *******************************************************************************/ + fun loginWithPassword(username: String, password: String) { + val attempt = prepareAuthentication() ?: return + exchangeAuthentication(attempt, username) { qqqRepository.loginWithPassword(username, password) } + } + + /******************************************************************************* + *******************************************************************************/ + fun getURI(path: String): String { + val uri = qqqRepository.getURI(path) + return uri + } + + /******************************************************************************* + *******************************************************************************/ + companion object { + var applicationName: String = "anonymousApp" + var applicationVersion: String = "0" + var applicationBuildTimestamp: String? = null + + lateinit var dataStore: DataStore<Preferences> + + val factory: ViewModelProvider.Factory = viewModelFactory() + { + initializer() + { + val application = (this[APPLICATION_KEY] as QMobileApplication) + QViewModel(qqqRepository = application.container.qqqRepository, dataStore = dataStore) + } + } + } +} diff --git a/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/viewmodel/SemanticFields.kt b/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/viewmodel/SemanticFields.kt new file mode 100644 index 0000000..aaa2bd2 --- /dev/null +++ b/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/viewmodel/SemanticFields.kt @@ -0,0 +1,70 @@ +/* Copyright (c) 2026 QRunIO. SPDX-License-Identifier: Apache-2.0 */ +package com.kingsrook.qqq.frontend.android.mobileapp.viewmodel + +import com.kingsrook.qqq.frontend.android.core.model.metadata.QFieldMetaData +import com.kingsrook.qqq.frontend.android.core.model.metadata.QFieldType + +/******************************************************************************* + ** A supplied null is an intentional value; defaults apply only to absent fields. + *******************************************************************************/ +internal fun semanticInitialValue(field: QFieldMetaData, values: Map<String, Any?>): Any? = + if (values.containsKey(field.name)) values[field.name] else field.defaultValue + +/******************************************************************************* + ** Convert input using the server field type while preserving decimal precision and intentional null values. + *******************************************************************************/ +internal fun semanticFieldValue(field: QFieldMetaData, raw: Any?): Any? { + if (raw == null || raw == "") return null + val text = raw.toString() + return when (field.type) { + QFieldType.INTEGER -> text.toIntOrNull() + QFieldType.LONG -> text.toLongOrNull() + // Preserve decimal precision; the semantic API accepts numeric strings. + QFieldType.DECIMAL -> text + QFieldType.BOOLEAN -> if (raw is Boolean) raw else text.toBooleanStrictOrNull() + else -> raw + } +} + +/******************************************************************************* + ** Apply the advertised field constraints before submission and return an operator-facing validation message. + *******************************************************************************/ +internal fun validateSemanticField(field: QFieldMetaData, raw: Any?): String? { + val text = raw?.toString().orEmpty() + val rules = field.validation + if (text.isEmpty()) return if (field.isRequired || rules?.required == true) "${field.label} is required." else null + if (field.type in setOf(QFieldType.INTEGER, QFieldType.LONG, QFieldType.BOOLEAN) && semanticFieldValue(field, raw) == null) + return "Enter a valid ${field.type.name.lowercase()} value." + val numeric = text.toBigDecimalOrNull() + if (field.type == QFieldType.DECIMAL && numeric == null) return "Enter a valid decimal value." + val validDate = when (field.type) { + QFieldType.DATE -> runCatching { java.time.LocalDate.parse(text) }.isSuccess + QFieldType.TIME -> runCatching { java.time.LocalTime.parse(text) }.isSuccess + QFieldType.DATE_TIME -> runCatching { java.time.OffsetDateTime.parse(text) }.isSuccess + else -> true + } + if (!validDate) return semanticFieldHint(field) ?: "Enter a valid date or time." + if (rules?.maxLength != null && text.length > rules.maxLength!! && rules.tooLongBehavior == "ERROR") + return "${field.label} must contain at most ${rules.maxLength} characters." + if (numeric != null) { + rules?.minValue?.toBigDecimalOrNull()?.let { if (numeric < it || (numeric == it && rules.minInclusive == false)) return "${field.label} is below the allowed minimum." } + rules?.maxValue?.toBigDecimalOrNull()?.let { if (numeric > it || (numeric == it && rules.maxInclusive == false)) return "${field.label} exceeds the allowed maximum." } + } + rules?.pattern?.let { pattern -> + val regex = runCatching { Regex(pattern) }.getOrNull() + if (regex != null && !regex.matches(text)) return rules.patternMessage ?: "${field.label} does not match the required format." + } + if (!field.inlinePossibleValueSource.isNullOrEmpty() && field.inlinePossibleValueSource!!.none { it.id.toString() == text }) + return "Choose one of the available values for ${field.label}." + return null +} + +/******************************************************************************* + ** Describe the wire date/time syntax accepted by semantic validation rather than a locale-dependent format. + *******************************************************************************/ +internal fun semanticFieldHint(field: QFieldMetaData): String? = when (field.type) { + QFieldType.DATE -> "Use YYYY-MM-DD." + QFieldType.TIME -> "Use HH:mm:ss." + QFieldType.DATE_TIME -> "Use YYYY-MM-DDTHH:mm:ssZ or a UTC offset, for example 2026-10-30T09:00:00-05:00." + else -> null +} diff --git a/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/viewmodel/SemanticProcess.kt b/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/viewmodel/SemanticProcess.kt new file mode 100644 index 0000000..2944886 --- /dev/null +++ b/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/viewmodel/SemanticProcess.kt @@ -0,0 +1,142 @@ +/* Copyright (c) 2026 QRunIO. SPDX-License-Identifier: Apache-2.0 */ +package com.kingsrook.qqq.frontend.android.mobileapp.viewmodel + +import com.kingsrook.qqq.frontend.android.core.model.metadata.QComponentType +import com.kingsrook.qqq.frontend.android.core.model.metadata.QFieldMetaData +import com.kingsrook.qqq.frontend.android.core.model.metadata.QFieldType +import com.kingsrook.qqq.frontend.android.core.model.metadata.QFrontendComponent +import com.kingsrook.qqq.frontend.android.core.model.metadata.QFrontendStepMetaData +import com.kingsrook.qqq.frontend.android.core.model.metadata.QInstance +import com.kingsrook.qqq.frontend.android.core.model.processes.ProcessMetaDataAdjustment +import com.kingsrook.qqq.frontend.android.core.model.processes.QJobComplete +import com.kingsrook.qqq.frontend.android.core.model.MapStringAny +import kotlinx.serialization.encodeToString +import kotlinx.serialization.json.Json + +/******************************************************************************* + ** Semantic decisions shared by the native UI and the submission boundary. + *******************************************************************************/ +internal object SemanticProcess { + // A COMPLETE response omits nextStep when the process has finished; step-list position is irrelevant. + /******************************************************************************* + ** Use the server's next-step/completion contract rather than the position of a displayed step. + *******************************************************************************/ + fun terminal(result: QJobComplete) = result.nextStep.isEmpty() || result.values["noMoreSteps"] == true + + /******************************************************************************* + ** Select visible fields from the active step and the component's explicit inclusion list. + *******************************************************************************/ + fun fields(step: QFrontendStepMetaData?, component: QFrontendComponent): List<QFieldMetaData> { + val fields = if (component.type == QComponentType.VIEW_FORM) step?.viewFields else step?.formFields + val included = component.values["includeFieldNames"] as? List<*> + return fields.orEmpty().filter { !it.isHidden && (included == null || it.name in included) } + } + + /******************************************************************************* + ** Apply server metadata adjustments consistently across editable, read-only and record-list fields. + *******************************************************************************/ + fun adjust(steps: List<QFrontendStepMetaData>, adjustment: ProcessMetaDataAdjustment?): List<QFrontendStepMetaData> { + val updated = adjustment?.updatedFields.orEmpty() + return (adjustment?.updatedFrontendStepList ?: steps).map { step -> + step.copy( + formFields = step.formFields?.map { updated[it.name] ?: it }, + viewFields = step.viewFields?.map { updated[it.name] ?: it }, + recordListFields = step.recordListFields?.map { updated[it.name] ?: it }) + } + } + + /******************************************************************************* + ** Stop submission when the current server screen requires a control this native client cannot represent. + *******************************************************************************/ + fun unsupported( + step: QFrontendStepMetaData?, values: Map<String, Any?>, + instance: QInstance?, customBlocks: Set<String> + ): String? { + if (step == null) return "The server did not provide a supported current screen." + for (component in step.components.orEmpty()) { + when (component.type) { + QComponentType.HELP_TEXT, QComponentType.HTML, QComponentType.PROCESS_SUMMARY_RESULTS, QComponentType.VIEW_FORM -> Unit + QComponentType.EDIT_FORM -> { + val unsupportedField = fields(step, component).firstOrNull { + // Named possible-value sources are resolved through the semantic possibleValues operation. + it.type.name in setOf("BLOB", "UNKNOWN") + } + if (unsupportedField != null) return "${unsupportedField.label} requires an input control unavailable in this client." + } + + QComponentType.WIDGET -> { + val blocks = if (component.values["isAdHocWidget"] == true) component.values["blocks"] as? List<*> + else { + val name = component.values["widgetName"] as? String ?: return "The server did not identify this widget." + if (instance?.widgets?.get(name)?.type != "composite") return "This widget is unavailable in this client." + (values[name] as? Map<*, *>)?.get("subBlocks") as? List<*> + } + if (blocks == null || !supportedBlocks(blocks, customBlocks)) return "This screen requires a widget control unavailable in this client." + } + + else -> return "This screen requires ${component.type.name}, which is unavailable in this client." + } + } + return null + } + + /******************************************************************************* + ** Validate every nested widget block and its input metadata before treating the screen as supported. + *******************************************************************************/ + private fun supportedBlocks(blocks: List<*>, customBlocks: Set<String>): Boolean = blocks.all { raw -> + val block = raw as? Map<*, *> ?: return@all false + val type = block["blockType"] as? String ?: return@all false + type in (setOf("AUDIO", "BUTTON", "COMPOSITE", "DIVIDER", "IMAGE", "INPUT_FIELD", "TEXT") + customBlocks) && + (type != "INPUT_FIELD" || inputField(block["values"] as? Map<*, *>)?.let { it.isHidden || supportedWidgetInput(it) } == true) && + ((block["subBlocks"] as? List<*>)?.let { supportedBlocks(it, customBlocks) } ?: true) + } + + /******************************************************************************* + ** INPUT_FIELD uses the same typed field metadata as forms; malformed metadata fails closed. + *******************************************************************************/ + fun inputField(values: Map<*, *>?): QFieldMetaData? { + val raw = values?.get("fieldMetaData") as? Map<*, *> ?: return null + if (raw.keys.any { it !is String }) return null + val fields = raw.entries.associate { it.key as String to it.value } + return runCatching { + Json { ignoreUnknownKeys = true }.decodeFromString<QFieldMetaData>(Json.encodeToString(MapStringAny(fields))) + }.getOrNull()?.takeIf { it.name.isNotBlank() } + } + + /******************************************************************************* + ** Specialized selectors require EDIT_FORM until the widget vocabulary has a native control. + *******************************************************************************/ + fun supportedWidgetInput(field: QFieldMetaData): Boolean = field.type !in setOf(QFieldType.UNKNOWN, QFieldType.BLOB, QFieldType.BOOLEAN) && + field.possibleValueSourceName == null && field.inlinePossibleValueSource.isNullOrEmpty() + + /******************************************************************************* + ** Use the declared conditional value to decide widget visibility without guessing a business action. + *******************************************************************************/ + fun widgetVisible(conditional: String?, values: Map<String, Any?>): Boolean = conditional == null || + values[conditional].let { it != null && it != "" && it != false } + + /******************************************************************************* + ** Collect widget inputs at submission time as well as render time, so raw callbacks cannot bypass field rules. + *******************************************************************************/ + fun widgetInputFields(step: QFrontendStepMetaData?, values: Map<String, Any?>): List<QFieldMetaData> { + val fields = mutableListOf<QFieldMetaData>() + + /******************************************************************************* + ** Collect only visible nested widget inputs so hidden controls cannot add unintended submission requirements. + *******************************************************************************/ + fun visit(blocks: List<*>) { + for (raw in blocks) { + val block = raw as? Map<*, *> ?: continue + if (!widgetVisible(block["conditional"] as? String, values)) continue + if (block["blockType"] == "INPUT_FIELD") inputField(block["values"] as? Map<*, *>)?.let { fields.add(it) } + (block["subBlocks"] as? List<*>)?.let(::visit) + } + } + step?.components.orEmpty().filter { it.type == QComponentType.WIDGET }.forEach { component -> + val blocks = if (component.values["isAdHocWidget"] == true) component.values["blocks"] as? List<*> + else (component.values["widgetName"] as? String)?.let { (values[it] as? Map<*, *>)?.get("subBlocks") as? List<*> } + blocks?.let(::visit) + } + return fields + } +} diff --git a/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/viewmodel/TopLevelAppState.kt b/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/viewmodel/TopLevelAppState.kt new file mode 100644 index 0000000..c4f351e --- /dev/null +++ b/qqq/android/mobileapp/src/main/java/com/kingsrook/qqq/frontend/android/mobileapp/viewmodel/TopLevelAppState.kt @@ -0,0 +1,79 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2024-2024. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.kingsrook.qqq.frontend.android.mobileapp.viewmodel + +import androidx.compose.material3.DrawerState +import androidx.compose.material3.DrawerValue +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.setValue +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.launch + +/******************************************************************************* + *******************************************************************************/ +class TopLevelAppState( + private val coroutineScope: CoroutineScope, + private val qViewModel: QViewModel +) { + var navDrawerState: DrawerState by mutableStateOf(DrawerState(DrawerValue.Closed)) + private set + var drawerRequested: Boolean by mutableStateOf(false) + private set + + /******************************************************************************* + *******************************************************************************/ + fun openNavDrawer() { + drawerRequested = true + coroutineScope.launch() + { + try { + navDrawerState.open() + } finally { + drawerRequested = false + } + } + } + + /******************************************************************************* + *******************************************************************************/ + fun closeNavDrawer() { + drawerRequested = false + coroutineScope.launch() + { + navDrawerState.close() + } + } + + /******************************************************************************* + *******************************************************************************/ + fun logOut() { + this.qViewModel.requestLogout() + } + + /******************************************************************************* + *******************************************************************************/ + fun isLoggedIn(): Boolean { + return this.qViewModel.isAuthenticated + } + +} diff --git a/qqq/android/mobileapp/src/main/res/drawable/_0fps.xml b/qqq/android/mobileapp/src/main/res/drawable/_0fps.xml new file mode 100644 index 0000000..c76d31b --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/_0fps.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/60fps/materialicons/black/res/drawable/baseline_60fps_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19,8v8h-4V8H19M19,5h-4c-1.66,0 -3,1.34 -3,3v8c0,1.66 1.34,3 3,3h4c1.66,0 3,-1.34 3,-3V8C22,6.34 20.66,5 19,5zM10,8V5H5C3.34,5 2,6.34 2,8v8c0,1.66 1.34,3 3,3h3c1.66,0 3,-1.34 3,-3v-3c0,-1.66 -1.34,-3 -3,-3H5V8H10zM8,13v3H5v-3H8z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/_0fps_select.xml b/qqq/android/mobileapp/src/main/res/drawable/_0fps_select.xml new file mode 100644 index 0000000..b02fc97 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/_0fps_select.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/30fps_select/materialicons/black/res/drawable/baseline_30fps_select_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M4,4v2h5v2H5v2h4v2H4v2h5c1.1,0 2,-0.9 2,-2v-1.5C11,9.67 10.83,9 10,9c0.83,0 1,-0.67 1,-1.5V6c0,-1.1 -0.9,-2 -2,-2H4zM18,4c1.1,0 2,0.9 2,2v6c0,1.1 -0.9,2 -2,2h-3c-1.1,0 -2,-0.9 -2,-2V6c0,-1.1 0.9,-2 2,-2H18zM18,6h-3v6h3V6zM5,22H3v-5h2V22zM9,22H7v-5h2V22zM13,22h-2v-5h2V22zM21,22h-6v-5h6V22z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/_0k.xml b/qqq/android/mobileapp/src/main/res/drawable/_0k.xml new file mode 100644 index 0000000..e6bf4ce --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/_0k.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/av/10k/materialicons/black/res/drawable/baseline_10k_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M10,10.5h1.5v3L10,13.5zM19,3L5,3c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2L21,5c0,-1.1 -0.9,-2 -2,-2zM7.5,15L6,15v-4.5L4.5,10.5L4.5,9h3v6zM13,14c0,0.55 -0.45,1 -1,1L9.5,15c-0.55,0 -1,-0.45 -1,-1v-4c0,-0.55 0.45,-1 1,-1L12,9c0.55,0 1,0.45 1,1v4zM19.5,15h-1.75L16,12.75L16,15h-1.5L14.5,9L16,9v2.25L17.75,9h1.75l-2.25,3 2.25,3z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/_0mp.xml b/qqq/android/mobileapp/src/main/res/drawable/_0mp.xml new file mode 100644 index 0000000..80f4235 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/_0mp.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/10mp/materialicons/black/res/drawable/baseline_10mp_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M13.5,7L15,7v3h-1.5zM19,3L5,3c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2L21,5c0,-1.1 -0.9,-2 -2,-2zM12,18.5h-1.5L10.5,14h-1v3L8,17v-3L7,14v4.5L5.5,18.5v-5c0,-0.55 0.45,-1 1,-1L11,12.5c0.55,0 1,0.45 1,1v5zM15.5,18.5L14,18.5v-6h3.5c0.55,0 1,0.45 1,1L18.5,16c0,0.55 -0.45,1 -1,1h-2v1.5zM10,5.5v6L8.5,11.5L8.5,7L7,7L7,5.5h3zM16.5,10.5c0,0.55 -0.45,1 -1,1L13,11.5c-0.55,0 -1,-0.45 -1,-1v-4c0,-0.55 0.45,-1 1,-1h2.5c0.55,0 1,0.45 1,1v4zM15.5,14L17,14v1.5h-1.5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/_1mp.xml b/qqq/android/mobileapp/src/main/res/drawable/_1mp.xml new file mode 100644 index 0000000..df4a12a --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/_1mp.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/11mp/materialicons/black/res/drawable/baseline_11mp_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19,3L5,3c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2L21,5c0,-1.1 -0.9,-2 -2,-2zM12,18.5h-1.5L10.5,14h-1v3L8,17v-3L7,14v4.5L5.5,18.5v-5c0,-0.55 0.45,-1 1,-1L11,12.5c0.55,0 1,0.45 1,1v5zM15.5,18.5L14,18.5v-6h3.5c0.55,0 1,0.45 1,1L18.5,16c0,0.55 -0.45,1 -1,1h-2v1.5zM11,5.5v6L9.5,11.5L9.5,7L8,7L8,5.5h3zM16,5.5v6h-1.5L14.5,7L13,7L13,5.5h3zM15.5,14L17,14v1.5h-1.5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/_23.xml b/qqq/android/mobileapp/src/main/res/drawable/_23.xml new file mode 100644 index 0000000..ef8c71f --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/_23.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/123/materialicons/black/res/drawable/baseline_123_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M7,15H5.5v-4.5H4V9h3V15zM13.5,13.5h-3v-1h2c0.55,0 1,-0.45 1,-1V10c0,-0.55 -0.45,-1 -1,-1H9v1.5h3v1h-2c-0.55,0 -1,0.45 -1,1V15h4.5V13.5zM19.5,14v-4c0,-0.55 -0.45,-1 -1,-1H15v1.5h3v1h-2v1h2v1h-3V15h3.5C19.05,15 19.5,14.55 19.5,14z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/_2mp.xml b/qqq/android/mobileapp/src/main/res/drawable/_2mp.xml new file mode 100644 index 0000000..c73578d --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/_2mp.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/22mp/materialicons/black/res/drawable/baseline_22mp_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19,3L5,3c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2L21,5c0,-1.1 -0.9,-2 -2,-2zM12,18.5h-1.5L10.5,14h-1v3L8,17v-3L7,14v4.5L5.5,18.5v-5c0,-0.55 0.45,-1 1,-1L11,12.5c0.55,0 1,0.45 1,1v5zM15.5,18.5L14,18.5v-6h3.5c0.55,0 1,0.45 1,1L18.5,16c0,0.55 -0.45,1 -1,1h-2v1.5zM10,9L8,9v1h3v1.5L6.5,11.5L6.5,9c0,-0.55 0.45,-1 1,-1h2L9.5,7h-3L6.5,5.5L10,5.5c0.55,0 1,0.45 1,1L11,8c0,0.55 -0.45,1 -1,1zM16.5,9h-2v1h3v1.5L13,11.5L13,9c0,-0.55 0.45,-1 1,-1h2L16,7h-3L13,5.5h3.5c0.55,0 1,0.45 1,1L17.5,8c0,0.55 -0.45,1 -1,1zM15.5,14L17,14v1.5h-1.5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/_3mp.xml b/qqq/android/mobileapp/src/main/res/drawable/_3mp.xml new file mode 100644 index 0000000..27cd483 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/_3mp.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/23mp/materialicons/black/res/drawable/baseline_23mp_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19,3L5,3c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2L21,5c0,-1.1 -0.9,-2 -2,-2zM12,18.5h-1.5L10.5,14h-1v3L8,17v-3L7,14v4.5L5.5,18.5v-5c0,-0.55 0.45,-1 1,-1L11,12.5c0.55,0 1,0.45 1,1v5zM15.5,18.5L14,18.5v-6h3.5c0.55,0 1,0.45 1,1L18.5,16c0,0.55 -0.45,1 -1,1h-2v1.5zM10,9L8,9v1h3v1.5L6.5,11.5L6.5,9c0,-0.55 0.45,-1 1,-1h2L9.5,7h-3L6.5,5.5L10,5.5c0.55,0 1,0.45 1,1L11,8c0,0.55 -0.45,1 -1,1zM17.5,10.5c0,0.55 -0.45,1 -1,1L13,11.5L13,10h3L16,9h-2L14,8h2L16,7h-3L13,5.5h3.5c0.55,0 1,0.45 1,1v4zM15.5,14L17,14v1.5h-1.5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/_4mp.xml b/qqq/android/mobileapp/src/main/res/drawable/_4mp.xml new file mode 100644 index 0000000..9126180 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/_4mp.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/14mp/materialicons/black/res/drawable/baseline_14mp_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19,3L5,3c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2L21,5c0,-1.1 -0.9,-2 -2,-2zM12,18.5h-1.5L10.5,14h-1v3L8,17v-3L7,14v4.5L5.5,18.5v-5c0,-0.55 0.45,-1 1,-1L11,12.5c0.55,0 1,0.45 1,1v5zM15.5,18.5L14,18.5v-6h3.5c0.55,0 1,0.45 1,1L18.5,16c0,0.55 -0.45,1 -1,1h-2v1.5zM10,5.5v6L8.5,11.5L8.5,7L7,7L7,5.5h3zM17.5,10h-1v1.5L15,11.5L15,10h-3L12,5.5h1.5v3L15,8.5v-3h1.5v3h1L17.5,10zM15.5,14L17,14v1.5h-1.5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/_5mp.xml b/qqq/android/mobileapp/src/main/res/drawable/_5mp.xml new file mode 100644 index 0000000..a5fe851 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/_5mp.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/15mp/materialicons/black/res/drawable/baseline_15mp_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19,3L5,3c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2L21,5c0,-1.1 -0.9,-2 -2,-2zM12,18.5h-1.5L10.5,14h-1v3L8,17v-3L7,14v4.5L5.5,18.5v-5c0,-0.55 0.45,-1 1,-1L11,12.5c0.55,0 1,0.45 1,1v5zM15.5,18.5L14,18.5v-6h3.5c0.55,0 1,0.45 1,1L18.5,16c0,0.55 -0.45,1 -1,1h-2v1.5zM10,5.5v6L8.5,11.5L8.5,7L7,7L7,5.5h3zM16.5,7h-3v1h2c0.55,0 1,0.45 1,1v1.5c0,0.55 -0.45,1 -1,1L12,11.5L12,10h3L15,9h-3L12,5.5h4.5L16.5,7zM15.5,14L17,14v1.5h-1.5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/_60.xml b/qqq/android/mobileapp/src/main/res/drawable/_60.xml new file mode 100644 index 0000000..b223619 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/_60.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/360/materialicons/black/res/drawable/baseline_360_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,7C6.48,7 2,9.24 2,12c0,2.24 2.94,4.13 7,4.77V20l4,-4 -4,-4v2.73c-3.15,-0.56 -5,-1.9 -5,-2.73 0,-1.06 3.04,-3 8,-3s8,1.94 8,3c0,0.73 -1.46,1.89 -4,2.53v2.05c3.53,-0.77 6,-2.53 6,-4.58 0,-2.76 -4.48,-5 -10,-5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/_6mp.xml b/qqq/android/mobileapp/src/main/res/drawable/_6mp.xml new file mode 100644 index 0000000..9adda07 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/_6mp.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/16mp/materialicons/black/res/drawable/baseline_16mp_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M13.5,9L15,9v1.5h-1.5zM19,3L5,3c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2L21,5c0,-1.1 -0.9,-2 -2,-2zM12,18.5h-1.5L10.5,14h-1v3L8,17v-3L7,14v4.5L5.5,18.5v-5c0,-0.55 0.45,-1 1,-1L11,12.5c0.55,0 1,0.45 1,1v5zM15.5,18.5L14,18.5v-6h3.5c0.55,0 1,0.45 1,1L18.5,16c0,0.55 -0.45,1 -1,1h-2v1.5zM10,5.5v6L8.5,11.5L8.5,7L7,7L7,5.5h3zM13,11.5c-0.55,0 -1,-0.45 -1,-1v-4c0,-0.55 0.45,-1 1,-1h3.5L16.5,7h-3v1h2c0.55,0 1,0.45 1,1v1.5c0,0.55 -0.45,1 -1,1L13,11.5zM15.5,14L17,14v1.5h-1.5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/_7mp.xml b/qqq/android/mobileapp/src/main/res/drawable/_7mp.xml new file mode 100644 index 0000000..7a8f59d --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/_7mp.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/17mp/materialicons/black/res/drawable/baseline_17mp_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19,3L5,3c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2L21,5c0,-1.1 -0.9,-2 -2,-2zM12,18.5h-1.5L10.5,14h-1v3L8,17v-3L7,14v4.5L5.5,18.5v-5c0,-0.55 0.45,-1 1,-1L11,12.5c0.55,0 1,0.45 1,1v5zM15.5,18.5L14,18.5v-6h3.5c0.55,0 1,0.45 1,1L18.5,16c0,0.55 -0.45,1 -1,1h-2v1.5zM10,5.5v6L8.5,11.5L8.5,7L7,7L7,5.5h3zM15,11.5h-1.75L14.62,7L12,7L12,5.5h3.5c0.67,0 1.15,0.65 0.96,1.29L15,11.5zM15.5,14L17,14v1.5h-1.5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/_8_up_rating.xml b/qqq/android/mobileapp/src/main/res/drawable/_8_up_rating.xml new file mode 100644 index 0000000..57d9d6a --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/_8_up_rating.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/18_up_rating/materialicons/black/res/drawable/baseline_18_up_rating_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M13,12.5h1.5v1.5h-1.5z" /> + <path + android:fillColor="#FF000000" + android:pathData="M13,10h1.5v1.5h-1.5z" /> + <path + android:fillColor="#FF000000" + android:pathData="M19,3H5C3.9,3 3,3.9 3,5v14c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2V5C21,3.9 20.1,3 19,3zM10,15H8.5v-4.5H7V9h3V15zM16,14c0,0.55 -0.45,1 -1,1h-2.5c-0.55,0 -1,-0.45 -1,-1v-4c0,-0.55 0.45,-1 1,-1H15c0.55,0 1,0.45 1,1V14z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/_8mp.xml b/qqq/android/mobileapp/src/main/res/drawable/_8mp.xml new file mode 100644 index 0000000..13e7310 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/_8mp.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/18mp/materialicons/black/res/drawable/baseline_18mp_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19,3L5,3c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2L21,5c0,-1.1 -0.9,-2 -2,-2zM12,18.5h-1.5L10.5,14h-1v3L8,17v-3L7,14v4.5L5.5,18.5v-5c0,-0.55 0.45,-1 1,-1L11,12.5c0.55,0 1,0.45 1,1v5zM15.5,18.5L14,18.5v-6h3.5c0.55,0 1,0.45 1,1L18.5,16c0,0.55 -0.45,1 -1,1h-2v1.5zM10,5.5v6L8.5,11.5L8.5,7L7,7L7,5.5h3zM16.5,10.5c0,0.55 -0.45,1 -1,1L13,11.5c-0.55,0 -1,-0.45 -1,-1v-4c0,-0.55 0.45,-1 1,-1h2.5c0.55,0 1,0.45 1,1v4zM13.5,10.5L15,10.5L15,9h-1.5v1.5zM13.5,8L15,8L15,6.5h-1.5L13.5,8zM15.5,14L17,14v1.5h-1.5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/_9mp.xml b/qqq/android/mobileapp/src/main/res/drawable/_9mp.xml new file mode 100644 index 0000000..4fe79d9 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/_9mp.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/19mp/materialicons/black/res/drawable/baseline_19mp_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19,3L5,3c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2L21,5c0,-1.1 -0.9,-2 -2,-2zM12,10h3L15,9h-2c-0.55,0 -1,-0.45 -1,-1L12,6.5c0,-0.55 0.45,-1 1,-1h2.5c0.55,0 1,0.45 1,1v4c0,0.55 -0.45,1 -1,1L12,11.5L12,10zM13.5,8L15,8L15,6.5h-1.5L13.5,8zM7,5.5h3v6L8.5,11.5L8.5,7L7,7L7,5.5zM12,18.5h-1.5L10.5,14h-1v3L8,17v-3L7,14v4.5L5.5,18.5v-5c0,-0.55 0.45,-1 1,-1L11,12.5c0.55,0 1,0.45 1,1v5zM18.5,16c0,0.55 -0.45,1 -1,1h-2v1.5L14,18.5v-6h3.5c0.55,0 1,0.45 1,1L18.5,16zM15.5,14L17,14v1.5h-1.5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/__ft_apart.xml b/qqq/android/mobileapp/src/main/res/drawable/__ft_apart.xml new file mode 100644 index 0000000..fba760b --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/__ft_apart.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/6_ft_apart/materialicons/black/res/drawable/baseline_6_ft_apart_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M6,6c1.1,0 2,-0.9 2,-2S7.1,2 6,2S4,2.9 4,4S4.9,6 6,6zM10,9.43c0,-0.81 -0.48,-1.53 -1.22,-1.85C7.93,7.21 6.99,7 6,7C5.01,7 4.07,7.21 3.22,7.58C2.48,7.9 2,8.62 2,9.43V10h8V9.43zM18,6c1.1,0 2,-0.9 2,-2s-0.9,-2 -2,-2s-2,0.9 -2,2S16.9,6 18,6zM22,9.43c0,-0.81 -0.48,-1.53 -1.22,-1.85C19.93,7.21 18.99,7 18,7c-0.99,0 -1.93,0.21 -2.78,0.58C14.48,7.9 14,8.62 14,9.43V10h8V9.43zM19,17v-2.01L5,15v2l-3,-3l3,-3v2.01L19,13v-2l3,3L19,17zM10,19v-1H7.5C7.22,18 7,18.22 7,18.5v3C7,21.78 7.22,22 7.5,22h2c0.28,0 0.5,-0.22 0.5,-0.5V20c0,-0.28 -0.22,-0.5 -0.5,-0.5H8V19H10zM9,20.5V21H8v-0.5H9zM17.5,19h-1v3h-1v-3h-1v-1h3V19zM12.5,19v0.5h1v1h-1V22h-1v-4H14v1H12.5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/_d_rotation.xml b/qqq/android/mobileapp/src/main/res/drawable/_d_rotation.xml new file mode 100644 index 0000000..0488a72 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/_d_rotation.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/3d_rotation/materialicons/black/res/drawable/baseline_3d_rotation_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M7.52,21.48C4.25,19.94 1.91,16.76 1.55,13L0.05,13C0.56,19.16 5.71,24 12,24l0.66,-0.03 -3.81,-3.81 -1.33,1.32zM8.41,14.96c-0.19,0 -0.37,-0.03 -0.52,-0.08 -0.16,-0.06 -0.29,-0.13 -0.4,-0.24 -0.11,-0.1 -0.2,-0.22 -0.26,-0.37 -0.06,-0.14 -0.09,-0.3 -0.09,-0.47h-1.3c0,0.36 0.07,0.68 0.21,0.95 0.14,0.27 0.33,0.5 0.56,0.69 0.24,0.18 0.51,0.32 0.82,0.41 0.3,0.1 0.62,0.15 0.96,0.15 0.37,0 0.72,-0.05 1.03,-0.15 0.32,-0.1 0.6,-0.25 0.83,-0.44s0.42,-0.43 0.55,-0.72c0.13,-0.29 0.2,-0.61 0.2,-0.97 0,-0.19 -0.02,-0.38 -0.07,-0.56 -0.05,-0.18 -0.12,-0.35 -0.23,-0.51 -0.1,-0.16 -0.24,-0.3 -0.4,-0.43 -0.17,-0.13 -0.37,-0.23 -0.61,-0.31 0.2,-0.09 0.37,-0.2 0.52,-0.33 0.15,-0.13 0.27,-0.27 0.37,-0.42 0.1,-0.15 0.17,-0.3 0.22,-0.46 0.05,-0.16 0.07,-0.32 0.07,-0.48 0,-0.36 -0.06,-0.68 -0.18,-0.96 -0.12,-0.28 -0.29,-0.51 -0.51,-0.69 -0.2,-0.19 -0.47,-0.33 -0.77,-0.43C9.1,8.05 8.76,8 8.39,8c-0.36,0 -0.69,0.05 -1,0.16 -0.3,0.11 -0.57,0.26 -0.79,0.45 -0.21,0.19 -0.38,0.41 -0.51,0.67 -0.12,0.26 -0.18,0.54 -0.18,0.85h1.3c0,-0.17 0.03,-0.32 0.09,-0.45s0.14,-0.25 0.25,-0.34c0.11,-0.09 0.23,-0.17 0.38,-0.22 0.15,-0.05 0.3,-0.08 0.48,-0.08 0.4,0 0.7,0.1 0.89,0.31 0.19,0.2 0.29,0.49 0.29,0.86 0,0.18 -0.03,0.34 -0.08,0.49 -0.05,0.15 -0.14,0.27 -0.25,0.37 -0.11,0.1 -0.25,0.18 -0.41,0.24 -0.16,0.06 -0.36,0.09 -0.58,0.09L7.5,11.4v1.03h0.77c0.22,0 0.42,0.02 0.6,0.07s0.33,0.13 0.45,0.23c0.12,0.11 0.22,0.24 0.29,0.4 0.07,0.16 0.1,0.35 0.1,0.57 0,0.41 -0.12,0.72 -0.35,0.93 -0.23,0.23 -0.55,0.33 -0.95,0.33zM16.96,9.04c-0.32,-0.33 -0.7,-0.59 -1.14,-0.77 -0.43,-0.18 -0.92,-0.27 -1.46,-0.27L12,8v8h2.3c0.55,0 1.06,-0.09 1.51,-0.27 0.45,-0.18 0.84,-0.43 1.16,-0.76 0.32,-0.33 0.57,-0.73 0.74,-1.19 0.17,-0.47 0.26,-0.99 0.26,-1.57v-0.4c0,-0.58 -0.09,-1.1 -0.26,-1.57 -0.18,-0.47 -0.43,-0.87 -0.75,-1.2zM16.57,12.2c0,0.42 -0.05,0.79 -0.14,1.13 -0.1,0.33 -0.24,0.62 -0.43,0.85 -0.19,0.23 -0.43,0.41 -0.71,0.53 -0.29,0.12 -0.62,0.18 -0.99,0.18h-0.91L13.39,9.12h0.97c0.72,0 1.27,0.23 1.64,0.69 0.38,0.46 0.57,1.12 0.57,1.99v0.4zM12,0l-0.66,0.03 3.81,3.81 1.33,-1.33c3.27,1.55 5.61,4.72 5.96,8.48h1.5C23.44,4.84 18.29,0 12,0z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/_g.xml b/qqq/android/mobileapp/src/main/res/drawable/_g.xml new file mode 100644 index 0000000..30e5071 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/_g.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/av/5g/materialicons/black/res/drawable/baseline_5g_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M17,13h2v2h-5V9h7c0,-1.1 -0.9,-2 -2,-2h-5c-1.1,0 -2,0.9 -2,2v6c0,1.1 0.9,2 2,2h5c1.1,0 2,-0.9 2,-2v-4h-4V13z" /> + <path + android:fillColor="#FF000000" + android:pathData="M3,13h5v2H3v2h5c1.1,0 2,-0.9 2,-2v-2c0,-1.1 -0.9,-2 -2,-2H5V9h5V7H3V13z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/_g_mobiledata.xml b/qqq/android/mobileapp/src/main/res/drawable/_g_mobiledata.xml new file mode 100644 index 0000000..efb01f4 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/_g_mobiledata.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/3g_mobiledata/materialicons/black/res/drawable/baseline_3g_mobiledata_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M3,7v2h5v2H4v2h4v2H3v2h5c1.1,0 2,-0.9 2,-2v-1.5c0,-0.83 -0.67,-1.5 -1.5,-1.5c0.83,0 1.5,-0.67 1.5,-1.5V9c0,-1.1 -0.9,-2 -2,-2H3zM21,11v4c0,1.1 -0.9,2 -2,2h-5c-1.1,0 -2,-0.9 -2,-2V9c0,-1.1 0.9,-2 2,-2h5c1.1,0 2,0.9 2,2h-7v6h5v-2h-2.5v-2H21z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/_g_plus_mobiledata.xml b/qqq/android/mobileapp/src/main/res/drawable/_g_plus_mobiledata.xml new file mode 100644 index 0000000..b8ec008 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/_g_plus_mobiledata.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/4g_plus_mobiledata/materialicons/black/res/drawable/baseline_4g_plus_mobiledata_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M13,11v2h2v2h-4V9h6c0,-1.1 -0.9,-2 -2,-2h-4C9.9,7 9,7.9 9,9v6c0,1.1 0.9,2 2,2h4c1.1,0 2,-0.9 2,-2v-4H13zM24,11h-2V9h-2v2h-2v2h2v2h2v-2h2V11zM7,7H5v5H3V7H1v7h4v3h2v-3h1v-2H7V7z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/_k.xml b/qqq/android/mobileapp/src/main/res/drawable/_k.xml new file mode 100644 index 0000000..dfec22a --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/_k.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/av/2k/materialicons/black/res/drawable/baseline_2k_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19,3L5,3c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2L21,5c0,-1.1 -0.9,-2 -2,-2zM10,12.5L8,12.5v1h3L11,15L6.5,15v-2.5c0,-0.55 0.45,-1 1,-1h2v-1h-3L6.5,9L10,9c0.55,0 1,0.45 1,1v1.5c0,0.55 -0.45,1 -1,1zM18,15h-1.75l-1.75,-2.25L14.5,15L13,15L13,9h1.5v2.25L16.25,9L18,9l-2.25,3L18,15z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/_k_plus.xml b/qqq/android/mobileapp/src/main/res/drawable/_k_plus.xml new file mode 100644 index 0000000..25407a4 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/_k_plus.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/av/2k_plus/materialicons/black/res/drawable/baseline_2k_plus_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19,3L5,3c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2L21,5c0,-1.1 -0.9,-2 -2,-2zM9.5,11.5c0,0.55 -0.45,1 -1,1h-2v1h3L9.5,15L5,15v-2.5c0,-0.55 0.45,-1 1,-1h2v-1L5,10.5L5,9h3.5c0.55,0 1,0.45 1,1v1.5zM14.25,15l-1.75,-2.25L12.5,15L11,15L11,9h1.5v2.25L14.25,9L16,9l-2.25,3L16,15h-1.75zM20,12.5h-1.5L18.5,14h-1v-1.5L16,12.5v-1h1.5L17.5,10h1v1.5L20,11.5v1z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/_mp.xml b/qqq/android/mobileapp/src/main/res/drawable/_mp.xml new file mode 100644 index 0000000..dbcb86a --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/_mp.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/4mp/materialicons/black/res/drawable/baseline_4mp_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19,3L5,3c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2L21,5c0,-1.1 -0.9,-2 -2,-2zM12,18.5h-1.5L10.5,14h-1v3L8,17v-3L7,14v4.5L5.5,18.5v-5c0,-0.55 0.45,-1 1,-1L11,12.5c0.55,0 1,0.45 1,1v5zM15,10h-1v1.5h-1.5L12.5,10h-3L9.5,5.5L11,5.5v3h1.5v-3L14,5.5v3h1L15,10zM15.5,18.5L14,18.5v-6h3.5c0.55,0 1,0.45 1,1L18.5,16c0,0.55 -0.45,1 -1,1h-2v1.5zM15.5,14L17,14v1.5h-1.5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/_p.xml b/qqq/android/mobileapp/src/main/res/drawable/_p.xml new file mode 100644 index 0000000..9c01c0c --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/_p.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/communication/3p/materialicons/black/res/drawable/baseline_3p_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,2H4.01c-1.1,0 -2,0.9 -2,2L2,22l4,-4h14c1.1,0 2,-0.9 2,-2V4C22,2.9 21.1,2 20,2zM12,6c1.1,0 2,0.9 2,2s-0.9,2 -2,2s-2,-0.9 -2,-2S10.9,6 12,6zM16,14H8v-0.57c0,-0.81 0.48,-1.53 1.22,-1.85C10.07,11.21 11.01,11 12,11c0.99,0 1.93,0.21 2.78,0.58C15.52,11.9 16,12.62 16,13.43V14z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/_x_mobiledata.xml b/qqq/android/mobileapp/src/main/res/drawable/_x_mobiledata.xml new file mode 100644 index 0000000..dbf3750 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/_x_mobiledata.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/1x_mobiledata/materialicons/black/res/drawable/baseline_1x_mobiledata_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M4,7h4v10H6V9H4V7zM15.83,11.72L18.66,7h-2.33l-1.66,2.77L13,7h-2.33l2.83,4.72L10.33,17h2.33l2,-3.34l2,3.34H19L15.83,11.72z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/abc.xml b/qqq/android/mobileapp/src/main/res/drawable/abc.xml new file mode 100644 index 0000000..4ba78a3 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/abc.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/abc/materialicons/black/res/drawable/baseline_abc_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M21,11h-1.5v-0.5h-2v3h2V13H21v1c0,0.55 -0.45,1 -1,1h-3c-0.55,0 -1,-0.45 -1,-1v-4c0,-0.55 0.45,-1 1,-1h3c0.55,0 1,0.45 1,1V11zM8,10v5H6.5v-1.5h-2V15H3v-5c0,-0.55 0.45,-1 1,-1h3C7.55,9 8,9.45 8,10zM6.5,10.5h-2V12h2V10.5zM13.5,12c0.55,0 1,0.45 1,1v1c0,0.55 -0.45,1 -1,1h-4V9h4c0.55,0 1,0.45 1,1v1C14.5,11.55 14.05,12 13.5,12zM11,10.5v0.75h2V10.5H11zM13,12.75h-2v0.75h2V12.75z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/ac_unit.xml b/qqq/android/mobileapp/src/main/res/drawable/ac_unit.xml new file mode 100644 index 0000000..0434014 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/ac_unit.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/places/ac_unit/materialicons/black/res/drawable/baseline_ac_unit_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M22,11h-4.17l3.24,-3.24 -1.41,-1.42L15,11h-2V9l4.66,-4.66 -1.42,-1.41L13,6.17V2h-2v4.17L7.76,2.93 6.34,4.34 11,9v2H9L4.34,6.34 2.93,7.76 6.17,11H2v2h4.17l-3.24,3.24 1.41,1.42L9,13h2v2l-4.66,4.66 1.42,1.41L11,17.83V22h2v-4.17l3.24,3.24 1.42,-1.41L13,15v-2h2l4.66,4.66 1.41,-1.42L17.83,13H22z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/access_alarm.xml b/qqq/android/mobileapp/src/main/res/drawable/access_alarm.xml new file mode 100644 index 0000000..ffcb1f1 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/access_alarm.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/access_alarm/materialicons/black/res/drawable/baseline_access_alarm_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M22,5.72l-4.6,-3.86 -1.29,1.53 4.6,3.86L22,5.72zM7.88,3.39L6.6,1.86 2,5.71l1.29,1.53 4.59,-3.85zM12.5,8L11,8v6l4.75,2.85 0.75,-1.23 -4,-2.37L12.5,8zM12,4c-4.97,0 -9,4.03 -9,9s4.02,9 9,9c4.97,0 9,-4.03 9,-9s-4.03,-9 -9,-9zM12,20c-3.87,0 -7,-3.13 -7,-7s3.13,-7 7,-7 7,3.13 7,7 -3.13,7 -7,7z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/access_alarms.xml b/qqq/android/mobileapp/src/main/res/drawable/access_alarms.xml new file mode 100644 index 0000000..8e87b4b --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/access_alarms.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/access_alarms/materialicons/black/res/drawable/baseline_access_alarms_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M22,5.7l-4.6,-3.9 -1.3,1.5 4.6,3.9L22,5.7zM7.9,3.4L6.6,1.9 2,5.7l1.3,1.5 4.6,-3.8zM12.5,8L11,8v6l4.7,2.9 0.8,-1.2 -4,-2.4L12.5,8zM12,4c-5,0 -9,4 -9,9s4,9 9,9 9,-4 9,-9 -4,-9 -9,-9zM12,20c-3.9,0 -7,-3.1 -7,-7s3.1,-7 7,-7 7,3.1 7,7 -3.1,7 -7,7z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/access_time.xml b/qqq/android/mobileapp/src/main/res/drawable/access_time.xml new file mode 100644 index 0000000..8d2da97 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/access_time.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/access_time/materialicons/black/res/drawable/baseline_access_time_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M11.99,2C6.47,2 2,6.48 2,12s4.47,10 9.99,10C17.52,22 22,17.52 22,12S17.52,2 11.99,2zM12,20c-4.42,0 -8,-3.58 -8,-8s3.58,-8 8,-8 8,3.58 8,8 -3.58,8 -8,8z" /> + <path + android:fillColor="#FF000000" + android:pathData="M12.5,7H11v6l5.25,3.15 0.75,-1.23 -4.5,-2.67z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/access_time_filled.xml b/qqq/android/mobileapp/src/main/res/drawable/access_time_filled.xml new file mode 100644 index 0000000..16e05a5 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/access_time_filled.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/access_time_filled/materialicons/black/res/drawable/baseline_access_time_filled_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M11.99,2C6.47,2 2,6.48 2,12s4.47,10 9.99,10C17.52,22 22,17.52 22,12S17.52,2 11.99,2zM15.29,16.71L11,12.41V7h2v4.59l3.71,3.71L15.29,16.71z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/accessibility.xml b/qqq/android/mobileapp/src/main/res/drawable/accessibility.xml new file mode 100644 index 0000000..4ec0243 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/accessibility.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/accessibility/materialicons/black/res/drawable/baseline_accessibility_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,2c1.1,0 2,0.9 2,2s-0.9,2 -2,2 -2,-0.9 -2,-2 0.9,-2 2,-2zM21,9h-6v13h-2v-6h-2v6L9,22L9,9L3,9L3,7h18v2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/accessibility_new.xml b/qqq/android/mobileapp/src/main/res/drawable/accessibility_new.xml new file mode 100644 index 0000000..8f1ddbd --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/accessibility_new.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/accessibility_new/materialicons/black/res/drawable/baseline_accessibility_new_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20.5,6c-2.61,0.7 -5.67,1 -8.5,1s-5.89,-0.3 -8.5,-1L3,8c1.86,0.5 4,0.83 6,1v13h2v-6h2v6h2V9c2,-0.17 4.14,-0.5 6,-1l-0.5,-2zM12,6c1.1,0 2,-0.9 2,-2s-0.9,-2 -2,-2 -2,0.9 -2,2 0.9,2 2,2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/accessible.xml b/qqq/android/mobileapp/src/main/res/drawable/accessible.xml new file mode 100644 index 0000000..a71a631 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/accessible.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/accessible/materialicons/black/res/drawable/baseline_accessible_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,4m-2,0a2,2 0,1 1,4 0a2,2 0,1 1,-4 0" /> + <path + android:fillColor="#FF000000" + android:pathData="M19,13v-2c-1.54,0.02 -3.09,-0.75 -4.07,-1.83l-1.29,-1.43c-0.17,-0.19 -0.38,-0.34 -0.61,-0.45 -0.01,0 -0.01,-0.01 -0.02,-0.01L13,7.28c-0.35,-0.2 -0.75,-0.3 -1.19,-0.26C10.76,7.11 10,8.04 10,9.09L10,15c0,1.1 0.9,2 2,2h5v5h2v-5.5c0,-1.1 -0.9,-2 -2,-2h-3v-3.45c1.29,1.07 3.25,1.94 5,1.95zM12.83,18c-0.41,1.16 -1.52,2 -2.83,2 -1.66,0 -3,-1.34 -3,-3 0,-1.31 0.84,-2.41 2,-2.83L9,12.1c-2.28,0.46 -4,2.48 -4,4.9 0,2.76 2.24,5 5,5 2.42,0 4.44,-1.72 4.9,-4h-2.07z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/accessible_forward.xml b/qqq/android/mobileapp/src/main/res/drawable/accessible_forward.xml new file mode 100644 index 0000000..7f98cc6 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/accessible_forward.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/accessible_forward/materialicons/black/res/drawable/baseline_accessible_forward_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M17,4.54m-2,0a2,2 0,1 1,4 0a2,2 0,1 1,-4 0" /> + <path + android:fillColor="#FF000000" + android:pathData="M14,17h-2c0,1.65 -1.35,3 -3,3s-3,-1.35 -3,-3 1.35,-3 3,-3v-2c-2.76,0 -5,2.24 -5,5s2.24,5 5,5 5,-2.24 5,-5zM17,13.5h-1.86l1.67,-3.67C17.42,8.5 16.44,7 14.96,7h-5.2c-0.81,0 -1.54,0.47 -1.87,1.2L7.22,10l1.92,0.53L9.79,9L12,9l-1.83,4.1c-0.6,1.33 0.39,2.9 1.85,2.9L17,16v5h2v-5.5c0,-1.1 -0.9,-2 -2,-2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/account_balance.xml b/qqq/android/mobileapp/src/main/res/drawable/account_balance.xml new file mode 100644 index 0000000..bbc56da --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/account_balance.xml @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/account_balance/materialicons/black/res/drawable/baseline_account_balance_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M4,10h3v7h-3z" /> + <path + android:fillColor="#FF000000" + android:pathData="M10.5,10h3v7h-3z" /> + <path + android:fillColor="#FF000000" + android:pathData="M2,19h20v3h-20z" /> + <path + android:fillColor="#FF000000" + android:pathData="M17,10h3v7h-3z" /> + <path + android:fillColor="#FF000000" + android:pathData="M12,1l-10,5l0,2l20,0l0,-2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/account_balance_wallet.xml b/qqq/android/mobileapp/src/main/res/drawable/account_balance_wallet.xml new file mode 100644 index 0000000..8cd2722 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/account_balance_wallet.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/account_balance_wallet/materialicons/black/res/drawable/baseline_account_balance_wallet_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M21,18v1c0,1.1 -0.9,2 -2,2L5,21c-1.11,0 -2,-0.9 -2,-2L3,5c0,-1.1 0.89,-2 2,-2h14c1.1,0 2,0.9 2,2v1h-9c-1.11,0 -2,0.9 -2,2v8c0,1.1 0.89,2 2,2h9zM12,16h10L22,8L12,8v8zM16,13.5c-0.83,0 -1.5,-0.67 -1.5,-1.5s0.67,-1.5 1.5,-1.5 1.5,0.67 1.5,1.5 -0.67,1.5 -1.5,1.5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/account_box.xml b/qqq/android/mobileapp/src/main/res/drawable/account_box.xml new file mode 100644 index 0000000..de5fe0b --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/account_box.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/account_box/materialicons/black/res/drawable/baseline_account_box_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19,3H5C3.9,3 3,3.9 3,5v14c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2V5C21,3.9 20.1,3 19,3zM12,6c1.93,0 3.5,1.57 3.5,3.5c0,1.93 -1.57,3.5 -3.5,3.5s-3.5,-1.57 -3.5,-3.5C8.5,7.57 10.07,6 12,6zM19,19H5v-0.23c0,-0.62 0.28,-1.2 0.76,-1.58C7.47,15.82 9.64,15 12,15s4.53,0.82 6.24,2.19c0.48,0.38 0.76,0.97 0.76,1.58V19z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/account_circle.xml b/qqq/android/mobileapp/src/main/res/drawable/account_circle.xml new file mode 100644 index 0000000..794907e --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/account_circle.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/account_circle/materialicons/black/res/drawable/baseline_account_circle_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10s10,-4.48 10,-10S17.52,2 12,2zM12,6c1.93,0 3.5,1.57 3.5,3.5S13.93,13 12,13s-3.5,-1.57 -3.5,-3.5S10.07,6 12,6zM12,20c-2.03,0 -4.43,-0.82 -6.14,-2.88C7.55,15.8 9.68,15 12,15s4.45,0.8 6.14,2.12C16.43,19.18 14.03,20 12,20z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/account_tree.xml b/qqq/android/mobileapp/src/main/res/drawable/account_tree.xml new file mode 100644 index 0000000..ef86748 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/account_tree.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/notification/account_tree/materialicons/black/res/drawable/baseline_account_tree_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M22,11V3h-7v3H9V3H2v8h7V8h2v10h4v3h7v-8h-7v3h-2V8h2v3z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/ad_units.xml b/qqq/android/mobileapp/src/main/res/drawable/ad_units.xml new file mode 100644 index 0000000..9cde332 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/ad_units.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/ad_units/materialicons/black/res/drawable/baseline_ad_units_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M17,1L7,1c-1.1,0 -2,0.9 -2,2v18c0,1.1 0.9,2 2,2h10c1.1,0 2,-0.9 2,-2L19,3c0,-1.1 -0.9,-2 -2,-2zM17,19L7,19L7,5h10v14zM8,6h8v2L8,8z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/adb.xml b/qqq/android/mobileapp/src/main/res/drawable/adb.xml new file mode 100644 index 0000000..3e70e47 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/adb.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/notification/adb/materialicons/black/res/drawable/baseline_adb_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M5,16c0,3.87 3.13,7 7,7s7,-3.13 7,-7v-4L5,12v4zM16.12,4.37l2.1,-2.1 -0.82,-0.83 -2.3,2.31C14.16,3.28 13.12,3 12,3s-2.16,0.28 -3.09,0.75L6.6,1.44l-0.82,0.83 2.1,2.1C6.14,5.64 5,7.68 5,10v1h14v-1c0,-2.32 -1.14,-4.36 -2.88,-5.63zM9,9c-0.55,0 -1,-0.45 -1,-1s0.45,-1 1,-1 1,0.45 1,1 -0.45,1 -1,1zM15,9c-0.55,0 -1,-0.45 -1,-1s0.45,-1 1,-1 1,0.45 1,1 -0.45,1 -1,1z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/add.xml b/qqq/android/mobileapp/src/main/res/drawable/add.xml new file mode 100644 index 0000000..f2fc6fa --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/add.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/content/add/materialicons/black/res/drawable/baseline_add_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19,13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/add_a_photo.xml b/qqq/android/mobileapp/src/main/res/drawable/add_a_photo.xml new file mode 100644 index 0000000..0045e1f --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/add_a_photo.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/add_a_photo/materialicons/black/res/drawable/baseline_add_a_photo_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M3,4V1h2v3h3v2H5v3H3V6H0V4H3zM6,10V7h3V4h7l1.83,2H21c1.1,0 2,0.9 2,2v12c0,1.1 -0.9,2 -2,2H5c-1.1,0 -2,-0.9 -2,-2V10H6zM13,19c2.76,0 5,-2.24 5,-5s-2.24,-5 -5,-5s-5,2.24 -5,5S10.24,19 13,19zM9.8,14c0,1.77 1.43,3.2 3.2,3.2s3.2,-1.43 3.2,-3.2s-1.43,-3.2 -3.2,-3.2S9.8,12.23 9.8,14z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/add_alarm.xml b/qqq/android/mobileapp/src/main/res/drawable/add_alarm.xml new file mode 100644 index 0000000..dbeeaea --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/add_alarm.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/add_alarm/materialicons/black/res/drawable/baseline_add_alarm_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M7.88,3.39L6.6,1.86 2,5.71l1.29,1.53 4.59,-3.85zM22,5.72l-4.6,-3.86 -1.29,1.53 4.6,3.86L22,5.72zM12,4c-4.97,0 -9,4.03 -9,9s4.02,9 9,9c4.97,0 9,-4.03 9,-9s-4.03,-9 -9,-9zM12,20c-3.87,0 -7,-3.13 -7,-7s3.13,-7 7,-7 7,3.13 7,7 -3.13,7 -7,7zM13,9h-2v3L8,12v2h3v3h2v-3h3v-2h-3L13,9z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/add_alert.xml b/qqq/android/mobileapp/src/main/res/drawable/add_alert.xml new file mode 100644 index 0000000..6f9f892 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/add_alert.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/alert/add_alert/materialicons/black/res/drawable/baseline_add_alert_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M10.01,21.01c0,1.1 0.89,1.99 1.99,1.99s1.99,-0.89 1.99,-1.99h-3.98zM18.88,16.82L18.88,11c0,-3.25 -2.25,-5.97 -5.29,-6.69v-0.72C13.59,2.71 12.88,2 12,2s-1.59,0.71 -1.59,1.59v0.72C7.37,5.03 5.12,7.75 5.12,11v5.82L3,18.94L3,20h18v-1.06l-2.12,-2.12zM16,13.01h-3v3h-2v-3L8,13.01L8,11h3L11,8h2v3h3v2.01z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/add_box.xml b/qqq/android/mobileapp/src/main/res/drawable/add_box.xml new file mode 100644 index 0000000..76fec4e --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/add_box.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/content/add_box/materialicons/black/res/drawable/baseline_add_box_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19,3L5,3c-1.11,0 -2,0.9 -2,2v14c0,1.1 0.89,2 2,2h14c1.1,0 2,-0.9 2,-2L21,5c0,-1.1 -0.9,-2 -2,-2zM17,13h-4v4h-2v-4L7,13v-2h4L11,7h2v4h4v2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/add_business.xml b/qqq/android/mobileapp/src/main/res/drawable/add_business.xml new file mode 100644 index 0000000..4a7d68d --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/add_business.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/add_business/materialicons/black/res/drawable/baseline_add_business_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M15,17h2v-3h1v-2l-1,-5H2l-1,5v2h1v6h9v-6h4V17zM9,18H4v-4h5V18z" /> + <path + android:fillColor="#FF000000" + android:pathData="M2,4h15v2h-15z" /> + <path + android:fillColor="#FF000000" + android:pathData="M20,18l0,-3l-2,0l0,3l-3,0l0,2l3,0l0,3l2,0l0,-3l3,0l0,-2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/add_call.xml b/qqq/android/mobileapp/src/main/res/drawable/add_call.xml new file mode 100644 index 0000000..80e8df5 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/add_call.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/notification/add_call/materialicons/black/res/drawable/baseline_add_call_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,15.5c-1.25,0 -2.45,-0.2 -3.57,-0.57 -0.35,-0.11 -0.74,-0.03 -1.02,0.24l-2.2,2.2c-2.83,-1.44 -5.15,-3.75 -6.59,-6.59l2.2,-2.21c0.28,-0.26 0.36,-0.65 0.25,-1C8.7,6.45 8.5,5.25 8.5,4c0,-0.55 -0.45,-1 -1,-1H4c-0.55,0 -1,0.45 -1,1 0,9.39 7.61,17 17,17 0.55,0 1,-0.45 1,-1v-3.5c0,-0.55 -0.45,-1 -1,-1zM21,6h-3V3h-2v3h-3v2h3v3h2V8h3z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/add_card.xml b/qqq/android/mobileapp/src/main/res/drawable/add_card.xml new file mode 100644 index 0000000..cbf9e5e --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/add_card.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/add_card/materialicons/black/res/drawable/baseline_add_card_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,4H4C2.89,4 2.01,4.89 2.01,6L2,18c0,1.11 0.89,2 2,2h10v-2H4v-6h18V6C22,4.89 21.11,4 20,4zM20,8H4V6h16V8zM24,17v2h-3v3h-2v-3h-3v-2h3v-3h2v3H24z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/add_chart.xml b/qqq/android/mobileapp/src/main/res/drawable/add_chart.xml new file mode 100644 index 0000000..ac1caa3 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/add_chart.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/editor/add_chart/materialicons/black/res/drawable/baseline_add_chart_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M6,9.99h2v7L6,16.99zM14,12.99h2v4h-2zM10,6.99h2v10h-2zM20,7L20,4h-2v3h-3v2h3v3h2L20,9h3L23,7zM18,19L4,19L4,5h12L16,3L4,3c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2v-5h-2v5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/add_circle.xml b/qqq/android/mobileapp/src/main/res/drawable/add_circle.xml new file mode 100644 index 0000000..fc251bd --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/add_circle.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/content/add_circle/materialicons/black/res/drawable/baseline_add_circle_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM17,13h-4v4h-2v-4L7,13v-2h4L11,7h2v4h4v2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/add_circle_outline.xml b/qqq/android/mobileapp/src/main/res/drawable/add_circle_outline.xml new file mode 100644 index 0000000..90a6714 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/add_circle_outline.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/content/add_circle_outline/materialicons/black/res/drawable/baseline_add_circle_outline_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M13,7h-2v4L7,11v2h4v4h2v-4h4v-2h-4L13,7zM12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM12,20c-4.41,0 -8,-3.59 -8,-8s3.59,-8 8,-8 8,3.59 8,8 -3.59,8 -8,8z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/add_comment.xml b/qqq/android/mobileapp/src/main/res/drawable/add_comment.xml new file mode 100644 index 0000000..b61f5f0 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/add_comment.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/editor/add_comment/materialicons/black/res/drawable/baseline_add_comment_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M21.99,4c0,-1.1 -0.89,-2 -1.99,-2H4c-1.1,0 -2,0.9 -2,2v12c0,1.1 0.9,2 2,2h14l4,4 -0.01,-18zM17,11h-4v4h-2v-4H7V9h4V5h2v4h4v2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/add_home.xml b/qqq/android/mobileapp/src/main/res/drawable/add_home.xml new file mode 100644 index 0000000..23e0c06 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/add_home.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/add_home/materialicons/black/res/drawable/baseline_add_home_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M18,11c0.7,0 1.37,0.1 2,0.29V9l-8,-6L4,9v12h7.68C11.25,20.09 11,19.08 11,18C11,14.13 14.13,11 18,11z" /> + <path + android:fillColor="#FF000000" + android:pathData="M18,13c-2.76,0 -5,2.24 -5,5s2.24,5 5,5s5,-2.24 5,-5S20.76,13 18,13zM21,18.5h-2.5V21h-1v-2.5H15v-1h2.5V15h1v2.5H21V18.5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/add_home_work.xml b/qqq/android/mobileapp/src/main/res/drawable/add_home_work.xml new file mode 100644 index 0000000..e342789 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/add_home_work.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/navigation/add_home_work/materialicons/black/res/drawable/baseline_add_home_work_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M15,11.68V11L8,6l-7,5v10h5v-6h4v6h1.68C11.25,20.09 11,19.08 11,18C11,15.21 12.64,12.81 15,11.68z" /> + <path + android:fillColor="#FF000000" + android:pathData="M23,13.11V3H10v1.97l7,5v1.11c0.33,-0.05 0.66,-0.08 1,-0.08C19.96,11 21.73,11.81 23,13.11zM17,7h2v2h-2V7z" /> + <path + android:fillColor="#FF000000" + android:pathData="M23,18c0,-2.76 -2.24,-5 -5,-5s-5,2.24 -5,5s2.24,5 5,5S23,20.76 23,18zM17.5,21v-2.5H15v-1h2.5V15h1v2.5H21v1h-2.5V21H17.5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/add_ic_call.xml b/qqq/android/mobileapp/src/main/res/drawable/add_ic_call.xml new file mode 100644 index 0000000..a2778a0 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/add_ic_call.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/communication/add_ic_call/materialicons/black/res/drawable/baseline_add_ic_call_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,15.5c-1.25,0 -2.45,-0.2 -3.57,-0.57 -0.35,-0.11 -0.74,-0.03 -1.02,0.24l-2.2,2.2c-2.83,-1.44 -5.15,-3.75 -6.59,-6.59l2.2,-2.21c0.28,-0.26 0.36,-0.65 0.25,-1C8.7,6.45 8.5,5.25 8.5,4c0,-0.55 -0.45,-1 -1,-1H4c-0.55,0 -1,0.45 -1,1 0,9.39 7.61,17 17,17 0.55,0 1,-0.45 1,-1v-3.5c0,-0.55 -0.45,-1 -1,-1zM21,6h-3V3h-2v3h-3v2h3v3h2V8h3z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/add_link.xml b/qqq/android/mobileapp/src/main/res/drawable/add_link.xml new file mode 100644 index 0000000..4470b6d --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/add_link.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/content/add_link/materialicons/black/res/drawable/baseline_add_link_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M8,11h8v2L8,13zM20.1,12L22,12c0,-2.76 -2.24,-5 -5,-5h-4v1.9h4c1.71,0 3.1,1.39 3.1,3.1zM3.9,12c0,-1.71 1.39,-3.1 3.1,-3.1h4L11,7L7,7c-2.76,0 -5,2.24 -5,5s2.24,5 5,5h4v-1.9L7,15.1c-1.71,0 -3.1,-1.39 -3.1,-3.1zM19,12h-2v3h-3v2h3v3h2v-3h3v-2h-3z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/add_location.xml b/qqq/android/mobileapp/src/main/res/drawable/add_location.xml new file mode 100644 index 0000000..f41c9a0 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/add_location.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/add_location/materialicons/black/res/drawable/baseline_add_location_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,2C8.14,2 5,5.14 5,9c0,5.25 7,13 7,13s7,-7.75 7,-13c0,-3.86 -3.14,-7 -7,-7zM16,10h-3v3h-2v-3L8,10L8,8h3L11,5h2v3h3v2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/add_location_alt.xml b/qqq/android/mobileapp/src/main/res/drawable/add_location_alt.xml new file mode 100644 index 0000000..d6770b3 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/add_location_alt.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/add_location_alt/materialicons/black/res/drawable/baseline_add_location_alt_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,1v3h3v2h-3v3h-2L18,6h-3L15,4h3L18,1h2zM12,13c1.1,0 2,-0.9 2,-2s-0.9,-2 -2,-2 -2,0.9 -2,2 0.9,2 2,2zM14,3.25L14,7h3v3h2.92c0.05,0.39 0.08,0.79 0.08,1.2 0,3.32 -2.67,7.25 -8,11.8 -5.33,-4.55 -8,-8.48 -8,-11.8C4,6.22 7.8,3 12,3c0.68,0 1.35,0.08 2,0.25z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/add_moderator.xml b/qqq/android/mobileapp/src/main/res/drawable/add_moderator.xml new file mode 100644 index 0000000..f6ca6e2 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/add_moderator.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/add_moderator/materialicons/black/res/drawable/baseline_add_moderator_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M13.22,22.61c-0.4,0.15 -0.8,0.29 -1.22,0.39 -5.16,-1.26 -9,-6.45 -9,-12V5l9,-4 9,4v6c0,0.9 -0.11,1.78 -0.3,2.65 -0.81,-0.41 -1.73,-0.65 -2.7,-0.65 -3.31,0 -6,2.69 -6,6 0,1.36 0.46,2.61 1.22,3.61zM19,20v2.99s-1.99,0.01 -2,0V20h-3v-2h3v-3h2v3h3v2h-3z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/add_photo_alternate.xml b/qqq/android/mobileapp/src/main/res/drawable/add_photo_alternate.xml new file mode 100644 index 0000000..3e84f9d --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/add_photo_alternate.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/add_photo_alternate/materialicons/black/res/drawable/baseline_add_photo_alternate_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19,7v2.99s-1.99,0.01 -2,0L17,7h-3s0.01,-1.99 0,-2h3L17,2h2v3h3v2h-3zM16,11L16,8h-3L13,5L5,5c-1.1,0 -2,0.9 -2,2v12c0,1.1 0.9,2 2,2h12c1.1,0 2,-0.9 2,-2v-8h-3zM5,19l3,-4 2,3 3,-4 4,5L5,19z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/add_reaction.xml b/qqq/android/mobileapp/src/main/res/drawable/add_reaction.xml new file mode 100644 index 0000000..4c943ee --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/add_reaction.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/add_reaction/materialicons/black/res/drawable/baseline_add_reaction_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M18,9V7h-2V2.84C14.77,2.3 13.42,2 11.99,2C6.47,2 2,6.48 2,12s4.47,10 9.99,10C17.52,22 22,17.52 22,12c0,-1.05 -0.17,-2.05 -0.47,-3H18zM15.5,8C16.33,8 17,8.67 17,9.5S16.33,11 15.5,11S14,10.33 14,9.5S14.67,8 15.5,8zM8.5,8C9.33,8 10,8.67 10,9.5S9.33,11 8.5,11S7,10.33 7,9.5S7.67,8 8.5,8zM12,17.5c-2.33,0 -4.31,-1.46 -5.11,-3.5h10.22C16.31,16.04 14.33,17.5 12,17.5zM22,3h2v2h-2v2h-2V5h-2V3h2V1h2V3z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/add_road.xml b/qqq/android/mobileapp/src/main/res/drawable/add_road.xml new file mode 100644 index 0000000..8096749 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/add_road.xml @@ -0,0 +1,34 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/add_road/materialicons/black/res/drawable/baseline_add_road_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,18l0,-3l-2,0l0,3l-3,0l0,2l3,0l0,3l2,0l0,-3l3,0l0,-2z" /> + <path + android:fillColor="#FF000000" + android:pathData="M18,4h2v9h-2z" /> + <path + android:fillColor="#FF000000" + android:pathData="M4,4h2v16h-2z" /> + <path + android:fillColor="#FF000000" + android:pathData="M11,4h2v4h-2z" /> + <path + android:fillColor="#FF000000" + android:pathData="M11,10h2v4h-2z" /> + <path + android:fillColor="#FF000000" + android:pathData="M11,16h2v4h-2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/add_shopping_cart.xml b/qqq/android/mobileapp/src/main/res/drawable/add_shopping_cart.xml new file mode 100644 index 0000000..5865e35 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/add_shopping_cart.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/add_shopping_cart/materialicons/black/res/drawable/baseline_add_shopping_cart_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M11,9h2L13,6h3L16,4h-3L13,1h-2v3L8,4v2h3v3zM7,18c-1.1,0 -1.99,0.9 -1.99,2S5.9,22 7,22s2,-0.9 2,-2 -0.9,-2 -2,-2zM17,18c-1.1,0 -1.99,0.9 -1.99,2s0.89,2 1.99,2 2,-0.9 2,-2 -0.9,-2 -2,-2zM7.17,14.75l0.03,-0.12 0.9,-1.63h7.45c0.75,0 1.41,-0.41 1.75,-1.03l3.86,-7.01L19.42,4h-0.01l-1.1,2 -2.76,5L8.53,11l-0.13,-0.27L6.16,6l-0.95,-2 -0.94,-2L1,2v2h2l3.6,7.59 -1.35,2.45c-0.16,0.28 -0.25,0.61 -0.25,0.96 0,1.1 0.9,2 2,2h12v-2L7.42,15c-0.13,0 -0.25,-0.11 -0.25,-0.25z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/add_task.xml b/qqq/android/mobileapp/src/main/res/drawable/add_task.xml new file mode 100644 index 0000000..5cb1dbb --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/add_task.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/add_task/materialicons/black/res/drawable/baseline_add_task_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M22,5.18L10.59,16.6l-4.24,-4.24l1.41,-1.41l2.83,2.83l10,-10L22,5.18zM12,20c-4.41,0 -8,-3.59 -8,-8s3.59,-8 8,-8c1.57,0 3.04,0.46 4.28,1.25l1.45,-1.45C16.1,2.67 14.13,2 12,2C6.48,2 2,6.48 2,12s4.48,10 10,10c1.73,0 3.36,-0.44 4.78,-1.22l-1.5,-1.5C14.28,19.74 13.17,20 12,20zM19,15h-3v2h3v3h2v-3h3v-2h-3v-3h-2V15z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/add_to_drive.xml b/qqq/android/mobileapp/src/main/res/drawable/add_to_drive.xml new file mode 100644 index 0000000..4bfe6de --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/add_to_drive.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/add_to_drive/materialicons/black/res/drawable/baseline_add_to_drive_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,21v-3h3v-2h-3v-3h-2v3h-3v2h3v3H20zM15.03,21.5H5.66c-0.72,0 -1.38,-0.38 -1.73,-1L1.57,16.4c-0.36,-0.62 -0.35,-1.38 0.01,-2L7.92,3.49C8.28,2.88 8.94,2.5 9.65,2.5h4.7c0.71,0 1.37,0.38 1.73,0.99l4.48,7.71C20.06,11.07 19.54,11 19,11c-0.28,0 -0.56,0.02 -0.84,0.06L14.35,4.5h-4.7L3.31,15.41l2.35,4.09h7.89C13.9,20.27 14.4,20.95 15.03,21.5zM13.34,15C13.12,15.63 13,16.3 13,17H7.25l-0.73,-1.27l4.58,-7.98h1.8l2.53,4.42c-0.56,0.42 -1.05,0.93 -1.44,1.51l-2,-3.49L9.25,15H13.34z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/add_to_home_screen.xml b/qqq/android/mobileapp/src/main/res/drawable/add_to_home_screen.xml new file mode 100644 index 0000000..c45f399 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/add_to_home_screen.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/add_to_home_screen/materialicons/black/res/drawable/baseline_add_to_home_screen_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M18,1.01L8,1c-1.1,0 -2,0.9 -2,2v3h2V5h10v14H8v-1H6v3c0,1.1 0.9,2 2,2h10c1.1,0 2,-0.9 2,-2V3c0,-1.1 -0.9,-1.99 -2,-1.99zM10,15h2V8H5v2h3.59L3,15.59 4.41,17 10,11.41z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/add_to_photos.xml b/qqq/android/mobileapp/src/main/res/drawable/add_to_photos.xml new file mode 100644 index 0000000..cd4ba1f --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/add_to_photos.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/add_to_photos/materialicons/black/res/drawable/baseline_add_to_photos_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M4,6L2,6v14c0,1.1 0.9,2 2,2h14v-2L4,20L4,6zM20,2L8,2c-1.1,0 -2,0.9 -2,2v12c0,1.1 0.9,2 2,2h12c1.1,0 2,-0.9 2,-2L22,4c0,-1.1 -0.9,-2 -2,-2zM19,11h-4v4h-2v-4L9,11L9,9h4L13,5h2v4h4v2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/add_to_queue.xml b/qqq/android/mobileapp/src/main/res/drawable/add_to_queue.xml new file mode 100644 index 0000000..8957a04 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/add_to_queue.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/av/add_to_queue/materialicons/black/res/drawable/baseline_add_to_queue_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M21,3L3,3c-1.11,0 -2,0.89 -2,2v12c0,1.1 0.89,2 2,2h5v2h8v-2h5c1.1,0 1.99,-0.9 1.99,-2L23,5c0,-1.11 -0.9,-2 -2,-2zM21,17L3,17L3,5h18v12zM16,10v2h-3v3h-2v-3L8,12v-2h3L11,7h2v3h3z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/addchart.xml b/qqq/android/mobileapp/src/main/res/drawable/addchart.xml new file mode 100644 index 0000000..b906049 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/addchart.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/addchart/materialicons/black/res/drawable/baseline_addchart_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M22,5v2h-3v3h-2L17,7h-3L14,5h3L17,2h2v3h3zM19,19L5,19L5,5h6L11,3L5,3c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2v-6h-2v6zM15,13v4h2v-4h-2zM11,17h2L13,9h-2v8zM9,17v-6L7,11v6h2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/adf_scanner.xml b/qqq/android/mobileapp/src/main/res/drawable/adf_scanner.xml new file mode 100644 index 0000000..081e319 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/adf_scanner.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/hardware/adf_scanner/materialicons/black/res/drawable/baseline_adf_scanner_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19,12h-1V4H6v8H5c-1.66,0 -3,1.34 -3,3v5h20v-5C22,13.34 20.66,12 19,12zM16,12H8V6h8V12zM18,17c-0.55,0 -1,-0.45 -1,-1c0,-0.55 0.45,-1 1,-1s1,0.45 1,1C19,16.55 18.55,17 18,17z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/adjust.xml b/qqq/android/mobileapp/src/main/res/drawable/adjust.xml new file mode 100644 index 0000000..6bdbc44 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/adjust.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/adjust/materialicons/black/res/drawable/baseline_adjust_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,2C6.49,2 2,6.49 2,12s4.49,10 10,10 10,-4.49 10,-10S17.51,2 12,2zM12,20c-4.41,0 -8,-3.59 -8,-8s3.59,-8 8,-8 8,3.59 8,8 -3.59,8 -8,8zM15,12c0,1.66 -1.34,3 -3,3s-3,-1.34 -3,-3 1.34,-3 3,-3 3,1.34 3,3z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/admin_panel_settings.xml b/qqq/android/mobileapp/src/main/res/drawable/admin_panel_settings.xml new file mode 100644 index 0000000..f16d3dd --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/admin_panel_settings.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/admin_panel_settings/materialicons/black/res/drawable/baseline_admin_panel_settings_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M17,11c0.34,0 0.67,0.04 1,0.09V6.27L10.5,3L3,6.27v4.91c0,4.54 3.2,8.79 7.5,9.82c0.55,-0.13 1.08,-0.32 1.6,-0.55C11.41,19.47 11,18.28 11,17C11,13.69 13.69,11 17,11z" /> + <path + android:fillColor="#FF000000" + android:pathData="M17,13c-2.21,0 -4,1.79 -4,4c0,2.21 1.79,4 4,4s4,-1.79 4,-4C21,14.79 19.21,13 17,13zM17,14.38c0.62,0 1.12,0.51 1.12,1.12s-0.51,1.12 -1.12,1.12s-1.12,-0.51 -1.12,-1.12S16.38,14.38 17,14.38zM17,19.75c-0.93,0 -1.74,-0.46 -2.24,-1.17c0.05,-0.72 1.51,-1.08 2.24,-1.08s2.19,0.36 2.24,1.08C18.74,19.29 17.93,19.75 17,19.75z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/ads_click.xml b/qqq/android/mobileapp/src/main/res/drawable/ads_click.xml new file mode 100644 index 0000000..aadcaaa --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/ads_click.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/ads_click/materialicons/black/res/drawable/baseline_ads_click_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M11.71,17.99C8.53,17.84 6,15.22 6,12c0,-3.31 2.69,-6 6,-6c3.22,0 5.84,2.53 5.99,5.71l-2.1,-0.63C15.48,9.31 13.89,8 12,8c-2.21,0 -4,1.79 -4,4c0,1.89 1.31,3.48 3.08,3.89L11.71,17.99zM22,12c0,0.3 -0.01,0.6 -0.04,0.9l-1.97,-0.59C20,12.21 20,12.1 20,12c0,-4.42 -3.58,-8 -8,-8s-8,3.58 -8,8s3.58,8 8,8c0.1,0 0.21,0 0.31,-0.01l0.59,1.97C12.6,21.99 12.3,22 12,22C6.48,22 2,17.52 2,12C2,6.48 6.48,2 12,2S22,6.48 22,12zM18.23,16.26L22,15l-10,-3l3,10l1.26,-3.77l4.27,4.27l1.98,-1.98L18.23,16.26z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/agriculture.xml b/qqq/android/mobileapp/src/main/res/drawable/agriculture.xml new file mode 100644 index 0000000..3ce1796 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/agriculture.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/agriculture/materialicons/black/res/drawable/baseline_agriculture_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19.5,12c0.93,0 1.78,0.28 2.5,0.76V8c0,-1.1 -0.9,-2 -2,-2h-6.29l-1.06,-1.06l1.41,-1.41l-0.71,-0.71L9.82,6.35l0.71,0.71l1.41,-1.41L13,6.71V9c0,1.1 -0.9,2 -2,2h-0.54c0.95,1.06 1.54,2.46 1.54,4c0,0.34 -0.04,0.67 -0.09,1h3.14C15.3,13.75 17.19,12 19.5,12z" /> + <path + android:fillColor="#FF000000" + android:pathData="M19.5,13c-1.93,0 -3.5,1.57 -3.5,3.5s1.57,3.5 3.5,3.5s3.5,-1.57 3.5,-3.5S21.43,13 19.5,13zM19.5,18c-0.83,0 -1.5,-0.67 -1.5,-1.5s0.67,-1.5 1.5,-1.5s1.5,0.67 1.5,1.5S20.33,18 19.5,18z" /> + <path + android:fillColor="#FF000000" + android:pathData="M4,9h5c0,-1.1 -0.9,-2 -2,-2H4C3.45,7 3,7.45 3,8C3,8.55 3.45,9 4,9z" /> + <path + android:fillColor="#FF000000" + android:pathData="M9.83,13.82l-0.18,-0.47L10.58,13c-0.46,-1.06 -1.28,-1.91 -2.31,-2.43l-0.4,0.89l-0.46,-0.21l0.4,-0.9C7.26,10.13 6.64,10 6,10c-0.53,0 -1.04,0.11 -1.52,0.26l0.34,0.91l-0.47,0.18L4,10.42c-1.06,0.46 -1.91,1.28 -2.43,2.31l0.89,0.4l-0.21,0.46l-0.9,-0.4C1.13,13.74 1,14.36 1,15c0,0.53 0.11,1.04 0.26,1.52l0.91,-0.34l0.18,0.47L1.42,17c0.46,1.06 1.28,1.91 2.31,2.43l0.4,-0.89l0.46,0.21l-0.4,0.9C4.74,19.87 5.36,20 6,20c0.53,0 1.04,-0.11 1.52,-0.26l-0.34,-0.91l0.47,-0.18L8,19.58c1.06,-0.46 1.91,-1.28 2.43,-2.31l-0.89,-0.4l0.21,-0.46l0.9,0.4C10.87,16.26 11,15.64 11,15c0,-0.53 -0.11,-1.04 -0.26,-1.52L9.83,13.82zM7.15,17.77c-1.53,0.63 -3.29,-0.09 -3.92,-1.62c-0.63,-1.53 0.09,-3.29 1.62,-3.92c1.53,-0.63 3.29,0.09 3.92,1.62C9.41,15.38 8.68,17.14 7.15,17.77z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/air.xml b/qqq/android/mobileapp/src/main/res/drawable/air.xml new file mode 100644 index 0000000..952436d --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/air.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/air/materialicons/black/res/drawable/baseline_air_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M14.5,17c0,1.65 -1.35,3 -3,3s-3,-1.35 -3,-3h2c0,0.55 0.45,1 1,1s1,-0.45 1,-1s-0.45,-1 -1,-1H2v-2h9.5C13.15,14 14.5,15.35 14.5,17zM19,6.5C19,4.57 17.43,3 15.5,3S12,4.57 12,6.5h2C14,5.67 14.67,5 15.5,5S17,5.67 17,6.5S16.33,8 15.5,8H2v2h13.5C17.43,10 19,8.43 19,6.5zM18.5,11H2v2h16.5c0.83,0 1.5,0.67 1.5,1.5S19.33,16 18.5,16v2c1.93,0 3.5,-1.57 3.5,-3.5S20.43,11 18.5,11z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/airline_seat_flat.xml b/qqq/android/mobileapp/src/main/res/drawable/airline_seat_flat.xml new file mode 100644 index 0000000..b4884e9 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/airline_seat_flat.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/notification/airline_seat_flat/materialicons/black/res/drawable/baseline_airline_seat_flat_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M22,11v2L9,13L9,7h9c2.21,0 4,1.79 4,4zM2,14v2h6v2h8v-2h6v-2L2,14zM7.14,12.1c1.16,-1.19 1.14,-3.08 -0.04,-4.24 -1.19,-1.16 -3.08,-1.14 -4.24,0.04 -1.16,1.19 -1.14,3.08 0.04,4.24 1.19,1.16 3.08,1.14 4.24,-0.04z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/airline_seat_flat_angled.xml b/qqq/android/mobileapp/src/main/res/drawable/airline_seat_flat_angled.xml new file mode 100644 index 0000000..fa9289f --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/airline_seat_flat_angled.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/notification/airline_seat_flat_angled/materialicons/black/res/drawable/baseline_airline_seat_flat_angled_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M22.25,14.29l-0.69,1.89L9.2,11.71l2.08,-5.66 8.56,3.09c2.1,0.76 3.18,3.06 2.41,5.15zM1.5,12.14L8,14.48L8,19h8v-1.63L20.52,19l0.69,-1.89 -19.02,-6.86 -0.69,1.89zM7.3,10.2c1.49,-0.72 2.12,-2.51 1.41,-4C7.99,4.71 6.2,4.08 4.7,4.8c-1.49,0.71 -2.12,2.5 -1.4,4 0.71,1.49 2.5,2.12 4,1.4z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/airline_seat_individual_suite.xml b/qqq/android/mobileapp/src/main/res/drawable/airline_seat_individual_suite.xml new file mode 100644 index 0000000..a37d639 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/airline_seat_individual_suite.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/notification/airline_seat_individual_suite/materialicons/black/res/drawable/baseline_airline_seat_individual_suite_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M7,13c1.65,0 3,-1.35 3,-3S8.65,7 7,7s-3,1.35 -3,3 1.35,3 3,3zM19,7h-8v7L3,14L3,7L1,7v10h22v-6c0,-2.21 -1.79,-4 -4,-4z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/airline_seat_legroom_extra.xml b/qqq/android/mobileapp/src/main/res/drawable/airline_seat_legroom_extra.xml new file mode 100644 index 0000000..354f61f --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/airline_seat_legroom_extra.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/notification/airline_seat_legroom_extra/materialicons/black/res/drawable/baseline_airline_seat_legroom_extra_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M4,12L4,3L2,3v9c0,2.76 2.24,5 5,5h6v-2L7,15c-1.66,0 -3,-1.34 -3,-3zM22.83,17.24c-0.38,-0.72 -1.29,-0.97 -2.03,-0.63l-1.09,0.5 -3.41,-6.98c-0.34,-0.68 -1.03,-1.12 -1.79,-1.12L11,9L11,3L5,3v8c0,1.66 1.34,3 3,3h7l3.41,7 3.72,-1.7c0.77,-0.36 1.1,-1.3 0.7,-2.06z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/airline_seat_legroom_normal.xml b/qqq/android/mobileapp/src/main/res/drawable/airline_seat_legroom_normal.xml new file mode 100644 index 0000000..50b34df --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/airline_seat_legroom_normal.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/notification/airline_seat_legroom_normal/materialicons/black/res/drawable/baseline_airline_seat_legroom_normal_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M5,12L5,3L3,3v9c0,2.76 2.24,5 5,5h6v-2L8,15c-1.66,0 -3,-1.34 -3,-3zM20.5,18L19,18v-7c0,-1.1 -0.9,-2 -2,-2h-5L12,3L6,3v8c0,1.65 1.35,3 3,3h7v7h4.5c0.83,0 1.5,-0.67 1.5,-1.5s-0.67,-1.5 -1.5,-1.5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/airline_seat_legroom_reduced.xml b/qqq/android/mobileapp/src/main/res/drawable/airline_seat_legroom_reduced.xml new file mode 100644 index 0000000..1d8400f --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/airline_seat_legroom_reduced.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/notification/airline_seat_legroom_reduced/materialicons/black/res/drawable/baseline_airline_seat_legroom_reduced_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19.97,19.2c0.18,0.96 -0.55,1.8 -1.47,1.8H14v-3l1,-4H9c-1.65,0 -3,-1.35 -3,-3V3h6v6h5c1.1,0 2,0.9 2,2l-2,7h1.44c0.73,0 1.39,0.49 1.53,1.2zM5,12V3H3v9c0,2.76 2.24,5 5,5h4v-2H8c-1.66,0 -3,-1.34 -3,-3z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/airline_seat_recline_extra.xml b/qqq/android/mobileapp/src/main/res/drawable/airline_seat_recline_extra.xml new file mode 100644 index 0000000..5e9ef85 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/airline_seat_recline_extra.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/notification/airline_seat_recline_extra/materialicons/black/res/drawable/baseline_airline_seat_recline_extra_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M5.35,5.64c-0.9,-0.64 -1.12,-1.88 -0.49,-2.79 0.63,-0.9 1.88,-1.12 2.79,-0.49 0.9,0.64 1.12,1.88 0.49,2.79 -0.64,0.9 -1.88,1.12 -2.79,0.49zM16,19L8.93,19c-1.48,0 -2.74,-1.08 -2.96,-2.54L4,7L2,7l1.99,9.76C4.37,19.2 6.47,21 8.94,21L16,21v-2zM16.23,15h-4.88l-1.03,-4.1c1.58,0.89 3.28,1.54 5.15,1.22L15.47,9.99c-1.63,0.31 -3.44,-0.27 -4.69,-1.25L9.14,7.47c-0.23,-0.18 -0.49,-0.3 -0.76,-0.38 -0.32,-0.09 -0.66,-0.12 -0.99,-0.06h-0.02c-1.23,0.22 -2.05,1.39 -1.84,2.61l1.35,5.92C7.16,16.98 8.39,18 9.83,18h6.85l3.82,3 1.5,-1.5 -5.77,-4.5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/airline_seat_recline_normal.xml b/qqq/android/mobileapp/src/main/res/drawable/airline_seat_recline_normal.xml new file mode 100644 index 0000000..8784de1 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/airline_seat_recline_normal.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/notification/airline_seat_recline_normal/materialicons/black/res/drawable/baseline_airline_seat_recline_normal_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M7.59,5.41c-0.78,-0.78 -0.78,-2.05 0,-2.83 0.78,-0.78 2.05,-0.78 2.83,0 0.78,0.78 0.78,2.05 0,2.83 -0.79,0.79 -2.05,0.79 -2.83,0zM6,16L6,7L4,7v9c0,2.76 2.24,5 5,5h6v-2L9,19c-1.66,0 -3,-1.34 -3,-3zM20,20.07L14.93,15L11.5,15v-3.68c1.4,1.15 3.6,2.16 5.5,2.16v-2.16c-1.66,0.02 -3.61,-0.87 -4.67,-2.04l-1.4,-1.55c-0.19,-0.21 -0.43,-0.38 -0.69,-0.5 -0.29,-0.14 -0.62,-0.23 -0.96,-0.23h-0.03C8.01,7 7,8.01 7,9.25L7,15c0,1.66 1.34,3 3,3h5.07l3.5,3.5L20,20.07z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/airline_stops.xml b/qqq/android/mobileapp/src/main/res/drawable/airline_stops.xml new file mode 100644 index 0000000..9454221 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/airline_stops.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/airline_stops/materialicons/black/res/drawable/baseline_airline_stops_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M18.21,9.21C15.93,10.78 13.45,13.3 13,17h2v2H9v-2h2c-0.5,-4.5 -4.37,-8 -9,-8V7c4.39,0 8.22,2.55 10,6.3c1.13,-2.43 2.99,-4.25 4.78,-5.52L14,5h7v7L18.21,9.21z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/airlines.xml b/qqq/android/mobileapp/src/main/res/drawable/airlines.xml new file mode 100644 index 0000000..5c50802 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/airlines.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/airlines/materialicons/black/res/drawable/baseline_airlines_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M13,4L2,20h17l3,-16H13zM14.5,14c-1.38,0 -2.5,-1.12 -2.5,-2.5c0,-1.38 1.12,-2.5 2.5,-2.5s2.5,1.12 2.5,2.5C17,12.88 15.88,14 14.5,14z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/airplane_ticket.xml b/qqq/android/mobileapp/src/main/res/drawable/airplane_ticket.xml new file mode 100644 index 0000000..d076655 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/airplane_ticket.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/airplane_ticket/materialicons/black/res/drawable/baseline_airplane_ticket_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20.19,4H4C2.9,4 2.01,4.9 2.01,6v4C3.11,10 4,10.9 4,12s-0.89,2 -2,2v4c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2V6C22,4.9 21.19,4 20.19,4zM17.73,13.3l-8.86,2.36l-1.66,-2.88l0.93,-0.25l1.26,0.99l2.39,-0.64l-2.4,-4.16l1.4,-0.38l4.01,3.74l2.44,-0.65c0.51,-0.14 1.04,0.17 1.18,0.68C18.55,12.62 18.25,13.15 17.73,13.3z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/airplanemode_active.xml b/qqq/android/mobileapp/src/main/res/drawable/airplanemode_active.xml new file mode 100644 index 0000000..ee0c703 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/airplanemode_active.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/airplanemode_active/materialicons/black/res/drawable/baseline_airplanemode_active_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M22,16v-2l-8.5,-5V3.5C13.5,2.67 12.83,2 12,2s-1.5,0.67 -1.5,1.5V9L2,14v2l8.5,-2.5V19L8,20.5L8,22l4,-1l4,1l0,-1.5L13.5,19v-5.5L22,16z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/airplanemode_inactive.xml b/qqq/android/mobileapp/src/main/res/drawable/airplanemode_inactive.xml new file mode 100644 index 0000000..5426d5e --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/airplanemode_inactive.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/airplanemode_inactive/materialicons/black/res/drawable/baseline_airplanemode_inactive_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M10.5,7.67V3.5C10.5,2.67 11.17,2 12,2c0.83,0 1.5,0.67 1.5,1.5V9l8.5,5v2l-4.49,-1.32L10.5,7.67zM19.78,22.61l1.41,-1.41L13.5,13.5L9.56,9.56L2.81,2.81L1.39,4.22l6.38,6.38L2,14v2l8.5,-2.5V19L8,20.5L8,22l4,-1l4,1l0,-1.5L13.5,19v-2.67L19.78,22.61z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/airplay.xml b/qqq/android/mobileapp/src/main/res/drawable/airplay.xml new file mode 100644 index 0000000..c3c13f4 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/airplay.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/av/airplay/materialicons/black/res/drawable/baseline_airplay_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M6,22l12,0l-6,-6z" /> + <path + android:fillColor="#FF000000" + android:pathData="M21,3H3C1.9,3 1,3.9 1,5v12c0,1.1 0.9,2 2,2h4v-2H3V5h18v12h-4v2h4c1.1,0 2,-0.9 2,-2V5C23,3.9 22.1,3 21,3z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/airport_shuttle.xml b/qqq/android/mobileapp/src/main/res/drawable/airport_shuttle.xml new file mode 100644 index 0000000..a2c5727 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/airport_shuttle.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/places/airport_shuttle/materialicons/black/res/drawable/baseline_airport_shuttle_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M17,5L3,5c-1.1,0 -2,0.89 -2,2v9h2c0,1.65 1.34,3 3,3s3,-1.35 3,-3h5.5c0,1.65 1.34,3 3,3s3,-1.35 3,-3L23,16v-5l-6,-6zM3,11L3,7h4v4L3,11zM6,17.5c-0.83,0 -1.5,-0.67 -1.5,-1.5s0.67,-1.5 1.5,-1.5 1.5,0.67 1.5,1.5 -0.67,1.5 -1.5,1.5zM13,11L9,11L9,7h4v4zM17.5,17.5c-0.83,0 -1.5,-0.67 -1.5,-1.5s0.67,-1.5 1.5,-1.5 1.5,0.67 1.5,1.5 -0.67,1.5 -1.5,1.5zM15,11L15,7h1l4,4h-5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/alarm.xml b/qqq/android/mobileapp/src/main/res/drawable/alarm.xml new file mode 100644 index 0000000..d508c06 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/alarm.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/alarm/materialicons/black/res/drawable/baseline_alarm_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M22,5.72l-4.6,-3.86 -1.29,1.53 4.6,3.86L22,5.72zM7.88,3.39L6.6,1.86 2,5.71l1.29,1.53 4.59,-3.85zM12.5,8L11,8v6l4.75,2.85 0.75,-1.23 -4,-2.37L12.5,8zM12,4c-4.97,0 -9,4.03 -9,9s4.02,9 9,9c4.97,0 9,-4.03 9,-9s-4.03,-9 -9,-9zM12,20c-3.87,0 -7,-3.13 -7,-7s3.13,-7 7,-7 7,3.13 7,7 -3.13,7 -7,7z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/alarm_add.xml b/qqq/android/mobileapp/src/main/res/drawable/alarm_add.xml new file mode 100644 index 0000000..d7eae33 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/alarm_add.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/alarm_add/materialicons/black/res/drawable/baseline_alarm_add_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M7.88,3.39L6.6,1.86 2,5.71l1.29,1.53 4.59,-3.85zM22,5.72l-4.6,-3.86 -1.29,1.53 4.6,3.86L22,5.72zM12,4c-4.97,0 -9,4.03 -9,9s4.02,9 9,9c4.97,0 9,-4.03 9,-9s-4.03,-9 -9,-9zM12,20c-3.87,0 -7,-3.13 -7,-7s3.13,-7 7,-7 7,3.13 7,7 -3.13,7 -7,7zM13,9h-2v3L8,12v2h3v3h2v-3h3v-2h-3L13,9z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/alarm_off.xml b/qqq/android/mobileapp/src/main/res/drawable/alarm_off.xml new file mode 100644 index 0000000..efd6707 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/alarm_off.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/alarm_off/materialicons/black/res/drawable/baseline_alarm_off_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,6c3.87,0 7,3.13 7,7 0,0.84 -0.16,1.65 -0.43,2.4l1.52,1.52c0.58,-1.19 0.91,-2.51 0.91,-3.92 0,-4.97 -4.03,-9 -9,-9 -1.41,0 -2.73,0.33 -3.92,0.91L9.6,6.43C10.35,6.16 11.16,6 12,6zM22,5.72l-4.6,-3.86 -1.29,1.53 4.6,3.86L22,5.72zM2.92,2.29L1.65,3.57 2.98,4.9l-1.11,0.93 1.42,1.42 1.11,-0.94 0.8,0.8C3.83,8.69 3,10.75 3,13c0,4.97 4.02,9 9,9 2.25,0 4.31,-0.83 5.89,-2.2l2.2,2.2 1.27,-1.27L3.89,3.27l-0.97,-0.98zM16.47,18.39C15.26,19.39 13.7,20 12,20c-3.87,0 -7,-3.13 -7,-7 0,-1.7 0.61,-3.26 1.61,-4.47l9.86,9.86zM8.02,3.28L6.6,1.86l-0.86,0.71 1.42,1.42 0.86,-0.71z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/alarm_on.xml b/qqq/android/mobileapp/src/main/res/drawable/alarm_on.xml new file mode 100644 index 0000000..18b93fb --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/alarm_on.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/alarm_on/materialicons/black/res/drawable/baseline_alarm_on_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M22,5.72l-4.6,-3.86 -1.29,1.53 4.6,3.86L22,5.72zM7.88,3.39L6.6,1.86 2,5.71l1.29,1.53 4.59,-3.85zM12,4c-4.97,0 -9,4.03 -9,9s4.02,9 9,9c4.97,0 9,-4.03 9,-9s-4.03,-9 -9,-9zM12,20c-3.87,0 -7,-3.13 -7,-7s3.13,-7 7,-7 7,3.13 7,7 -3.13,7 -7,7zM10.54,14.53L8.41,12.4l-1.06,1.06 3.18,3.18 6,-6 -1.06,-1.06 -4.93,4.95z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/album.xml b/qqq/android/mobileapp/src/main/res/drawable/album.xml new file mode 100644 index 0000000..47605dd --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/album.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/av/album/materialicons/black/res/drawable/baseline_album_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM12,16.5c-2.49,0 -4.5,-2.01 -4.5,-4.5S9.51,7.5 12,7.5s4.5,2.01 4.5,4.5 -2.01,4.5 -4.5,4.5zM12,11c-0.55,0 -1,0.45 -1,1s0.45,1 1,1 1,-0.45 1,-1 -0.45,-1 -1,-1z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/align_horizontal_center.xml b/qqq/android/mobileapp/src/main/res/drawable/align_horizontal_center.xml new file mode 100644 index 0000000..8fbc0bb --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/align_horizontal_center.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/editor/align_horizontal_center/materialicons/black/res/drawable/baseline_align_horizontal_center_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M11,2l2,0l0,5l8,0l0,3l-8,0l0,4l5,0l0,3l-5,0l0,5l-2,0l0,-5l-5,0l0,-3l5,0l0,-4l-8,0l0,-3l8,0z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/align_horizontal_left.xml b/qqq/android/mobileapp/src/main/res/drawable/align_horizontal_left.xml new file mode 100644 index 0000000..becff36 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/align_horizontal_left.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/editor/align_horizontal_left/materialicons/black/res/drawable/baseline_align_horizontal_left_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M4,22H2V2h2V22zM22,7H6v3h16V7zM16,14H6v3h10V14z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/align_horizontal_right.xml b/qqq/android/mobileapp/src/main/res/drawable/align_horizontal_right.xml new file mode 100644 index 0000000..dec1906 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/align_horizontal_right.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/editor/align_horizontal_right/materialicons/black/res/drawable/baseline_align_horizontal_right_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,2h2v20h-2V2zM2,10h16V7H2V10zM8,17h10v-3H8V17z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/align_vertical_bottom.xml b/qqq/android/mobileapp/src/main/res/drawable/align_vertical_bottom.xml new file mode 100644 index 0000000..c3ad3f1 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/align_vertical_bottom.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/editor/align_vertical_bottom/materialicons/black/res/drawable/baseline_align_vertical_bottom_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M22,22H2v-2h20V22zM10,2H7v16h3V2zM17,8h-3v10h3V8z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/align_vertical_center.xml b/qqq/android/mobileapp/src/main/res/drawable/align_vertical_center.xml new file mode 100644 index 0000000..b40f7c9 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/align_vertical_center.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/editor/align_vertical_center/materialicons/black/res/drawable/baseline_align_vertical_center_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M22,11l-5,0l0,-5l-3,0l0,5l-4,0l0,-8l-3,0l0,8l-5.16,0l0,2l5.16,0l0,8l3,0l0,-8l4,0l0,5l3,0l0,-5l5,0z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/align_vertical_top.xml b/qqq/android/mobileapp/src/main/res/drawable/align_vertical_top.xml new file mode 100644 index 0000000..bfaaec8 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/align_vertical_top.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/editor/align_vertical_top/materialicons/black/res/drawable/baseline_align_vertical_top_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M22,2v2H2V2H22zM7,22h3V6H7V22zM14,16h3V6h-3V16z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/all_inbox.xml b/qqq/android/mobileapp/src/main/res/drawable/all_inbox.xml new file mode 100644 index 0000000..cb888b8 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/all_inbox.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/all_inbox/materialicons/black/res/drawable/baseline_all_inbox_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19,3L5,3c-1.1,0 -2,0.9 -2,2v7c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2L21,5c0,-1.1 -0.9,-2 -2,-2zM19,9h-4c0,1.62 -1.38,3 -3,3s-3,-1.38 -3,-3L5,9L5,5h14v4zM15,16h6v3c0,1.1 -0.9,2 -2,2L5,21c-1.1,0 -2,-0.9 -2,-2v-3h6c0,1.66 1.34,3 3,3s3,-1.34 3,-3z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/all_inclusive.xml b/qqq/android/mobileapp/src/main/res/drawable/all_inclusive.xml new file mode 100644 index 0000000..ad7d66e --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/all_inclusive.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/places/all_inclusive/materialicons/black/res/drawable/baseline_all_inclusive_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M18.6,6.62c-1.44,0 -2.8,0.56 -3.77,1.53L12,10.66 10.48,12h0.01L7.8,14.39c-0.64,0.64 -1.49,0.99 -2.4,0.99 -1.87,0 -3.39,-1.51 -3.39,-3.38S3.53,8.62 5.4,8.62c0.91,0 1.76,0.35 2.44,1.03l1.13,1 1.51,-1.34L9.22,8.2C8.2,7.18 6.84,6.62 5.4,6.62 2.42,6.62 0,9.04 0,12s2.42,5.38 5.4,5.38c1.44,0 2.8,-0.56 3.77,-1.53l2.83,-2.5 0.01,0.01L13.52,12h-0.01l2.69,-2.39c0.64,-0.64 1.49,-0.99 2.4,-0.99 1.87,0 3.39,1.51 3.39,3.38s-1.52,3.38 -3.39,3.38c-0.9,0 -1.76,-0.35 -2.44,-1.03l-1.14,-1.01 -1.51,1.34 1.27,1.12c1.02,1.01 2.37,1.57 3.82,1.57 2.98,0 5.4,-2.41 5.4,-5.38s-2.42,-5.37 -5.4,-5.37z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/all_out.xml b/qqq/android/mobileapp/src/main/res/drawable/all_out.xml new file mode 100644 index 0000000..a79ac99 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/all_out.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/all_out/materialicons/black/res/drawable/baseline_all_out_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M16.21,4.16l4,4v-4zM20.21,16.16l-4,4h4zM8.21,20.16l-4,-4v4zM4.21,8.16l4,-4h-4zM17.16,7.21c-2.73,-2.73 -7.17,-2.73 -9.9,0s-2.73,7.17 0,9.9 7.17,2.73 9.9,0 2.73,-7.16 0,-9.9zM16.06,16.01c-2.13,2.13 -5.57,2.13 -7.7,0s-2.13,-5.57 0,-7.7 5.57,-2.13 7.7,0 2.13,5.57 0,7.7z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/alt_route.xml b/qqq/android/mobileapp/src/main/res/drawable/alt_route.xml new file mode 100644 index 0000000..4b99b45 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/alt_route.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/alt_route/materialicons/black/res/drawable/baseline_alt_route_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M9.78,11.16l-1.42,1.42c-0.68,-0.69 -1.34,-1.58 -1.79,-2.94l1.94,-0.49C8.83,10.04 9.28,10.65 9.78,11.16zM11,6L7,2L3,6h3.02C6.04,6.81 6.1,7.54 6.21,8.17l1.94,-0.49C8.08,7.2 8.03,6.63 8.02,6H11zM21,6l-4,-4l-4,4h2.99c-0.1,3.68 -1.28,4.75 -2.54,5.88c-0.5,0.44 -1.01,0.92 -1.45,1.55c-0.34,-0.49 -0.73,-0.88 -1.13,-1.24L9.46,13.6C10.39,14.45 11,15.14 11,17c0,0 0,0 0,0h0v5h2v-5c0,0 0,0 0,0c0,-2.02 0.71,-2.66 1.79,-3.63c1.38,-1.24 3.08,-2.78 3.2,-7.37H21z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/alternate_email.xml b/qqq/android/mobileapp/src/main/res/drawable/alternate_email.xml new file mode 100644 index 0000000..7aec6fd --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/alternate_email.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/communication/alternate_email/materialicons/black/res/drawable/baseline_alternate_email_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10h5v-2h-5c-4.34,0 -8,-3.66 -8,-8s3.66,-8 8,-8 8,3.66 8,8v1.43c0,0.79 -0.71,1.57 -1.5,1.57s-1.5,-0.78 -1.5,-1.57L17,12c0,-2.76 -2.24,-5 -5,-5s-5,2.24 -5,5 2.24,5 5,5c1.38,0 2.64,-0.56 3.54,-1.47 0.65,0.89 1.77,1.47 2.96,1.47 1.97,0 3.5,-1.6 3.5,-3.57L22,12c0,-5.52 -4.48,-10 -10,-10zM12,15c-1.66,0 -3,-1.34 -3,-3s1.34,-3 3,-3 3,1.34 3,3 -1.34,3 -3,3z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/amp_stories.xml b/qqq/android/mobileapp/src/main/res/drawable/amp_stories.xml new file mode 100644 index 0000000..d34590a --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/amp_stories.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/content/amp_stories/materialicons/black/res/drawable/baseline_amp_stories_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M7,4h10v15h-10z" /> + <path + android:fillColor="#FF000000" + android:pathData="M3,6h2v11h-2z" /> + <path + android:fillColor="#FF000000" + android:pathData="M19,6h2v11h-2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/analytics.xml b/qqq/android/mobileapp/src/main/res/drawable/analytics.xml new file mode 100644 index 0000000..88169ef --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/analytics.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/analytics/materialicons/black/res/drawable/baseline_analytics_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19,3L5,3c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2L21,5c0,-1.1 -0.9,-2 -2,-2zM9,17L7,17v-5h2v5zM13,17h-2v-3h2v3zM13,12h-2v-2h2v2zM17,17h-2L15,7h2v10z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/anchor.xml b/qqq/android/mobileapp/src/main/res/drawable/anchor.xml new file mode 100644 index 0000000..f2874d8 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/anchor.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/anchor/materialicons/black/res/drawable/baseline_anchor_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M17,15l1.55,1.55c-0.96,1.69 -3.33,3.04 -5.55,3.37V11h3V9h-3V7.82C14.16,7.4 15,6.3 15,5c0,-1.65 -1.35,-3 -3,-3S9,3.35 9,5c0,1.3 0.84,2.4 2,2.82V9H8v2h3v8.92c-2.22,-0.33 -4.59,-1.68 -5.55,-3.37L7,15l-4,-3v3c0,3.88 4.92,7 9,7s9,-3.12 9,-7v-3L17,15zM12,4c0.55,0 1,0.45 1,1s-0.45,1 -1,1s-1,-0.45 -1,-1S11.45,4 12,4z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/android.xml b/qqq/android/mobileapp/src/main/res/drawable/android.xml new file mode 100644 index 0000000..dc4ee9d --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/android.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/android/materialicons/black/res/drawable/baseline_android_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M17.6,9.48l1.84,-3.18c0.16,-0.31 0.04,-0.69 -0.26,-0.85c-0.29,-0.15 -0.65,-0.06 -0.83,0.22l-1.88,3.24c-2.86,-1.21 -6.08,-1.21 -8.94,0L5.65,5.67c-0.19,-0.29 -0.58,-0.38 -0.87,-0.2C4.5,5.65 4.41,6.01 4.56,6.3L6.4,9.48C3.3,11.25 1.28,14.44 1,18h22C22.72,14.44 20.7,11.25 17.6,9.48zM7,15.25c-0.69,0 -1.25,-0.56 -1.25,-1.25c0,-0.69 0.56,-1.25 1.25,-1.25S8.25,13.31 8.25,14C8.25,14.69 7.69,15.25 7,15.25zM17,15.25c-0.69,0 -1.25,-0.56 -1.25,-1.25c0,-0.69 0.56,-1.25 1.25,-1.25s1.25,0.56 1.25,1.25C18.25,14.69 17.69,15.25 17,15.25z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/animation.xml b/qqq/android/mobileapp/src/main/res/drawable/animation.xml new file mode 100644 index 0000000..d655bf8 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/animation.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/animation/materialicons/black/res/drawable/baseline_animation_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M15,2c-2.71,0 -5.05,1.54 -6.22,3.78 -1.28,0.67 -2.34,1.72 -3,3C3.54,9.95 2,12.29 2,15c0,3.87 3.13,7 7,7 2.71,0 5.05,-1.54 6.22,-3.78 1.28,-0.67 2.34,-1.72 3,-3C20.46,14.05 22,11.71 22,9c0,-3.87 -3.13,-7 -7,-7zM9,20c-2.76,0 -5,-2.24 -5,-5 0,-1.12 0.37,-2.16 1,-3 0,3.87 3.13,7 7,7 -0.84,0.63 -1.88,1 -3,1zM12,17c-2.76,0 -5,-2.24 -5,-5 0,-1.12 0.37,-2.16 1,-3 0,3.86 3.13,6.99 7,7 -0.84,0.63 -1.88,1 -3,1zM16.7,13.7c-0.53,0.19 -1.1,0.3 -1.7,0.3 -2.76,0 -5,-2.24 -5,-5 0,-0.6 0.11,-1.17 0.3,-1.7 0.53,-0.19 1.1,-0.3 1.7,-0.3 2.76,0 5,2.24 5,5 0,0.6 -0.11,1.17 -0.3,1.7zM19,12c0,-3.86 -3.13,-6.99 -7,-7 0.84,-0.63 1.87,-1 3,-1 2.76,0 5,2.24 5,5 0,1.12 -0.37,2.16 -1,3z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/announcement.xml b/qqq/android/mobileapp/src/main/res/drawable/announcement.xml new file mode 100644 index 0000000..15d891b --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/announcement.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/announcement/materialicons/black/res/drawable/baseline_announcement_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,2L4,2c-1.1,0 -1.99,0.9 -1.99,2L2,22l4,-4h14c1.1,0 2,-0.9 2,-2L22,4c0,-1.1 -0.9,-2 -2,-2zM13,11h-2L11,5h2v6zM13,15h-2v-2h2v2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/aod.xml b/qqq/android/mobileapp/src/main/res/drawable/aod.xml new file mode 100644 index 0000000..941bb08 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/aod.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/aod/materialicons/black/res/drawable/baseline_aod_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M17,1.01L7,1C5.9,1 5,1.9 5,3v18c0,1.1 0.9,2 2,2h10c1.1,0 2,-0.9 2,-2V3C19,1.9 18.1,1.01 17,1.01zM17,18H7V6h10V18zM8,10h8v1.5H8V10zM9,13h6v1.5H9V13z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/apartment.xml b/qqq/android/mobileapp/src/main/res/drawable/apartment.xml new file mode 100644 index 0000000..d9c2683 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/apartment.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/places/apartment/materialicons/black/res/drawable/baseline_apartment_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M17,11V3H7v4H3v14h8v-4h2v4h8V11H17zM7,19H5v-2h2V19zM7,15H5v-2h2V15zM7,11H5V9h2V11zM11,15H9v-2h2V15zM11,11H9V9h2V11zM11,7H9V5h2V7zM15,15h-2v-2h2V15zM15,11h-2V9h2V11zM15,7h-2V5h2V7zM19,19h-2v-2h2V19zM19,15h-2v-2h2V15z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/api.xml b/qqq/android/mobileapp/src/main/res/drawable/api.xml new file mode 100644 index 0000000..b1c035f --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/api.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/api/materialicons/black/res/drawable/baseline_api_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M14,12l-2,2l-2,-2l2,-2L14,12zM12,6l2.12,2.12l2.5,-2.5L12,1L7.38,5.62l2.5,2.5L12,6zM6,12l2.12,-2.12l-2.5,-2.5L1,12l4.62,4.62l2.5,-2.5L6,12zM18,12l-2.12,2.12l2.5,2.5L23,12l-4.62,-4.62l-2.5,2.5L18,12zM12,18l-2.12,-2.12l-2.5,2.5L12,23l4.62,-4.62l-2.5,-2.5L12,18z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/app_blocking.xml b/qqq/android/mobileapp/src/main/res/drawable/app_blocking.xml new file mode 100644 index 0000000..6e74d6f --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/app_blocking.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/app_blocking/materialicons/black/res/drawable/baseline_app_blocking_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M18,8c-2.21,0 -4,1.79 -4,4s1.79,4 4,4 4,-1.79 4,-4 -1.79,-4 -4,-4zM15.5,12c0,-1.38 1.12,-2.5 2.5,-2.5 0.42,0 0.8,0.11 1.15,0.29l-3.36,3.36c-0.18,-0.35 -0.29,-0.73 -0.29,-1.15zM18,14.5c-0.42,0 -0.8,-0.11 -1.15,-0.29l3.36,-3.36c0.18,0.35 0.29,0.73 0.29,1.15 0,1.38 -1.12,2.5 -2.5,2.5zM17,18L7,18L7,6h10v1h2L19,3c0,-1.1 -0.9,-2 -2,-2L7,1c-1.1,0 -2,0.9 -2,2v18c0,1.1 0.9,2 2,2h10c1.1,0 2,-0.9 2,-2v-4h-2v1z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/app_registration.xml b/qqq/android/mobileapp/src/main/res/drawable/app_registration.xml new file mode 100644 index 0000000..bb6b5ac --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/app_registration.xml @@ -0,0 +1,40 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/communication/app_registration/materialicons/black/res/drawable/baseline_app_registration_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M10,4h4v4h-4z" /> + <path + android:fillColor="#FF000000" + android:pathData="M4,16h4v4h-4z" /> + <path + android:fillColor="#FF000000" + android:pathData="M4,10h4v4h-4z" /> + <path + android:fillColor="#FF000000" + android:pathData="M4,4h4v4h-4z" /> + <path + android:fillColor="#FF000000" + android:pathData="M14,12.42l0,-2.42l-4,0l0,4l2.42,0z" /> + <path + android:fillColor="#FF000000" + android:pathData="M20.88,11.29l-1.17,-1.17c-0.16,-0.16 -0.42,-0.16 -0.58,0L18.25,11L20,12.75l0.88,-0.88C21.04,11.71 21.04,11.45 20.88,11.29z" /> + <path + android:fillColor="#FF000000" + android:pathData="M11,18.25l0,1.75l1.75,0l6.67,-6.67l-1.75,-1.75z" /> + <path + android:fillColor="#FF000000" + android:pathData="M16,4h4v4h-4z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/app_settings_alt.xml b/qqq/android/mobileapp/src/main/res/drawable/app_settings_alt.xml new file mode 100644 index 0000000..1abb690 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/app_settings_alt.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/navigation/app_settings_alt/materialicons/black/res/drawable/baseline_app_settings_alt_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M21.81,12.74l-0.82,-0.63v-0.22l0.8,-0.63c0.16,-0.12 0.2,-0.34 0.1,-0.51l-0.85,-1.48c-0.07,-0.13 -0.21,-0.2 -0.35,-0.2 -0.05,0 -0.1,0.01 -0.15,0.03l-0.95,0.38c-0.08,-0.05 -0.11,-0.07 -0.19,-0.11l-0.15,-1.01c-0.03,-0.21 -0.2,-0.36 -0.4,-0.36h-1.71c-0.2,0 -0.37,0.15 -0.4,0.34l-0.14,1.01c-0.03,0.02 -0.07,0.03 -0.1,0.05l-0.09,0.06 -0.95,-0.38c-0.05,-0.02 -0.1,-0.03 -0.15,-0.03 -0.14,0 -0.27,0.07 -0.35,0.2l-0.85,1.48c-0.1,0.17 -0.06,0.39 0.1,0.51l0.8,0.63v0.23l-0.8,0.63c-0.16,0.12 -0.2,0.34 -0.1,0.51l0.85,1.48c0.07,0.13 0.21,0.2 0.35,0.2 0.05,0 0.1,-0.01 0.15,-0.03l0.95,-0.37c0.08,0.05 0.12,0.07 0.2,0.11l0.15,1.01c0.03,0.2 0.2,0.34 0.4,0.34h1.71c0.2,0 0.37,-0.15 0.4,-0.34l0.15,-1.01c0.03,-0.02 0.07,-0.03 0.1,-0.05l0.09,-0.06 0.95,0.38c0.05,0.02 0.1,0.03 0.15,0.03 0.14,0 0.27,-0.07 0.35,-0.2l0.85,-1.48c0.1,-0.17 0.06,-0.39 -0.1,-0.51zM18,13.5c-0.83,0 -1.5,-0.67 -1.5,-1.5s0.67,-1.5 1.5,-1.5 1.5,0.67 1.5,1.5 -0.67,1.5 -1.5,1.5zM17,17h2v4c0,1.1 -0.9,2 -2,2H7c-1.1,0 -2,-0.9 -2,-2V3c0,-1.1 0.9,-2 2,-2h10c1.1,0 2,0.9 2,2v4h-2V6H7v12h10v-1z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/app_shortcut.xml b/qqq/android/mobileapp/src/main/res/drawable/app_shortcut.xml new file mode 100644 index 0000000..2441240 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/app_shortcut.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/app_shortcut/materialicons/black/res/drawable/baseline_app_shortcut_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M17,18H7V6h10v1h2V3c0,-1.1 -0.9,-2 -2,-2H7C5.9,1 5,1.9 5,3v18c0,1.1 0.9,2 2,2h10c1.1,0 2,-0.9 2,-2v-4h-2V18z" /> + <path + android:fillColor="#FF000000" + android:pathData="M20.38,9.62l0.62,1.38l0.62,-1.38l1.38,-0.62l-1.38,-0.62l-0.62,-1.38l-0.62,1.38l-1.38,0.62z" /> + <path + android:fillColor="#FF000000" + android:pathData="M16,8l-1.25,2.75l-2.75,1.25l2.75,1.25l1.25,2.75l1.25,-2.75l2.75,-1.25l-2.75,-1.25z" /> + <path + android:fillColor="#FF000000" + android:pathData="M21,13l-0.62,1.38l-1.38,0.62l1.38,0.62l0.62,1.38l0.62,-1.38l1.38,-0.62l-1.38,-0.62z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/approval.xml b/qqq/android/mobileapp/src/main/res/drawable/approval.xml new file mode 100644 index 0000000..6b68ea8 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/approval.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/file/approval/materialicons/black/res/drawable/baseline_approval_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M4,16v6h16v-6c0,-1.1 -0.9,-2 -2,-2L6,14c-1.1,0 -2,0.9 -2,2zM18,18L6,18v-2h12v2zM12,2C9.24,2 7,4.24 7,7l5,7 5,-7c0,-2.76 -2.24,-5 -5,-5zM12,11L9,7c0,-1.66 1.34,-3 3,-3s3,1.34 3,3l-3,4z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/apps.xml b/qqq/android/mobileapp/src/main/res/drawable/apps.xml new file mode 100644 index 0000000..ad1cc8c --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/apps.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/navigation/apps/materialicons/black/res/drawable/baseline_apps_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M4,8h4L8,4L4,4v4zM10,20h4v-4h-4v4zM4,20h4v-4L4,16v4zM4,14h4v-4L4,10v4zM10,14h4v-4h-4v4zM16,4v4h4L20,4h-4zM10,8h4L14,4h-4v4zM16,14h4v-4h-4v4zM16,20h4v-4h-4v4z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/apps_outage.xml b/qqq/android/mobileapp/src/main/res/drawable/apps_outage.xml new file mode 100644 index 0000000..ff05598 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/apps_outage.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/navigation/apps_outage/materialicons/black/res/drawable/baseline_apps_outage_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M4,8h4V4H4V8zM10,20h4v-4h-4V20zM4,20h4v-4H4V20zM4,14h4v-4H4V14zM10,14h4v-4h-4V14zM16,20h4v-4h-4V20zM19,0c-2.76,0 -5,2.24 -5,5s2.24,5 5,5s5,-2.24 5,-5S21.76,0 19,0zM19.5,8h-1V7h1V8zM19.5,6h-1V2h1V6zM16,14h4v-2.07C19.67,11.98 19.34,12 19,12c-1.07,0 -2.09,-0.24 -3,-0.68V14zM10,4v4h2.68C12.24,7.09 12,6.07 12,5c0,-0.34 0.02,-0.67 0.07,-1H10z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/architecture.xml b/qqq/android/mobileapp/src/main/res/drawable/architecture.xml new file mode 100644 index 0000000..a4567f9 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/architecture.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/architecture/materialicons/black/res/drawable/baseline_architecture_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M6.36,18.78L6.61,21l1.62,-1.54l2.77,-7.6c-0.68,-0.17 -1.28,-0.51 -1.77,-0.98L6.36,18.78z" /> + <path + android:fillColor="#FF000000" + android:pathData="M14.77,10.88c-0.49,0.47 -1.1,0.81 -1.77,0.98l2.77,7.6L17.39,21l0.26,-2.22L14.77,10.88z" /> + <path + android:fillColor="#FF000000" + android:pathData="M15,8c0,-1.3 -0.84,-2.4 -2,-2.82V3h-2v2.18C9.84,5.6 9,6.7 9,8c0,1.66 1.34,3 3,3S15,9.66 15,8zM12,9c-0.55,0 -1,-0.45 -1,-1c0,-0.55 0.45,-1 1,-1s1,0.45 1,1C13,8.55 12.55,9 12,9z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/archive.xml b/qqq/android/mobileapp/src/main/res/drawable/archive.xml new file mode 100644 index 0000000..0bc8516 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/archive.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/content/archive/materialicons/black/res/drawable/baseline_archive_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20.54,5.23l-1.39,-1.68C18.88,3.21 18.47,3 18,3H6c-0.47,0 -0.88,0.21 -1.16,0.55L3.46,5.23C3.17,5.57 3,6.02 3,6.5V19c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2V6.5c0,-0.48 -0.17,-0.93 -0.46,-1.27zM12,17.5L6.5,12H10v-2h4v2h3.5L12,17.5zM5.12,5l0.81,-1h12l0.94,1H5.12z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/area_chart.xml b/qqq/android/mobileapp/src/main/res/drawable/area_chart.xml new file mode 100644 index 0000000..fa6f075 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/area_chart.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/editor/area_chart/materialicons/black/res/drawable/baseline_area_chart_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M3,13v7h18v-1.5l-9,-7L8,17L3,13zM3,7l4,3l5,-7l5,4h4v8.97l-9.4,-7.31l-3.98,5.48L3,10.44V7z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/arrow_back.xml b/qqq/android/mobileapp/src/main/res/drawable/arrow_back.xml new file mode 100644 index 0000000..ff980b9 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/arrow_back.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/navigation/arrow_back/materialicons/black/res/drawable/baseline_arrow_back_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,11H7.83l5.59,-5.59L12,4l-8,8 8,8 1.41,-1.41L7.83,13H20v-2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/arrow_back_ios.xml b/qqq/android/mobileapp/src/main/res/drawable/arrow_back_ios.xml new file mode 100644 index 0000000..58740ac --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/arrow_back_ios.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/navigation/arrow_back_ios/materialicons/black/res/drawable/baseline_arrow_back_ios_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M11.67,3.87L9.9,2.1 0,12l9.9,9.9 1.77,-1.77L3.54,12z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/arrow_back_ios_new.xml b/qqq/android/mobileapp/src/main/res/drawable/arrow_back_ios_new.xml new file mode 100644 index 0000000..17ef1ba --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/arrow_back_ios_new.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/navigation/arrow_back_ios_new/materialicons/black/res/drawable/baseline_arrow_back_ios_new_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M17.77,3.77l-1.77,-1.77l-10,10l10,10l1.77,-1.77l-8.23,-8.23z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/arrow_circle_down.xml b/qqq/android/mobileapp/src/main/res/drawable/arrow_circle_down.xml new file mode 100644 index 0000000..da7834b --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/arrow_circle_down.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/arrow_circle_down/materialicons/black/res/drawable/baseline_arrow_circle_down_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,4c4.41,0 8,3.59 8,8s-3.59,8 -8,8s-8,-3.59 -8,-8S7.59,4 12,4M12,2C6.48,2 2,6.48 2,12c0,5.52 4.48,10 10,10c5.52,0 10,-4.48 10,-10C22,6.48 17.52,2 12,2L12,2zM13,12l0,-4h-2l0,4H8l4,4l4,-4H13z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/arrow_circle_left.xml b/qqq/android/mobileapp/src/main/res/drawable/arrow_circle_left.xml new file mode 100644 index 0000000..10a7dc4 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/arrow_circle_left.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/arrow_circle_left/materialicons/black/res/drawable/baseline_arrow_circle_left_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M2,12c0,5.52 4.48,10 10,10s10,-4.48 10,-10c0,-5.52 -4.48,-10 -10,-10C6.48,2 2,6.48 2,12zM12,11l4,0v2l-4,0l0,3l-4,-4l4,-4L12,11z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/arrow_circle_right.xml b/qqq/android/mobileapp/src/main/res/drawable/arrow_circle_right.xml new file mode 100644 index 0000000..ba3bb08 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/arrow_circle_right.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/arrow_circle_right/materialicons/black/res/drawable/baseline_arrow_circle_right_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M22,12c0,-5.52 -4.48,-10 -10,-10S2,6.48 2,12c0,5.52 4.48,10 10,10S22,17.52 22,12zM12,13l-4,0v-2l4,0V8l4,4l-4,4V13z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/arrow_circle_up.xml b/qqq/android/mobileapp/src/main/res/drawable/arrow_circle_up.xml new file mode 100644 index 0000000..363aa1f --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/arrow_circle_up.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/arrow_circle_up/materialicons/black/res/drawable/baseline_arrow_circle_up_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,20c-4.41,0 -8,-3.59 -8,-8s3.59,-8 8,-8s8,3.59 8,8S16.41,20 12,20M12,22c5.52,0 10,-4.48 10,-10c0,-5.52 -4.48,-10 -10,-10C6.48,2 2,6.48 2,12C2,17.52 6.48,22 12,22L12,22zM11,12l0,4h2l0,-4h3l-4,-4l-4,4H11z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/arrow_downward.xml b/qqq/android/mobileapp/src/main/res/drawable/arrow_downward.xml new file mode 100644 index 0000000..830e24a --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/arrow_downward.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/navigation/arrow_downward/materialicons/black/res/drawable/baseline_arrow_downward_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,12l-1.41,-1.41L13,16.17V4h-2v12.17l-5.58,-5.59L4,12l8,8 8,-8z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/arrow_drop_down.xml b/qqq/android/mobileapp/src/main/res/drawable/arrow_drop_down.xml new file mode 100644 index 0000000..9d26723 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/arrow_drop_down.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/navigation/arrow_drop_down/materialicons/black/res/drawable/baseline_arrow_drop_down_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M7,10l5,5 5,-5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/arrow_drop_down_circle.xml b/qqq/android/mobileapp/src/main/res/drawable/arrow_drop_down_circle.xml new file mode 100644 index 0000000..b349d58 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/arrow_drop_down_circle.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/navigation/arrow_drop_down_circle/materialicons/black/res/drawable/baseline_arrow_drop_down_circle_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM12,14l-4,-4h8l-4,4z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/arrow_drop_up.xml b/qqq/android/mobileapp/src/main/res/drawable/arrow_drop_up.xml new file mode 100644 index 0000000..c093d10 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/arrow_drop_up.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/navigation/arrow_drop_up/materialicons/black/res/drawable/baseline_arrow_drop_up_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M7,14l5,-5 5,5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/arrow_forward.xml b/qqq/android/mobileapp/src/main/res/drawable/arrow_forward.xml new file mode 100644 index 0000000..88ac68a --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/arrow_forward.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/navigation/arrow_forward/materialicons/black/res/drawable/baseline_arrow_forward_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,4l-1.41,1.41L16.17,11H4v2h12.17l-5.58,5.59L12,20l8,-8z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/arrow_forward_ios.xml b/qqq/android/mobileapp/src/main/res/drawable/arrow_forward_ios.xml new file mode 100644 index 0000000..a187798 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/arrow_forward_ios.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/navigation/arrow_forward_ios/materialicons/black/res/drawable/baseline_arrow_forward_ios_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M6.23,20.23l1.77,1.77l10,-10l-10,-10l-1.77,1.77l8.23,8.23z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/arrow_left.xml b/qqq/android/mobileapp/src/main/res/drawable/arrow_left.xml new file mode 100644 index 0000000..2323699 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/arrow_left.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/navigation/arrow_left/materialicons/black/res/drawable/baseline_arrow_left_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M14,7l-5,5 5,5V7z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/arrow_outward.xml b/qqq/android/mobileapp/src/main/res/drawable/arrow_outward.xml new file mode 100644 index 0000000..baae3a9 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/arrow_outward.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/arrow_outward/materialicons/black/res/drawable/baseline_arrow_outward_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M6,6l0,2l8.59,0l-9.59,9.59l1.41,1.41l9.59,-9.59l0,8.59l2,0l0,-12z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/arrow_right.xml b/qqq/android/mobileapp/src/main/res/drawable/arrow_right.xml new file mode 100644 index 0000000..0ed7fd5 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/arrow_right.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/navigation/arrow_right/materialicons/black/res/drawable/baseline_arrow_right_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M10,17l5,-5 -5,-5v10z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/arrow_right_alt.xml b/qqq/android/mobileapp/src/main/res/drawable/arrow_right_alt.xml new file mode 100644 index 0000000..fa19598 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/arrow_right_alt.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/arrow_right_alt/materialicons/black/res/drawable/baseline_arrow_right_alt_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M16.01,11H4v2h12.01v3L20,12l-3.99,-4z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/arrow_upward.xml b/qqq/android/mobileapp/src/main/res/drawable/arrow_upward.xml new file mode 100644 index 0000000..9c9fc4e --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/arrow_upward.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/navigation/arrow_upward/materialicons/black/res/drawable/baseline_arrow_upward_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M4,12l1.41,1.41L11,7.83V20h2V7.83l5.58,5.59L20,12l-8,-8 -8,8z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/art_track.xml b/qqq/android/mobileapp/src/main/res/drawable/art_track.xml new file mode 100644 index 0000000..4573abe --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/art_track.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/av/art_track/materialicons/black/res/drawable/baseline_art_track_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M22,13h-8v-2h8v2zM22,7h-8v2h8L22,7zM14,17h8v-2h-8v2zM12,9v6c0,1.1 -0.9,2 -2,2L4,17c-1.1,0 -2,-0.9 -2,-2L2,9c0,-1.1 0.9,-2 2,-2h6c1.1,0 2,0.9 2,2zM10.5,15l-2.25,-3 -1.75,2.26 -1.25,-1.51L3.5,15h7z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/article.xml b/qqq/android/mobileapp/src/main/res/drawable/article.xml new file mode 100644 index 0000000..51ea5db --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/article.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/article/materialicons/black/res/drawable/baseline_article_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19,3L5,3c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2L21,5c0,-1.1 -0.9,-2 -2,-2zM14,17L7,17v-2h7v2zM17,13L7,13v-2h10v2zM17,9L7,9L7,7h10v2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/aspect_ratio.xml b/qqq/android/mobileapp/src/main/res/drawable/aspect_ratio.xml new file mode 100644 index 0000000..2031914 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/aspect_ratio.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/aspect_ratio/materialicons/black/res/drawable/baseline_aspect_ratio_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19,12h-2v3h-3v2h5v-5zM7,9h3L10,7L5,7v5h2L7,9zM21,3L3,3c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h18c1.1,0 2,-0.9 2,-2L23,5c0,-1.1 -0.9,-2 -2,-2zM21,19.01L3,19.01L3,4.99h18v14.02z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/assessment.xml b/qqq/android/mobileapp/src/main/res/drawable/assessment.xml new file mode 100644 index 0000000..b332913 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/assessment.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/assessment/materialicons/black/res/drawable/baseline_assessment_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19,3L5,3c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2L21,5c0,-1.1 -0.9,-2 -2,-2zM9,17L7,17v-7h2v7zM13,17h-2L11,7h2v10zM17,17h-2v-4h2v4z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/assignment.xml b/qqq/android/mobileapp/src/main/res/drawable/assignment.xml new file mode 100644 index 0000000..1f80116 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/assignment.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/assignment/materialicons/black/res/drawable/baseline_assignment_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19,3h-4.18C14.4,1.84 13.3,1 12,1c-1.3,0 -2.4,0.84 -2.82,2L5,3c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2L21,5c0,-1.1 -0.9,-2 -2,-2zM12,3c0.55,0 1,0.45 1,1s-0.45,1 -1,1 -1,-0.45 -1,-1 0.45,-1 1,-1zM14,17L7,17v-2h7v2zM17,13L7,13v-2h10v2zM17,9L7,9L7,7h10v2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/assignment_add.xml b/qqq/android/mobileapp/src/main/res/drawable/assignment_add.xml new file mode 100644 index 0000000..bd8a6b0 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/assignment_add.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/assignment_add/materialicons/black/res/drawable/baseline_assignment_add_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M18,13c-2.76,0 -5,2.24 -5,5s2.24,5 5,5s5,-2.24 5,-5S20.76,13 18,13zM21,18.5h-2.5V21h-1v-2.5H15v-1h2.5V15h1v2.5H21V18.5z" /> + <path + android:fillColor="#FF000000" + android:pathData="M11.69,15c0.36,-0.75 0.84,-1.43 1.43,-2H7v-2c0,0 10.66,0 11,0c1.07,0 2.09,0.25 3,0.69V5c0,-1.1 -0.9,-2 -2,-2h-4.18C14.4,1.84 13.3,1 12,1S9.6,1.84 9.18,3H5C3.9,3 3,3.9 3,5v14c0,1.1 0.9,2 2,2h6.69C11.25,20.09 11,19.07 11,18c0,-0.34 0.03,-0.67 0.08,-1H7v-2H11.69zM12,2.75c0.41,0 0.75,0.34 0.75,0.75c0,0.41 -0.34,0.75 -0.75,0.75s-0.75,-0.34 -0.75,-0.75C11.25,3.09 11.59,2.75 12,2.75zM7,7h10v2H7V7z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/assignment_ind.xml b/qqq/android/mobileapp/src/main/res/drawable/assignment_ind.xml new file mode 100644 index 0000000..85a74de --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/assignment_ind.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/assignment_ind/materialicons/black/res/drawable/baseline_assignment_ind_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19,3h-4.18C14.4,1.84 13.3,1 12,1c-1.3,0 -2.4,0.84 -2.82,2L5,3c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2L21,5c0,-1.1 -0.9,-2 -2,-2zM12,3c0.55,0 1,0.45 1,1s-0.45,1 -1,1 -1,-0.45 -1,-1 0.45,-1 1,-1zM12,7c1.66,0 3,1.34 3,3s-1.34,3 -3,3 -3,-1.34 -3,-3 1.34,-3 3,-3zM18,19L6,19v-1.4c0,-2 4,-3.1 6,-3.1s6,1.1 6,3.1L18,19z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/assignment_late.xml b/qqq/android/mobileapp/src/main/res/drawable/assignment_late.xml new file mode 100644 index 0000000..d54dce4 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/assignment_late.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/assignment_late/materialicons/black/res/drawable/baseline_assignment_late_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19,3h-4.18C14.4,1.84 13.3,1 12,1c-1.3,0 -2.4,0.84 -2.82,2L5,3c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2L21,5c0,-1.1 -0.9,-2 -2,-2zM13,18h-2v-2h2v2zM13,14h-2L11,8h2v6zM12,5c-0.55,0 -1,-0.45 -1,-1s0.45,-1 1,-1 1,0.45 1,1 -0.45,1 -1,1z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/assignment_return.xml b/qqq/android/mobileapp/src/main/res/drawable/assignment_return.xml new file mode 100644 index 0000000..6b5c119 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/assignment_return.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/assignment_return/materialicons/black/res/drawable/baseline_assignment_return_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19,3h-4.18C14.4,1.84 13.3,1 12,1c-1.3,0 -2.4,0.84 -2.82,2L5,3c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2L21,5c0,-1.1 -0.9,-2 -2,-2zM12,3c0.55,0 1,0.45 1,1s-0.45,1 -1,1 -1,-0.45 -1,-1 0.45,-1 1,-1zM16,15h-4v3l-5,-5 5,-5v3h4v4z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/assignment_returned.xml b/qqq/android/mobileapp/src/main/res/drawable/assignment_returned.xml new file mode 100644 index 0000000..04e8b22 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/assignment_returned.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/assignment_returned/materialicons/black/res/drawable/baseline_assignment_returned_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19,3h-4.18C14.4,1.84 13.3,1 12,1c-1.3,0 -2.4,0.84 -2.82,2L5,3c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2L21,5c0,-1.1 -0.9,-2 -2,-2zM12,3c0.55,0 1,0.45 1,1s-0.45,1 -1,1 -1,-0.45 -1,-1 0.45,-1 1,-1zM12,18l-5,-5h3L10,9h4v4h3l-5,5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/assignment_turned_in.xml b/qqq/android/mobileapp/src/main/res/drawable/assignment_turned_in.xml new file mode 100644 index 0000000..b8a901c --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/assignment_turned_in.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/assignment_turned_in/materialicons/black/res/drawable/baseline_assignment_turned_in_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19,3h-4.18C14.4,1.84 13.3,1 12,1c-1.3,0 -2.4,0.84 -2.82,2L5,3c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2L21,5c0,-1.1 -0.9,-2 -2,-2zM12,3c0.55,0 1,0.45 1,1s-0.45,1 -1,1 -1,-0.45 -1,-1 0.45,-1 1,-1zM10,17l-4,-4 1.41,-1.41L10,14.17l6.59,-6.59L18,9l-8,8z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/assist_walker.xml b/qqq/android/mobileapp/src/main/res/drawable/assist_walker.xml new file mode 100644 index 0000000..9ad3379 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/assist_walker.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/assist_walker/materialicons/black/res/drawable/baseline_assist_walker_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12.5,4.5m-2,0a2,2 0,1 1,4 0a2,2 0,1 1,-4 0" /> + <path + android:fillColor="#FF000000" + android:pathData="M19.77,17.72l-0.64,-6.37C19.06,10.58 18.41,10 17.64,10H16c-1.5,-0.02 -2.86,-0.54 -3.76,-1.44l-2,-1.98C10.08,6.42 9.62,6 8.83,6C8.32,6 7.81,6.2 7.42,6.59L4.08,9.91c-0.53,0.68 -0.51,1.57 -0.21,2.13l1.43,2.8l-3.15,4.05l1.57,1.24l3.68,-4.73l-0.17,-1.36L8,14.75V20h2v-6.12l-2.12,-2.12l2.36,-2.36c0.94,0.94 1.72,1.82 3.59,2.32L13,20h1.5l0.41,-3.5h3.18l0.14,1.22c-0.44,0.26 -0.73,0.74 -0.73,1.28c0,0.83 0.67,1.5 1.5,1.5s1.5,-0.67 1.5,-1.5C20.5,18.46 20.21,17.98 19.77,17.72zM15.09,15l0.41,-3.5h2l0.41,3.5H15.09z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/assistant.xml b/qqq/android/mobileapp/src/main/res/drawable/assistant.xml new file mode 100644 index 0000000..fde5a16 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/assistant.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/assistant/materialicons/black/res/drawable/baseline_assistant_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19,2L5,2c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h4l3,3 3,-3h4c1.1,0 2,-0.9 2,-2L21,4c0,-1.1 -0.9,-2 -2,-2zM13.88,12.88L12,17l-1.88,-4.12L6,11l4.12,-1.88L12,5l1.88,4.12L18,11l-4.12,1.88z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/assistant_direction.xml b/qqq/android/mobileapp/src/main/res/drawable/assistant_direction.xml new file mode 100644 index 0000000..78a93c4 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/assistant_direction.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/navigation/assistant_direction/materialicons/black/res/drawable/baseline_assistant_direction_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M14,10L9,10c-0.6,0 -1,0.4 -1,1v4h2v-3h4v2.5l3.5,-3.5L14,7.5L14,10zM12,1C5.9,1 1,5.9 1,12s4.9,11 11,11 11,-4.9 11,-11S18.1,1 12,1zM19.73,12.58l-7.19,7.22c-0.35,0.27 -0.79,0.27 -1.15,0L4.2,12.58c-0.27,-0.36 -0.27,-0.8 0,-1.16l7.19,-7.22c0.35,-0.27 0.79,-0.27 1.15,0l7.19,7.22c0.36,0.27 0.36,0.8 0,1.16z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/assistant_navigation.xml b/qqq/android/mobileapp/src/main/res/drawable/assistant_navigation.xml new file mode 100644 index 0000000..219cbdb --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/assistant_navigation.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/navigation/assistant_navigation/materialicons/black/res/drawable/baseline_assistant_navigation_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,1C5.93,1 1,5.93 1,12s4.93,11 11,11 11,-4.93 11,-11S18.07,1 12,1zM15.57,17L12,15.42 8.43,17l-0.37,-0.37L12,7l3.95,9.63 -0.38,0.37z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/assistant_photo.xml b/qqq/android/mobileapp/src/main/res/drawable/assistant_photo.xml new file mode 100644 index 0000000..de60ff6 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/assistant_photo.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/assistant_photo/materialicons/black/res/drawable/baseline_assistant_photo_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M14.4,6L14,4H5v17h2v-7h5.6l0.4,2h7V6z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/assured_workload.xml b/qqq/android/mobileapp/src/main/res/drawable/assured_workload.xml new file mode 100644 index 0000000..6dd6e17 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/assured_workload.xml @@ -0,0 +1,34 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/assured_workload/materialicons/black/res/drawable/baseline_assured_workload_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M5,10h2v7h-2z" /> + <path + android:fillColor="#FF000000" + android:pathData="M11,10h2v7h-2z" /> + <path + android:fillColor="#FF000000" + android:pathData="M22,6l-10,-5l-10,5l0,2l20,0z" /> + <path + android:fillColor="#FF000000" + android:pathData="M2,19v2h12.4c-0.21,-0.64 -0.32,-1.31 -0.36,-2H2z" /> + <path + android:fillColor="#FF000000" + android:pathData="M19,12.26l0,-2.26l-2,0l0,3.26z" /> + <path + android:fillColor="#FF000000" + android:pathData="M20,14l-4,2v2.55c0,2.52 1.71,4.88 4,5.45c2.29,-0.57 4,-2.93 4,-5.45V16L20,14zM19.28,21l-2.03,-2.03l1.06,-1.06l0.97,0.97l2.41,-2.38l1.06,1.06L19.28,21z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/atm.xml b/qqq/android/mobileapp/src/main/res/drawable/atm.xml new file mode 100644 index 0000000..4a07571 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/atm.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/atm/materialicons/black/res/drawable/baseline_atm_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M8,9v1.5h2.25L10.25,15h1.5v-4.5L14,10.5L14,9zM6,9L3,9c-0.55,0 -1,0.45 -1,1v5h1.5v-1.5h2L5.5,15L7,15v-5c0,-0.55 -0.45,-1 -1,-1zM5.5,12h-2v-1.5h2L5.5,12zM21,9h-4.5c-0.55,0 -1,0.45 -1,1v5L17,15v-4.5h1L18,14h1.5v-3.51h1L20.5,15L22,15v-5c0,-0.55 -0.45,-1 -1,-1z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/attach_email.xml b/qqq/android/mobileapp/src/main/res/drawable/attach_email.xml new file mode 100644 index 0000000..e044f84 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/attach_email.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/file/attach_email/materialicons/black/res/drawable/baseline_attach_email_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M21,10V4c0,-1.1 -0.9,-2 -2,-2H3C1.9,2 1.01,2.9 1.01,4L1,16c0,1.1 0.9,2 2,2h11v-5c0,-1.66 1.34,-3 3,-3H21zM11,11L3,6V4l8,5l8,-5v2L11,11z" /> + <path + android:fillColor="#FF000000" + android:pathData="M21,14v4c0,1.1 -0.9,2 -2,2s-2,-0.9 -2,-2v-4.5c0,-0.28 0.22,-0.5 0.5,-0.5s0.5,0.22 0.5,0.5V18h2v-4.5c0,-1.38 -1.12,-2.5 -2.5,-2.5S15,12.12 15,13.5V18c0,2.21 1.79,4 4,4s4,-1.79 4,-4v-4H21z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/attach_file.xml b/qqq/android/mobileapp/src/main/res/drawable/attach_file.xml new file mode 100644 index 0000000..356a903 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/attach_file.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/editor/attach_file/materialicons/black/res/drawable/baseline_attach_file_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M16.5,6v11.5c0,2.21 -1.79,4 -4,4s-4,-1.79 -4,-4V5c0,-1.38 1.12,-2.5 2.5,-2.5s2.5,1.12 2.5,2.5v10.5c0,0.55 -0.45,1 -1,1s-1,-0.45 -1,-1V6H10v9.5c0,1.38 1.12,2.5 2.5,2.5s2.5,-1.12 2.5,-2.5V5c0,-2.21 -1.79,-4 -4,-4S7,2.79 7,5v12.5c0,3.04 2.46,5.5 5.5,5.5s5.5,-2.46 5.5,-5.5V6h-1.5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/attach_money.xml b/qqq/android/mobileapp/src/main/res/drawable/attach_money.xml new file mode 100644 index 0000000..f417ca4 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/attach_money.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/editor/attach_money/materialicons/black/res/drawable/baseline_attach_money_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M11.8,10.9c-2.27,-0.59 -3,-1.2 -3,-2.15 0,-1.09 1.01,-1.85 2.7,-1.85 1.78,0 2.44,0.85 2.5,2.1h2.21c-0.07,-1.72 -1.12,-3.3 -3.21,-3.81V3h-3v2.16c-1.94,0.42 -3.5,1.68 -3.5,3.61 0,2.31 1.91,3.46 4.7,4.13 2.5,0.6 3,1.48 3,2.41 0,0.69 -0.49,1.79 -2.7,1.79 -2.06,0 -2.87,-0.92 -2.98,-2.1h-2.2c0.12,2.19 1.76,3.42 3.68,3.83V21h3v-2.15c1.95,-0.37 3.5,-1.5 3.5,-3.55 0,-2.84 -2.43,-3.81 -4.7,-4.4z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/attachment.xml b/qqq/android/mobileapp/src/main/res/drawable/attachment.xml new file mode 100644 index 0000000..b5961db --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/attachment.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/file/attachment/materialicons/black/res/drawable/baseline_attachment_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M2,12.5C2,9.46 4.46,7 7.5,7H18c2.21,0 4,1.79 4,4s-1.79,4 -4,4H9.5C8.12,15 7,13.88 7,12.5S8.12,10 9.5,10H17v2H9.41c-0.55,0 -0.55,1 0,1H18c1.1,0 2,-0.9 2,-2s-0.9,-2 -2,-2H7.5C5.57,9 4,10.57 4,12.5S5.57,16 7.5,16H17v2H7.5C4.46,18 2,15.54 2,12.5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/attractions.xml b/qqq/android/mobileapp/src/main/res/drawable/attractions.xml new file mode 100644 index 0000000..a57dab5 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/attractions.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/attractions/materialicons/black/res/drawable/baseline_attractions_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M10.43,18.75C10.8,18.29 11.37,18 12,18c0.63,0 1.19,0.29 1.56,0.75c0.39,-0.09 0.76,-0.21 1.12,-0.36l-1.42,-3.18c-0.39,0.15 -0.82,0.23 -1.26,0.23c-0.46,0 -0.9,-0.09 -1.3,-0.25l-1.43,3.19C9.65,18.54 10.03,18.67 10.43,18.75zM5.15,10c-0.16,0.59 -0.25,1.21 -0.25,1.85c0,0.75 0.12,1.47 0.33,2.15c0.63,0.05 1.22,0.4 1.56,0.99c0.33,0.57 0.35,1.23 0.11,1.79c0.27,0.27 0.56,0.53 0.87,0.76l1.52,-3.39v0c-0.47,-0.58 -0.75,-1.32 -0.75,-2.13c0,-1.89 1.55,-3.41 3.46,-3.41c1.91,0 3.46,1.53 3.46,3.41c0,0.82 -0.29,1.57 -0.78,2.16l1.5,3.35c0.32,-0.24 0.62,-0.5 0.9,-0.79c-0.22,-0.55 -0.2,-1.2 0.12,-1.75c0.33,-0.57 0.9,-0.92 1.52,-0.99c0.22,-0.68 0.34,-1.41 0.34,-2.16c0,-0.64 -0.09,-1.27 -0.25,-1.86c-0.64,-0.04 -1.26,-0.39 -1.6,-1c-0.36,-0.62 -0.35,-1.36 -0.03,-1.95c-0.91,-0.98 -2.1,-1.71 -3.44,-2.05C13.39,5.6 12.74,6 12,6c-0.74,0 -1.39,-0.41 -1.74,-1.01C8.92,5.33 7.73,6.04 6.82,7.02C7.15,7.62 7.17,8.37 6.8,9C6.45,9.62 5.81,9.97 5.15,10zM3.85,9.58C3.07,8.98 2.83,7.88 3.34,7c0.51,-0.88 1.58,-1.23 2.49,-0.85c1.11,-1.17 2.56,-2.03 4.18,-2.42C10.15,2.75 10.99,2 12,2c1.01,0 1.85,0.75 1.98,1.73c1.63,0.39 3.07,1.24 4.18,2.42c0.91,-0.38 1.99,-0.03 2.49,0.85c0.51,0.88 0.27,1.98 -0.51,2.58c0.23,0.77 0.35,1.58 0.35,2.42s-0.12,1.65 -0.35,2.42c0.78,0.6 1.02,1.7 0.51,2.58c-0.51,0.88 -1.58,1.23 -2.49,0.85c-0.4,0.43 -0.85,0.81 -1.34,1.15l1.34,3H16.3l-0.97,-2.17c-0.43,0.18 -0.88,0.33 -1.34,0.44C13.85,21.25 13.01,22 12,22c-1.01,0 -1.85,-0.75 -1.98,-1.73C9.54,20.15 9.08,20 8.64,19.81L7.66,22H5.78l1.36,-3.03c-0.47,-0.33 -0.91,-0.71 -1.3,-1.12C4.92,18.23 3.85,17.88 3.34,17c-0.51,-0.88 -0.27,-1.98 0.51,-2.58C3.62,13.65 3.5,12.84 3.5,12S3.62,10.35 3.85,9.58z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/attribution.xml b/qqq/android/mobileapp/src/main/res/drawable/attribution.xml new file mode 100644 index 0000000..de43daf --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/attribution.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/content/attribution/materialicons/black/res/drawable/baseline_attribution_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,8.5c-0.91,0 -2.75,0.46 -2.75,1.38v4.62h1.5V19h2.5v-4.5h1.5V9.88C14.75,8.97 12.91,8.5 12,8.5z" /> + <path + android:fillColor="#FF000000" + android:pathData="M12,2C6.47,2 2,6.47 2,12s4.47,10 10,10s10,-4.48 10,-10S17.52,2 12,2zM12,20c-4.42,0 -8,-3.58 -8,-8s3.58,-8 8,-8s8,3.58 8,8S16.42,20 12,20z" /> + <path + android:fillColor="#FF000000" + android:pathData="M12,6.5m-1.5,0a1.5,1.5 0,1 1,3 0a1.5,1.5 0,1 1,-3 0" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/audio_file.xml b/qqq/android/mobileapp/src/main/res/drawable/audio_file.xml new file mode 100644 index 0000000..8bcf85e --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/audio_file.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/av/audio_file/materialicons/black/res/drawable/baseline_audio_file_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M14,2H6C4.9,2 4.01,2.9 4.01,4L4,20c0,1.1 0.89,2 1.99,2H18c1.1,0 2,-0.9 2,-2V8L14,2zM16,13h-3v3.75c0,1.24 -1.01,2.25 -2.25,2.25S8.5,17.99 8.5,16.75c0,-1.24 1.01,-2.25 2.25,-2.25c0.46,0 0.89,0.14 1.25,0.38V11h4V13zM13,9V3.5L18.5,9H13z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/audiotrack.xml b/qqq/android/mobileapp/src/main/res/drawable/audiotrack.xml new file mode 100644 index 0000000..2d6bfac --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/audiotrack.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/audiotrack/materialicons/black/res/drawable/baseline_audiotrack_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,3v9.28c-0.47,-0.17 -0.97,-0.28 -1.5,-0.28C8.01,12 6,14.01 6,16.5S8.01,21 10.5,21c2.31,0 4.2,-1.75 4.45,-4H15V6h4V3h-7z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/auto_awesome.xml b/qqq/android/mobileapp/src/main/res/drawable/auto_awesome.xml new file mode 100644 index 0000000..9a6331d --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/auto_awesome.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/auto_awesome/materialicons/black/res/drawable/baseline_auto_awesome_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19,9l1.25,-2.75L23,5l-2.75,-1.25L19,1l-1.25,2.75L15,5l2.75,1.25L19,9zM11.5,9.5L9,4 6.5,9.5 1,12l5.5,2.5L9,20l2.5,-5.5L17,12l-5.5,-2.5zM19,15l-1.25,2.75L15,19l2.75,1.25L19,23l1.25,-2.75L23,19l-2.75,-1.25L19,15z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/auto_awesome_mosaic.xml b/qqq/android/mobileapp/src/main/res/drawable/auto_awesome_mosaic.xml new file mode 100644 index 0000000..80b4451 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/auto_awesome_mosaic.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/auto_awesome_mosaic/materialicons/black/res/drawable/baseline_auto_awesome_mosaic_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M3,5v14c0,1.1 0.89,2 2,2h6L11,3L5,3c-1.11,0 -2,0.9 -2,2zM19,3h-6v8h8L21,5c0,-1.1 -0.9,-2 -2,-2zM13,21h6c1.1,0 2,-0.9 2,-2v-6h-8v8z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/auto_awesome_motion.xml b/qqq/android/mobileapp/src/main/res/drawable/auto_awesome_motion.xml new file mode 100644 index 0000000..665389c --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/auto_awesome_motion.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/auto_awesome_motion/materialicons/black/res/drawable/baseline_auto_awesome_motion_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M14,2L4,2c-1.11,0 -2,0.9 -2,2v10h2L4,4h10L14,2zM18,6L8,6c-1.11,0 -2,0.9 -2,2v10h2L8,8h10L18,6zM20,10h-8c-1.11,0 -2,0.9 -2,2v8c0,1.1 0.89,2 2,2h8c1.1,0 2,-0.9 2,-2v-8c0,-1.1 -0.9,-2 -2,-2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/auto_delete.xml b/qqq/android/mobileapp/src/main/res/drawable/auto_delete.xml new file mode 100644 index 0000000..82828c0 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/auto_delete.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/alert/auto_delete/materialicons/black/res/drawable/baseline_auto_delete_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M15,2l-3.5,0l-1,-1l-5,0l-1,1l-3.5,0l0,2l14,0z" /> + <path + android:fillColor="#FF000000" + android:pathData="M16,9c-0.7,0 -1.37,0.1 -2,0.29V5H2v12c0,1.1 0.9,2 2,2h5.68c1.12,2.36 3.53,4 6.32,4c3.87,0 7,-3.13 7,-7C23,12.13 19.87,9 16,9zM16,21c-2.76,0 -5,-2.24 -5,-5s2.24,-5 5,-5s5,2.24 5,5S18.76,21 16,21z" /> + <path + android:fillColor="#FF000000" + android:pathData="M16.5,12l-1.5,0l0,5l3.6,2.1l0.8,-1.2l-2.9,-1.7z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/auto_fix_high.xml b/qqq/android/mobileapp/src/main/res/drawable/auto_fix_high.xml new file mode 100644 index 0000000..205397b --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/auto_fix_high.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/auto_fix_high/materialicons/black/res/drawable/baseline_auto_fix_high_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M7.5,5.6L10,7 8.6,4.5 10,2 7.5,3.4 5,2l1.4,2.5L5,7zM19.5,15.4L17,14l1.4,2.5L17,19l2.5,-1.4L22,19l-1.4,-2.5L22,14zM22,2l-2.5,1.4L17,2l1.4,2.5L17,7l2.5,-1.4L22,7l-1.4,-2.5zM14.37,7.29c-0.39,-0.39 -1.02,-0.39 -1.41,0L1.29,18.96c-0.39,0.39 -0.39,1.02 0,1.41l2.34,2.34c0.39,0.39 1.02,0.39 1.41,0L16.7,11.05c0.39,-0.39 0.39,-1.02 0,-1.41l-2.33,-2.35zM13.34,12.78l-2.12,-2.12 2.44,-2.44 2.12,2.12 -2.44,2.44z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/auto_fix_normal.xml b/qqq/android/mobileapp/src/main/res/drawable/auto_fix_normal.xml new file mode 100644 index 0000000..c36812a --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/auto_fix_normal.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/auto_fix_normal/materialicons/black/res/drawable/baseline_auto_fix_normal_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M22,2l-2.5,1.4L17,2l1.4,2.5L17,7l2.5,-1.4L22,7l-1.4,-2.5zM14.37,7.29c-0.39,-0.39 -1.02,-0.39 -1.41,0L1.29,18.96c-0.39,0.39 -0.39,1.02 0,1.41l2.34,2.34c0.39,0.39 1.02,0.39 1.41,0L16.7,11.05c0.39,-0.39 0.39,-1.02 0,-1.41l-2.33,-2.35zM13.34,12.78l-2.12,-2.12 2.44,-2.44 2.12,2.12 -2.44,2.44z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/auto_fix_off.xml b/qqq/android/mobileapp/src/main/res/drawable/auto_fix_off.xml new file mode 100644 index 0000000..34bdeed --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/auto_fix_off.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/auto_fix_off/materialicons/black/res/drawable/baseline_auto_fix_off_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M23,1l-2.5,1.4L18,1l1.4,2.5L18,6l2.5,-1.4L23,6l-1.4,-2.5L23,1zM14.66,7.22l2.12,2.12 -2.44,2.44 0.81,0.81 2.55,-2.55c0.39,-0.39 0.39,-1.02 0,-1.41l-2.34,-2.34c-0.39,-0.39 -1.02,-0.39 -1.41,0L11.4,8.84l0.81,0.81 2.45,-2.43zM13.88,13.87l-3.75,-3.75 -6.86,-6.86L2,4.53l6.86,6.86 -6.57,6.57c-0.39,0.39 -0.39,1.02 0,1.41l2.34,2.34c0.39,0.39 1.02,0.39 1.41,0l6.57,-6.57L19.47,22l1.27,-1.27 -6.86,-6.86z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/auto_graph.xml b/qqq/android/mobileapp/src/main/res/drawable/auto_graph.xml new file mode 100644 index 0000000..9a63d7c --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/auto_graph.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/editor/auto_graph/materialicons/black/res/drawable/baseline_auto_graph_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M14.06,9.94L12,9l2.06,-0.94L15,6l0.94,2.06L18,9l-2.06,0.94L15,12L14.06,9.94zM4,14l0.94,-2.06L7,11l-2.06,-0.94L4,8l-0.94,2.06L1,11l2.06,0.94L4,14zM8.5,9l1.09,-2.41L12,5.5L9.59,4.41L8.5,2L7.41,4.41L5,5.5l2.41,1.09L8.5,9zM4.5,20.5l6,-6.01l4,4L23,8.93l-1.41,-1.41l-7.09,7.97l-4,-4L3,19L4.5,20.5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/auto_mode.xml b/qqq/android/mobileapp/src/main/res/drawable/auto_mode.xml new file mode 100644 index 0000000..f7e29c6 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/auto_mode.xml @@ -0,0 +1,34 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/home/auto_mode/materialicons/black/res/drawable/baseline_auto_mode_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19.03,3.56c-1.67,-1.39 -3.74,-2.3 -6.03,-2.51v2.01c1.73,0.19 3.31,0.88 4.61,1.92L19.03,3.56z" /> + <path + android:fillColor="#FF000000" + android:pathData="M11,3.06V1.05C8.71,1.25 6.64,2.17 4.97,3.56l1.42,1.42C7.69,3.94 9.27,3.25 11,3.06z" /> + <path + android:fillColor="#FF000000" + android:pathData="M4.98,6.39L3.56,4.97C2.17,6.64 1.26,8.71 1.05,11h2.01C3.25,9.27 3.94,7.69 4.98,6.39z" /> + <path + android:fillColor="#FF000000" + android:pathData="M20.94,11h2.01c-0.21,-2.29 -1.12,-4.36 -2.51,-6.03l-1.42,1.42C20.06,7.69 20.75,9.27 20.94,11z" /> + <path + android:fillColor="#FF000000" + android:pathData="M7,12l3.44,1.56l1.56,3.44l1.56,-3.44l3.44,-1.56l-3.44,-1.56l-1.56,-3.44l-1.56,3.44z" /> + <path + android:fillColor="#FF000000" + android:pathData="M12,21c-3.11,0 -5.85,-1.59 -7.46,-4H7v-2H1v6h2v-2.7c1.99,2.84 5.27,4.7 9,4.7c4.87,0 9,-3.17 10.44,-7.56l-1.96,-0.45C19.25,18.48 15.92,21 12,21z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/auto_stories.xml b/qqq/android/mobileapp/src/main/res/drawable/auto_stories.xml new file mode 100644 index 0000000..a14ab8c --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/auto_stories.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/auto_stories/materialicons/black/res/drawable/baseline_auto_stories_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19,1l-5,5v11l5,-4.5L19,1zM1,6v14.65c0,0.25 0.25,0.5 0.5,0.5 0.1,0 0.15,-0.05 0.25,-0.05C3.1,20.45 5.05,20 6.5,20c1.95,0 4.05,0.4 5.5,1.5L12,6c-1.45,-1.1 -3.55,-1.5 -5.5,-1.5S2.45,4.9 1,6zM23,19.5L23,6c-0.6,-0.45 -1.25,-0.75 -2,-1v13.5c-1.1,-0.35 -2.3,-0.5 -3.5,-0.5 -1.7,0 -4.15,0.65 -5.5,1.5v2c1.35,-0.85 3.8,-1.5 5.5,-1.5 1.65,0 3.35,0.3 4.75,1.05 0.1,0.05 0.15,0.05 0.25,0.05 0.25,0 0.5,-0.25 0.5,-0.5v-1.1z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/autofps_select.xml b/qqq/android/mobileapp/src/main/res/drawable/autofps_select.xml new file mode 100644 index 0000000..432b6d3 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/autofps_select.xml @@ -0,0 +1,34 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/autofps_select/materialicons/black/res/drawable/baseline_autofps_select_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12.03,6.3l-0.06,0l-1.02,2.89l2.1,0z" /> + <path + android:fillColor="#FF000000" + android:pathData="M3,17h2v5h-2z" /> + <path + android:fillColor="#FF000000" + android:pathData="M12,15c3.31,0 6,-2.69 6,-6s-2.69,-6 -6,-6S6,5.69 6,9S8.69,15 12,15zM11.37,5h1.25l2.63,7h-1.21l-0.63,-1.79h-2.83L9.96,12H8.74L11.37,5z" /> + <path + android:fillColor="#FF000000" + android:pathData="M7,17h2v5h-2z" /> + <path + android:fillColor="#FF000000" + android:pathData="M11,17h2v5h-2z" /> + <path + android:fillColor="#FF000000" + android:pathData="M15,17h6v5h-6z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/autorenew.xml b/qqq/android/mobileapp/src/main/res/drawable/autorenew.xml new file mode 100644 index 0000000..c1fd864 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/autorenew.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/autorenew/materialicons/black/res/drawable/baseline_autorenew_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,6v3l4,-4 -4,-4v3c-4.42,0 -8,3.58 -8,8 0,1.57 0.46,3.03 1.24,4.26L6.7,14.8c-0.45,-0.83 -0.7,-1.79 -0.7,-2.8 0,-3.31 2.69,-6 6,-6zM18.76,7.74L17.3,9.2c0.44,0.84 0.7,1.79 0.7,2.8 0,3.31 -2.69,6 -6,6v-3l-4,4 4,4v-3c4.42,0 8,-3.58 8,-8 0,-1.57 -0.46,-3.03 -1.24,-4.26z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/av_timer.xml b/qqq/android/mobileapp/src/main/res/drawable/av_timer.xml new file mode 100644 index 0000000..a2ac488 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/av_timer.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/av/av_timer/materialicons/black/res/drawable/baseline_av_timer_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M11,17c0,0.55 0.45,1 1,1s1,-0.45 1,-1 -0.45,-1 -1,-1 -1,0.45 -1,1zM11,3v4h2L13,5.08c3.39,0.49 6,3.39 6,6.92 0,3.87 -3.13,7 -7,7s-7,-3.13 -7,-7c0,-1.68 0.59,-3.22 1.58,-4.42L12,13l1.41,-1.41 -6.8,-6.8v0.02C4.42,6.45 3,9.05 3,12c0,4.97 4.02,9 9,9 4.97,0 9,-4.03 9,-9s-4.03,-9 -9,-9h-1zM18,12c0,-0.55 -0.45,-1 -1,-1s-1,0.45 -1,1 0.45,1 1,1 1,-0.45 1,-1zM6,12c0,0.55 0.45,1 1,1s1,-0.45 1,-1 -0.45,-1 -1,-1 -1,0.45 -1,1z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/baby_changing_station.xml b/qqq/android/mobileapp/src/main/res/drawable/baby_changing_station.xml new file mode 100644 index 0000000..30adc77 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/baby_changing_station.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/places/baby_changing_station/materialicons/black/res/drawable/baseline_baby_changing_station_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M14,8v2h-3L8.31,8.82L7,12.75V22H3V12l1.58,-4.63C4.96,6.25 6.22,5.69 7.3,6.18l4.15,1.83L14,8zM8,1C6.9,1 6,1.9 6,3s0.9,2 2,2s2,-0.9 2,-2S9.1,1 8,1zM9,19h12v-2H9V19zM19.5,16c0.83,0 1.5,-0.67 1.5,-1.5c0,-0.83 -0.67,-1.5 -1.5,-1.5S18,13.67 18,14.5C18,15.33 18.67,16 19.5,16zM13,12c0,-0.55 -0.45,-1 -1,-1H9v2h2v1c0,1.1 0.9,2 2,2h2c1.1,0 2,-0.9 2,-2v-3h-2v2h-2V12z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/back_hand.xml b/qqq/android/mobileapp/src/main/res/drawable/back_hand.xml new file mode 100644 index 0000000..1c040ab --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/back_hand.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/back_hand/materialicons/black/res/drawable/baseline_back_hand_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M13,24c-3.26,0 -6.19,-1.99 -7.4,-5.02l-3.03,-7.61C2.26,10.58 3,9.79 3.81,10.05l0.79,0.26c0.56,0.18 1.02,0.61 1.24,1.16L7.25,15H8V3.25C8,2.56 8.56,2 9.25,2s1.25,0.56 1.25,1.25V12h1V1.25C11.5,0.56 12.06,0 12.75,0S14,0.56 14,1.25V12h1V2.75c0,-0.69 0.56,-1.25 1.25,-1.25c0.69,0 1.25,0.56 1.25,1.25V12h1V5.75c0,-0.69 0.56,-1.25 1.25,-1.25S21,5.06 21,5.75V16C21,20.42 17.42,24 13,24z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/backpack.xml b/qqq/android/mobileapp/src/main/res/drawable/backpack.xml new file mode 100644 index 0000000..7eea779 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/backpack.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/places/backpack/materialicons/black/res/drawable/baseline_backpack_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,8v12c0,1.1 -0.9,2 -2,2H6c-1.1,0 -2,-0.9 -2,-2V8c0,-1.86 1.28,-3.41 3,-3.86V2h3v2h4V2h3v2.14C18.72,4.59 20,6.14 20,8zM6,12v2h10v2h2v-4H6z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/backspace.xml b/qqq/android/mobileapp/src/main/res/drawable/backspace.xml new file mode 100644 index 0000000..1ec5918 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/backspace.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/content/backspace/materialicons/black/res/drawable/baseline_backspace_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M22,3L7,3c-0.69,0 -1.23,0.35 -1.59,0.88L0,12l5.41,8.11c0.36,0.53 0.9,0.89 1.59,0.89h15c1.1,0 2,-0.9 2,-2L24,5c0,-1.1 -0.9,-2 -2,-2zM19,15.59L17.59,17 14,13.41 10.41,17 9,15.59 12.59,12 9,8.41 10.41,7 14,10.59 17.59,7 19,8.41 15.41,12 19,15.59z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/backup.xml b/qqq/android/mobileapp/src/main/res/drawable/backup.xml new file mode 100644 index 0000000..dcf8742 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/backup.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/backup/materialicons/black/res/drawable/baseline_backup_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19.35,10.04C18.67,6.59 15.64,4 12,4 9.11,4 6.6,5.64 5.35,8.04 2.34,8.36 0,10.91 0,14c0,3.31 2.69,6 6,6h13c2.76,0 5,-2.24 5,-5 0,-2.64 -2.05,-4.78 -4.65,-4.96zM14,13v4h-4v-4H7l5,-5 5,5h-3z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/backup_table.xml b/qqq/android/mobileapp/src/main/res/drawable/backup_table.xml new file mode 100644 index 0000000..60b0844 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/backup_table.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/backup_table/materialicons/black/res/drawable/baseline_backup_table_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,6v14H6v2h14c1.1,0 2,-0.9 2,-2V6H20z" /> + <path + android:fillColor="#FF000000" + android:pathData="M16,2H4C2.9,2 2,2.9 2,4v12c0,1.1 0.9,2 2,2h12c1.1,0 2,-0.9 2,-2V4C18,2.9 17.1,2 16,2zM9,16H4v-5h5V16zM16,16h-5v-5h5V16zM16,9H4V4h12V9z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/badge.xml b/qqq/android/mobileapp/src/main/res/drawable/badge.xml new file mode 100644 index 0000000..fc86d67 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/badge.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/badge/materialicons/black/res/drawable/baseline_badge_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,7h-5V4c0,-1.1 -0.9,-2 -2,-2h-2C9.9,2 9,2.9 9,4v3H4C2.9,7 2,7.9 2,9v11c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2V9C22,7.9 21.1,7 20,7zM9,12c0.83,0 1.5,0.67 1.5,1.5S9.83,15 9,15s-1.5,-0.67 -1.5,-1.5S8.17,12 9,12zM12,18H6v-0.75c0,-1 2,-1.5 3,-1.5s3,0.5 3,1.5V18zM13,9h-2V4h2V9zM18,16.5h-4V15h4V16.5zM18,13.5h-4V12h4V13.5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/bakery_dining.xml b/qqq/android/mobileapp/src/main/res/drawable/bakery_dining.xml new file mode 100644 index 0000000..b03092d --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/bakery_dining.xml @@ -0,0 +1,20 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/bakery_dining/materialicons/black/res/drawable/baseline_bakery_dining_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19.28,16.34C18.07,15.45 17.46,15 17.46,15s0.32,-0.59 0.96,-1.78c0.38,-0.59 1.22,-0.59 1.6,0l0.81,1.26c0.19,0.3 0.21,0.68 0.06,1l-0.22,0.47C20.42,16.49 19.76,16.67 19.28,16.34zM4.72,16.34c-0.48,0.33 -1.13,0.15 -1.39,-0.38L3.1,15.49c-0.15,-0.32 -0.13,-0.7 0.06,-1l0.81,-1.26c0.38,-0.59 1.22,-0.59 1.6,0C6.22,14.41 6.54,15 6.54,15S5.93,15.45 4.72,16.34zM15.36,9.37c0.09,-0.68 0.73,-1.06 1.27,-0.75l1.59,0.9c0.46,0.26 0.63,0.91 0.36,1.41L16.5,15h-1.8L15.36,9.37zM8.63,9.37L9.3,15H7.5l-2.09,-4.08c-0.27,-0.5 -0.1,-1.15 0.36,-1.41l1.59,-0.9C7.89,8.31 8.54,8.69 8.63,9.37zM13.8,15h-3.6L9.46,8.12C9.39,7.53 9.81,7 10.34,7h3.3c0.53,0 0.94,0.53 0.88,1.12L13.8,15z" + android:fillType="evenOdd" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/balance.xml b/qqq/android/mobileapp/src/main/res/drawable/balance.xml new file mode 100644 index 0000000..17afab3 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/balance.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/balance/materialicons/black/res/drawable/baseline_balance_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M13,7.83c0.85,-0.3 1.53,-0.98 1.83,-1.83H18l-3,7c0,1.66 1.57,3 3.5,3s3.5,-1.34 3.5,-3l-3,-7h2V4h-6.17C14.42,2.83 13.31,2 12,2S9.58,2.83 9.17,4L3,4v2h2l-3,7c0,1.66 1.57,3 3.5,3S9,14.66 9,13L6,6h3.17c0.3,0.85 0.98,1.53 1.83,1.83V19H2v2h20v-2h-9V7.83zM20.37,13h-3.74l1.87,-4.36L20.37,13zM7.37,13H3.63L5.5,8.64L7.37,13zM12,6c-0.55,0 -1,-0.45 -1,-1c0,-0.55 0.45,-1 1,-1s1,0.45 1,1C13,5.55 12.55,6 12,6z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/balcony.xml b/qqq/android/mobileapp/src/main/res/drawable/balcony.xml new file mode 100644 index 0000000..3014d6a --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/balcony.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/places/balcony/materialicons/black/res/drawable/baseline_balcony_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M10,10v2H8v-2H10zM16,12v-2h-2v2H16zM21,14v8H3v-8h1v-4c0,-4.42 3.58,-8 8,-8s8,3.58 8,8v4H21zM7,16H5v4h2V16zM11,16H9v4h2V16zM11,4.08C8.16,4.56 6,7.03 6,10v4h5V4.08zM13,14h5v-4c0,-2.97 -2.16,-5.44 -5,-5.92V14zM15,16h-2v4h2V16zM19,16h-2v4h2V16z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/ballot.xml b/qqq/android/mobileapp/src/main/res/drawable/ballot.xml new file mode 100644 index 0000000..16ece1d --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/ballot.xml @@ -0,0 +1,20 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/content/ballot/materialicons/black/res/drawable/baseline_ballot_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M13,9.5h5v-2h-5V9.5zM13,16.5h5v-2h-5V16.5zM19,21H5c-1.1,0 -2,-0.9 -2,-2V5c0,-1.1 0.9,-2 2,-2h14c1.1,0 2,0.9 2,2v14C21,20.1 20.1,21 19,21zM6,11h5V6H6V11zM7,7h3v3H7V7zM6,18h5v-5H6V18zM7,14h3v3H7V14z" + android:fillType="evenOdd" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/bar_chart.xml b/qqq/android/mobileapp/src/main/res/drawable/bar_chart.xml new file mode 100644 index 0000000..4ae0f53 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/bar_chart.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/editor/bar_chart/materialicons/black/res/drawable/baseline_bar_chart_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M4,9h4v11h-4z" /> + <path + android:fillColor="#FF000000" + android:pathData="M16,13h4v7h-4z" /> + <path + android:fillColor="#FF000000" + android:pathData="M10,4h4v16h-4z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/barcode_reader.xml b/qqq/android/mobileapp/src/main/res/drawable/barcode_reader.xml new file mode 100644 index 0000000..38f589f --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/barcode_reader.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/barcode_reader/materialicons/black/res/drawable/baseline_barcode_reader_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M23,8.75h-4v-1.5h4V8.75zM22.62,4.37L22,3l-3.62,1.63L19,6L22.62,4.37zM19,10l-0.62,1.37L22,13l0.62,-1.37L19,10zM11,13c0.55,0 1,0.45 1,1v2c0,0.55 -0.45,1 -1,1H9.64L8.9,19.78C8.54,21.12 7.33,22 6,22c-0.26,0 -0.52,-0.03 -0.78,-0.1c-1.6,-0.43 -2.55,-2.07 -2.12,-3.67l1.82,-6.8C3.77,10.72 3,9.45 3,8c0,-2.21 1.79,-4 4,-4h8c1.49,0 2.45,1.56 1.79,2.89l-2,4C14.45,11.57 13.75,12 13,12h-2.02l-0.27,1H11z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/batch_prediction.xml b/qqq/android/mobileapp/src/main/res/drawable/batch_prediction.xml new file mode 100644 index 0000000..9a60a32 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/batch_prediction.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/batch_prediction/materialicons/black/res/drawable/baseline_batch_prediction_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M17,8H7c-1.1,0 -2,0.9 -2,2v10c0,1.1 0.9,2 2,2h10c1.1,0 2,-0.9 2,-2V10C19,8.9 18.1,8 17,8zM13,20.5h-2V19h2V20.5zM13,18h-2c0,-1.5 -2.5,-3 -2.5,-5c0,-1.93 1.57,-3.5 3.5,-3.5c1.93,0 3.5,1.57 3.5,3.5C15.5,15 13,16.5 13,18zM18,6.5H6v0C6,5.67 6.67,5 7.5,5h9C17.33,5 18,5.67 18,6.5L18,6.5zM17,3.5H7v0C7,2.67 7.67,2 8.5,2h7C16.33,2 17,2.67 17,3.5L17,3.5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/bathroom.xml b/qqq/android/mobileapp/src/main/res/drawable/bathroom.xml new file mode 100644 index 0000000..a5f4cf1 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/bathroom.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/search/bathroom/materialicons/black/res/drawable/baseline_bathroom_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,2H4C2.9,2 2,2.9 2,4v16c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2V4C22,2.9 21.1,2 20,2zM9,18c-0.55,0 -1,-0.45 -1,-1s0.45,-1 1,-1s1,0.45 1,1S9.55,18 9,18zM9,15c-0.55,0 -1,-0.45 -1,-1s0.45,-1 1,-1s1,0.45 1,1S9.55,15 9,15zM12,18c-0.55,0 -1,-0.45 -1,-1s0.45,-1 1,-1s1,0.45 1,1S12.55,18 12,18zM12,15c-0.55,0 -1,-0.45 -1,-1s0.45,-1 1,-1s1,0.45 1,1S12.55,15 12,15zM15,18c-0.55,0 -1,-0.45 -1,-1s0.45,-1 1,-1s1,0.45 1,1S15.55,18 15,18zM15,15c-0.55,0 -1,-0.45 -1,-1s0.45,-1 1,-1s1,0.45 1,1S15.55,15 15,15zM17,12H7v-1c0,-2.76 2.24,-5 5,-5s5,2.24 5,5V12z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/bathtub.xml b/qqq/android/mobileapp/src/main/res/drawable/bathtub.xml new file mode 100644 index 0000000..d4b0d1f --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/bathtub.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/places/bathtub/materialicons/black/res/drawable/baseline_bathtub_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M7,7m-2,0a2,2 0,1 1,4 0a2,2 0,1 1,-4 0" /> + <path + android:fillColor="#FF000000" + android:pathData="M20,13V4.83C20,3.27 18.73,2 17.17,2c-0.75,0 -1.47,0.3 -2,0.83l-1.25,1.25C13.76,4.03 13.59,4 13.41,4c-0.4,0 -0.77,0.12 -1.08,0.32l2.76,2.76c0.2,-0.31 0.32,-0.68 0.32,-1.08c0,-0.18 -0.03,-0.34 -0.07,-0.51l1.25,-1.25C16.74,4.09 16.95,4 17.17,4C17.63,4 18,4.37 18,4.83V13h-6.85c-0.3,-0.21 -0.57,-0.45 -0.82,-0.72l-1.4,-1.55c-0.19,-0.21 -0.43,-0.38 -0.69,-0.5C7.93,10.08 7.59,10 7.24,10C6,10.01 5,11.01 5,12.25V13H2v6c0,1.1 0.9,2 2,2c0,0.55 0.45,1 1,1h14c0.55,0 1,-0.45 1,-1c1.1,0 2,-0.9 2,-2v-6H20z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/battery_0_bar.xml b/qqq/android/mobileapp/src/main/res/drawable/battery_0_bar.xml new file mode 100644 index 0000000..654e86c --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/battery_0_bar.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/battery_0_bar/materialicons/black/res/drawable/baseline_battery_0_bar_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M17,5v16c0,0.55 -0.45,1 -1,1H8c-0.55,0 -1,-0.45 -1,-1V5c0,-0.55 0.45,-1 1,-1h2V2h4v2h2C16.55,4 17,4.45 17,5zM15,6H9v14h6V6z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/battery_1_bar.xml b/qqq/android/mobileapp/src/main/res/drawable/battery_1_bar.xml new file mode 100644 index 0000000..ac23916 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/battery_1_bar.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/battery_1_bar/materialicons/black/res/drawable/baseline_battery_1_bar_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M17,5v16c0,0.55 -0.45,1 -1,1H8c-0.55,0 -1,-0.45 -1,-1V5c0,-0.55 0.45,-1 1,-1h2V2h4v2h2C16.55,4 17,4.45 17,5zM15,6H9v12h6V6z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/battery_2_bar.xml b/qqq/android/mobileapp/src/main/res/drawable/battery_2_bar.xml new file mode 100644 index 0000000..bf34424 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/battery_2_bar.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/battery_2_bar/materialicons/black/res/drawable/baseline_battery_2_bar_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M17,5v16c0,0.55 -0.45,1 -1,1H8c-0.55,0 -1,-0.45 -1,-1V5c0,-0.55 0.45,-1 1,-1h2V2h4v2h2C16.55,4 17,4.45 17,5zM15,6H9v10h6V6z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/battery_3_bar.xml b/qqq/android/mobileapp/src/main/res/drawable/battery_3_bar.xml new file mode 100644 index 0000000..69b1dcb --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/battery_3_bar.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/battery_3_bar/materialicons/black/res/drawable/baseline_battery_3_bar_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M17,5v16c0,0.55 -0.45,1 -1,1H8c-0.55,0 -1,-0.45 -1,-1V5c0,-0.55 0.45,-1 1,-1h2V2h4v2h2C16.55,4 17,4.45 17,5zM15,6H9v8h6V6z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/battery_4_bar.xml b/qqq/android/mobileapp/src/main/res/drawable/battery_4_bar.xml new file mode 100644 index 0000000..1e20a1b --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/battery_4_bar.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/battery_4_bar/materialicons/black/res/drawable/baseline_battery_4_bar_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M17,5v16c0,0.55 -0.45,1 -1,1H8c-0.55,0 -1,-0.45 -1,-1V5c0,-0.55 0.45,-1 1,-1h2V2h4v2h2C16.55,4 17,4.45 17,5zM15,6H9v6h6V6z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/battery_5_bar.xml b/qqq/android/mobileapp/src/main/res/drawable/battery_5_bar.xml new file mode 100644 index 0000000..a617e91 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/battery_5_bar.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/battery_5_bar/materialicons/black/res/drawable/baseline_battery_5_bar_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M17,5v16c0,0.55 -0.45,1 -1,1H8c-0.55,0 -1,-0.45 -1,-1V5c0,-0.55 0.45,-1 1,-1h2V2h4v2h2C16.55,4 17,4.45 17,5zM15,6H9v4h6V6z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/battery_6_bar.xml b/qqq/android/mobileapp/src/main/res/drawable/battery_6_bar.xml new file mode 100644 index 0000000..b658782 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/battery_6_bar.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/battery_6_bar/materialicons/black/res/drawable/baseline_battery_6_bar_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M17,5v16c0,0.55 -0.45,1 -1,1H8c-0.55,0 -1,-0.45 -1,-1V5c0,-0.55 0.45,-1 1,-1h2V2h4v2h2C16.55,4 17,4.45 17,5zM15,6H9v2h6V6z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/battery_alert.xml b/qqq/android/mobileapp/src/main/res/drawable/battery_alert.xml new file mode 100644 index 0000000..a32192a --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/battery_alert.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/battery_alert/materialicons/black/res/drawable/baseline_battery_alert_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M15.67,4L14,4L14,2h-4v2L8.33,4C7.6,4 7,4.6 7,5.33v15.33C7,21.4 7.6,22 8.33,22h7.33c0.74,0 1.34,-0.6 1.34,-1.33L17,5.33C17,4.6 16.4,4 15.67,4zM13,18h-2v-2h2v2zM13,14h-2L11,9h2v5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/battery_charging_full.xml b/qqq/android/mobileapp/src/main/res/drawable/battery_charging_full.xml new file mode 100644 index 0000000..35c0c52 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/battery_charging_full.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/battery_charging_full/materialicons/black/res/drawable/baseline_battery_charging_full_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M15.67,4H14V2h-4v2H8.33C7.6,4 7,4.6 7,5.33v15.33C7,21.4 7.6,22 8.33,22h7.33c0.74,0 1.34,-0.6 1.34,-1.33V5.33C17,4.6 16.4,4 15.67,4zM11,20v-5.5H9L13,7v5.5h2L11,20z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/battery_full.xml b/qqq/android/mobileapp/src/main/res/drawable/battery_full.xml new file mode 100644 index 0000000..6a524b2 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/battery_full.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/battery_full/materialicons/black/res/drawable/baseline_battery_full_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M15.67,4H14V2h-4v2H8.33C7.6,4 7,4.6 7,5.33v15.33C7,21.4 7.6,22 8.33,22h7.33c0.74,0 1.34,-0.6 1.34,-1.33V5.33C17,4.6 16.4,4 15.67,4z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/battery_saver.xml b/qqq/android/mobileapp/src/main/res/drawable/battery_saver.xml new file mode 100644 index 0000000..343c25e --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/battery_saver.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/battery_saver/materialicons/black/res/drawable/baseline_battery_saver_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M16,4h-2V2h-4v2H8C7.45,4 7,4.45 7,5v16c0,0.55 0.45,1 1,1h8c0.55,0 1,-0.45 1,-1V5C17,4.45 16.55,4 16,4zM15,14h-2v2h-2v-2H9v-2h2v-2h2v2h2V14z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/battery_std.xml b/qqq/android/mobileapp/src/main/res/drawable/battery_std.xml new file mode 100644 index 0000000..3601a59 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/battery_std.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/battery_std/materialicons/black/res/drawable/baseline_battery_std_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M15.67,4H14V2h-4v2H8.33C7.6,4 7,4.6 7,5.33v15.33C7,21.4 7.6,22 8.33,22h7.33c0.74,0 1.34,-0.6 1.34,-1.33V5.33C17,4.6 16.4,4 15.67,4z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/battery_unknown.xml b/qqq/android/mobileapp/src/main/res/drawable/battery_unknown.xml new file mode 100644 index 0000000..d7823e0 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/battery_unknown.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/battery_unknown/materialicons/black/res/drawable/baseline_battery_unknown_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M15.67,4L14,4L14,2h-4v2L8.33,4C7.6,4 7,4.6 7,5.33v15.33C7,21.4 7.6,22 8.33,22h7.33c0.74,0 1.34,-0.6 1.34,-1.33L17,5.33C17,4.6 16.4,4 15.67,4zM12.95,17.95h-1.9v-1.9h1.9v1.9zM14.3,12.69s-0.38,0.42 -0.67,0.71c-0.48,0.48 -0.83,1.15 -0.83,1.6h-1.6c0,-0.83 0.46,-1.52 0.93,-2l0.93,-0.94c0.27,-0.27 0.44,-0.65 0.44,-1.06 0,-0.83 -0.67,-1.5 -1.5,-1.5s-1.5,0.67 -1.5,1.5L9,11c0,-1.66 1.34,-3 3,-3s3,1.34 3,3c0,0.66 -0.27,1.26 -0.7,1.69z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/beach_access.xml b/qqq/android/mobileapp/src/main/res/drawable/beach_access.xml new file mode 100644 index 0000000..93706eb --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/beach_access.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/places/beach_access/materialicons/black/res/drawable/baseline_beach_access_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M13.127,14.56l1.43,-1.43 6.44,6.443L19.57,21zM17.42,8.83l2.86,-2.86c-3.95,-3.95 -10.35,-3.96 -14.3,-0.02 3.93,-1.3 8.31,-0.25 11.44,2.88zM5.95,5.98c-3.94,3.95 -3.93,10.35 0.02,14.3l2.86,-2.86C5.7,14.29 4.65,9.91 5.95,5.98zM5.97,5.96l-0.01,0.01c-0.38,3.01 1.17,6.88 4.3,10.02l5.73,-5.73c-3.13,-3.13 -7.01,-4.68 -10.02,-4.3z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/bed.xml b/qqq/android/mobileapp/src/main/res/drawable/bed.xml new file mode 100644 index 0000000..8c523f0 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/bed.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/search/bed/materialicons/black/res/drawable/baseline_bed_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M21,10.78V8c0,-1.65 -1.35,-3 -3,-3h-4c-0.77,0 -1.47,0.3 -2,0.78C11.47,5.3 10.77,5 10,5H6C4.35,5 3,6.35 3,8v2.78C2.39,11.33 2,12.12 2,13v6h2v-2h16v2h2v-6C22,12.12 21.61,11.33 21,10.78zM14,7h4c0.55,0 1,0.45 1,1v2h-6V8C13,7.45 13.45,7 14,7zM5,8c0,-0.55 0.45,-1 1,-1h4c0.55,0 1,0.45 1,1v2H5V8z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/bedroom_baby.xml b/qqq/android/mobileapp/src/main/res/drawable/bedroom_baby.xml new file mode 100644 index 0000000..a9d8b48 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/bedroom_baby.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/search/bedroom_baby/materialicons/black/res/drawable/baseline_bedroom_baby_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,2H4C2.9,2 2,2.9 2,4v16c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2V4C22,2.9 21.1,2 20,2zM12,18c-2.64,0 -5.13,-1.03 -7,-2.9l1.06,-1.06c0.34,0.34 0.71,0.65 1.1,0.92L8,13.5V9.51L6.45,10.5l-0.95,-1L7,7.76L6,7h3.65l1.73,3H17v1h-1v2.5l0.84,1.46c0.39,-0.28 0.76,-0.58 1.1,-0.92L19,15.1C17.13,16.97 14.64,18 12,18z" /> + <path + android:fillColor="#FF000000" + android:pathData="M14.69,14.24c-1.74,0.65 -3.66,0.65 -5.4,0l-0.81,1.41l-0.03,0.06c1.1,0.52 2.28,0.79 3.53,0.79s2.45,-0.28 3.55,-0.79l-0.03,-0.06L14.69,14.24z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/bedroom_child.xml b/qqq/android/mobileapp/src/main/res/drawable/bedroom_child.xml new file mode 100644 index 0000000..8aa23fa --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/bedroom_child.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/search/bedroom_child/materialicons/black/res/drawable/baseline_bedroom_child_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M9,8.5h6v2h-6z" /> + <path + android:fillColor="#FF000000" + android:pathData="M15.64,12H8.37c-0.48,0 -0.87,0.39 -0.87,0.87h0.01V14h9v-1.13C16.51,12.39 16.12,12 15.64,12z" /> + <path + android:fillColor="#FF000000" + android:pathData="M20,2H4C2.9,2 2,2.9 2,4v16c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2V4C22,2.9 21.1,2 20,2zM18,17h-1.5v-1.5h-9V17H6v-4.13c0,-1 0.62,-1.85 1.5,-2.2V9c0,-1.1 0.9,-2 2,-2h5c1.1,0 2,0.9 2,2v1.67c0.88,0.35 1.5,1.2 1.5,2.2V17z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/bedroom_parent.xml b/qqq/android/mobileapp/src/main/res/drawable/bedroom_parent.xml new file mode 100644 index 0000000..991fdb4 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/bedroom_parent.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/search/bedroom_parent/materialicons/black/res/drawable/baseline_bedroom_parent_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M16.5,12h-9c-0.55,0 -1,0.45 -1,1v1h11v-1C17.5,12.45 17.05,12 16.5,12z" /> + <path + android:fillColor="#FF000000" + android:pathData="M7.25,8.5h4v2h-4z" /> + <path + android:fillColor="#FF000000" + android:pathData="M12.75,8.5h4v2h-4z" /> + <path + android:fillColor="#FF000000" + android:pathData="M20,2H4C2.9,2 2,2.9 2,4v16c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2V4C22,2.9 21.1,2 20,2zM19,17h-1.5v-1.5h-11V17H5v-3.83c0,-0.66 0.25,-1.26 0.65,-1.72V9c0,-1.1 0.9,-2 2,-2H11c0.37,0 0.72,0.12 1,0.32C12.28,7.12 12.63,7 13,7h3.35c1.1,0 2,0.9 2,2v2.45c0.4,0.46 0.65,1.06 0.65,1.72V17z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/bedtime.xml b/qqq/android/mobileapp/src/main/res/drawable/bedtime.xml new file mode 100644 index 0000000..2da86be --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/bedtime.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/bedtime/materialicons/black/res/drawable/baseline_bedtime_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12.34,2.02C6.59,1.82 2,6.42 2,12c0,5.52 4.48,10 10,10c3.71,0 6.93,-2.02 8.66,-5.02C13.15,16.73 8.57,8.55 12.34,2.02z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/bedtime_off.xml b/qqq/android/mobileapp/src/main/res/drawable/bedtime_off.xml new file mode 100644 index 0000000..20416ae --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/bedtime_off.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/bedtime_off/materialicons/black/res/drawable/baseline_bedtime_off_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M21.19,21.19L2.81,2.81L1.39,4.22l2.27,2.27C2.61,8.08 2,9.97 2,12c0,5.52 4.48,10 10,10c2.04,0 3.93,-0.62 5.51,-1.66l2.27,2.27L21.19,21.19z" /> + <path + android:fillColor="#FF000000" + android:pathData="M12.34,2.02c-2.18,-0.07 -4.19,0.55 -5.85,1.64l4.59,4.59C10.81,6.2 11.18,4.03 12.34,2.02z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/beenhere.xml b/qqq/android/mobileapp/src/main/res/drawable/beenhere.xml new file mode 100644 index 0000000..acc892e --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/beenhere.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/beenhere/materialicons/black/res/drawable/baseline_beenhere_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19,1L5,1c-1.1,0 -1.99,0.9 -1.99,2L3,15.93c0,0.69 0.35,1.3 0.88,1.66L12,23l8.11,-5.41c0.53,-0.36 0.88,-0.97 0.88,-1.66L21,3c0,-1.1 -0.9,-2 -2,-2zM10,16l-5,-5 1.41,-1.41L10,13.17l7.59,-7.59L19,7l-9,9z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/bento.xml b/qqq/android/mobileapp/src/main/res/drawable/bento.xml new file mode 100644 index 0000000..8e9a036 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/bento.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/places/bento/materialicons/black/res/drawable/baseline_bento_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M16,11V5h4c1.1,0 2,0.9 2,2v4H16zM20,19c1.1,0 2,-0.9 2,-2v-4h-6v6H20zM14,5v14H4c-1.1,0 -2,-0.9 -2,-2V7c0,-1.1 0.9,-2 2,-2H14zM9.5,12c0,-0.83 -0.67,-1.5 -1.5,-1.5S6.5,11.17 6.5,12s0.67,1.5 1.5,1.5S9.5,12.83 9.5,12z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/bike_scooter.xml b/qqq/android/mobileapp/src/main/res/drawable/bike_scooter.xml new file mode 100644 index 0000000..7be5dab --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/bike_scooter.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/bike_scooter/materialicons/black/res/drawable/baseline_bike_scooter_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M10,14h0.74L8.82,5.56C8.61,4.65 7.8,4 6.87,4H3v2h3.87l1.42,6.25c0,0 -0.01,0 -0.01,0C6.12,12.9 4.47,14.73 4.09,17H0v2h6v-1C6,15.79 7.79,14 10,14z" /> + <path + android:fillColor="#FF000000" + android:pathData="M19,8h-0.82l-1.35,-3.69C16.55,3.52 15.8,3 14.96,3H11v2h3.96l1.1,3H10.4l0.46,2H15c-0.43,0.58 -0.75,1.25 -0.9,2h-2.79l0.46,2h2.33c0.44,2.23 2.31,3.88 4.65,3.99c2.8,0.13 5.25,-2.19 5.25,-5C24,10.2 21.8,8 19,8zM19,16c-1.68,0 -3,-1.32 -3,-3c0,-0.93 0.41,-1.73 1.05,-2.28l0.96,2.64l1.88,-0.68l-0.97,-2.67c0.03,0 0.06,-0.01 0.09,-0.01c1.68,0 3,1.32 3,3S20.68,16 19,16z" /> + <path + android:fillColor="#FF000000" + android:pathData="M10,15c-1.66,0 -3,1.34 -3,3s1.34,3 3,3s3,-1.34 3,-3S11.66,15 10,15zM10,19c-0.55,0 -1,-0.45 -1,-1s0.45,-1 1,-1s1,0.45 1,1S10.55,19 10,19z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/biotech.xml b/qqq/android/mobileapp/src/main/res/drawable/biotech.xml new file mode 100644 index 0000000..f69224c --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/biotech.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/content/biotech/materialicons/black/res/drawable/baseline_biotech_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M7,19c-1.1,0 -2,0.9 -2,2h14c0,-1.1 -0.9,-2 -2,-2h-4v-2h3c1.1,0 2,-0.9 2,-2h-8c-1.66,0 -3,-1.34 -3,-3c0,-1.09 0.59,-2.04 1.46,-2.56C8.17,9.03 8,8.54 8,8c0,-0.21 0.04,-0.42 0.09,-0.62C6.28,8.13 5,9.92 5,12c0,2.76 2.24,5 5,5v2H7z" /> + <path + android:fillColor="#FF000000" + android:pathData="M10.56,5.51C11.91,5.54 13,6.64 13,8c0,0.75 -0.33,1.41 -0.85,1.87l0.59,1.62l0.94,-0.34l0.34,0.94l1.88,-0.68l-0.34,-0.94l0.94,-0.34L13.76,2.6l-0.94,0.34L12.48,2L10.6,2.68l0.34,0.94L10,3.97L10.56,5.51z" /> + <path + android:fillColor="#FF000000" + android:pathData="M10.5,8m-1.5,0a1.5,1.5 0,1 1,3 0a1.5,1.5 0,1 1,-3 0" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/blender.xml b/qqq/android/mobileapp/src/main/res/drawable/blender.xml new file mode 100644 index 0000000..dbbf93d --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/blender.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/search/blender/materialicons/black/res/drawable/baseline_blender_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M16.13,15.13L18,3h-4V2h-4v1H5C3.9,3 3,3.9 3,5v4c0,1.1 0.9,2 2,2h2.23l0.64,4.13C6.74,16.05 6,17.43 6,19v1c0,1.1 0.9,2 2,2h8c1.1,0 2,-0.9 2,-2v-1C18,17.43 17.26,16.05 16.13,15.13zM5,9V5h1.31l0.62,4H5zM12,19c-0.55,0 -1,-0.45 -1,-1s0.45,-1 1,-1s1,0.45 1,1S12.55,19 12,19zM14.29,14H9.72L8.33,5h7.34L14.29,14z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/blind.xml b/qqq/android/mobileapp/src/main/res/drawable/blind.xml new file mode 100644 index 0000000..362db25 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/blind.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/blind/materialicons/black/res/drawable/baseline_blind_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M11.5,3.5m-2,0a2,2 0,1 1,4 0a2,2 0,1 1,-4 0" /> + <path + android:fillColor="#FF000000" + android:pathData="M12.13,7.12c-0.17,-0.35 -0.44,-0.65 -0.8,-0.85C10.72,5.91 9.99,5.93 9.4,6.24l0,-0.01L4,9.3V14h2v-3.54l1.5,-0.85C7.18,10.71 7,11.85 7,13v5.33L4.4,21.8L6,23l3,-4l0.22,-3.54L11,18v5h2v-6.5l-1.97,-2.81c-0.04,-0.52 -0.14,-1.76 0.45,-3.4c0.75,1.14 1.88,1.98 3.2,2.41L20.63,23l0.87,-0.5L16.02,13H17v-2c-0.49,0 -2.88,0.17 -4.08,-2.21" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/blinds.xml b/qqq/android/mobileapp/src/main/res/drawable/blinds.xml new file mode 100644 index 0000000..ea5d474 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/blinds.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/home/blinds/materialicons/black/res/drawable/baseline_blinds_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,19V3H4v16H2v2h20v-2H20zM16,9h2v2h-2V9zM14,11H6V9h8V11zM18,7h-2V5h2V7zM14,5v2H6V5H14zM6,19v-6h8v1.82c-0.45,0.32 -0.75,0.84 -0.75,1.43c0,0.97 0.78,1.75 1.75,1.75s1.75,-0.78 1.75,-1.75c0,-0.59 -0.3,-1.12 -0.75,-1.43V13h2v6H6z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/blinds_closed.xml b/qqq/android/mobileapp/src/main/res/drawable/blinds_closed.xml new file mode 100644 index 0000000..d3f245d --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/blinds_closed.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/home/blinds_closed/materialicons/black/res/drawable/baseline_blinds_closed_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,19V3H4v16H2v2h11.25c0,0.97 0.78,1.75 1.75,1.75s1.75,-0.78 1.75,-1.75H22v-2H20zM18,11h-2V9h2V11zM14,11H6V9h8V11zM14,13v2H6v-2H14zM16,13h2v2h-2V13zM18,7h-2V5h2V7zM14,5v2H6V5H14zM6,19v-2h8v2H6zM16,19v-2h2v2H16z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/block.xml b/qqq/android/mobileapp/src/main/res/drawable/block.xml new file mode 100644 index 0000000..80659bf --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/block.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/content/block/materialicons/black/res/drawable/baseline_block_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM4,12c0,-4.42 3.58,-8 8,-8 1.85,0 3.55,0.63 4.9,1.69L5.69,16.9C4.63,15.55 4,13.85 4,12zM12,20c-1.85,0 -3.55,-0.63 -4.9,-1.69L18.31,7.1C19.37,8.45 20,10.15 20,12c0,4.42 -3.58,8 -8,8z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/block_flipped.xml b/qqq/android/mobileapp/src/main/res/drawable/block_flipped.xml new file mode 100644 index 0000000..4594ba9 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/block_flipped.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/content/block_flipped/materialicons/black/res/drawable/baseline_block_flipped_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M22,12c0,-5.5 -4.5,-10 -10,-10S2,6.5 2,12s4.5,10 10,10S22,17.5 22,12zM5.7,7.1l11.2,11.2c-1.3,1.1 -3,1.7 -4.9,1.7c-4.4,0 -8,-3.6 -8,-8C4,10.1 4.6,8.4 5.7,7.1zM20,12c0,1.9 -0.6,3.6 -1.7,4.9L7.1,5.7C8.4,4.6 10.1,4 12,4C16.4,4 20,7.6 20,12z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/bloodtype.xml b/qqq/android/mobileapp/src/main/res/drawable/bloodtype.xml new file mode 100644 index 0000000..858f099 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/bloodtype.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/bloodtype/materialicons/black/res/drawable/baseline_bloodtype_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,2c-5.33,4.55 -8,8.48 -8,11.8c0,4.98 3.8,8.2 8,8.2s8,-3.22 8,-8.2C20,10.48 17.33,6.55 12,2zM15,18H9v-2h6V18zM15,13h-2v2h-2v-2H9v-2h2V9h2v2h2V13z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/bluetooth.xml b/qqq/android/mobileapp/src/main/res/drawable/bluetooth.xml new file mode 100644 index 0000000..ed9b024 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/bluetooth.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/bluetooth/materialicons/black/res/drawable/baseline_bluetooth_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M17.71,7.71L12,2h-1v7.59L6.41,5 5,6.41 10.59,12 5,17.59 6.41,19 11,14.41L11,22h1l5.71,-5.71 -4.3,-4.29 4.3,-4.29zM13,5.83l1.88,1.88L13,9.59L13,5.83zM14.88,16.29L13,18.17v-3.76l1.88,1.88z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/bluetooth_audio.xml b/qqq/android/mobileapp/src/main/res/drawable/bluetooth_audio.xml new file mode 100644 index 0000000..ad31fe9 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/bluetooth_audio.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/notification/bluetooth_audio/materialicons/black/res/drawable/baseline_bluetooth_audio_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M14.24,12.01l2.32,2.32c0.28,-0.72 0.44,-1.51 0.44,-2.33 0,-0.82 -0.16,-1.59 -0.43,-2.31l-2.33,2.32zM19.53,6.71l-1.26,1.26c0.63,1.21 0.98,2.57 0.98,4.02s-0.36,2.82 -0.98,4.02l1.2,1.2c0.97,-1.54 1.54,-3.36 1.54,-5.31 -0.01,-1.89 -0.55,-3.67 -1.48,-5.19zM15.71,7.71L10,2L9,2v7.59L4.41,5 3,6.41 8.59,12 3,17.59 4.41,19 9,14.41L9,22h1l5.71,-5.71 -4.3,-4.29 4.3,-4.29zM11,5.83l1.88,1.88L11,9.59L11,5.83zM12.88,16.29L11,18.17v-3.76l1.88,1.88z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/bluetooth_connected.xml b/qqq/android/mobileapp/src/main/res/drawable/bluetooth_connected.xml new file mode 100644 index 0000000..a2e049c --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/bluetooth_connected.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/bluetooth_connected/materialicons/black/res/drawable/baseline_bluetooth_connected_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M7,12l-2,-2 -2,2 2,2 2,-2zM17.71,7.71L12,2h-1v7.59L6.41,5 5,6.41 10.59,12 5,17.59 6.41,19 11,14.41L11,22h1l5.71,-5.71 -4.3,-4.29 4.3,-4.29zM13,5.83l1.88,1.88L13,9.59L13,5.83zM14.88,16.29L13,18.17v-3.76l1.88,1.88zM19,10l-2,2 2,2 2,-2 -2,-2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/bluetooth_disabled.xml b/qqq/android/mobileapp/src/main/res/drawable/bluetooth_disabled.xml new file mode 100644 index 0000000..190785a --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/bluetooth_disabled.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/bluetooth_disabled/materialicons/black/res/drawable/baseline_bluetooth_disabled_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M13,5.83l1.88,1.88 -1.6,1.6 1.41,1.41 3.02,-3.02L12,2h-1v5.03l2,2v-3.2zM5.41,4L4,5.41 10.59,12 5,17.59 6.41,19 11,14.41V22h1l4.29,-4.29 2.3,2.29L20,18.59 5.41,4zM13,18.17v-3.76l1.88,1.88L13,18.17z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/bluetooth_drive.xml b/qqq/android/mobileapp/src/main/res/drawable/bluetooth_drive.xml new file mode 100644 index 0000000..3ce6bed --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/bluetooth_drive.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/bluetooth_drive/materialicons/black/res/drawable/baseline_bluetooth_drive_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M15,10H4.81l1.04,-3H15V5H5.5C4.84,5 4.29,5.42 4.08,6.01L2,12v8c0,0.55 0.45,1 1,1h1c0.55,0 1,-0.45 1,-1v-1h12v1c0,0.55 0.45,1 1,1h1c0.55,0 1,-0.45 1,-1v-8h-3C15.9,12 15,11.1 15,10zM6.5,16C5.67,16 5,15.33 5,14.5S5.67,13 6.5,13S8,13.67 8,14.5S7.33,16 6.5,16zM15.5,16c-0.83,0 -1.5,-0.67 -1.5,-1.5s0.67,-1.5 1.5,-1.5s1.5,0.67 1.5,1.5S16.33,16 15.5,16z" /> + <path + android:fillColor="#FF000000" + android:pathData="M22,3.85L19.15,1h-0.5v3.79l-2.3,-2.29l-0.7,0.7L18.44,6l-2.79,2.79l0.7,0.71l2.3,-2.3V11h0.5L22,8.14L19.85,6L22,3.85zM19.65,2.91l0.94,0.94l-0.94,0.94V2.91zM20.59,8.14l-0.94,0.94V7.2L20.59,8.14z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/bluetooth_searching.xml b/qqq/android/mobileapp/src/main/res/drawable/bluetooth_searching.xml new file mode 100644 index 0000000..7e68ed4 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/bluetooth_searching.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/bluetooth_searching/materialicons/black/res/drawable/baseline_bluetooth_searching_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M14.24,12.01l2.32,2.32c0.28,-0.72 0.44,-1.51 0.44,-2.33 0,-0.82 -0.16,-1.59 -0.43,-2.31l-2.33,2.32zM19.53,6.71l-1.26,1.26c0.63,1.21 0.98,2.57 0.98,4.02s-0.36,2.82 -0.98,4.02l1.2,1.2c0.97,-1.54 1.54,-3.36 1.54,-5.31 -0.01,-1.89 -0.55,-3.67 -1.48,-5.19zM15.71,7.71L10,2L9,2v7.59L4.41,5 3,6.41 8.59,12 3,17.59 4.41,19 9,14.41L9,22h1l5.71,-5.71 -4.3,-4.29 4.3,-4.29zM11,5.83l1.88,1.88L11,9.59L11,5.83zM12.88,16.29L11,18.17v-3.76l1.88,1.88z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/blur_circular.xml b/qqq/android/mobileapp/src/main/res/drawable/blur_circular.xml new file mode 100644 index 0000000..25f5bb4 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/blur_circular.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/blur_circular/materialicons/black/res/drawable/baseline_blur_circular_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M10,9c-0.55,0 -1,0.45 -1,1s0.45,1 1,1 1,-0.45 1,-1 -0.45,-1 -1,-1zM10,13c-0.55,0 -1,0.45 -1,1s0.45,1 1,1 1,-0.45 1,-1 -0.45,-1 -1,-1zM7,9.5c-0.28,0 -0.5,0.22 -0.5,0.5s0.22,0.5 0.5,0.5 0.5,-0.22 0.5,-0.5 -0.22,-0.5 -0.5,-0.5zM10,16.5c-0.28,0 -0.5,0.22 -0.5,0.5s0.22,0.5 0.5,0.5 0.5,-0.22 0.5,-0.5 -0.22,-0.5 -0.5,-0.5zM7,13.5c-0.28,0 -0.5,0.22 -0.5,0.5s0.22,0.5 0.5,0.5 0.5,-0.22 0.5,-0.5 -0.22,-0.5 -0.5,-0.5zM10,7.5c0.28,0 0.5,-0.22 0.5,-0.5s-0.22,-0.5 -0.5,-0.5 -0.5,0.22 -0.5,0.5 0.22,0.5 0.5,0.5zM14,9c-0.55,0 -1,0.45 -1,1s0.45,1 1,1 1,-0.45 1,-1 -0.45,-1 -1,-1zM14,7.5c0.28,0 0.5,-0.22 0.5,-0.5s-0.22,-0.5 -0.5,-0.5 -0.5,0.22 -0.5,0.5 0.22,0.5 0.5,0.5zM17,13.5c-0.28,0 -0.5,0.22 -0.5,0.5s0.22,0.5 0.5,0.5 0.5,-0.22 0.5,-0.5 -0.22,-0.5 -0.5,-0.5zM17,9.5c-0.28,0 -0.5,0.22 -0.5,0.5s0.22,0.5 0.5,0.5 0.5,-0.22 0.5,-0.5 -0.22,-0.5 -0.5,-0.5zM12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM12,20c-4.42,0 -8,-3.58 -8,-8s3.58,-8 8,-8 8,3.58 8,8 -3.58,8 -8,8zM14,16.5c-0.28,0 -0.5,0.22 -0.5,0.5s0.22,0.5 0.5,0.5 0.5,-0.22 0.5,-0.5 -0.22,-0.5 -0.5,-0.5zM14,13c-0.55,0 -1,0.45 -1,1s0.45,1 1,1 1,-0.45 1,-1 -0.45,-1 -1,-1z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/blur_linear.xml b/qqq/android/mobileapp/src/main/res/drawable/blur_linear.xml new file mode 100644 index 0000000..9ac008b --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/blur_linear.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/blur_linear/materialicons/black/res/drawable/baseline_blur_linear_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M5,17.5c0.83,0 1.5,-0.67 1.5,-1.5s-0.67,-1.5 -1.5,-1.5 -1.5,0.67 -1.5,1.5 0.67,1.5 1.5,1.5zM9,13c0.55,0 1,-0.45 1,-1s-0.45,-1 -1,-1 -1,0.45 -1,1 0.45,1 1,1zM9,9c0.55,0 1,-0.45 1,-1s-0.45,-1 -1,-1 -1,0.45 -1,1 0.45,1 1,1zM3,21h18v-2L3,19v2zM5,9.5c0.83,0 1.5,-0.67 1.5,-1.5S5.83,6.5 5,6.5 3.5,7.17 3.5,8 4.17,9.5 5,9.5zM5,13.5c0.83,0 1.5,-0.67 1.5,-1.5s-0.67,-1.5 -1.5,-1.5 -1.5,0.67 -1.5,1.5 0.67,1.5 1.5,1.5zM9,17c0.55,0 1,-0.45 1,-1s-0.45,-1 -1,-1 -1,0.45 -1,1 0.45,1 1,1zM17,16.5c0.28,0 0.5,-0.22 0.5,-0.5s-0.22,-0.5 -0.5,-0.5 -0.5,0.22 -0.5,0.5 0.22,0.5 0.5,0.5zM3,3v2h18L21,3L3,3zM17,8.5c0.28,0 0.5,-0.22 0.5,-0.5s-0.22,-0.5 -0.5,-0.5 -0.5,0.22 -0.5,0.5 0.22,0.5 0.5,0.5zM17,12.5c0.28,0 0.5,-0.22 0.5,-0.5s-0.22,-0.5 -0.5,-0.5 -0.5,0.22 -0.5,0.5 0.22,0.5 0.5,0.5zM13,9c0.55,0 1,-0.45 1,-1s-0.45,-1 -1,-1 -1,0.45 -1,1 0.45,1 1,1zM13,13c0.55,0 1,-0.45 1,-1s-0.45,-1 -1,-1 -1,0.45 -1,1 0.45,1 1,1zM13,17c0.55,0 1,-0.45 1,-1s-0.45,-1 -1,-1 -1,0.45 -1,1 0.45,1 1,1z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/blur_off.xml b/qqq/android/mobileapp/src/main/res/drawable/blur_off.xml new file mode 100644 index 0000000..e2ac095 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/blur_off.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/blur_off/materialicons/black/res/drawable/baseline_blur_off_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M14,7c0.55,0 1,-0.45 1,-1s-0.45,-1 -1,-1 -1,0.45 -1,1 0.45,1 1,1zM13.8,11.48l0.2,0.02c0.83,0 1.5,-0.67 1.5,-1.5s-0.67,-1.5 -1.5,-1.5 -1.5,0.67 -1.5,1.5l0.02,0.2c0.09,0.67 0.61,1.19 1.28,1.28zM14,3.5c0.28,0 0.5,-0.22 0.5,-0.5s-0.22,-0.5 -0.5,-0.5 -0.5,0.22 -0.5,0.5 0.22,0.5 0.5,0.5zM10,3.5c0.28,0 0.5,-0.22 0.5,-0.5s-0.22,-0.5 -0.5,-0.5 -0.5,0.22 -0.5,0.5 0.22,0.5 0.5,0.5zM21,10.5c0.28,0 0.5,-0.22 0.5,-0.5s-0.22,-0.5 -0.5,-0.5 -0.5,0.22 -0.5,0.5 0.22,0.5 0.5,0.5zM10,7c0.55,0 1,-0.45 1,-1s-0.45,-1 -1,-1 -1,0.45 -1,1 0.45,1 1,1zM18,15c0.55,0 1,-0.45 1,-1s-0.45,-1 -1,-1 -1,0.45 -1,1 0.45,1 1,1zM18,11c0.55,0 1,-0.45 1,-1s-0.45,-1 -1,-1 -1,0.45 -1,1 0.45,1 1,1zM18,7c0.55,0 1,-0.45 1,-1s-0.45,-1 -1,-1 -1,0.45 -1,1 0.45,1 1,1zM14,20.5c-0.28,0 -0.5,0.22 -0.5,0.5s0.22,0.5 0.5,0.5 0.5,-0.22 0.5,-0.5 -0.22,-0.5 -0.5,-0.5zM2.5,5.27l3.78,3.78L6,9c-0.55,0 -1,0.45 -1,1s0.45,1 1,1 1,-0.45 1,-1c0,-0.1 -0.03,-0.19 -0.06,-0.28l2.81,2.81c-0.71,0.11 -1.25,0.73 -1.25,1.47 0,0.83 0.67,1.5 1.5,1.5 0.74,0 1.36,-0.54 1.47,-1.25l2.81,2.81c-0.09,-0.03 -0.18,-0.06 -0.28,-0.06 -0.55,0 -1,0.45 -1,1s0.45,1 1,1 1,-0.45 1,-1c0,-0.1 -0.03,-0.19 -0.06,-0.28l3.78,3.78L20,20.23 3.77,4 2.5,5.27zM10,17c-0.55,0 -1,0.45 -1,1s0.45,1 1,1 1,-0.45 1,-1 -0.45,-1 -1,-1zM21,13.5c-0.28,0 -0.5,0.22 -0.5,0.5s0.22,0.5 0.5,0.5 0.5,-0.22 0.5,-0.5 -0.22,-0.5 -0.5,-0.5zM6,13c-0.55,0 -1,0.45 -1,1s0.45,1 1,1 1,-0.45 1,-1 -0.45,-1 -1,-1zM3,9.5c-0.28,0 -0.5,0.22 -0.5,0.5s0.22,0.5 0.5,0.5 0.5,-0.22 0.5,-0.5 -0.22,-0.5 -0.5,-0.5zM10,20.5c-0.28,0 -0.5,0.22 -0.5,0.5s0.22,0.5 0.5,0.5 0.5,-0.22 0.5,-0.5 -0.22,-0.5 -0.5,-0.5zM6,17c-0.55,0 -1,0.45 -1,1s0.45,1 1,1 1,-0.45 1,-1 -0.45,-1 -1,-1zM3,13.5c-0.28,0 -0.5,0.22 -0.5,0.5s0.22,0.5 0.5,0.5 0.5,-0.22 0.5,-0.5 -0.22,-0.5 -0.5,-0.5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/blur_on.xml b/qqq/android/mobileapp/src/main/res/drawable/blur_on.xml new file mode 100644 index 0000000..54ccd9c --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/blur_on.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/blur_on/materialicons/black/res/drawable/baseline_blur_on_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M6,13c-0.55,0 -1,0.45 -1,1s0.45,1 1,1 1,-0.45 1,-1 -0.45,-1 -1,-1zM6,17c-0.55,0 -1,0.45 -1,1s0.45,1 1,1 1,-0.45 1,-1 -0.45,-1 -1,-1zM6,9c-0.55,0 -1,0.45 -1,1s0.45,1 1,1 1,-0.45 1,-1 -0.45,-1 -1,-1zM3,9.5c-0.28,0 -0.5,0.22 -0.5,0.5s0.22,0.5 0.5,0.5 0.5,-0.22 0.5,-0.5 -0.22,-0.5 -0.5,-0.5zM6,5c-0.55,0 -1,0.45 -1,1s0.45,1 1,1 1,-0.45 1,-1 -0.45,-1 -1,-1zM21,10.5c0.28,0 0.5,-0.22 0.5,-0.5s-0.22,-0.5 -0.5,-0.5 -0.5,0.22 -0.5,0.5 0.22,0.5 0.5,0.5zM14,7c0.55,0 1,-0.45 1,-1s-0.45,-1 -1,-1 -1,0.45 -1,1 0.45,1 1,1zM14,3.5c0.28,0 0.5,-0.22 0.5,-0.5s-0.22,-0.5 -0.5,-0.5 -0.5,0.22 -0.5,0.5 0.22,0.5 0.5,0.5zM3,13.5c-0.28,0 -0.5,0.22 -0.5,0.5s0.22,0.5 0.5,0.5 0.5,-0.22 0.5,-0.5 -0.22,-0.5 -0.5,-0.5zM10,20.5c-0.28,0 -0.5,0.22 -0.5,0.5s0.22,0.5 0.5,0.5 0.5,-0.22 0.5,-0.5 -0.22,-0.5 -0.5,-0.5zM10,3.5c0.28,0 0.5,-0.22 0.5,-0.5s-0.22,-0.5 -0.5,-0.5 -0.5,0.22 -0.5,0.5 0.22,0.5 0.5,0.5zM10,7c0.55,0 1,-0.45 1,-1s-0.45,-1 -1,-1 -1,0.45 -1,1 0.45,1 1,1zM10,12.5c-0.83,0 -1.5,0.67 -1.5,1.5s0.67,1.5 1.5,1.5 1.5,-0.67 1.5,-1.5 -0.67,-1.5 -1.5,-1.5zM18,13c-0.55,0 -1,0.45 -1,1s0.45,1 1,1 1,-0.45 1,-1 -0.45,-1 -1,-1zM18,17c-0.55,0 -1,0.45 -1,1s0.45,1 1,1 1,-0.45 1,-1 -0.45,-1 -1,-1zM18,9c-0.55,0 -1,0.45 -1,1s0.45,1 1,1 1,-0.45 1,-1 -0.45,-1 -1,-1zM18,5c-0.55,0 -1,0.45 -1,1s0.45,1 1,1 1,-0.45 1,-1 -0.45,-1 -1,-1zM21,13.5c-0.28,0 -0.5,0.22 -0.5,0.5s0.22,0.5 0.5,0.5 0.5,-0.22 0.5,-0.5 -0.22,-0.5 -0.5,-0.5zM14,17c-0.55,0 -1,0.45 -1,1s0.45,1 1,1 1,-0.45 1,-1 -0.45,-1 -1,-1zM14,20.5c-0.28,0 -0.5,0.22 -0.5,0.5s0.22,0.5 0.5,0.5 0.5,-0.22 0.5,-0.5 -0.22,-0.5 -0.5,-0.5zM10,8.5c-0.83,0 -1.5,0.67 -1.5,1.5s0.67,1.5 1.5,1.5 1.5,-0.67 1.5,-1.5 -0.67,-1.5 -1.5,-1.5zM10,17c-0.55,0 -1,0.45 -1,1s0.45,1 1,1 1,-0.45 1,-1 -0.45,-1 -1,-1zM14,12.5c-0.83,0 -1.5,0.67 -1.5,1.5s0.67,1.5 1.5,1.5 1.5,-0.67 1.5,-1.5 -0.67,-1.5 -1.5,-1.5zM14,8.5c-0.83,0 -1.5,0.67 -1.5,1.5s0.67,1.5 1.5,1.5 1.5,-0.67 1.5,-1.5 -0.67,-1.5 -1.5,-1.5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/bolt.xml b/qqq/android/mobileapp/src/main/res/drawable/bolt.xml new file mode 100644 index 0000000..dd629a7 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/bolt.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/content/bolt/materialicons/black/res/drawable/baseline_bolt_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M11,21h-1l1,-7H7.5c-0.58,0 -0.57,-0.32 -0.38,-0.66 0.19,-0.34 0.05,-0.08 0.07,-0.12C8.48,10.94 10.42,7.54 13,3h1l-1,7h3.5c0.49,0 0.56,0.33 0.47,0.51l-0.07,0.15C12.96,17.55 11,21 11,21z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/book.xml b/qqq/android/mobileapp/src/main/res/drawable/book.xml new file mode 100644 index 0000000..a246590 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/book.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/book/materialicons/black/res/drawable/baseline_book_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M18,2H6c-1.1,0 -2,0.9 -2,2v16c0,1.1 0.9,2 2,2h12c1.1,0 2,-0.9 2,-2V4c0,-1.1 -0.9,-2 -2,-2zM6,4h5v8l-2.5,-1.5L6,12V4z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/book_online.xml b/qqq/android/mobileapp/src/main/res/drawable/book_online.xml new file mode 100644 index 0000000..c64a5d0 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/book_online.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/book_online/materialicons/black/res/drawable/baseline_book_online_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M17,1H7C5.9,1 5,1.9 5,3v18c0,1.1 0.9,2 2,2h10c1.1,0 2,-0.9 2,-2V3C19,1.9 18.1,1 17,1zM7,18V6h10v12H7zM16,11V9.14C16,8.51 15.55,8 15,8H9C8.45,8 8,8.51 8,9.14l0,1.96c0.55,0 1,0.45 1,1c0,0.55 -0.45,1 -1,1l0,1.76C8,15.49 8.45,16 9,16h6c0.55,0 1,-0.51 1,-1.14V13c-0.55,0 -1,-0.45 -1,-1C15,11.45 15.45,11 16,11zM12.5,14.5h-1v-1h1V14.5zM12.5,12.5h-1v-1h1V12.5zM12.5,10.5h-1v-1h1V10.5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/bookmark.xml b/qqq/android/mobileapp/src/main/res/drawable/bookmark.xml new file mode 100644 index 0000000..befd33e --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/bookmark.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/bookmark/materialicons/black/res/drawable/baseline_bookmark_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M17,3H7c-1.1,0 -1.99,0.9 -1.99,2L5,21l7,-3 7,3V5c0,-1.1 -0.9,-2 -2,-2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/bookmark_add.xml b/qqq/android/mobileapp/src/main/res/drawable/bookmark_add.xml new file mode 100644 index 0000000..b2b9e0d --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/bookmark_add.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/bookmark_add/materialicons/black/res/drawable/baseline_bookmark_add_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M21,7h-2v2h-2V7h-2V5h2V3h2v2h2V7zM19,21l-7,-3l-7,3V5c0,-1.1 0.9,-2 2,-2l7,0c-0.63,0.84 -1,1.87 -1,3c0,2.76 2.24,5 5,5c0.34,0 0.68,-0.03 1,-0.1V21z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/bookmark_added.xml b/qqq/android/mobileapp/src/main/res/drawable/bookmark_added.xml new file mode 100644 index 0000000..2bd67fc --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/bookmark_added.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/bookmark_added/materialicons/black/res/drawable/baseline_bookmark_added_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19,21l-7,-3l-7,3V5c0,-1.1 0.9,-2 2,-2l7,0c-0.63,0.84 -1,1.87 -1,3c0,2.76 2.24,5 5,5c0.34,0 0.68,-0.03 1,-0.1V21zM17.83,9L15,6.17l1.41,-1.41l1.41,1.41l3.54,-3.54l1.41,1.41L17.83,9z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/bookmark_border.xml b/qqq/android/mobileapp/src/main/res/drawable/bookmark_border.xml new file mode 100644 index 0000000..72d91cb --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/bookmark_border.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/bookmark_border/materialicons/black/res/drawable/baseline_bookmark_border_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M17,3L7,3c-1.1,0 -1.99,0.9 -1.99,2L5,21l7,-3 7,3L19,5c0,-1.1 -0.9,-2 -2,-2zM17,18l-5,-2.18L7,18L7,5h10v13z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/bookmark_remove.xml b/qqq/android/mobileapp/src/main/res/drawable/bookmark_remove.xml new file mode 100644 index 0000000..8fc89e5 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/bookmark_remove.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/bookmark_remove/materialicons/black/res/drawable/baseline_bookmark_remove_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M21,7h-6V5h6V7zM19,10.9c-0.32,0.07 -0.66,0.1 -1,0.1c-2.76,0 -5,-2.24 -5,-5c0,-1.13 0.37,-2.16 1,-3L7,3C5.9,3 5,3.9 5,5v16l7,-3l7,3V10.9z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/bookmarks.xml b/qqq/android/mobileapp/src/main/res/drawable/bookmarks.xml new file mode 100644 index 0000000..7205bfc --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/bookmarks.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/bookmarks/materialicons/black/res/drawable/baseline_bookmarks_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19,18l2,1V3c0,-1.1 -0.9,-2 -2,-2H8.99C7.89,1 7,1.9 7,3h10c1.1,0 2,0.9 2,2v13zM15,5H5c-1.1,0 -2,0.9 -2,2v16l7,-3 7,3V7c0,-1.1 -0.9,-2 -2,-2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/border_all.xml b/qqq/android/mobileapp/src/main/res/drawable/border_all.xml new file mode 100644 index 0000000..ced3dbc --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/border_all.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/editor/border_all/materialicons/black/res/drawable/baseline_border_all_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M3,3v18h18L21,3L3,3zM11,19L5,19v-6h6v6zM11,11L5,11L5,5h6v6zM19,19h-6v-6h6v6zM19,11h-6L13,5h6v6z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/border_bottom.xml b/qqq/android/mobileapp/src/main/res/drawable/border_bottom.xml new file mode 100644 index 0000000..8dbe5af --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/border_bottom.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/editor/border_bottom/materialicons/black/res/drawable/baseline_border_bottom_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M9,11L7,11v2h2v-2zM13,15h-2v2h2v-2zM9,3L7,3v2h2L9,3zM13,11h-2v2h2v-2zM5,3L3,3v2h2L5,3zM13,7h-2v2h2L13,7zM17,11h-2v2h2v-2zM13,3h-2v2h2L13,3zM17,3h-2v2h2L17,3zM19,13h2v-2h-2v2zM19,17h2v-2h-2v2zM5,7L3,7v2h2L5,7zM19,3v2h2L21,3h-2zM19,9h2L21,7h-2v2zM5,11L3,11v2h2v-2zM3,21h18v-2L3,19v2zM5,15L3,15v2h2v-2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/border_clear.xml b/qqq/android/mobileapp/src/main/res/drawable/border_clear.xml new file mode 100644 index 0000000..00534d1 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/border_clear.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/editor/border_clear/materialicons/black/res/drawable/baseline_border_clear_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M7,5h2L9,3L7,3v2zM7,13h2v-2L7,11v2zM7,21h2v-2L7,19v2zM11,17h2v-2h-2v2zM11,21h2v-2h-2v2zM3,21h2v-2L3,19v2zM3,17h2v-2L3,15v2zM3,13h2v-2L3,11v2zM3,9h2L5,7L3,7v2zM3,5h2L5,3L3,3v2zM11,13h2v-2h-2v2zM19,17h2v-2h-2v2zM19,13h2v-2h-2v2zM19,21h2v-2h-2v2zM19,9h2L21,7h-2v2zM11,9h2L13,7h-2v2zM19,3v2h2L21,3h-2zM11,5h2L13,3h-2v2zM15,21h2v-2h-2v2zM15,13h2v-2h-2v2zM15,5h2L17,3h-2v2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/border_color.xml b/qqq/android/mobileapp/src/main/res/drawable/border_color.xml new file mode 100644 index 0000000..ccd6525 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/border_color.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/editor/border_color/materialicons/black/res/drawable/baseline_border_color_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M22,24H2v-4h20V24zM13.06,5.19l3.75,3.75L7.75,18H4v-3.75L13.06,5.19zM17.88,7.87l-3.75,-3.75l1.83,-1.83c0.39,-0.39 1.02,-0.39 1.41,0l2.34,2.34c0.39,0.39 0.39,1.02 0,1.41L17.88,7.87z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/border_horizontal.xml b/qqq/android/mobileapp/src/main/res/drawable/border_horizontal.xml new file mode 100644 index 0000000..b8af047 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/border_horizontal.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/editor/border_horizontal/materialicons/black/res/drawable/baseline_border_horizontal_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M3,21h2v-2L3,19v2zM5,7L3,7v2h2L5,7zM3,17h2v-2L3,15v2zM7,21h2v-2L7,19v2zM5,3L3,3v2h2L5,3zM9,3L7,3v2h2L9,3zM17,3h-2v2h2L17,3zM13,7h-2v2h2L13,7zM13,3h-2v2h2L13,3zM19,17h2v-2h-2v2zM11,21h2v-2h-2v2zM3,13h18v-2L3,11v2zM19,3v2h2L21,3h-2zM19,9h2L21,7h-2v2zM11,17h2v-2h-2v2zM15,21h2v-2h-2v2zM19,21h2v-2h-2v2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/border_inner.xml b/qqq/android/mobileapp/src/main/res/drawable/border_inner.xml new file mode 100644 index 0000000..87364ce --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/border_inner.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/editor/border_inner/materialicons/black/res/drawable/baseline_border_inner_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M3,21h2v-2L3,19v2zM7,21h2v-2L7,19v2zM5,7L3,7v2h2L5,7zM3,17h2v-2L3,15v2zM9,3L7,3v2h2L9,3zM5,3L3,3v2h2L5,3zM17,3h-2v2h2L17,3zM19,9h2L21,7h-2v2zM19,3v2h2L21,3h-2zM15,21h2v-2h-2v2zM13,3h-2v8L3,11v2h8v8h2v-8h8v-2h-8L13,3zM19,21h2v-2h-2v2zM19,17h2v-2h-2v2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/border_left.xml b/qqq/android/mobileapp/src/main/res/drawable/border_left.xml new file mode 100644 index 0000000..e206285 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/border_left.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/editor/border_left/materialicons/black/res/drawable/baseline_border_left_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M11,21h2v-2h-2v2zM11,17h2v-2h-2v2zM11,5h2L13,3h-2v2zM11,9h2L13,7h-2v2zM11,13h2v-2h-2v2zM7,21h2v-2L7,19v2zM7,5h2L9,3L7,3v2zM7,13h2v-2L7,11v2zM3,21h2L5,3L3,3v18zM19,9h2L21,7h-2v2zM15,21h2v-2h-2v2zM19,17h2v-2h-2v2zM19,3v2h2L21,3h-2zM19,13h2v-2h-2v2zM19,21h2v-2h-2v2zM15,13h2v-2h-2v2zM15,5h2L17,3h-2v2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/border_outer.xml b/qqq/android/mobileapp/src/main/res/drawable/border_outer.xml new file mode 100644 index 0000000..e7b6a42 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/border_outer.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/editor/border_outer/materialicons/black/res/drawable/baseline_border_outer_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M13,7h-2v2h2L13,7zM13,11h-2v2h2v-2zM17,11h-2v2h2v-2zM3,3v18h18L21,3L3,3zM19,19L5,19L5,5h14v14zM13,15h-2v2h2v-2zM9,11L7,11v2h2v-2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/border_right.xml b/qqq/android/mobileapp/src/main/res/drawable/border_right.xml new file mode 100644 index 0000000..e7577b5 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/border_right.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/editor/border_right/materialicons/black/res/drawable/baseline_border_right_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M7,21h2v-2L7,19v2zM3,5h2L5,3L3,3v2zM7,5h2L9,3L7,3v2zM7,13h2v-2L7,11v2zM3,21h2v-2L3,19v2zM11,21h2v-2h-2v2zM3,13h2v-2L3,11v2zM3,17h2v-2L3,15v2zM3,9h2L5,7L3,7v2zM11,17h2v-2h-2v2zM15,13h2v-2h-2v2zM19,3v18h2L21,3h-2zM15,21h2v-2h-2v2zM15,5h2L17,3h-2v2zM11,13h2v-2h-2v2zM11,5h2L13,3h-2v2zM11,9h2L13,7h-2v2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/border_style.xml b/qqq/android/mobileapp/src/main/res/drawable/border_style.xml new file mode 100644 index 0000000..aab6560 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/border_style.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/editor/border_style/materialicons/black/res/drawable/baseline_border_style_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M15,21h2v-2h-2v2zM19,21h2v-2h-2v2zM7,21h2v-2L7,19v2zM11,21h2v-2h-2v2zM19,17h2v-2h-2v2zM19,13h2v-2h-2v2zM3,3v18h2L5,5h16L21,3L3,3zM19,9h2L21,7h-2v2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/border_top.xml b/qqq/android/mobileapp/src/main/res/drawable/border_top.xml new file mode 100644 index 0000000..11fdee1 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/border_top.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/editor/border_top/materialicons/black/res/drawable/baseline_border_top_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M7,21h2v-2L7,19v2zM7,13h2v-2L7,11v2zM11,13h2v-2h-2v2zM11,21h2v-2h-2v2zM3,17h2v-2L3,15v2zM3,21h2v-2L3,19v2zM3,13h2v-2L3,11v2zM3,9h2L5,7L3,7v2zM11,17h2v-2h-2v2zM19,9h2L21,7h-2v2zM19,13h2v-2h-2v2zM3,3v2h18L21,3L3,3zM19,17h2v-2h-2v2zM15,21h2v-2h-2v2zM11,9h2L13,7h-2v2zM19,21h2v-2h-2v2zM15,13h2v-2h-2v2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/border_vertical.xml b/qqq/android/mobileapp/src/main/res/drawable/border_vertical.xml new file mode 100644 index 0000000..d801fa0 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/border_vertical.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/editor/border_vertical/materialicons/black/res/drawable/baseline_border_vertical_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M3,9h2L5,7L3,7v2zM3,5h2L5,3L3,3v2zM7,21h2v-2L7,19v2zM7,13h2v-2L7,11v2zM3,13h2v-2L3,11v2zM3,21h2v-2L3,19v2zM3,17h2v-2L3,15v2zM7,5h2L9,3L7,3v2zM19,17h2v-2h-2v2zM11,21h2L13,3h-2v18zM19,21h2v-2h-2v2zM19,13h2v-2h-2v2zM19,3v2h2L21,3h-2zM19,9h2L21,7h-2v2zM15,5h2L17,3h-2v2zM15,21h2v-2h-2v2zM15,13h2v-2h-2v2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/boy.xml b/qqq/android/mobileapp/src/main/res/drawable/boy.xml new file mode 100644 index 0000000..7dc3c42 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/boy.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/boy/materialicons/black/res/drawable/baseline_boy_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,7.5c0.97,0 1.75,-0.78 1.75,-1.75S12.97,4 12,4s-1.75,0.78 -1.75,1.75S11.03,7.5 12,7.5zM14,20v-5h1v-4.5c0,-1.1 -0.9,-2 -2,-2h-2c-1.1,0 -2,0.9 -2,2V15h1v5H14z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/branding_watermark.xml b/qqq/android/mobileapp/src/main/res/drawable/branding_watermark.xml new file mode 100644 index 0000000..b7fe544 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/branding_watermark.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/av/branding_watermark/materialicons/black/res/drawable/baseline_branding_watermark_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M21,3L3,3c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h18c1.1,0 2,-0.9 2,-2L23,5c0,-1.1 -0.9,-2 -2,-2zM21,19h-9v-6h9v6z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/breakfast_dining.xml b/qqq/android/mobileapp/src/main/res/drawable/breakfast_dining.xml new file mode 100644 index 0000000..4c59b67 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/breakfast_dining.xml @@ -0,0 +1,20 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/breakfast_dining/materialicons/black/res/drawable/baseline_breakfast_dining_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M18,3H6C3.79,3 2,4.79 2,7c0,1.48 0.81,2.75 2,3.45V19c0,1.1 0.9,2 2,2h12c1.1,0 2,-0.9 2,-2v-8.55c1.19,-0.69 2,-1.97 2,-3.45C22,4.79 20.21,3 18,3zM14,15h-4v-4h4V15z" + android:fillType="evenOdd" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/brightness_1.xml b/qqq/android/mobileapp/src/main/res/drawable/brightness_1.xml new file mode 100644 index 0000000..0a9c0d8 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/brightness_1.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/brightness_1/materialicons/black/res/drawable/baseline_brightness_1_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,12m-10,0a10,10 0,1 1,20 0a10,10 0,1 1,-20 0" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/brightness_2.xml b/qqq/android/mobileapp/src/main/res/drawable/brightness_2.xml new file mode 100644 index 0000000..da7f8fe --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/brightness_2.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/brightness_2/materialicons/black/res/drawable/baseline_brightness_2_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M10,2c-1.82,0 -3.53,0.5 -5,1.35C7.99,5.08 10,8.3 10,12s-2.01,6.92 -5,8.65C6.47,21.5 8.18,22 10,22c5.52,0 10,-4.48 10,-10S15.52,2 10,2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/brightness_3.xml b/qqq/android/mobileapp/src/main/res/drawable/brightness_3.xml new file mode 100644 index 0000000..ad867e5 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/brightness_3.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/brightness_3/materialicons/black/res/drawable/baseline_brightness_3_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M9,2c-1.05,0 -2.05,0.16 -3,0.46 4.06,1.27 7,5.06 7,9.54 0,4.48 -2.94,8.27 -7,9.54 0.95,0.3 1.95,0.46 3,0.46 5.52,0 10,-4.48 10,-10S14.52,2 9,2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/brightness_4.xml b/qqq/android/mobileapp/src/main/res/drawable/brightness_4.xml new file mode 100644 index 0000000..af0953e --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/brightness_4.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/brightness_4/materialicons/black/res/drawable/baseline_brightness_4_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,8.69V4h-4.69L12,0.69 8.69,4H4v4.69L0.69,12 4,15.31V20h4.69L12,23.31 15.31,20H20v-4.69L23.31,12 20,8.69zM12,18c-0.89,0 -1.74,-0.2 -2.5,-0.55C11.56,16.5 13,14.42 13,12s-1.44,-4.5 -3.5,-5.45C10.26,6.2 11.11,6 12,6c3.31,0 6,2.69 6,6s-2.69,6 -6,6z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/brightness_5.xml b/qqq/android/mobileapp/src/main/res/drawable/brightness_5.xml new file mode 100644 index 0000000..19df3da --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/brightness_5.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/brightness_5/materialicons/black/res/drawable/baseline_brightness_5_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,15.31L23.31,12 20,8.69V4h-4.69L12,0.69 8.69,4H4v4.69L0.69,12 4,15.31V20h4.69L12,23.31 15.31,20H20v-4.69zM12,18c-3.31,0 -6,-2.69 -6,-6s2.69,-6 6,-6 6,2.69 6,6 -2.69,6 -6,6z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/brightness_6.xml b/qqq/android/mobileapp/src/main/res/drawable/brightness_6.xml new file mode 100644 index 0000000..db6bc8a --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/brightness_6.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/brightness_6/materialicons/black/res/drawable/baseline_brightness_6_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,15.31L23.31,12 20,8.69V4h-4.69L12,0.69 8.69,4H4v4.69L0.69,12 4,15.31V20h4.69L12,23.31 15.31,20H20v-4.69zM12,18V6c3.31,0 6,2.69 6,6s-2.69,6 -6,6z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/brightness_7.xml b/qqq/android/mobileapp/src/main/res/drawable/brightness_7.xml new file mode 100644 index 0000000..76adf4e --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/brightness_7.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/brightness_7/materialicons/black/res/drawable/baseline_brightness_7_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,8.69L20,4h-4.69L12,0.69 8.69,4L4,4v4.69L0.69,12 4,15.31L4,20h4.69L12,23.31 15.31,20L20,20v-4.69L23.31,12 20,8.69zM12,18c-3.31,0 -6,-2.69 -6,-6s2.69,-6 6,-6 6,2.69 6,6 -2.69,6 -6,6zM12,8c-2.21,0 -4,1.79 -4,4s1.79,4 4,4 4,-1.79 4,-4 -1.79,-4 -4,-4z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/brightness_auto.xml b/qqq/android/mobileapp/src/main/res/drawable/brightness_auto.xml new file mode 100644 index 0000000..894837a --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/brightness_auto.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/brightness_auto/materialicons/black/res/drawable/baseline_brightness_auto_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M10.85,12.65h2.3L12,9l-1.15,3.65zM20,8.69V4h-4.69L12,0.69 8.69,4H4v4.69L0.69,12 4,15.31V20h4.69L12,23.31 15.31,20H20v-4.69L23.31,12 20,8.69zM14.3,16l-0.7,-2h-3.2l-0.7,2H7.8L11,7h2l3.2,9h-1.9z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/brightness_high.xml b/qqq/android/mobileapp/src/main/res/drawable/brightness_high.xml new file mode 100644 index 0000000..00f7785 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/brightness_high.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/brightness_high/materialicons/black/res/drawable/baseline_brightness_high_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,8.69L20,4h-4.69L12,0.69 8.69,4L4,4v4.69L0.69,12 4,15.31L4,20h4.69L12,23.31 15.31,20L20,20v-4.69L23.31,12 20,8.69zM12,18c-3.31,0 -6,-2.69 -6,-6s2.69,-6 6,-6 6,2.69 6,6 -2.69,6 -6,6zM12,8c-2.21,0 -4,1.79 -4,4s1.79,4 4,4 4,-1.79 4,-4 -1.79,-4 -4,-4z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/brightness_low.xml b/qqq/android/mobileapp/src/main/res/drawable/brightness_low.xml new file mode 100644 index 0000000..3a77ffb --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/brightness_low.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/brightness_low/materialicons/black/res/drawable/baseline_brightness_low_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,15.31L23.31,12 20,8.69V4h-4.69L12,0.69 8.69,4H4v4.69L0.69,12 4,15.31V20h4.69L12,23.31 15.31,20H20v-4.69zM12,18c-3.31,0 -6,-2.69 -6,-6s2.69,-6 6,-6 6,2.69 6,6 -2.69,6 -6,6z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/brightness_medium.xml b/qqq/android/mobileapp/src/main/res/drawable/brightness_medium.xml new file mode 100644 index 0000000..4d512a0 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/brightness_medium.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/brightness_medium/materialicons/black/res/drawable/baseline_brightness_medium_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,15.31L23.31,12 20,8.69V4h-4.69L12,0.69 8.69,4H4v4.69L0.69,12 4,15.31V20h4.69L12,23.31 15.31,20H20v-4.69zM12,18V6c3.31,0 6,2.69 6,6s-2.69,6 -6,6z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/broadcast_on_home.xml b/qqq/android/mobileapp/src/main/res/drawable/broadcast_on_home.xml new file mode 100644 index 0000000..924348b --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/broadcast_on_home.xml @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/home/broadcast_on_home/materialicons/black/res/drawable/baseline_broadcast_on_home_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M22,6c0,-1.1 -0.9,-2 -2,-2H4v2h16v2.59c0.73,0.29 1.4,0.69 2,1.17V6z" /> + <path + android:fillColor="#FF000000" + android:pathData="M8,9H3c-0.5,0 -1,0.5 -1,1v9c0,0.5 0.5,1 1,1h5c0.5,0 1,-0.5 1,-1v-9C9,9.5 8.5,9 8,9zM7,18H4v-7h3V18z" /> + <path + android:fillColor="#FF000000" + android:pathData="M17.75,16.97c0.3,-0.23 0.5,-0.57 0.5,-0.97c0,-0.69 -0.56,-1.25 -1.25,-1.25s-1.25,0.56 -1.25,1.25c0,0.4 0.2,0.75 0.5,0.97V22h1.5V16.97z" /> + <path + android:fillColor="#FF000000" + android:pathData="M17,13.5c1.38,0 2.5,1.12 2.5,2.5c0,0.69 -0.28,1.31 -0.73,1.76l1.06,1.06C20.55,18.1 21,17.1 21,16c0,-2.21 -1.79,-4 -4,-4c-2.21,0 -4,1.79 -4,4c0,1.1 0.45,2.1 1.17,2.83l1.06,-1.06c-0.45,-0.45 -0.73,-1.08 -0.73,-1.77C14.5,14.62 15.62,13.5 17,13.5z" /> + <path + android:fillColor="#FF000000" + android:pathData="M17,9.5c-3.59,0 -6.5,2.91 -6.5,6.5c0,1.79 0.73,3.42 1.9,4.6l1.06,-1.06C12.56,18.63 12,17.38 12,16c0,-2.76 2.24,-5 5,-5s5,2.24 5,5c0,1.37 -0.56,2.62 -1.46,3.52l1.07,1.06c1.17,-1.18 1.89,-2.8 1.89,-4.58C23.5,12.41 20.59,9.5 17,9.5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/broadcast_on_personal.xml b/qqq/android/mobileapp/src/main/res/drawable/broadcast_on_personal.xml new file mode 100644 index 0000000..c613115 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/broadcast_on_personal.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/home/broadcast_on_personal/materialicons/black/res/drawable/baseline_broadcast_on_personal_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M17,8c0.7,0 1.38,0.1 2.02,0.27L12,3L4,9v12h6.76C9.66,19.63 9,17.89 9,16C9,11.58 12.58,8 17,8z" /> + <path + android:fillColor="#FF000000" + android:pathData="M17,14.75c-0.69,0 -1.25,0.56 -1.25,1.25c0,0.4 0.2,0.75 0.5,0.97V22h1.5v-5.03c0.3,-0.23 0.5,-0.57 0.5,-0.97C18.25,15.31 17.69,14.75 17,14.75z" /> + <path + android:fillColor="#FF000000" + android:pathData="M17,12c-2.21,0 -4,1.79 -4,4c0,1.1 0.45,2.1 1.17,2.83l1.06,-1.06c-0.45,-0.45 -0.73,-1.08 -0.73,-1.77c0,-1.38 1.12,-2.5 2.5,-2.5s2.5,1.12 2.5,2.5c0,0.69 -0.28,1.31 -0.73,1.76l1.06,1.06C20.55,18.1 21,17.1 21,16C21,13.79 19.21,12 17,12z" /> + <path + android:fillColor="#FF000000" + android:pathData="M17,9.5c-3.59,0 -6.5,2.91 -6.5,6.5c0,1.79 0.73,3.42 1.9,4.6l1.06,-1.06C12.56,18.63 12,17.38 12,16c0,-2.76 2.24,-5 5,-5s5,2.24 5,5c0,1.37 -0.56,2.62 -1.46,3.52l1.07,1.06c1.17,-1.18 1.89,-2.8 1.89,-4.58C23.5,12.41 20.59,9.5 17,9.5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/broken_image.xml b/qqq/android/mobileapp/src/main/res/drawable/broken_image.xml new file mode 100644 index 0000000..52e6b22 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/broken_image.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/broken_image/materialicons/black/res/drawable/baseline_broken_image_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M21,5v6.59l-3,-3.01 -4,4.01 -4,-4 -4,4 -3,-3.01L3,5c0,-1.1 0.9,-2 2,-2h14c1.1,0 2,0.9 2,2zM18,11.42l3,3.01L21,19c0,1.1 -0.9,2 -2,2L5,21c-1.1,0 -2,-0.9 -2,-2v-6.58l3,2.99 4,-4 4,4 4,-3.99z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/browse_gallery.xml b/qqq/android/mobileapp/src/main/res/drawable/browse_gallery.xml new file mode 100644 index 0000000..1224e84 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/browse_gallery.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/browse_gallery/materialicons/black/res/drawable/baseline_browse_gallery_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M9,3c-4.97,0 -9,4.03 -9,9s4.03,9 9,9s9,-4.03 9,-9S13.97,3 9,3zM11.79,16.21L8,12.41V7h2v4.59l3.21,3.21L11.79,16.21z" /> + <path + android:fillColor="#FF000000" + android:pathData="M17.99,3.52v2.16C20.36,6.8 22,9.21 22,12c0,2.79 -1.64,5.2 -4.01,6.32v2.16C21.48,19.24 24,15.91 24,12C24,8.09 21.48,4.76 17.99,3.52z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/browser_not_supported.xml b/qqq/android/mobileapp/src/main/res/drawable/browser_not_supported.xml new file mode 100644 index 0000000..bc8169d --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/browser_not_supported.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/hardware/browser_not_supported/materialicons/black/res/drawable/baseline_browser_not_supported_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19,6v10.5l1.95,1.95C20.98,18.3 21,18.15 21,18V6c0,-1.1 -0.9,-2 -2,-2H6.5l2,2H19z" /> + <path + android:fillColor="#FF000000" + android:pathData="M3.22,3.32L1.95,4.59L3,5.64L3,18c0,1.1 0.9,2 2,2h12.36l2.06,2.06l1.27,-1.27L3.22,3.32zM15,18H5V7.64L15.36,18H15z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/browser_updated.xml b/qqq/android/mobileapp/src/main/res/drawable/browser_updated.xml new file mode 100644 index 0000000..fd9bb00 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/browser_updated.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/hardware/browser_updated/materialicons/black/res/drawable/baseline_browser_updated_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M22,13v3c0,1.1 -0.9,2 -2,2h-3l1,1v2H6v-2l1,-1H4c-1.1,0 -2,-0.9 -2,-2V5c0,-1.1 0.9,-2 2,-2l8,0v2L4,5v11h16v-3H22zM15,15l-5,-5h4V3h2v7h4L15,15z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/brunch_dining.xml b/qqq/android/mobileapp/src/main/res/drawable/brunch_dining.xml new file mode 100644 index 0000000..e082a18 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/brunch_dining.xml @@ -0,0 +1,20 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/brunch_dining/materialicons/black/res/drawable/baseline_brunch_dining_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M18,8h2V4h-2V8zM15.51,22H2.49C2.22,22 2,21.78 2,21.5V20h14v1.5C16,21.78 15.78,22 15.51,22zM18,15.89l-0.4,-0.42c-1.02,-1.08 -1.6,-2.52 -1.6,-4V2h6v9.51c0,1.46 -0.54,2.87 -1.53,3.94L20,15.97V20h2v2h-4V15.89zM7,16v-2h4v2h4.5c0.28,0 0.5,0.22 0.5,0.5v1c0,0.28 -0.22,0.5 -0.5,0.5h-13C2.22,18 2,17.78 2,17.5v-1C2,16.22 2.22,16 2.5,16H7z" + android:fillType="evenOdd" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/brush.xml b/qqq/android/mobileapp/src/main/res/drawable/brush.xml new file mode 100644 index 0000000..c8856f7 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/brush.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/brush/materialicons/black/res/drawable/baseline_brush_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M7,14c-1.66,0 -3,1.34 -3,3 0,1.31 -1.16,2 -2,2 0.92,1.22 2.49,2 4,2 2.21,0 4,-1.79 4,-4 0,-1.66 -1.34,-3 -3,-3zM20.71,4.63l-1.34,-1.34c-0.39,-0.39 -1.02,-0.39 -1.41,0L9,12.25 11.75,15l8.96,-8.96c0.39,-0.39 0.39,-1.02 0,-1.41z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/bubble_chart.xml b/qqq/android/mobileapp/src/main/res/drawable/bubble_chart.xml new file mode 100644 index 0000000..9cdf497 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/bubble_chart.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/editor/bubble_chart/materialicons/black/res/drawable/baseline_bubble_chart_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M7.2,14.4m-3.2,0a3.2,3.2 0,1 1,6.4 0a3.2,3.2 0,1 1,-6.4 0" /> + <path + android:fillColor="#FF000000" + android:pathData="M14.8,18m-2,0a2,2 0,1 1,4 0a2,2 0,1 1,-4 0" /> + <path + android:fillColor="#FF000000" + android:pathData="M15.2,8.8m-4.8,0a4.8,4.8 0,1 1,9.6 0a4.8,4.8 0,1 1,-9.6 0" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/bug_report.xml b/qqq/android/mobileapp/src/main/res/drawable/bug_report.xml new file mode 100644 index 0000000..f157790 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/bug_report.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/bug_report/materialicons/black/res/drawable/baseline_bug_report_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,8h-2.81c-0.45,-0.78 -1.07,-1.45 -1.82,-1.96L17,4.41 15.59,3l-2.17,2.17C12.96,5.06 12.49,5 12,5c-0.49,0 -0.96,0.06 -1.41,0.17L8.41,3 7,4.41l1.62,1.63C7.88,6.55 7.26,7.22 6.81,8L4,8v2h2.09c-0.05,0.33 -0.09,0.66 -0.09,1v1L4,12v2h2v1c0,0.34 0.04,0.67 0.09,1L4,16v2h2.81c1.04,1.79 2.97,3 5.19,3s4.15,-1.21 5.19,-3L20,18v-2h-2.09c0.05,-0.33 0.09,-0.66 0.09,-1v-1h2v-2h-2v-1c0,-0.34 -0.04,-0.67 -0.09,-1L20,10L20,8zM14,16h-4v-2h4v2zM14,12h-4v-2h4v2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/build.xml b/qqq/android/mobileapp/src/main/res/drawable/build.xml new file mode 100644 index 0000000..08abdaf --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/build.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/build/materialicons/black/res/drawable/baseline_build_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M22.7,19l-9.1,-9.1c0.9,-2.3 0.4,-5 -1.5,-6.9 -2,-2 -5,-2.4 -7.4,-1.3L9,6 6,9 1.6,4.7C0.4,7.1 0.9,10.1 2.9,12.1c1.9,1.9 4.6,2.4 6.9,1.5l9.1,9.1c0.4,0.4 1,0.4 1.4,0l2.3,-2.3c0.5,-0.4 0.5,-1.1 0.1,-1.4z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/build_circle.xml b/qqq/android/mobileapp/src/main/res/drawable/build_circle.xml new file mode 100644 index 0000000..88c229d --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/build_circle.xml @@ -0,0 +1,20 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/build_circle/materialicons/black/res/drawable/baseline_build_circle_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,2C6.48,2 2,6.48 2,12c0,5.52 4.48,10 10,10s10,-4.48 10,-10C22,6.48 17.52,2 12,2zM16.9,15.49l-1.4,1.4c-0.2,0.2 -0.51,0.2 -0.71,0l-3.41,-3.41c-1.22,0.43 -2.64,0.17 -3.62,-0.81c-1.11,-1.11 -1.3,-2.79 -0.59,-4.1l2.35,2.35l1.41,-1.41L8.58,7.17c1.32,-0.71 2.99,-0.52 4.1,0.59c0.98,0.98 1.24,2.4 0.81,3.62l3.41,3.41C17.09,14.98 17.09,15.3 16.9,15.49z" + android:fillType="evenOdd" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/bungalow.xml b/qqq/android/mobileapp/src/main/res/drawable/bungalow.xml new file mode 100644 index 0000000..6d253fb --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/bungalow.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/places/bungalow/materialicons/black/res/drawable/baseline_bungalow_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,3L4.2,15.5l1.7,1.06L7,14.8V21h4v-5h2v5h4v-6.21l1.1,1.77l1.7,-1.06L12,3zM13,14h-2v-2h2V14z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/burst_mode.xml b/qqq/android/mobileapp/src/main/res/drawable/burst_mode.xml new file mode 100644 index 0000000..924dd20 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/burst_mode.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/burst_mode/materialicons/black/res/drawable/baseline_burst_mode_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M1,5h2v14L1,19zM5,5h2v14L5,19zM22,5L10,5c-0.55,0 -1,0.45 -1,1v12c0,0.55 0.45,1 1,1h12c0.55,0 1,-0.45 1,-1L23,6c0,-0.55 -0.45,-1 -1,-1zM11,17l2.5,-3.15L15.29,16l2.5,-3.22L21,17L11,17z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/bus_alert.xml b/qqq/android/mobileapp/src/main/res/drawable/bus_alert.xml new file mode 100644 index 0000000..1af008d --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/bus_alert.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/bus_alert/materialicons/black/res/drawable/baseline_bus_alert_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M16,1a7,7 0,0 0,-5.78 3.05l0.02,-0.03C9.84,4 9.42,4 9,4c-4.42,0 -8,0.5 -8,4v10c0,0.88 0.39,1.67 1,2.22L2,22a1,1 0,0 0,1 1h1a1,1 0,0 0,1 -1v-1h8v1a1,1 0,0 0,1 1h1a1,1 0,0 0,1 -1v-1.78c0.61,-0.55 1,-1.34 1,-2.22v-3.08A7,7 0,0 0,16 1zM4.5,19a1.5,1.5 0,1 1,0 -3,1.5 1.5,0 0,1 0,3zM3,13L3,8h6c0,1.96 0.81,3.73 2.11,5L3,13zM13.5,19a1.5,1.5 0,1 1,0 -3,1.5 1.5,0 0,1 0,3zM16,13a5,5 0,1 1,0 -10,5 5,0 0,1 0,10zM15,4h2v5h-2zM15,10h2v2h-2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/business.xml b/qqq/android/mobileapp/src/main/res/drawable/business.xml new file mode 100644 index 0000000..72aa26b --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/business.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/communication/business/materialicons/black/res/drawable/baseline_business_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,7L12,3L2,3v18h20L22,7L12,7zM6,19L4,19v-2h2v2zM6,15L4,15v-2h2v2zM6,11L4,11L4,9h2v2zM6,7L4,7L4,5h2v2zM10,19L8,19v-2h2v2zM10,15L8,15v-2h2v2zM10,11L8,11L8,9h2v2zM10,7L8,7L8,5h2v2zM20,19h-8v-2h2v-2h-2v-2h2v-2h-2L12,9h8v10zM18,11h-2v2h2v-2zM18,15h-2v2h2v-2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/business_center.xml b/qqq/android/mobileapp/src/main/res/drawable/business_center.xml new file mode 100644 index 0000000..462648f --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/business_center.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/places/business_center/materialicons/black/res/drawable/baseline_business_center_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M10,16v-1L3.01,15L3,19c0,1.11 0.89,2 2,2h14c1.11,0 2,-0.89 2,-2v-4h-7v1h-4zM20,7h-4.01L15.99,5l-2,-2h-4l-2,2v2L4,7c-1.1,0 -2,0.9 -2,2v3c0,1.11 0.89,2 2,2h6v-2h4v2h6c1.1,0 2,-0.9 2,-2L22,9c0,-1.1 -0.9,-2 -2,-2zM14,7h-4L10,5h4v2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/cabin.xml b/qqq/android/mobileapp/src/main/res/drawable/cabin.xml new file mode 100644 index 0000000..f2dc2b5 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/cabin.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/places/cabin/materialicons/black/res/drawable/baseline_cabin_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M10,1c0,1.66 -1.34,3 -3,3C6.45,4 6,4.45 6,5H4c0,-1.66 1.34,-3 3,-3c0.55,0 1,-0.45 1,-1H10zM12,3L6,7.58V6H4v3.11L1,11.4l1.21,1.59L4,11.62V21h16v-9.38l1.79,1.36L23,11.4L12,3zM13.94,7h-3.89L12,5.52L13.94,7zM7.44,9h9.12L18,10.1V11H6v-0.9L7.44,9zM18,13v2H6v-2H18zM6,19v-2h12v2H6z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/cable.xml b/qqq/android/mobileapp/src/main/res/drawable/cable.xml new file mode 100644 index 0000000..3e07ba2 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/cable.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/cable/materialicons/black/res/drawable/baseline_cable_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,5V4c0,-0.55 -0.45,-1 -1,-1h-2c-0.55,0 -1,0.45 -1,1v1h-1v4c0,0.55 0.45,1 1,1h1v7c0,1.1 -0.9,2 -2,2s-2,-0.9 -2,-2V7c0,-2.21 -1.79,-4 -4,-4S5,4.79 5,7v7H4c-0.55,0 -1,0.45 -1,1v4h1v1c0,0.55 0.45,1 1,1h2c0.55,0 1,-0.45 1,-1v-1h1v-4c0,-0.55 -0.45,-1 -1,-1H7V7c0,-1.1 0.9,-2 2,-2s2,0.9 2,2v10c0,2.21 1.79,4 4,4s4,-1.79 4,-4v-7h1c0.55,0 1,-0.45 1,-1V5H20z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/cached.xml b/qqq/android/mobileapp/src/main/res/drawable/cached.xml new file mode 100644 index 0000000..065c823 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/cached.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/cached/materialicons/black/res/drawable/baseline_cached_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19,8l-4,4h3c0,3.31 -2.69,6 -6,6 -1.01,0 -1.97,-0.25 -2.8,-0.7l-1.46,1.46C8.97,19.54 10.43,20 12,20c4.42,0 8,-3.58 8,-8h3l-4,-4zM6,12c0,-3.31 2.69,-6 6,-6 1.01,0 1.97,0.25 2.8,0.7l1.46,-1.46C15.03,4.46 13.57,4 12,4c-4.42,0 -8,3.58 -8,8H1l4,4 4,-4H6z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/cake.xml b/qqq/android/mobileapp/src/main/res/drawable/cake.xml new file mode 100644 index 0000000..63c0e11 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/cake.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/cake/materialicons/black/res/drawable/baseline_cake_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,6c1.11,0 2,-0.9 2,-2 0,-0.38 -0.1,-0.73 -0.29,-1.03L12,0l-1.71,2.97c-0.19,0.3 -0.29,0.65 -0.29,1.03 0,1.1 0.9,2 2,2zM16.6,15.99l-1.07,-1.07 -1.08,1.07c-1.3,1.3 -3.58,1.31 -4.89,0l-1.07,-1.07 -1.09,1.07C6.75,16.64 5.88,17 4.96,17c-0.73,0 -1.4,-0.23 -1.96,-0.61L3,21c0,0.55 0.45,1 1,1h16c0.55,0 1,-0.45 1,-1v-4.61c-0.56,0.38 -1.23,0.61 -1.96,0.61 -0.92,0 -1.79,-0.36 -2.44,-1.01zM18,9h-5L13,7h-2v2L6,9c-1.66,0 -3,1.34 -3,3v1.54c0,1.08 0.88,1.96 1.96,1.96 0.52,0 1.02,-0.2 1.38,-0.57l2.14,-2.13 2.13,2.13c0.74,0.74 2.03,0.74 2.77,0l2.14,-2.13 2.13,2.13c0.37,0.37 0.86,0.57 1.38,0.57 1.08,0 1.96,-0.88 1.96,-1.96L20.99,12C21,10.34 19.66,9 18,9z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/calculate.xml b/qqq/android/mobileapp/src/main/res/drawable/calculate.xml new file mode 100644 index 0000000..ddee594 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/calculate.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/content/calculate/materialicons/black/res/drawable/baseline_calculate_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19,3H5C3.9,3 3,3.9 3,5v14c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2V5C21,3.9 20.1,3 19,3zM13.03,7.06L14.09,6l1.41,1.41L16.91,6l1.06,1.06l-1.41,1.41l1.41,1.41l-1.06,1.06L15.5,9.54l-1.41,1.41l-1.06,-1.06l1.41,-1.41L13.03,7.06zM6.25,7.72h5v1.5h-5V7.72zM11.5,16h-2v2H8v-2H6v-1.5h2v-2h1.5v2h2V16zM18,17.25h-5v-1.5h5V17.25zM18,14.75h-5v-1.5h5V14.75z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/calendar_month.xml b/qqq/android/mobileapp/src/main/res/drawable/calendar_month.xml new file mode 100644 index 0000000..070ec68 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/calendar_month.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/calendar_month/materialicons/black/res/drawable/baseline_calendar_month_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19,4h-1V2h-2v2H8V2H6v2H5C3.89,4 3.01,4.9 3.01,6L3,20c0,1.1 0.89,2 2,2h14c1.1,0 2,-0.9 2,-2V6C21,4.9 20.1,4 19,4zM19,20H5V10h14V20zM9,14H7v-2h2V14zM13,14h-2v-2h2V14zM17,14h-2v-2h2V14zM9,18H7v-2h2V18zM13,18h-2v-2h2V18zM17,18h-2v-2h2V18z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/calendar_today.xml b/qqq/android/mobileapp/src/main/res/drawable/calendar_today.xml new file mode 100644 index 0000000..2e458f3 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/calendar_today.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/calendar_today/materialicons/black/res/drawable/baseline_calendar_today_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,3h-1L19,1h-2v2L7,3L7,1L5,1v2L4,3c-1.1,0 -2,0.9 -2,2v16c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2L22,5c0,-1.1 -0.9,-2 -2,-2zM20,21L4,21L4,8h16v13z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/calendar_view_day.xml b/qqq/android/mobileapp/src/main/res/drawable/calendar_view_day.xml new file mode 100644 index 0000000..fc8462c --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/calendar_view_day.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/calendar_view_day/materialicons/black/res/drawable/baseline_calendar_view_day_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M3,17h18v2L3,19zM3,10h18v5L3,15zM3,6h18v2L3,8z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/calendar_view_month.xml b/qqq/android/mobileapp/src/main/res/drawable/calendar_view_month.xml new file mode 100644 index 0000000..f3ad8ad --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/calendar_view_month.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/calendar_view_month/materialicons/black/res/drawable/baseline_calendar_view_month_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,4H4C2.9,4 2,4.9 2,6v12c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2V6C22,4.9 21.1,4 20,4zM8,11H4V6h4V11zM14,11h-4V6h4V11zM20,11h-4V6h4V11zM8,18H4v-5h4V18zM14,18h-4v-5h4V18zM20,18h-4v-5h4V18z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/calendar_view_week.xml b/qqq/android/mobileapp/src/main/res/drawable/calendar_view_week.xml new file mode 100644 index 0000000..15b0e1c --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/calendar_view_week.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/calendar_view_week/materialicons/black/res/drawable/baseline_calendar_view_week_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,4H4C2.9,4 2,4.9 2,6v12c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2V6C22,4.9 21.1,4 20,4zM13,6h2.5v12H13V6zM11,18H8.5V6H11V18zM4,6h2.5v12H4V6zM20,18h-2.5V6H20V18z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/call.xml b/qqq/android/mobileapp/src/main/res/drawable/call.xml new file mode 100644 index 0000000..b230621 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/call.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/communication/call/materialicons/black/res/drawable/baseline_call_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20.01,15.38c-1.23,0 -2.42,-0.2 -3.53,-0.56 -0.35,-0.12 -0.74,-0.03 -1.01,0.24l-1.57,1.97c-2.83,-1.35 -5.48,-3.9 -6.89,-6.83l1.95,-1.66c0.27,-0.28 0.35,-0.67 0.24,-1.02 -0.37,-1.11 -0.56,-2.3 -0.56,-3.53 0,-0.54 -0.45,-0.99 -0.99,-0.99H4.19C3.65,3 3,3.24 3,3.99 3,13.28 10.73,21 20.01,21c0.71,0 0.99,-0.63 0.99,-1.18v-3.45c0,-0.54 -0.45,-0.99 -0.99,-0.99z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/call_end.xml b/qqq/android/mobileapp/src/main/res/drawable/call_end.xml new file mode 100644 index 0000000..7fc960b --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/call_end.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/communication/call_end/materialicons/black/res/drawable/baseline_call_end_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,9c-1.6,0 -3.15,0.25 -4.6,0.72v3.1c0,0.39 -0.23,0.74 -0.56,0.9 -0.98,0.49 -1.87,1.12 -2.66,1.85 -0.18,0.18 -0.43,0.28 -0.7,0.28 -0.28,0 -0.53,-0.11 -0.71,-0.29L0.29,13.08c-0.18,-0.17 -0.29,-0.42 -0.29,-0.7 0,-0.28 0.11,-0.53 0.29,-0.71C3.34,8.78 7.46,7 12,7s8.66,1.78 11.71,4.67c0.18,0.18 0.29,0.43 0.29,0.71 0,0.28 -0.11,0.53 -0.29,0.71l-2.48,2.48c-0.18,0.18 -0.43,0.29 -0.71,0.29 -0.27,0 -0.52,-0.11 -0.7,-0.28 -0.79,-0.74 -1.69,-1.36 -2.67,-1.85 -0.33,-0.16 -0.56,-0.5 -0.56,-0.9v-3.1C15.15,9.25 13.6,9 12,9z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/call_made.xml b/qqq/android/mobileapp/src/main/res/drawable/call_made.xml new file mode 100644 index 0000000..795d84a --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/call_made.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/communication/call_made/materialicons/black/res/drawable/baseline_call_made_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M9,5v2h6.59L4,18.59 5.41,20 17,8.41V15h2V5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/call_merge.xml b/qqq/android/mobileapp/src/main/res/drawable/call_merge.xml new file mode 100644 index 0000000..800adad --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/call_merge.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/communication/call_merge/materialicons/black/res/drawable/baseline_call_merge_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M17,20.41L18.41,19 15,15.59 13.59,17 17,20.41zM7.5,8H11v5.59L5.59,19 7,20.41l6,-6V8h3.5L12,3.5 7.5,8z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/call_missed.xml b/qqq/android/mobileapp/src/main/res/drawable/call_missed.xml new file mode 100644 index 0000000..7ea1b91 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/call_missed.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/communication/call_missed/materialicons/black/res/drawable/baseline_call_missed_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19.59,7L12,14.59 6.41,9H11V7H3v8h2v-4.59l7,7 9,-9z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/call_missed_outgoing.xml b/qqq/android/mobileapp/src/main/res/drawable/call_missed_outgoing.xml new file mode 100644 index 0000000..291ae64 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/call_missed_outgoing.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/communication/call_missed_outgoing/materialicons/black/res/drawable/baseline_call_missed_outgoing_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M3,8.41l9,9l7,-7V15h2V7h-8v2h4.59L12,14.59L4.41,7L3,8.41z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/call_received.xml b/qqq/android/mobileapp/src/main/res/drawable/call_received.xml new file mode 100644 index 0000000..4b1f17d --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/call_received.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/communication/call_received/materialicons/black/res/drawable/baseline_call_received_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,5.41L18.59,4 7,15.59V9H5v10h10v-2H8.41z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/call_split.xml b/qqq/android/mobileapp/src/main/res/drawable/call_split.xml new file mode 100644 index 0000000..7e1ae3e --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/call_split.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/communication/call_split/materialicons/black/res/drawable/baseline_call_split_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M14,4l2.29,2.29 -2.88,2.88 1.42,1.42 2.88,-2.88L20,10L20,4zM10,4L4,4v6l2.29,-2.29 4.71,4.7L11,20h2v-8.41l-5.29,-5.3z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/call_to_action.xml b/qqq/android/mobileapp/src/main/res/drawable/call_to_action.xml new file mode 100644 index 0000000..aa48da6 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/call_to_action.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/av/call_to_action/materialicons/black/res/drawable/baseline_call_to_action_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M21,3L3,3c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h18c1.1,0 2,-0.9 2,-2L23,5c0,-1.1 -0.9,-2 -2,-2zM21,19L3,19v-3h18v3z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/camera.xml b/qqq/android/mobileapp/src/main/res/drawable/camera.xml new file mode 100644 index 0000000..b6da3b4 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/camera.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/camera/materialicons/black/res/drawable/baseline_camera_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M9.4,10.5l4.77,-8.26C13.47,2.09 12.75,2 12,2c-2.4,0 -4.6,0.85 -6.32,2.25l3.66,6.35 0.06,-0.1zM21.54,9c-0.92,-2.92 -3.15,-5.26 -6,-6.34L11.88,9h9.66zM21.8,10h-7.49l0.29,0.5 4.76,8.25C21,16.97 22,14.61 22,12c0,-0.69 -0.07,-1.35 -0.2,-2zM8.54,12l-3.9,-6.75C3.01,7.03 2,9.39 2,12c0,0.69 0.07,1.35 0.2,2h7.49l-1.15,-2zM2.46,15c0.92,2.92 3.15,5.26 6,6.34L12.12,15L2.46,15zM13.73,15l-3.9,6.76c0.7,0.15 1.42,0.24 2.17,0.24 2.4,0 4.6,-0.85 6.32,-2.25l-3.66,-6.35 -0.93,1.6z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/camera_alt.xml b/qqq/android/mobileapp/src/main/res/drawable/camera_alt.xml new file mode 100644 index 0000000..5e1a9df --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/camera_alt.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/camera_alt/materialicons/black/res/drawable/baseline_camera_alt_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,12m-3.2,0a3.2,3.2 0,1 1,6.4 0a3.2,3.2 0,1 1,-6.4 0" /> + <path + android:fillColor="#FF000000" + android:pathData="M9,2L7.17,4L4,4c-1.1,0 -2,0.9 -2,2v12c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2L22,6c0,-1.1 -0.9,-2 -2,-2h-3.17L15,2L9,2zM12,17c-2.76,0 -5,-2.24 -5,-5s2.24,-5 5,-5 5,2.24 5,5 -2.24,5 -5,5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/camera_enhance.xml b/qqq/android/mobileapp/src/main/res/drawable/camera_enhance.xml new file mode 100644 index 0000000..c3b9365 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/camera_enhance.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/camera_enhance/materialicons/black/res/drawable/baseline_camera_enhance_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M9,3L7.17,5L4,5c-1.1,0 -2,0.9 -2,2v12c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2L22,7c0,-1.1 -0.9,-2 -2,-2h-3.17L15,3L9,3zM12,18c-2.76,0 -5,-2.24 -5,-5s2.24,-5 5,-5 5,2.24 5,5 -2.24,5 -5,5z" /> + <path + android:fillColor="#FF000000" + android:pathData="M12,17l1.25,-2.75L16,13l-2.75,-1.25L12,9l-1.25,2.75L8,13l2.75,1.25z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/camera_front.xml b/qqq/android/mobileapp/src/main/res/drawable/camera_front.xml new file mode 100644 index 0000000..ee862c4 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/camera_front.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/camera_front/materialicons/black/res/drawable/baseline_camera_front_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M10,20L5,20v2h5v2l3,-3 -3,-3v2zM14,20v2h5v-2h-5zM12,8c1.1,0 2,-0.9 2,-2s-0.9,-2 -2,-2 -1.99,0.9 -1.99,2S10.9,8 12,8zM17,0L7,0C5.9,0 5,0.9 5,2v14c0,1.1 0.9,2 2,2h10c1.1,0 2,-0.9 2,-2L19,2c0,-1.1 -0.9,-2 -2,-2zM7,2h10v10.5c0,-1.67 -3.33,-2.5 -5,-2.5s-5,0.83 -5,2.5L7,2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/camera_indoor.xml b/qqq/android/mobileapp/src/main/res/drawable/camera_indoor.xml new file mode 100644 index 0000000..706f228 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/camera_indoor.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/search/camera_indoor/materialicons/black/res/drawable/baseline_camera_indoor_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,3L4,9v12h16V9L12,3zM16,16.06L14,15v1c0,0.55 -0.45,1 -1,1H9c-0.55,0 -1,-0.45 -1,-1v-4c0,-0.55 0.45,-1 1,-1h4c0.55,0 1,0.45 1,1v1l2,-1.06V16.06z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/camera_outdoor.xml b/qqq/android/mobileapp/src/main/res/drawable/camera_outdoor.xml new file mode 100644 index 0000000..6755c68 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/camera_outdoor.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/search/camera_outdoor/materialicons/black/res/drawable/baseline_camera_outdoor_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M18,13c0,-0.55 -0.45,-1 -1,-1h-4c-0.55,0 -1,0.45 -1,1v4c0,0.55 0.45,1 1,1h4c0.55,0 1,-0.45 1,-1v-1l2,1.06v-4.12L18,14V13zM12,3L4,9v12h16v-2H6v-9l6,-4.5l6,4.5v1h2V9L12,3z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/camera_rear.xml b/qqq/android/mobileapp/src/main/res/drawable/camera_rear.xml new file mode 100644 index 0000000..a6040fa --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/camera_rear.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/camera_rear/materialicons/black/res/drawable/baseline_camera_rear_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M10,20L5,20v2h5v2l3,-3 -3,-3v2zM14,20v2h5v-2h-5zM17,0L7,0C5.9,0 5,0.9 5,2v14c0,1.1 0.9,2 2,2h10c1.1,0 2,-0.9 2,-2L19,2c0,-1.1 -0.9,-2 -2,-2zM12,6c-1.11,0 -2,-0.9 -2,-2s0.89,-2 1.99,-2 2,0.9 2,2C14,5.1 13.1,6 12,6z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/camera_roll.xml b/qqq/android/mobileapp/src/main/res/drawable/camera_roll.xml new file mode 100644 index 0000000..39be93a --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/camera_roll.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/camera_roll/materialicons/black/res/drawable/baseline_camera_roll_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M14,5c0,-1.1 -0.9,-2 -2,-2h-1L11,2c0,-0.55 -0.45,-1 -1,-1L6,1c-0.55,0 -1,0.45 -1,1v1L4,3c-1.1,0 -2,0.9 -2,2v15c0,1.1 0.9,2 2,2h8c1.1,0 2,-0.9 2,-2h8L22,5h-8zM12,18h-2v-2h2v2zM12,9h-2L10,7h2v2zM16,18h-2v-2h2v2zM16,9h-2L14,7h2v2zM20,18h-2v-2h2v2zM20,9h-2L18,7h2v2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/cameraswitch.xml b/qqq/android/mobileapp/src/main/res/drawable/cameraswitch.xml new file mode 100644 index 0000000..939e12f --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/cameraswitch.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/cameraswitch/materialicons/black/res/drawable/baseline_cameraswitch_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M16,7h-1l-1,-1h-4L9,7H8C6.9,7 6,7.9 6,9v6c0,1.1 0.9,2 2,2h8c1.1,0 2,-0.9 2,-2V9C18,7.9 17.1,7 16,7zM12,14c-1.1,0 -2,-0.9 -2,-2c0,-1.1 0.9,-2 2,-2s2,0.9 2,2C14,13.1 13.1,14 12,14z" /> + <path + android:fillColor="#FF000000" + android:pathData="M8.57,0.51l4.48,4.48V2.04c4.72,0.47 8.48,4.23 8.95,8.95c0,0 2,0 2,0C23.34,3.02 15.49,-1.59 8.57,0.51z" /> + <path + android:fillColor="#FF000000" + android:pathData="M10.95,21.96C6.23,21.49 2.47,17.73 2,13.01c0,0 -2,0 -2,0c0.66,7.97 8.51,12.58 15.43,10.48l-4.48,-4.48V21.96z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/campaign.xml b/qqq/android/mobileapp/src/main/res/drawable/campaign.xml new file mode 100644 index 0000000..e6cb92a --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/campaign.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/navigation/campaign/materialicons/black/res/drawable/baseline_campaign_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M18,11v2h4v-2h-4zM16,17.61c0.96,0.71 2.21,1.65 3.2,2.39 0.4,-0.53 0.8,-1.07 1.2,-1.6 -0.99,-0.74 -2.24,-1.68 -3.2,-2.4 -0.4,0.54 -0.8,1.08 -1.2,1.61zM20.4,5.6c-0.4,-0.53 -0.8,-1.07 -1.2,-1.6 -0.99,0.74 -2.24,1.68 -3.2,2.4 0.4,0.53 0.8,1.07 1.2,1.6 0.96,-0.72 2.21,-1.65 3.2,-2.4zM4,9c-1.1,0 -2,0.9 -2,2v2c0,1.1 0.9,2 2,2h1v4h2v-4h1l5,3L13,6L8,9L4,9zM15.5,12c0,-1.33 -0.58,-2.53 -1.5,-3.35v6.69c0.92,-0.81 1.5,-2.01 1.5,-3.34z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/cancel.xml b/qqq/android/mobileapp/src/main/res/drawable/cancel.xml new file mode 100644 index 0000000..7dc90f3 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/cancel.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/navigation/cancel/materialicons/black/res/drawable/baseline_cancel_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,2C6.47,2 2,6.47 2,12s4.47,10 10,10 10,-4.47 10,-10S17.53,2 12,2zM17,15.59L15.59,17 12,13.41 8.41,17 7,15.59 10.59,12 7,8.41 8.41,7 12,10.59 15.59,7 17,8.41 13.41,12 17,15.59z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/cancel_presentation.xml b/qqq/android/mobileapp/src/main/res/drawable/cancel_presentation.xml new file mode 100644 index 0000000..ebd9cc3 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/cancel_presentation.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/communication/cancel_presentation/materialicons/black/res/drawable/baseline_cancel_presentation_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M21,19.1H3V5h18v14.1zM21,3H3c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h18c1.1,0 2,-0.9 2,-2V5c0,-1.1 -0.9,-2 -2,-2z" /> + <path + android:fillColor="#FF000000" + android:pathData="M14.59,8L12,10.59 9.41,8 8,9.41 10.59,12 8,14.59 9.41,16 12,13.41 14.59,16 16,14.59 13.41,12 16,9.41z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/cancel_schedule_send.xml b/qqq/android/mobileapp/src/main/res/drawable/cancel_schedule_send.xml new file mode 100644 index 0000000..c665960 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/cancel_schedule_send.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/cancel_schedule_send/materialicons/black/res/drawable/baseline_cancel_schedule_send_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M16.5,9c-0.42,0 -0.83,0.04 -1.24,0.11L1.01,3L1,10l9,2l-9,2l0.01,7l8.07,-3.46C9.59,21.19 12.71,24 16.5,24c4.14,0 7.5,-3.36 7.5,-7.5S20.64,9 16.5,9zM16.5,22c-3.03,0 -5.5,-2.47 -5.5,-5.5s2.47,-5.5 5.5,-5.5s5.5,2.47 5.5,5.5S19.53,22 16.5,22z" /> + <path + android:fillColor="#FF000000" + android:pathData="M18.27,14.03l-1.77,1.76l-1.77,-1.76l-0.7,0.7l1.76,1.77l-1.76,1.77l0.7,0.7l1.77,-1.76l1.77,1.76l0.7,-0.7l-1.76,-1.77l1.76,-1.77z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/candlestick_chart.xml b/qqq/android/mobileapp/src/main/res/drawable/candlestick_chart.xml new file mode 100644 index 0000000..4ec7b3c --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/candlestick_chart.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/editor/candlestick_chart/materialicons/black/res/drawable/baseline_candlestick_chart_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M9,4l-2,0l0,2l-2,0l0,12l2,0l0,2l2,0l0,-2l2,0l0,-12l-2,0z" /> + <path + android:fillColor="#FF000000" + android:pathData="M19,8l-2,0l0,-4l-2,0l0,4l-2,0l0,7l2,0l0,5l2,0l0,-5l2,0z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/car_crash.xml b/qqq/android/mobileapp/src/main/res/drawable/car_crash.xml new file mode 100644 index 0000000..d9d49fa --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/car_crash.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/car_crash/materialicons/black/res/drawable/baseline_car_crash_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M18,1c-2.76,0 -5,2.24 -5,5s2.24,5 5,5s5,-2.24 5,-5S20.76,1 18,1zM18.5,7h-1V3h1V7zM18.5,8v1h-1V8H18.5zM17.91,13c0.06,0.16 0.09,0.33 0.09,0.5c0,0.83 -0.67,1.5 -1.5,1.5S15,14.33 15,13.5c0,-0.39 0.15,-0.74 0.39,-1.01c-1.63,-0.66 -2.96,-1.91 -3.71,-3.49H5.81l1.04,-3H11c0,-0.69 0.1,-1.37 0.29,-2H6.5C5.84,4 5.29,4.42 5.08,5.01L3,11v8c0,0.55 0.45,1 1,1h1c0.55,0 1,-0.45 1,-1v-1h12v1c0,0.55 0.45,1 1,1h1c0.55,0 1,-0.45 1,-1v-6.68C19.95,12.83 18.84,13.01 17.91,13zM7.5,15C6.67,15 6,14.33 6,13.5S6.67,12 7.5,12S9,12.67 9,13.5S8.33,15 7.5,15z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/car_rental.xml b/qqq/android/mobileapp/src/main/res/drawable/car_rental.xml new file mode 100644 index 0000000..3aaa0a6 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/car_rental.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/car_rental/materialicons/black/res/drawable/baseline_car_rental_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M16.39,9H7.61C7.18,9 6.8,9.28 6.66,9.68l-1.66,5v6.81C5,21.78 5.23,22 5.5,22h1C6.78,22 7,21.78 7,21.5V20h10v1.5c0,0.28 0.22,0.5 0.5,0.5h1c0.28,0 0.5,-0.22 0.5,-0.5v-6.81l-1.66,-5C17.2,9.28 16.82,9 16.39,9zM7.78,18c-0.68,0 -1.22,-0.54 -1.22,-1.22s0.54,-1.22 1.22,-1.22S9,16.11 9,16.78S8.46,18 7.78,18zM16.22,18C15.55,18 15,17.46 15,16.78s0.54,-1.22 1.22,-1.22s1.22,0.54 1.22,1.22S16.9,18 16.22,18zM6.29,14l1.33,-4h8.78l1.33,4H6.29z" /> + <path + android:fillColor="#FF000000" + android:pathData="M10.83,3C10.41,1.83 9.3,1 8,1C6.34,1 5,2.34 5,4c0,1.65 1.34,3 3,3c1.3,0 2.41,-0.84 2.83,-2H16v2h2V5h1V3H10.83zM8,5C7.45,5 7,4.55 7,4s0.45,-1 1,-1s1,0.45 1,1S8.55,5 8,5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/car_repair.xml b/qqq/android/mobileapp/src/main/res/drawable/car_repair.xml new file mode 100644 index 0000000..b7c9cef --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/car_repair.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/car_repair/materialicons/black/res/drawable/baseline_car_repair_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M16.22,12c0.68,0 1.22,-0.54 1.22,-1.22c0,-0.67 -0.54,-1.22 -1.22,-1.22S15,10.11 15,10.78C15,11.46 15.55,12 16.22,12zM6.56,10.78c0,0.67 0.54,1.22 1.22,1.22S9,11.46 9,10.78c0,-0.67 -0.54,-1.22 -1.22,-1.22S6.56,10.11 6.56,10.78zM7.61,4L6.28,8h11.43l-1.33,-4H7.61zM16.28,3c0,0 0.54,0.01 0.92,0.54c0.02,0.02 0.03,0.04 0.05,0.07c0.07,0.11 0.14,0.24 0.19,0.4C17.66,4.66 19,8.69 19,8.69v6.5c0,0.45 -0.35,0.81 -0.78,0.81h-0.44C17.35,16 17,15.64 17,15.19V14H7v1.19C7,15.64 6.65,16 6.22,16H5.78C5.35,16 5,15.64 5,15.19v-6.5c0,0 1.34,-4.02 1.55,-4.69c0.05,-0.16 0.12,-0.28 0.19,-0.4C6.77,3.58 6.78,3.56 6.8,3.54C7.18,3.01 7.72,3 7.72,3H16.28zM4,17.01h16V19h-7v3h-2v-3H4V17.01z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/card_giftcard.xml b/qqq/android/mobileapp/src/main/res/drawable/card_giftcard.xml new file mode 100644 index 0000000..9059d58 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/card_giftcard.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/card_giftcard/materialicons/black/res/drawable/baseline_card_giftcard_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,6h-2.18c0.11,-0.31 0.18,-0.65 0.18,-1 0,-1.66 -1.34,-3 -3,-3 -1.05,0 -1.96,0.54 -2.5,1.35l-0.5,0.67 -0.5,-0.68C10.96,2.54 10.05,2 9,2 7.34,2 6,3.34 6,5c0,0.35 0.07,0.69 0.18,1L4,6c-1.11,0 -1.99,0.89 -1.99,2L2,19c0,1.11 0.89,2 2,2h16c1.11,0 2,-0.89 2,-2L22,8c0,-1.11 -0.89,-2 -2,-2zM15,4c0.55,0 1,0.45 1,1s-0.45,1 -1,1 -1,-0.45 -1,-1 0.45,-1 1,-1zM9,4c0.55,0 1,0.45 1,1s-0.45,1 -1,1 -1,-0.45 -1,-1 0.45,-1 1,-1zM20,19L4,19v-2h16v2zM20,14L4,14L4,8h5.08L7,10.83 8.62,12 11,8.76l1,-1.36 1,1.36L15.38,12 17,10.83 14.92,8L20,8v6z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/card_membership.xml b/qqq/android/mobileapp/src/main/res/drawable/card_membership.xml new file mode 100644 index 0000000..035bfb3 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/card_membership.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/card_membership/materialicons/black/res/drawable/baseline_card_membership_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,2L4,2c-1.11,0 -2,0.89 -2,2v11c0,1.11 0.89,2 2,2h4v5l4,-2 4,2v-5h4c1.11,0 2,-0.89 2,-2L22,4c0,-1.11 -0.89,-2 -2,-2zM20,15L4,15v-2h16v2zM20,10L4,10L4,4h16v6z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/card_travel.xml b/qqq/android/mobileapp/src/main/res/drawable/card_travel.xml new file mode 100644 index 0000000..b3aa115 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/card_travel.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/card_travel/materialicons/black/res/drawable/baseline_card_travel_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,6h-3L17,4c0,-1.11 -0.89,-2 -2,-2L9,2c-1.11,0 -2,0.89 -2,2v2L4,6c-1.11,0 -2,0.89 -2,2v11c0,1.11 0.89,2 2,2h16c1.11,0 2,-0.89 2,-2L22,8c0,-1.11 -0.89,-2 -2,-2zM9,4h6v2L9,6L9,4zM20,19L4,19v-2h16v2zM20,14L4,14L4,8h3v2h2L9,8h6v2h2L17,8h3v6z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/carpenter.xml b/qqq/android/mobileapp/src/main/res/drawable/carpenter.xml new file mode 100644 index 0000000..13acfc2 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/carpenter.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/places/carpenter/materialicons/black/res/drawable/baseline_carpenter_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19.73,14.23L7,1.5L3.11,5.39l8.13,11.67c-0.78,0.78 -0.78,2.05 0,2.83l1.41,1.41c0.78,0.78 2.05,0.78 2.83,0l4.24,-4.24C20.51,16.28 20.51,15.01 19.73,14.23zM14.07,19.88l-1.41,-1.41l4.24,-4.24l1.41,1.41L14.07,19.88z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/cases.xml b/qqq/android/mobileapp/src/main/res/drawable/cases.xml new file mode 100644 index 0000000..0dcdab9 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/cases.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/cases/materialicons/black/res/drawable/baseline_cases_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M18,6L18,4l-2,-2h-5L9,4v2L5,6v11s1,2 2,2h13s2,-0.98 2,-2L22,6h-4zM4,9L2,9v11c0,1.11 0.89,2 2,2h14c1.11,0 2,-0.89 2,-2L4,20L4,9zM11,5c0,-0.55 0.53,-1 1,-1h3c0.46,0 1,0.54 1,1v1h-5L11,5zM5,6h17v11c0,1.1 -0.9,2 -2,2L7,19c-1.1,0 -2,-0.9 -2,-2L5,6z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/casino.xml b/qqq/android/mobileapp/src/main/res/drawable/casino.xml new file mode 100644 index 0000000..065841c --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/casino.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/places/casino/materialicons/black/res/drawable/baseline_casino_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19,3L5,3c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2L21,5c0,-1.1 -0.9,-2 -2,-2zM7.5,18c-0.83,0 -1.5,-0.67 -1.5,-1.5S6.67,15 7.5,15s1.5,0.67 1.5,1.5S8.33,18 7.5,18zM7.5,9C6.67,9 6,8.33 6,7.5S6.67,6 7.5,6 9,6.67 9,7.5 8.33,9 7.5,9zM12,13.5c-0.83,0 -1.5,-0.67 -1.5,-1.5s0.67,-1.5 1.5,-1.5 1.5,0.67 1.5,1.5 -0.67,1.5 -1.5,1.5zM16.5,18c-0.83,0 -1.5,-0.67 -1.5,-1.5s0.67,-1.5 1.5,-1.5 1.5,0.67 1.5,1.5 -0.67,1.5 -1.5,1.5zM16.5,9c-0.83,0 -1.5,-0.67 -1.5,-1.5S15.67,6 16.5,6s1.5,0.67 1.5,1.5S17.33,9 16.5,9z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/cast.xml b/qqq/android/mobileapp/src/main/res/drawable/cast.xml new file mode 100644 index 0000000..26e512a --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/cast.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/hardware/cast/materialicons/black/res/drawable/baseline_cast_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M21,3L3,3c-1.1,0 -2,0.9 -2,2v3h2L3,5h18v14h-7v2h7c1.1,0 2,-0.9 2,-2L23,5c0,-1.1 -0.9,-2 -2,-2zM1,18v3h3c0,-1.66 -1.34,-3 -3,-3zM1,14v2c2.76,0 5,2.24 5,5h2c0,-3.87 -3.13,-7 -7,-7zM1,10v2c4.97,0 9,4.03 9,9h2c0,-6.08 -4.93,-11 -11,-11z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/cast_connected.xml b/qqq/android/mobileapp/src/main/res/drawable/cast_connected.xml new file mode 100644 index 0000000..6348f62 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/cast_connected.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/hardware/cast_connected/materialicons/black/res/drawable/baseline_cast_connected_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M1,18v3h3c0,-1.66 -1.34,-3 -3,-3zM1,14v2c2.76,0 5,2.24 5,5h2c0,-3.87 -3.13,-7 -7,-7zM19,7L5,7v1.63c3.96,1.28 7.09,4.41 8.37,8.37L19,17L19,7zM1,10v2c4.97,0 9,4.03 9,9h2c0,-6.08 -4.93,-11 -11,-11zM21,3L3,3c-1.1,0 -2,0.9 -2,2v3h2L3,5h18v14h-7v2h7c1.1,0 2,-0.9 2,-2L23,5c0,-1.1 -0.9,-2 -2,-2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/cast_for_education.xml b/qqq/android/mobileapp/src/main/res/drawable/cast_for_education.xml new file mode 100644 index 0000000..74c8cdf --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/cast_for_education.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/hardware/cast_for_education/materialicons/black/res/drawable/baseline_cast_for_education_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M21,3H3C1.9,3 1,3.9 1,5v3h2V5h18v14h-7v2h7c1.1,0 2,-0.9 2,-2V5C23,3.9 22.1,3 21,3zM1,18v3h3C4,19.34 2.66,18 1,18zM1,14v2c2.76,0 5,2.24 5,5h2C8,17.13 4.87,14 1,14zM1,10v2c4.97,0 9,4.03 9,9h2C12,14.92 7.07,10 1,10zM11,11.09v2L14.5,15l3.5,-1.91v-2L14.5,13L11,11.09zM14.5,6L9,9l5.5,3L20,9L14.5,6z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/castle.xml b/qqq/android/mobileapp/src/main/res/drawable/castle.xml new file mode 100644 index 0000000..4578863 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/castle.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/castle/materialicons/black/res/drawable/baseline_castle_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M21,9v2h-2V3h-2v2h-2V3h-2v2h-2V3H9v2H7V3H5v8H3V9H1v12h9v-3c0,-1.1 0.9,-2 2,-2s2,0.9 2,2v3h9V9H21zM11,12H9V9h2V12zM15,12h-2V9h2V12z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/catching_pokemon.xml b/qqq/android/mobileapp/src/main/res/drawable/catching_pokemon.xml new file mode 100644 index 0000000..4819675 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/catching_pokemon.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/catching_pokemon/materialicons/black/res/drawable/baseline_catching_pokemon_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M14.5,12c0,1.38 -1.12,2.5 -2.5,2.5c-1.38,0 -2.5,-1.12 -2.5,-2.5s1.12,-2.5 2.5,-2.5C13.38,9.5 14.5,10.62 14.5,12zM22,12c0,5.52 -4.48,10 -10,10C6.48,22 2,17.52 2,12S6.48,2 12,2C17.52,2 22,6.48 22,12zM20,12h-4c0,-2.21 -1.79,-4 -4,-4c-2.21,0 -4,1.79 -4,4H4c0,4.41 3.59,8 8,8C16.41,20 20,16.41 20,12z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/category.xml b/qqq/android/mobileapp/src/main/res/drawable/category.xml new file mode 100644 index 0000000..27daccc --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/category.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/category/materialicons/black/res/drawable/baseline_category_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,2l-5.5,9h11z" /> + <path + android:fillColor="#FF000000" + android:pathData="M17.5,17.5m-4.5,0a4.5,4.5 0,1 1,9 0a4.5,4.5 0,1 1,-9 0" /> + <path + android:fillColor="#FF000000" + android:pathData="M3,13.5h8v8H3z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/celebration.xml b/qqq/android/mobileapp/src/main/res/drawable/celebration.xml new file mode 100644 index 0000000..f2013ca --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/celebration.xml @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/celebration/materialicons/black/res/drawable/baseline_celebration_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M2,22l14,-5l-9,-9z" /> + <path + android:fillColor="#FF000000" + android:pathData="M14.53,12.53l5.59,-5.59c0.49,-0.49 1.28,-0.49 1.77,0l0.59,0.59l1.06,-1.06l-0.59,-0.59c-1.07,-1.07 -2.82,-1.07 -3.89,0l-5.59,5.59L14.53,12.53z" /> + <path + android:fillColor="#FF000000" + android:pathData="M10.06,6.88L9.47,7.47l1.06,1.06l0.59,-0.59c1.07,-1.07 1.07,-2.82 0,-3.89l-0.59,-0.59L9.47,4.53l0.59,0.59C10.54,5.6 10.54,6.4 10.06,6.88z" /> + <path + android:fillColor="#FF000000" + android:pathData="M17.06,11.88l-1.59,1.59l1.06,1.06l1.59,-1.59c0.49,-0.49 1.28,-0.49 1.77,0l1.61,1.61l1.06,-1.06l-1.61,-1.61C19.87,10.81 18.13,10.81 17.06,11.88z" /> + <path + android:fillColor="#FF000000" + android:pathData="M15.06,5.88l-3.59,3.59l1.06,1.06l3.59,-3.59c1.07,-1.07 1.07,-2.82 0,-3.89l-1.59,-1.59l-1.06,1.06l1.59,1.59C15.54,4.6 15.54,5.4 15.06,5.88z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/cell_tower.xml b/qqq/android/mobileapp/src/main/res/drawable/cell_tower.xml new file mode 100644 index 0000000..9f0847f --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/cell_tower.xml @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/communication/cell_tower/materialicons/black/res/drawable/baseline_cell_tower_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M7.3,14.7l1.2,-1.2c-1,-1 -1.5,-2.3 -1.5,-3.5c0,-1.3 0.5,-2.6 1.5,-3.5L7.3,5.3c-1.3,1.3 -2,3 -2,4.7S6,13.4 7.3,14.7z" /> + <path + android:fillColor="#FF000000" + android:pathData="M19.1,2.9l-1.2,1.2c1.6,1.6 2.4,3.8 2.4,5.9c0,2.1 -0.8,4.3 -2.4,5.9l1.2,1.2c2,-2 2.9,-4.5 2.9,-7.1C22,7.4 21,4.9 19.1,2.9z" /> + <path + android:fillColor="#FF000000" + android:pathData="M6.1,4.1L4.9,2.9C3,4.9 2,7.4 2,10c0,2.6 1,5.1 2.9,7.1l1.2,-1.2c-1.6,-1.6 -2.4,-3.8 -2.4,-5.9C3.7,7.9 4.5,5.7 6.1,4.1z" /> + <path + android:fillColor="#FF000000" + android:pathData="M16.7,14.7c1.3,-1.3 2,-3 2,-4.7c-0.1,-1.7 -0.7,-3.4 -2,-4.7l-1.2,1.2c1,1 1.5,2.3 1.5,3.5c0,1.3 -0.5,2.6 -1.5,3.5L16.7,14.7z" /> + <path + android:fillColor="#FF000000" + android:pathData="M14.5,10c0,-1.38 -1.12,-2.5 -2.5,-2.5S9.5,8.62 9.5,10c0,0.76 0.34,1.42 0.87,1.88L7,22h2l0.67,-2h4.67L15,22h2l-3.37,-10.12C14.16,11.42 14.5,10.76 14.5,10zM10.33,18L12,13l1.67,5H10.33z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/cell_wifi.xml b/qqq/android/mobileapp/src/main/res/drawable/cell_wifi.xml new file mode 100644 index 0000000..98ec033 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/cell_wifi.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/communication/cell_wifi/materialicons/black/res/drawable/baseline_cell_wifi_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M18,9.98L6,22h12h4V5.97L18,9.98zM20,20h-2v-7.22l2,-2V20zM5.22,7.22L3.93,5.93c3.9,-3.91 10.24,-3.91 14.15,0l-1.29,1.29C13.6,4.03 8.41,4.03 5.22,7.22zM12.93,11.07L11,13l-1.93,-1.93C10.14,10.01 11.86,10.01 12.93,11.07zM14.22,9.79c-1.78,-1.77 -4.66,-1.77 -6.43,0L6.5,8.5c2.48,-2.48 6.52,-2.48 9,0L14.22,9.79z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/center_focus_strong.xml b/qqq/android/mobileapp/src/main/res/drawable/center_focus_strong.xml new file mode 100644 index 0000000..6b1a92d --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/center_focus_strong.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/center_focus_strong/materialicons/black/res/drawable/baseline_center_focus_strong_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,8c-2.21,0 -4,1.79 -4,4s1.79,4 4,4 4,-1.79 4,-4 -1.79,-4 -4,-4zM5,15L3,15v4c0,1.1 0.9,2 2,2h4v-2L5,19v-4zM5,5h4L9,3L5,3c-1.1,0 -2,0.9 -2,2v4h2L5,5zM19,3h-4v2h4v4h2L21,5c0,-1.1 -0.9,-2 -2,-2zM19,19h-4v2h4c1.1,0 2,-0.9 2,-2v-4h-2v4z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/center_focus_weak.xml b/qqq/android/mobileapp/src/main/res/drawable/center_focus_weak.xml new file mode 100644 index 0000000..edcd3ae --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/center_focus_weak.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/center_focus_weak/materialicons/black/res/drawable/baseline_center_focus_weak_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M5,15L3,15v4c0,1.1 0.9,2 2,2h4v-2L5,19v-4zM5,5h4L9,3L5,3c-1.1,0 -2,0.9 -2,2v4h2L5,5zM19,3h-4v2h4v4h2L21,5c0,-1.1 -0.9,-2 -2,-2zM19,19h-4v2h4c1.1,0 2,-0.9 2,-2v-4h-2v4zM12,8c-2.21,0 -4,1.79 -4,4s1.79,4 4,4 4,-1.79 4,-4 -1.79,-4 -4,-4zM12,14c-1.1,0 -2,-0.9 -2,-2s0.9,-2 2,-2 2,0.9 2,2 -0.9,2 -2,2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/chair.xml b/qqq/android/mobileapp/src/main/res/drawable/chair.xml new file mode 100644 index 0000000..c1d73a6 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/chair.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/search/chair/materialicons/black/res/drawable/baseline_chair_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M7,11v2h10v-2c0,-1.86 1.28,-3.41 3,-3.86V6c0,-1.65 -1.35,-3 -3,-3H7C5.35,3 4,4.35 4,6v1.14C5.72,7.59 7,9.14 7,11z" /> + <path + android:fillColor="#FF000000" + android:pathData="M21,9c-1.1,0 -2,0.9 -2,2v4H5v-4c0,-1.1 -0.9,-2 -2,-2s-2,0.9 -2,2v5c0,1.65 1.35,3 3,3v1c0,0.55 0.45,1 1,1c0.55,0 1,-0.45 1,-1v-1h12v1c0,0.55 0.45,1 1,1c0.55,0 1,-0.45 1,-1v-1c1.65,0 3,-1.35 3,-3v-5C23,9.9 22.1,9 21,9z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/chair_alt.xml b/qqq/android/mobileapp/src/main/res/drawable/chair_alt.xml new file mode 100644 index 0000000..8285de1 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/chair_alt.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/search/chair_alt/materialicons/black/res/drawable/baseline_chair_alt_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M17,10c1.1,0 2,-0.9 2,-2V5c0,-1.1 -0.9,-2 -2,-2H7C5.9,3 5,3.9 5,5v3c0,1.1 0.9,2 2,2h1v2H7c-1.1,0 -2,0.9 -2,2v7h2v-3h10v3h2v-7c0,-1.1 -0.9,-2 -2,-2h-1v-2H17zM7,8V5h10v3H7zM17,16H7v-2h10V16zM14,12h-4v-2h4V12z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/chalet.xml b/qqq/android/mobileapp/src/main/res/drawable/chalet.xml new file mode 100644 index 0000000..184159e --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/chalet.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/places/chalet/materialicons/black/res/drawable/baseline_chalet_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M10,7.5l7.5,7.5l-1.41,1.41L15,15.33V20h-4v-5H9v5H5v-4.67l-1.09,1.09L2.5,15L10,7.5zM22,6.5h-1.19l0.75,-0.75l-0.71,-0.71L19.39,6.5H18.5V5.61l1.45,-1.45l-0.71,-0.71L18.5,4.19V3h-1v1.19l-0.75,-0.75l-0.71,0.71l1.45,1.45V6.5h-0.89l-1.45,-1.45l-0.71,0.71l0.75,0.75H14v1h1.19l-0.75,0.75l0.71,0.71l1.45,-1.45h0.89v0.89l-1.45,1.45l0.71,0.71l0.75,-0.75V11h1V9.81l0.75,0.75l0.71,-0.71L18.5,8.39V7.5h0.89l1.45,1.45l0.71,-0.71L20.81,7.5H22V6.5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/change_circle.xml b/qqq/android/mobileapp/src/main/res/drawable/change_circle.xml new file mode 100644 index 0000000..1090c03 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/change_circle.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/content/change_circle/materialicons/black/res/drawable/baseline_change_circle_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,2C6.48,2 2,6.48 2,12c0,5.52 4.48,10 10,10s10,-4.48 10,-10C22,6.48 17.52,2 12,2zM12.06,19v-2.01c-0.02,0 -0.04,0 -0.06,0c-1.28,0 -2.56,-0.49 -3.54,-1.46c-1.71,-1.71 -1.92,-4.35 -0.64,-6.29l1.1,1.1c-0.71,1.33 -0.53,3.01 0.59,4.13c0.7,0.7 1.62,1.03 2.54,1.01v-2.14l2.83,2.83L12.06,19zM16.17,14.76l-1.1,-1.1c0.71,-1.33 0.53,-3.01 -0.59,-4.13C13.79,8.84 12.9,8.5 12,8.5c-0.02,0 -0.04,0 -0.06,0v2.15L9.11,7.83L11.94,5v2.02c1.3,-0.02 2.61,0.45 3.6,1.45C17.24,10.17 17.45,12.82 16.17,14.76z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/change_history.xml b/qqq/android/mobileapp/src/main/res/drawable/change_history.xml new file mode 100644 index 0000000..b4e8619 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/change_history.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/change_history/materialicons/black/res/drawable/baseline_change_history_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,7.77L18.39,18H5.61L12,7.77M12,4L2,20h20L12,4z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/charging_station.xml b/qqq/android/mobileapp/src/main/res/drawable/charging_station.xml new file mode 100644 index 0000000..a4253a4 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/charging_station.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/places/charging_station/materialicons/black/res/drawable/baseline_charging_station_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M14.5,11l-3,6v-4h-2l3,-6v4H14.5zM7,1h10c1.1,0 2,0.9 2,2v18c0,1.1 -0.9,2 -2,2H7c-1.1,0 -2,-0.9 -2,-2V3C5,1.9 5.9,1 7,1zM7,6v12h10V6H7z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/chat.xml b/qqq/android/mobileapp/src/main/res/drawable/chat.xml new file mode 100644 index 0000000..f143432 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/chat.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/communication/chat/materialicons/black/res/drawable/baseline_chat_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,2L4,2c-1.1,0 -1.99,0.9 -1.99,2L2,22l4,-4h14c1.1,0 2,-0.9 2,-2L22,4c0,-1.1 -0.9,-2 -2,-2zM6,9h12v2L6,11L6,9zM14,14L6,14v-2h8v2zM18,8L6,8L6,6h12v2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/chat_bubble.xml b/qqq/android/mobileapp/src/main/res/drawable/chat_bubble.xml new file mode 100644 index 0000000..20c39e6 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/chat_bubble.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/communication/chat_bubble/materialicons/black/res/drawable/baseline_chat_bubble_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,2H4c-1.1,0 -2,0.9 -2,2v18l4,-4h14c1.1,0 2,-0.9 2,-2V4c0,-1.1 -0.9,-2 -2,-2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/chat_bubble_outline.xml b/qqq/android/mobileapp/src/main/res/drawable/chat_bubble_outline.xml new file mode 100644 index 0000000..6f83c33 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/chat_bubble_outline.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/communication/chat_bubble_outline/materialicons/black/res/drawable/baseline_chat_bubble_outline_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,2L4,2c-1.1,0 -2,0.9 -2,2v18l4,-4h14c1.1,0 2,-0.9 2,-2L22,4c0,-1.1 -0.9,-2 -2,-2zM20,16L6,16l-2,2L4,4h16v12z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/check.xml b/qqq/android/mobileapp/src/main/res/drawable/check.xml new file mode 100644 index 0000000..bcd27c8 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/check.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/navigation/check/materialicons/black/res/drawable/baseline_check_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M9,16.17L4.83,12l-1.42,1.41L9,19 21,7l-1.41,-1.41z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/check_box.xml b/qqq/android/mobileapp/src/main/res/drawable/check_box.xml new file mode 100644 index 0000000..21fb1b6 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/check_box.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/toggle/check_box/materialicons/black/res/drawable/baseline_check_box_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19,3L5,3c-1.11,0 -2,0.9 -2,2v14c0,1.1 0.89,2 2,2h14c1.11,0 2,-0.9 2,-2L21,5c0,-1.1 -0.89,-2 -2,-2zM10,17l-5,-5 1.41,-1.41L10,14.17l7.59,-7.59L19,8l-9,9z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/check_box_outline_blank.xml b/qqq/android/mobileapp/src/main/res/drawable/check_box_outline_blank.xml new file mode 100644 index 0000000..51a0c03 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/check_box_outline_blank.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/toggle/check_box_outline_blank/materialicons/black/res/drawable/baseline_check_box_outline_blank_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19,5v14H5V5h14m0,-2H5c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2V5c0,-1.1 -0.9,-2 -2,-2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/check_circle.xml b/qqq/android/mobileapp/src/main/res/drawable/check_circle.xml new file mode 100644 index 0000000..879dae3 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/check_circle.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/check_circle/materialicons/black/res/drawable/baseline_check_circle_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM10,17l-5,-5 1.41,-1.41L10,14.17l7.59,-7.59L19,8l-9,9z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/check_circle_outline.xml b/qqq/android/mobileapp/src/main/res/drawable/check_circle_outline.xml new file mode 100644 index 0000000..117877a --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/check_circle_outline.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/check_circle_outline/materialicons/black/res/drawable/baseline_check_circle_outline_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M16.59,7.58L10,14.17l-3.59,-3.58L5,12l5,5 8,-8zM12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM12,20c-4.42,0 -8,-3.58 -8,-8s3.58,-8 8,-8 8,3.58 8,8 -3.58,8 -8,8z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/checklist.xml b/qqq/android/mobileapp/src/main/res/drawable/checklist.xml new file mode 100644 index 0000000..3d19d75 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/checklist.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/editor/checklist/materialicons/black/res/drawable/baseline_checklist_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M22,7h-9v2h9V7zM22,15h-9v2h9V15zM5.54,11L2,7.46l1.41,-1.41l2.12,2.12l4.24,-4.24l1.41,1.41L5.54,11zM5.54,19L2,15.46l1.41,-1.41l2.12,2.12l4.24,-4.24l1.41,1.41L5.54,19z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/checklist_rtl.xml b/qqq/android/mobileapp/src/main/res/drawable/checklist_rtl.xml new file mode 100644 index 0000000..754a304 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/checklist_rtl.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/editor/checklist_rtl/materialicons/black/res/drawable/baseline_checklist_rtl_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M11,7H2v2h9V7zM11,15H2v2h9V15zM16.34,11l-3.54,-3.54l1.41,-1.41l2.12,2.12l4.24,-4.24L22,5.34L16.34,11zM16.34,19l-3.54,-3.54l1.41,-1.41l2.12,2.12l4.24,-4.24L22,13.34L16.34,19z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/checkroom.xml b/qqq/android/mobileapp/src/main/res/drawable/checkroom.xml new file mode 100644 index 0000000..1518472 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/checkroom.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/places/checkroom/materialicons/black/res/drawable/baseline_checkroom_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M21.6,18.2L13,11.75v-0.91c1.65,-0.49 2.8,-2.17 2.43,-4.05c-0.26,-1.31 -1.3,-2.4 -2.61,-2.7C10.54,3.57 8.5,5.3 8.5,7.5h2C10.5,6.67 11.17,6 12,6s1.5,0.67 1.5,1.5c0,0.84 -0.69,1.52 -1.53,1.5C11.43,8.99 11,9.45 11,9.99v1.76L2.4,18.2C1.63,18.78 2.04,20 3,20h9h9C21.96,20 22.37,18.78 21.6,18.2zM6,18l6,-4.5l6,4.5H6z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/chevron_left.xml b/qqq/android/mobileapp/src/main/res/drawable/chevron_left.xml new file mode 100644 index 0000000..d295b46 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/chevron_left.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/navigation/chevron_left/materialicons/black/res/drawable/baseline_chevron_left_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M15.41,7.41L14,6l-6,6 6,6 1.41,-1.41L10.83,12z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/chevron_right.xml b/qqq/android/mobileapp/src/main/res/drawable/chevron_right.xml new file mode 100644 index 0000000..27f11b1 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/chevron_right.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/navigation/chevron_right/materialicons/black/res/drawable/baseline_chevron_right_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M10,6L8.59,7.41 13.17,12l-4.58,4.59L10,18l6,-6z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/child_care.xml b/qqq/android/mobileapp/src/main/res/drawable/child_care.xml new file mode 100644 index 0000000..ea79194 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/child_care.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/places/child_care/materialicons/black/res/drawable/baseline_child_care_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M14.5,10.5m-1.25,0a1.25,1.25 0,1 1,2.5 0a1.25,1.25 0,1 1,-2.5 0" /> + <path + android:fillColor="#FF000000" + android:pathData="M9.5,10.5m-1.25,0a1.25,1.25 0,1 1,2.5 0a1.25,1.25 0,1 1,-2.5 0" /> + <path + android:fillColor="#FF000000" + android:pathData="M22.94,12.66c0.04,-0.21 0.06,-0.43 0.06,-0.66s-0.02,-0.45 -0.06,-0.66c-0.25,-1.51 -1.36,-2.74 -2.81,-3.17 -0.53,-1.12 -1.28,-2.1 -2.19,-2.91C16.36,3.85 14.28,3 12,3s-4.36,0.85 -5.94,2.26c-0.92,0.81 -1.67,1.8 -2.19,2.91 -1.45,0.43 -2.56,1.65 -2.81,3.17 -0.04,0.21 -0.06,0.43 -0.06,0.66s0.02,0.45 0.06,0.66c0.25,1.51 1.36,2.74 2.81,3.17 0.52,1.11 1.27,2.09 2.17,2.89C7.62,20.14 9.71,21 12,21s4.38,-0.86 5.97,-2.28c0.9,-0.8 1.65,-1.79 2.17,-2.89 1.44,-0.43 2.55,-1.65 2.8,-3.17zM19,14c-0.1,0 -0.19,-0.02 -0.29,-0.03 -0.2,0.67 -0.49,1.29 -0.86,1.86C16.6,17.74 14.45,19 12,19s-4.6,-1.26 -5.85,-3.17c-0.37,-0.57 -0.66,-1.19 -0.86,-1.86 -0.1,0.01 -0.19,0.03 -0.29,0.03 -1.1,0 -2,-0.9 -2,-2s0.9,-2 2,-2c0.1,0 0.19,0.02 0.29,0.03 0.2,-0.67 0.49,-1.29 0.86,-1.86C7.4,6.26 9.55,5 12,5s4.6,1.26 5.85,3.17c0.37,0.57 0.66,1.19 0.86,1.86 0.1,-0.01 0.19,-0.03 0.29,-0.03 1.1,0 2,0.9 2,2s-0.9,2 -2,2zM7.5,14c0.76,1.77 2.49,3 4.5,3s3.74,-1.23 4.5,-3h-9z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/child_friendly.xml b/qqq/android/mobileapp/src/main/res/drawable/child_friendly.xml new file mode 100644 index 0000000..69a2173 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/child_friendly.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/places/child_friendly/materialicons/black/res/drawable/baseline_child_friendly_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M13,2v8h8c0,-4.42 -3.58,-8 -8,-8zM19.32,15.89C20.37,14.54 21,12.84 21,11L6.44,11l-0.95,-2L2,9v2h2.22s1.89,4.07 2.12,4.42c-1.1,0.59 -1.84,1.75 -1.84,3.08C4.5,20.43 6.07,22 8,22c1.76,0 3.22,-1.3 3.46,-3h2.08c0.24,1.7 1.7,3 3.46,3 1.93,0 3.5,-1.57 3.5,-3.5 0,-1.04 -0.46,-1.97 -1.18,-2.61zM8,20c-0.83,0 -1.5,-0.67 -1.5,-1.5S7.17,17 8,17s1.5,0.67 1.5,1.5S8.83,20 8,20zM17,20c-0.83,0 -1.5,-0.67 -1.5,-1.5S16.17,17 17,17s1.5,0.67 1.5,1.5S17.83,20 17,20z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/chrome_reader_mode.xml b/qqq/android/mobileapp/src/main/res/drawable/chrome_reader_mode.xml new file mode 100644 index 0000000..76b5654 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/chrome_reader_mode.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/chrome_reader_mode/materialicons/black/res/drawable/baseline_chrome_reader_mode_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M13,12h7v1.5h-7zM13,9.5h7L20,11h-7zM13,14.5h7L20,16h-7zM21,4L3,4c-1.1,0 -2,0.9 -2,2v13c0,1.1 0.9,2 2,2h18c1.1,0 2,-0.9 2,-2L23,6c0,-1.1 -0.9,-2 -2,-2zM21,19h-9L12,6h9v13z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/church.xml b/qqq/android/mobileapp/src/main/res/drawable/church.xml new file mode 100644 index 0000000..6ab59f1 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/church.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/church/materialicons/black/res/drawable/baseline_church_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M18,12.22V9l-5,-2.5V5h2V3h-2V1h-2v2H9v2h2v1.5L6,9v3.22L2,14v8h8v-3c0,-1.1 0.9,-2 2,-2s2,0.9 2,2v3h8v-8L18,12.22zM12,13.5c-0.83,0 -1.5,-0.67 -1.5,-1.5s0.67,-1.5 1.5,-1.5s1.5,0.67 1.5,1.5S12.83,13.5 12,13.5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/circle.xml b/qqq/android/mobileapp/src/main/res/drawable/circle.xml new file mode 100644 index 0000000..7cb73b8 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/circle.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/circle/materialicons/black/res/drawable/baseline_circle_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,2C6.47,2 2,6.47 2,12s4.47,10 10,10 10,-4.47 10,-10S17.53,2 12,2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/circle_notifications.xml b/qqq/android/mobileapp/src/main/res/drawable/circle_notifications.xml new file mode 100644 index 0000000..a5a3ad6 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/circle_notifications.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/circle_notifications/materialicons/black/res/drawable/baseline_circle_notifications_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM12,18.5c-0.83,0 -1.5,-0.67 -1.5,-1.5h3c0,0.83 -0.67,1.5 -1.5,1.5zM17,16L7,16v-1l1,-1v-2.61C8,9.27 9.03,7.47 11,7v-0.5c0,-0.57 0.43,-1 1,-1s1,0.43 1,1L13,7c1.97,0.47 3,2.28 3,4.39L16,14l1,1v1z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/clean_hands.xml b/qqq/android/mobileapp/src/main/res/drawable/clean_hands.xml new file mode 100644 index 0000000..5e9aa88 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/clean_hands.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/clean_hands/materialicons/black/res/drawable/baseline_clean_hands_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M16.99,5l0.63,1.37L18.99,7l-1.37,0.63L16.99,9l-0.63,-1.37L14.99,7l1.37,-0.63L16.99,5M11,6.13V4h2c0.57,0 1.1,0.17 1.55,0.45l1.43,-1.43C15.15,2.39 14.13,2 13,2c-1.48,0 -5.5,0 -5.5,0v2H9v2.14C7.23,6.51 5.81,7.8 5.26,9.5h3.98L15,11.65v-0.62C15,8.61 13.28,6.59 11,6.13zM1,22h4V11H1V22zM20,17h-7l-2.09,-0.73l0.33,-0.94L13,16h2.82c0.65,0 1.18,-0.53 1.18,-1.18l0,0c0,-0.49 -0.31,-0.93 -0.77,-1.11L8.97,11H7v9.02L14,22l8,-3l0,0C21.99,17.9 21.11,17 20,17zM20,14c1.1,0 2,-0.9 2,-2c0,-1.1 -2,-4 -2,-4s-2,2.9 -2,4C18,13.1 18.9,14 20,14z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/cleaning_services.xml b/qqq/android/mobileapp/src/main/res/drawable/cleaning_services.xml new file mode 100644 index 0000000..735abcb --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/cleaning_services.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/cleaning_services/materialicons/black/res/drawable/baseline_cleaning_services_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M16,11h-1V3c0,-1.1 -0.9,-2 -2,-2h-2C9.9,1 9,1.9 9,3v8H8c-2.76,0 -5,2.24 -5,5v7h18v-7C21,13.24 18.76,11 16,11zM19,21h-2v-3c0,-0.55 -0.45,-1 -1,-1s-1,0.45 -1,1v3h-2v-3c0,-0.55 -0.45,-1 -1,-1s-1,0.45 -1,1v3H9v-3c0,-0.55 -0.45,-1 -1,-1s-1,0.45 -1,1v3H5v-5c0,-1.65 1.35,-3 3,-3h8c1.65,0 3,1.35 3,3V21z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/clear.xml b/qqq/android/mobileapp/src/main/res/drawable/clear.xml new file mode 100644 index 0000000..aa59b23 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/clear.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/content/clear/materialicons/black/res/drawable/baseline_clear_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19,6.41L17.59,5 12,10.59 6.41,5 5,6.41 10.59,12 5,17.59 6.41,19 12,13.41 17.59,19 19,17.59 13.41,12z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/clear_all.xml b/qqq/android/mobileapp/src/main/res/drawable/clear_all.xml new file mode 100644 index 0000000..f9994be --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/clear_all.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/communication/clear_all/materialicons/black/res/drawable/baseline_clear_all_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M5,13h14v-2L5,11v2zM3,17h14v-2L3,15v2zM7,7v2h14L21,7L7,7z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/close.xml b/qqq/android/mobileapp/src/main/res/drawable/close.xml new file mode 100644 index 0000000..2cda9c4 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/close.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/navigation/close/materialicons/black/res/drawable/baseline_close_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19,6.41L17.59,5 12,10.59 6.41,5 5,6.41 10.59,12 5,17.59 6.41,19 12,13.41 17.59,19 19,17.59 13.41,12z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/close_fullscreen.xml b/qqq/android/mobileapp/src/main/res/drawable/close_fullscreen.xml new file mode 100644 index 0000000..8b0b714 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/close_fullscreen.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/close_fullscreen/materialicons/black/res/drawable/baseline_close_fullscreen_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M22,3.41l-5.29,5.29L20,12h-8V4l3.29,3.29L20.59,2L22,3.41zM3.41,22l5.29,-5.29L12,20v-8H4l3.29,3.29L2,20.59L3.41,22z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/closed_caption.xml b/qqq/android/mobileapp/src/main/res/drawable/closed_caption.xml new file mode 100644 index 0000000..9a4cd83 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/closed_caption.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/av/closed_caption/materialicons/black/res/drawable/baseline_closed_caption_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19,4L5,4c-1.11,0 -2,0.9 -2,2v12c0,1.1 0.89,2 2,2h14c1.1,0 2,-0.9 2,-2L21,6c0,-1.1 -0.9,-2 -2,-2zM11,11L9.5,11v-0.5h-2v3h2L9.5,13L11,13v1c0,0.55 -0.45,1 -1,1L7,15c-0.55,0 -1,-0.45 -1,-1v-4c0,-0.55 0.45,-1 1,-1h3c0.55,0 1,0.45 1,1v1zM18,11h-1.5v-0.5h-2v3h2L16.5,13L18,13v1c0,0.55 -0.45,1 -1,1h-3c-0.55,0 -1,-0.45 -1,-1v-4c0,-0.55 0.45,-1 1,-1h3c0.55,0 1,0.45 1,1v1z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/closed_caption_disabled.xml b/qqq/android/mobileapp/src/main/res/drawable/closed_caption_disabled.xml new file mode 100644 index 0000000..5fbcd25 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/closed_caption_disabled.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/av/closed_caption_disabled/materialicons/black/res/drawable/baseline_closed_caption_disabled_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M6.83,4H19c1.1,0 2,0.9 2,2v12c0,0.05 -0.01,0.1 -0.02,0.16l-3.38,-3.38C17.84,14.59 18,14.32 18,14v-1h-1.5v0.5h-0.17l-1.83,-1.83V10.5h2V11H18v-1c0,-0.55 -0.45,-1 -1,-1h-3c-0.55,0 -1,0.45 -1,1v0.17L6.83,4zM19.78,22.61L17.17,20H5c-1.11,0 -2,-0.9 -2,-2V6c0,-0.05 0.02,-0.1 0.02,-0.15L1.39,4.22l1.41,-1.41l18.38,18.38L19.78,22.61zM11,13.83L10.17,13H9.5v0.5h-2v-3h0.17L6.4,9.22C6.16,9.41 6,9.68 6,10v4c0,0.55 0.45,1 1,1h3c0.55,0 1,-0.45 1,-1V13.83z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/closed_caption_off.xml b/qqq/android/mobileapp/src/main/res/drawable/closed_caption_off.xml new file mode 100644 index 0000000..74cea4e --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/closed_caption_off.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/av/closed_caption_off/materialicons/black/res/drawable/baseline_closed_caption_off_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19.5,5.5v13h-15v-13h15zM19,4L5,4c-1.11,0 -2,0.9 -2,2v12c0,1.1 0.89,2 2,2h14c1.1,0 2,-0.9 2,-2L21,6c0,-1.1 -0.9,-2 -2,-2zM11,11L9.5,11v-0.5h-2v3h2L9.5,13L11,13v1c0,0.55 -0.45,1 -1,1L7,15c-0.55,0 -1,-0.45 -1,-1v-4c0,-0.55 0.45,-1 1,-1h3c0.55,0 1,0.45 1,1v1zM18,11h-1.5v-0.5h-2v3h2L16.5,13L18,13v1c0,0.55 -0.45,1 -1,1h-3c-0.55,0 -1,-0.45 -1,-1v-4c0,-0.55 0.45,-1 1,-1h3c0.55,0 1,0.45 1,1v1z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/cloud.xml b/qqq/android/mobileapp/src/main/res/drawable/cloud.xml new file mode 100644 index 0000000..6c94e73 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/cloud.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/file/cloud/materialicons/black/res/drawable/baseline_cloud_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19.35,10.04C18.67,6.59 15.64,4 12,4 9.11,4 6.6,5.64 5.35,8.04 2.34,8.36 0,10.91 0,14c0,3.31 2.69,6 6,6h13c2.76,0 5,-2.24 5,-5 0,-2.64 -2.05,-4.78 -4.65,-4.96z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/cloud_circle.xml b/qqq/android/mobileapp/src/main/res/drawable/cloud_circle.xml new file mode 100644 index 0000000..86f7851 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/cloud_circle.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/file/cloud_circle/materialicons/black/res/drawable/baseline_cloud_circle_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM16.5,16L8,16c-1.66,0 -3,-1.34 -3,-3s1.34,-3 3,-3l0.14,0.01C8.58,8.28 10.13,7 12,7c2.21,0 4,1.79 4,4h0.5c1.38,0 2.5,1.12 2.5,2.5S17.88,16 16.5,16z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/cloud_done.xml b/qqq/android/mobileapp/src/main/res/drawable/cloud_done.xml new file mode 100644 index 0000000..f75f9ac --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/cloud_done.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/file/cloud_done/materialicons/black/res/drawable/baseline_cloud_done_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19.35,10.04C18.67,6.59 15.64,4 12,4 9.11,4 6.6,5.64 5.35,8.04 2.34,8.36 0,10.91 0,14c0,3.31 2.69,6 6,6h13c2.76,0 5,-2.24 5,-5 0,-2.64 -2.05,-4.78 -4.65,-4.96zM10,17l-3.5,-3.5 1.41,-1.41L10,14.17 15.18,9l1.41,1.41L10,17z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/cloud_download.xml b/qqq/android/mobileapp/src/main/res/drawable/cloud_download.xml new file mode 100644 index 0000000..97d4fb0 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/cloud_download.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/file/cloud_download/materialicons/black/res/drawable/baseline_cloud_download_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19.35,10.04C18.67,6.59 15.64,4 12,4 9.11,4 6.6,5.64 5.35,8.04 2.34,8.36 0,10.91 0,14c0,3.31 2.69,6 6,6h13c2.76,0 5,-2.24 5,-5 0,-2.64 -2.05,-4.78 -4.65,-4.96zM17,13l-5,5 -5,-5h3V9h4v4h3z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/cloud_off.xml b/qqq/android/mobileapp/src/main/res/drawable/cloud_off.xml new file mode 100644 index 0000000..e4857e1 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/cloud_off.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/file/cloud_off/materialicons/black/res/drawable/baseline_cloud_off_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19.35,10.04C18.67,6.59 15.64,4 12,4c-1.48,0 -2.85,0.43 -4.01,1.17l1.46,1.46C10.21,6.23 11.08,6 12,6c3.04,0 5.5,2.46 5.5,5.5v0.5H19c1.66,0 3,1.34 3,3 0,1.13 -0.64,2.11 -1.56,2.62l1.45,1.45C23.16,18.16 24,16.68 24,15c0,-2.64 -2.05,-4.78 -4.65,-4.96zM3,5.27l2.75,2.74C2.56,8.15 0,10.77 0,14c0,3.31 2.69,6 6,6h11.73l2,2L21,20.73 4.27,4 3,5.27zM7.73,10l8,8H6c-2.21,0 -4,-1.79 -4,-4s1.79,-4 4,-4h1.73z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/cloud_queue.xml b/qqq/android/mobileapp/src/main/res/drawable/cloud_queue.xml new file mode 100644 index 0000000..0959195 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/cloud_queue.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/file/cloud_queue/materialicons/black/res/drawable/baseline_cloud_queue_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19.35,10.04C18.67,6.59 15.64,4 12,4 9.11,4 6.6,5.64 5.35,8.04 2.34,8.36 0,10.91 0,14c0,3.31 2.69,6 6,6h13c2.76,0 5,-2.24 5,-5 0,-2.64 -2.05,-4.78 -4.65,-4.96zM19,18H6c-2.21,0 -4,-1.79 -4,-4s1.79,-4 4,-4h0.71C7.37,7.69 9.48,6 12,6c3.04,0 5.5,2.46 5.5,5.5v0.5H19c1.66,0 3,1.34 3,3s-1.34,3 -3,3z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/cloud_sync.xml b/qqq/android/mobileapp/src/main/res/drawable/cloud_sync.xml new file mode 100644 index 0000000..e75557b --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/cloud_sync.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/file/cloud_sync/materialicons/black/res/drawable/baseline_cloud_sync_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M21.5,14.98c-0.02,0 -0.03,0 -0.05,0.01C21.2,13.3 19.76,12 18,12c-1.4,0 -2.6,0.83 -3.16,2.02C13.26,14.1 12,15.4 12,17c0,1.66 1.34,3 3,3l6.5,-0.02c1.38,0 2.5,-1.12 2.5,-2.5S22.88,14.98 21.5,14.98zM10,4.26v2.09C7.67,7.18 6,9.39 6,12c0,1.77 0.78,3.34 2,4.44V14h2v6H4v-2h2.73C5.06,16.54 4,14.4 4,12C4,8.27 6.55,5.15 10,4.26zM20,6h-2.73c1.43,1.26 2.41,3.01 2.66,5l-2.02,0C17.68,9.64 16.98,8.45 16,7.56V10h-2V4h6V6z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/cloud_upload.xml b/qqq/android/mobileapp/src/main/res/drawable/cloud_upload.xml new file mode 100644 index 0000000..f478988 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/cloud_upload.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/file/cloud_upload/materialicons/black/res/drawable/baseline_cloud_upload_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19.35,10.04C18.67,6.59 15.64,4 12,4 9.11,4 6.6,5.64 5.35,8.04 2.34,8.36 0,10.91 0,14c0,3.31 2.69,6 6,6h13c2.76,0 5,-2.24 5,-5 0,-2.64 -2.05,-4.78 -4.65,-4.96zM14,13v4h-4v-4H7l5,-5 5,5h-3z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/cloudy_snowing.xml b/qqq/android/mobileapp/src/main/res/drawable/cloudy_snowing.xml new file mode 100644 index 0000000..20cd03a --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/cloudy_snowing.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/home/cloudy_snowing/materialicons/black/res/drawable/baseline_cloudy_snowing_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M5,18c0,0.55 0.45,1 1,1s1,-0.45 1,-1s-0.45,-1 -1,-1S5,17.45 5,18zM17,18c0,0.55 0.45,1 1,1s1,-0.45 1,-1s-0.45,-1 -1,-1S17,17.45 17,18zM8,22c0,0.55 0.45,1 1,1s1,-0.45 1,-1s-0.45,-1 -1,-1S8,21.45 8,22zM11,18c0,0.55 0.45,1 1,1s1,-0.45 1,-1s-0.45,-1 -1,-1S11,17.45 11,18zM14,22c0,0.55 0.45,1 1,1s1,-0.45 1,-1s-0.45,-1 -1,-1S14,21.45 14,22zM17.5,16h-10C4.47,16 2,13.53 2,10.5c0,-2.76 2.09,-5.09 4.78,-5.44C7.83,3.18 9.82,2 12,2c2.97,0 5.45,2.18 5.92,5.02C20.21,7.23 22,9.16 22,11.5C22,13.98 19.98,16 17.5,16z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/co2.xml b/qqq/android/mobileapp/src/main/res/drawable/co2.xml new file mode 100644 index 0000000..e30eb78 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/co2.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/co2/materialicons/black/res/drawable/baseline_co2_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M14,9h-3c-0.55,0 -1,0.45 -1,1v4c0,0.55 0.45,1 1,1h3c0.55,0 1,-0.45 1,-1v-4C15,9.45 14.55,9 14,9zM13.5,13.5h-2v-3h2V13.5zM8,13v1c0,0.55 -0.45,1 -1,1H4c-0.55,0 -1,-0.45 -1,-1v-4c0,-0.55 0.45,-1 1,-1h3c0.55,0 1,0.45 1,1v1H6.5v-0.5h-2v3h2V13H8zM20.5,15.5h-2v1h3V18H17v-2.5c0,-0.55 0.45,-1 1,-1h2v-1h-3V12h3.5c0.55,0 1,0.45 1,1v1.5C21.5,15.05 21.05,15.5 20.5,15.5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/co_present.xml b/qqq/android/mobileapp/src/main/res/drawable/co_present.xml new file mode 100644 index 0000000..6820f47 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/co_present.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/communication/co_present/materialicons/black/res/drawable/baseline_co_present_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M21,3H3C1.9,3 1,3.9 1,5v8h2V5h18v16c1.1,0 2,-0.9 2,-2V5C23,3.9 22.1,3 21,3z" /> + <path + android:fillColor="#FF000000" + android:pathData="M9,10m-4,0a4,4 0,1 1,8 0a4,4 0,1 1,-8 0" /> + <path + android:fillColor="#FF000000" + android:pathData="M15.39,16.56C13.71,15.7 11.53,15 9,15c-2.53,0 -4.71,0.7 -6.39,1.56C1.61,17.07 1,18.1 1,19.22V22h16v-2.78C17,18.1 16.39,17.07 15.39,16.56z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/code.xml b/qqq/android/mobileapp/src/main/res/drawable/code.xml new file mode 100644 index 0000000..fabf085 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/code.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/code/materialicons/black/res/drawable/baseline_code_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M9.4,16.6L4.8,12l4.6,-4.6L8,6l-6,6 6,6 1.4,-1.4zM14.6,16.6l4.6,-4.6 -4.6,-4.6L16,6l6,6 -6,6 -1.4,-1.4z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/code_off.xml b/qqq/android/mobileapp/src/main/res/drawable/code_off.xml new file mode 100644 index 0000000..83340ea --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/code_off.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/code_off/materialicons/black/res/drawable/baseline_code_off_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19.17,12l-4.58,-4.59L16,6l6,6l-3.59,3.59L17,14.17L19.17,12zM1.39,4.22l4.19,4.19L2,12l6,6l1.41,-1.41L4.83,12L7,9.83l12.78,12.78l1.41,-1.41L2.81,2.81L1.39,4.22z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/coffee.xml b/qqq/android/mobileapp/src/main/res/drawable/coffee.xml new file mode 100644 index 0000000..44ec6bc --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/coffee.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/search/coffee/materialicons/black/res/drawable/baseline_coffee_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M18.5,3H6C4.9,3 4,3.9 4,5v5.71c0,3.83 2.95,7.18 6.78,7.29c3.96,0.12 7.22,-3.06 7.22,-7v-1h0.5c1.93,0 3.5,-1.57 3.5,-3.5S20.43,3 18.5,3zM16,5v3H6V5H16zM18.5,8H18V5h0.5C19.33,5 20,5.67 20,6.5S19.33,8 18.5,8zM4,19h16v2H4V19z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/coffee_maker.xml b/qqq/android/mobileapp/src/main/res/drawable/coffee_maker.xml new file mode 100644 index 0000000..a532479 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/coffee_maker.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/search/coffee_maker/materialicons/black/res/drawable/baseline_coffee_maker_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M18,6V4h2V2H6C4.9,2 4,2.9 4,4v16c0,1.1 0.9,2 2,2h14v-2h-4.03C17.2,19.09 18,17.64 18,16v-5H8v5c0,1.64 0.81,3.09 2.03,4H6V4h2v2c0,0.55 0.45,1 1,1h8C17.55,7 18,6.55 18,6z" /> + <path + android:fillColor="#FF000000" + android:pathData="M13,9m-1,0a1,1 0,1 1,2 0a1,1 0,1 1,-2 0" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/collections.xml b/qqq/android/mobileapp/src/main/res/drawable/collections.xml new file mode 100644 index 0000000..26e81f3 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/collections.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/collections/materialicons/black/res/drawable/baseline_collections_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M22,16L22,4c0,-1.1 -0.9,-2 -2,-2L8,2c-1.1,0 -2,0.9 -2,2v12c0,1.1 0.9,2 2,2h12c1.1,0 2,-0.9 2,-2zM11,12l2.03,2.71L16,11l4,5L8,16l3,-4zM2,6v14c0,1.1 0.9,2 2,2h14v-2L4,20L4,6L2,6z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/collections_bookmark.xml b/qqq/android/mobileapp/src/main/res/drawable/collections_bookmark.xml new file mode 100644 index 0000000..fc34a91 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/collections_bookmark.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/collections_bookmark/materialicons/black/res/drawable/baseline_collections_bookmark_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M4,6H2v14c0,1.1 0.9,2 2,2h14v-2H4V6z" /> + <path + android:fillColor="#FF000000" + android:pathData="M20,2L8,2c-1.1,0 -2,0.9 -2,2v12c0,1.1 0.9,2 2,2h12c1.1,0 2,-0.9 2,-2L22,4c0,-1.1 -0.9,-2 -2,-2zM20,12l-2.5,-1.5L15,12L15,4h5v8z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/color_lens.xml b/qqq/android/mobileapp/src/main/res/drawable/color_lens.xml new file mode 100644 index 0000000..fbe78bb --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/color_lens.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/color_lens/materialicons/black/res/drawable/baseline_color_lens_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,3c-4.97,0 -9,4.03 -9,9s4.03,9 9,9c0.83,0 1.5,-0.67 1.5,-1.5 0,-0.39 -0.15,-0.74 -0.39,-1.01 -0.23,-0.26 -0.38,-0.61 -0.38,-0.99 0,-0.83 0.67,-1.5 1.5,-1.5L16,16c2.76,0 5,-2.24 5,-5 0,-4.42 -4.03,-8 -9,-8zM6.5,12c-0.83,0 -1.5,-0.67 -1.5,-1.5S5.67,9 6.5,9 8,9.67 8,10.5 7.33,12 6.5,12zM9.5,8C8.67,8 8,7.33 8,6.5S8.67,5 9.5,5s1.5,0.67 1.5,1.5S10.33,8 9.5,8zM14.5,8c-0.83,0 -1.5,-0.67 -1.5,-1.5S13.67,5 14.5,5s1.5,0.67 1.5,1.5S15.33,8 14.5,8zM17.5,12c-0.83,0 -1.5,-0.67 -1.5,-1.5S16.67,9 17.5,9s1.5,0.67 1.5,1.5 -0.67,1.5 -1.5,1.5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/colorize.xml b/qqq/android/mobileapp/src/main/res/drawable/colorize.xml new file mode 100644 index 0000000..d454b4d --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/colorize.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/colorize/materialicons/black/res/drawable/baseline_colorize_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20.71,5.63l-2.34,-2.34c-0.39,-0.39 -1.02,-0.39 -1.41,0l-3.12,3.12 -1.93,-1.91 -1.41,1.41 1.42,1.42L3,16.25V21h4.75l8.92,-8.92 1.42,1.42 1.41,-1.41 -1.92,-1.92 3.12,-3.12c0.4,-0.4 0.4,-1.03 0.01,-1.42zM6.92,19L5,17.08l8.06,-8.06 1.92,1.92L6.92,19z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/comment.xml b/qqq/android/mobileapp/src/main/res/drawable/comment.xml new file mode 100644 index 0000000..e8cabe4 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/comment.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/communication/comment/materialicons/black/res/drawable/baseline_comment_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M21.99,4c0,-1.1 -0.89,-2 -1.99,-2L4,2c-1.1,0 -2,0.9 -2,2v12c0,1.1 0.9,2 2,2h14l4,4 -0.01,-18zM18,14L6,14v-2h12v2zM18,11L6,11L6,9h12v2zM18,8L6,8L6,6h12v2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/comment_bank.xml b/qqq/android/mobileapp/src/main/res/drawable/comment_bank.xml new file mode 100644 index 0000000..79f6c62 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/comment_bank.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/comment_bank/materialicons/black/res/drawable/baseline_comment_bank_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,2H4C2.9,2 2,2.9 2,4v18l4,-4h14c1.1,0 2,-0.9 2,-2V4C22,2.9 21.1,2 20,2zM19,13l-2.5,-1.5L14,13V5h5V13z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/comments_disabled.xml b/qqq/android/mobileapp/src/main/res/drawable/comments_disabled.xml new file mode 100644 index 0000000..e90e45c --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/comments_disabled.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/communication/comments_disabled/materialicons/black/res/drawable/baseline_comments_disabled_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M16.83,14H18v-2h-3.17l-1,-1H18V9h-6.17l-1,-1H18V6H8.83l-4,-4H20c1.1,0 2,0.9 2,2v15.17L16.83,14zM2.1,2.1L0.69,3.51L2,4.83V16c0,1.1 0.9,2 2,2h11.17l5.31,5.31l1.41,-1.41L2.1,2.1zM6,9h0.17l2,2H6V9zM6,14v-2h3.17l2,2H6z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/commit.xml b/qqq/android/mobileapp/src/main/res/drawable/commit.xml new file mode 100644 index 0000000..659468e --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/commit.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/commit/materialicons/black/res/drawable/baseline_commit_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M16.9,11L16.9,11c-0.46,-2.28 -2.48,-4 -4.9,-4s-4.44,1.72 -4.9,4h0H2v2h5.1h0c0.46,2.28 2.48,4 4.9,4s4.44,-1.72 4.9,-4h0H22v-2H16.9zM12,15c-1.66,0 -3,-1.34 -3,-3s1.34,-3 3,-3s3,1.34 3,3S13.66,15 12,15z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/commute.xml b/qqq/android/mobileapp/src/main/res/drawable/commute.xml new file mode 100644 index 0000000..7a15dc5 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/commute.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/commute/materialicons/black/res/drawable/baseline_commute_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,4L5,4C3.34,4 2,5.34 2,7v8c0,1.66 1.34,3 3,3l-1,1v1h1l2,-2.03L9,18v-5L4,13L4,5.98L13,6v2h2L15,7c0,-1.66 -1.34,-3 -3,-3zM5,14c0.55,0 1,0.45 1,1s-0.45,1 -1,1 -1,-0.45 -1,-1 0.45,-1 1,-1zM20.57,9.66c-0.14,-0.4 -0.52,-0.66 -0.97,-0.66h-7.19c-0.46,0 -0.83,0.26 -0.98,0.66L10,13.77l0.01,5.51c0,0.38 0.31,0.72 0.69,0.72h0.62c0.38,0 0.68,-0.38 0.68,-0.76L12,18h8v1.24c0,0.38 0.31,0.76 0.69,0.76h0.61c0.38,0 0.69,-0.34 0.69,-0.72l0.01,-1.37v-4.14l-1.43,-4.11zM12.41,10h7.19l1.03,3h-9.25l1.03,-3zM12,16c-0.55,0 -1,-0.45 -1,-1s0.45,-1 1,-1 1,0.45 1,1 -0.45,1 -1,1zM20,16c-0.55,0 -1,-0.45 -1,-1s0.45,-1 1,-1 1,0.45 1,1 -0.45,1 -1,1z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/compare.xml b/qqq/android/mobileapp/src/main/res/drawable/compare.xml new file mode 100644 index 0000000..aed7b6a --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/compare.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/compare/materialicons/black/res/drawable/baseline_compare_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M10,3L5,3c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h5v2h2L12,1h-2v2zM10,18L5,18l5,-6v6zM19,3h-5v2h5v13l-5,-6v9h5c1.1,0 2,-0.9 2,-2L21,5c0,-1.1 -0.9,-2 -2,-2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/compare_arrows.xml b/qqq/android/mobileapp/src/main/res/drawable/compare_arrows.xml new file mode 100644 index 0000000..8994d69 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/compare_arrows.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/compare_arrows/materialicons/black/res/drawable/baseline_compare_arrows_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M9.01,14H2v2h7.01v3L13,15l-3.99,-4V14zM14.99,13v-3H22V8h-7.01V5L11,9L14.99,13z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/compass_calibration.xml b/qqq/android/mobileapp/src/main/res/drawable/compass_calibration.xml new file mode 100644 index 0000000..63cbf7e --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/compass_calibration.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/compass_calibration/materialicons/black/res/drawable/baseline_compass_calibration_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,17m-4,0a4,4 0,1 1,8 0a4,4 0,1 1,-8 0" /> + <path + android:fillColor="#FF000000" + android:pathData="M12,10.07c1.95,0 3.72,0.79 5,2.07l5,-5C19.44,4.59 15.9,3 12,3S4.56,4.59 2,7.15l5,5c1.28,-1.28 3.05,-2.08 5,-2.08z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/compost.xml b/qqq/android/mobileapp/src/main/res/drawable/compost.xml new file mode 100644 index 0000000..c791f50 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/compost.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/compost/materialicons/black/res/drawable/baseline_compost_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12.87,11.81c-0.23,-0.38 -0.37,-0.83 -0.37,-1.31C12.5,9.12 13.62,8 15,8l1,0c1.51,0 2,-1 2,-1s0.55,6 -3,6c-0.49,0 -0.94,-0.14 -1.32,-0.38c-0.24,0.64 -0.59,1.76 -0.76,2.96c1.26,0.22 2.28,0.89 2.77,1.77c1.69,-1.17 2.81,-3.13 2.81,-5.35h3c0,5.24 -4.26,9.5 -9.5,9.5S2.5,17.24 2.5,12S6.76,2.5 12,2.5V0l4,4l-4,4V5.5c-3.58,0 -6.5,2.92 -6.5,6.5c0,2.21 1.11,4.17 2.81,5.35c0.51,-0.92 1.63,-1.62 2.98,-1.8c-0.09,-0.69 -0.26,-1.42 -0.49,-2.03C10.45,13.82 10,14 9.5,14c-1.1,0 -2,-0.9 -2,-2v-0.99c0,-0.56 -0.19,-1.09 -0.5,-1.51c0,0 4.45,-0.23 4.5,2.5c0,0.29 -0.06,0.56 -0.17,0.8C10.91,12.48 10.47,12.2 10,12c0.58,0.43 1.37,1.37 2,2.6c0.67,-1.62 1.68,-3.27 3,-4.6C14.24,10.52 13.53,11.12 12.87,11.81z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/compress.xml b/qqq/android/mobileapp/src/main/res/drawable/compress.xml new file mode 100644 index 0000000..c7dd761 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/compress.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/compress/materialicons/black/res/drawable/baseline_compress_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M8,19h3v3h2v-3h3l-4,-4 -4,4zM16,4h-3L13,1h-2v3L8,4l4,4 4,-4zM4,9v2h16L20,9L4,9z" /> + <path + android:fillColor="#FF000000" + android:pathData="M4,12h16v2H4z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/computer.xml b/qqq/android/mobileapp/src/main/res/drawable/computer.xml new file mode 100644 index 0000000..13483c2 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/computer.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/hardware/computer/materialicons/black/res/drawable/baseline_computer_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,18c1.1,0 1.99,-0.9 1.99,-2L22,6c0,-1.1 -0.9,-2 -2,-2H4c-1.1,0 -2,0.9 -2,2v10c0,1.1 0.9,2 2,2H0v2h24v-2h-4zM4,6h16v10H4V6z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/confirmation_number.xml b/qqq/android/mobileapp/src/main/res/drawable/confirmation_number.xml new file mode 100644 index 0000000..71e328d --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/confirmation_number.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/notification/confirmation_number/materialicons/black/res/drawable/baseline_confirmation_number_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M22,10V6c0,-1.11 -0.9,-2 -2,-2H4C2.9,4 2.01,4.89 2.01,6v4C3.11,10 4,10.9 4,12s-0.89,2 -2,2v4c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2v-4c-1.1,0 -2,-0.9 -2,-2S20.9,10 22,10zM13,17.5h-2v-2h2V17.5zM13,13h-2v-2h2V13zM13,8.5h-2v-2h2V8.5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/connect_without_contact.xml b/qqq/android/mobileapp/src/main/res/drawable/connect_without_contact.xml new file mode 100644 index 0000000..76135c0 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/connect_without_contact.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/connect_without_contact/materialicons/black/res/drawable/baseline_connect_without_contact_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M11,14H9c0,-4.97 4.03,-9 9,-9v2C14.13,7 11,10.13 11,14zM18,11V9c-2.76,0 -5,2.24 -5,5h2C15,12.34 16.34,11 18,11zM7,4c0,-1.11 -0.89,-2 -2,-2S3,2.89 3,4s0.89,2 2,2S7,5.11 7,4zM11.45,4.5h-2C9.21,5.92 7.99,7 6.5,7h-3C2.67,7 2,7.67 2,8.5V11h6V8.74C9.86,8.15 11.25,6.51 11.45,4.5zM19,17c1.11,0 2,-0.89 2,-2s-0.89,-2 -2,-2s-2,0.89 -2,2S17.89,17 19,17zM20.5,18h-3c-1.49,0 -2.71,-1.08 -2.95,-2.5h-2c0.2,2.01 1.59,3.65 3.45,4.24V22h6v-2.5C22,18.67 21.33,18 20.5,18z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/connected_tv.xml b/qqq/android/mobileapp/src/main/res/drawable/connected_tv.xml new file mode 100644 index 0000000..1a7691b --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/connected_tv.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/hardware/connected_tv/materialicons/black/res/drawable/baseline_connected_tv_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M21,3L3,3c-1.1,0 -2,0.9 -2,2v12c0,1.1 0.9,2 2,2h5v2h8v-2h5c1.1,0 1.99,-0.9 1.99,-2L23,5c0,-1.1 -0.9,-2 -2,-2zM21,17L3,17L3,5h18v12zM4,14v2h2c0,-1.11 -0.89,-2 -2,-2zM4,11v1.43c1.97,0 3.57,1.6 3.57,3.57L9,16c0,-2.76 -2.24,-5 -5,-5zM4,8v1.45c3.61,0 6.55,2.93 6.55,6.55L12,16c0,-4.42 -3.59,-8 -8,-8z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/connecting_airports.xml b/qqq/android/mobileapp/src/main/res/drawable/connecting_airports.xml new file mode 100644 index 0000000..b20b3bb --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/connecting_airports.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/connecting_airports/materialicons/black/res/drawable/baseline_connecting_airports_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M15.4,17l1.3,4.4h-1.1L13,17h-3c-0.55,0 -1,-0.45 -1,-1c0,-0.55 0.45,-1 1,-1h3l2.6,-4.4h1.1L15.4,15h2.85L19,14h1l-0.6,2l0.6,2h-1l-0.75,-1H15.4zM5.75,7L5,6H4l0.6,2L4,10h1l0.75,-1H8.6l-1.3,4.4h1.1L11,9h3c0.55,0 1,-0.45 1,-1s-0.45,-1 -1,-1h-3L8.4,2.6H7.3L8.6,7H5.75z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/construction.xml b/qqq/android/mobileapp/src/main/res/drawable/construction.xml new file mode 100644 index 0000000..b426929 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/construction.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/construction/materialicons/black/res/drawable/baseline_construction_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M13.7827,15.1719l2.1213,-2.1213l5.9962,5.9962l-2.1213,2.1213z" /> + <path + android:fillColor="#FF000000" + android:pathData="M17.5,10c1.93,0 3.5,-1.57 3.5,-3.5c0,-0.58 -0.16,-1.12 -0.41,-1.6l-2.7,2.7L16.4,6.11l2.7,-2.7C18.62,3.16 18.08,3 17.5,3C15.57,3 14,4.57 14,6.5c0,0.41 0.08,0.8 0.21,1.16l-1.85,1.85l-1.78,-1.78l0.71,-0.71L9.88,5.61L12,3.49c-1.17,-1.17 -3.07,-1.17 -4.24,0L4.22,7.03l1.41,1.41H2.81L2.1,9.15l3.54,3.54l0.71,-0.71V9.15l1.41,1.41l0.71,-0.71l1.78,1.78l-7.41,7.41l2.12,2.12L16.34,9.79C16.7,9.92 17.09,10 17.5,10z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/contact_emergency.xml b/qqq/android/mobileapp/src/main/res/drawable/contact_emergency.xml new file mode 100644 index 0000000..add12db --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/contact_emergency.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/communication/contact_emergency/materialicons/black/res/drawable/baseline_contact_emergency_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M22,3H2C0.9,3 0,3.9 0,5v14c0,1.1 0.9,2 2,2h20c1.1,0 1.99,-0.9 1.99,-2L24,5C24,3.9 23.1,3 22,3zM9,8c1.65,0 3,1.35 3,3s-1.35,3 -3,3s-3,-1.35 -3,-3S7.35,8 9,8zM2.08,19c1.38,-2.39 3.96,-4 6.92,-4s5.54,1.61 6.92,4H2.08zM20.97,9.85l-0.75,1.3l-1.47,-0.85V12h-1.5v-1.7l-1.47,0.85l-0.75,-1.3L16.5,9l-1.47,-0.85l0.75,-1.3l1.47,0.85V6h1.5v1.7l1.47,-0.85l0.75,1.3L19.5,9L20.97,9.85z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/contact_mail.xml b/qqq/android/mobileapp/src/main/res/drawable/contact_mail.xml new file mode 100644 index 0000000..94f154b --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/contact_mail.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/communication/contact_mail/materialicons/black/res/drawable/baseline_contact_mail_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M21,8L21,7l-3,2 -3,-2v1l3,2 3,-2zM22,3L2,3C0.9,3 0,3.9 0,5v14c0,1.1 0.9,2 2,2h20c1.1,0 1.99,-0.9 1.99,-2L24,5c0,-1.1 -0.9,-2 -2,-2zM8,6c1.66,0 3,1.34 3,3s-1.34,3 -3,3 -3,-1.34 -3,-3 1.34,-3 3,-3zM14,18L2,18v-1c0,-2 4,-3.1 6,-3.1s6,1.1 6,3.1v1zM22,12h-8L14,6h8v6z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/contact_page.xml b/qqq/android/mobileapp/src/main/res/drawable/contact_page.xml new file mode 100644 index 0000000..c06dcdb --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/contact_page.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/contact_page/materialicons/black/res/drawable/baseline_contact_page_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M14,2H6C4.9,2 4,2.9 4,4v16c0,1.1 0.9,2 2,2h12c1.1,0 2,-0.9 2,-2V8L14,2zM12,10c1.1,0 2,0.9 2,2c0,1.1 -0.9,2 -2,2s-2,-0.9 -2,-2C10,10.9 10.9,10 12,10zM16,18H8v-0.57c0,-0.81 0.48,-1.53 1.22,-1.85C10.07,15.21 11.01,15 12,15c0.99,0 1.93,0.21 2.78,0.58C15.52,15.9 16,16.62 16,17.43V18z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/contact_phone.xml b/qqq/android/mobileapp/src/main/res/drawable/contact_phone.xml new file mode 100644 index 0000000..a2736a4 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/contact_phone.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/communication/contact_phone/materialicons/black/res/drawable/baseline_contact_phone_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M22,3L2,3C0.9,3 0,3.9 0,5v14c0,1.1 0.9,2 2,2h20c1.1,0 1.99,-0.9 1.99,-2L24,5c0,-1.1 -0.9,-2 -2,-2zM8,6c1.66,0 3,1.34 3,3s-1.34,3 -3,3 -3,-1.34 -3,-3 1.34,-3 3,-3zM14,18L2,18v-1c0,-2 4,-3.1 6,-3.1s6,1.1 6,3.1v1zM17.85,14h1.64L21,16l-1.99,1.99c-1.31,-0.98 -2.28,-2.38 -2.73,-3.99 -0.18,-0.64 -0.28,-1.31 -0.28,-2s0.1,-1.36 0.28,-2c0.45,-1.62 1.42,-3.01 2.73,-3.99L21,8l-1.51,2h-1.64c-0.22,0.63 -0.35,1.3 -0.35,2s0.13,1.37 0.35,2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/contact_support.xml b/qqq/android/mobileapp/src/main/res/drawable/contact_support.xml new file mode 100644 index 0000000..b678bb5 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/contact_support.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/contact_support/materialicons/black/res/drawable/baseline_contact_support_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M11.5,2C6.81,2 3,5.81 3,10.5S6.81,19 11.5,19h0.5v3c4.86,-2.34 8,-7 8,-11.5C20,5.81 16.19,2 11.5,2zM12.5,16.5h-2v-2h2v2zM12.5,13h-2c0,-3.25 3,-3 3,-5 0,-1.1 -0.9,-2 -2,-2s-2,0.9 -2,2h-2c0,-2.21 1.79,-4 4,-4s4,1.79 4,4c0,2.5 -3,2.75 -3,5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/contactless.xml b/qqq/android/mobileapp/src/main/res/drawable/contactless.xml new file mode 100644 index 0000000..0c8e134 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/contactless.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/contactless/materialicons/black/res/drawable/baseline_contactless_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,2C6.48,2 2,6.48 2,12c0,5.52 4.48,10 10,10s10,-4.48 10,-10C22,6.48 17.52,2 12,2zM8.46,14.45L7.1,13.83c0.28,-0.61 0.41,-1.24 0.4,-1.86c-0.01,-0.63 -0.14,-1.24 -0.4,-1.8l1.36,-0.63c0.35,0.75 0.53,1.56 0.54,2.4C9.01,12.8 8.83,13.64 8.46,14.45zM11.53,16.01l-1.3,-0.74c0.52,-0.92 0.78,-1.98 0.78,-3.15c0,-1.19 -0.27,-2.33 -0.8,-3.4l1.34,-0.67c0.64,1.28 0.96,2.65 0.96,4.07C12.51,13.55 12.18,14.86 11.53,16.01zM14.67,17.33l-1.35,-0.66c0.78,-1.6 1.18,-3.18 1.18,-4.69c0,-1.51 -0.4,-3.07 -1.18,-4.64l1.34,-0.67C15.56,8.45 16,10.23 16,11.98C16,13.72 15.56,15.52 14.67,17.33z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/contacts.xml b/qqq/android/mobileapp/src/main/res/drawable/contacts.xml new file mode 100644 index 0000000..c985bd0 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/contacts.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/communication/contacts/materialicons/black/res/drawable/baseline_contacts_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,0L4,0v2h16L20,0zM4,24h16v-2L4,22v2zM20,4L4,4c-1.1,0 -2,0.9 -2,2v12c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2L22,6c0,-1.1 -0.9,-2 -2,-2zM12,6.75c1.24,0 2.25,1.01 2.25,2.25s-1.01,2.25 -2.25,2.25S9.75,10.24 9.75,9 10.76,6.75 12,6.75zM17,17L7,17v-1.5c0,-1.67 3.33,-2.5 5,-2.5s5,0.83 5,2.5L17,17z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/content_copy.xml b/qqq/android/mobileapp/src/main/res/drawable/content_copy.xml new file mode 100644 index 0000000..b75b6de --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/content_copy.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/content/content_copy/materialicons/black/res/drawable/baseline_content_copy_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M16,1L4,1c-1.1,0 -2,0.9 -2,2v14h2L4,3h12L16,1zM19,5L8,5c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h11c1.1,0 2,-0.9 2,-2L21,7c0,-1.1 -0.9,-2 -2,-2zM19,21L8,21L8,7h11v14z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/content_cut.xml b/qqq/android/mobileapp/src/main/res/drawable/content_cut.xml new file mode 100644 index 0000000..6d51402 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/content_cut.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/content/content_cut/materialicons/black/res/drawable/baseline_content_cut_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M9.64,7.64c0.23,-0.5 0.36,-1.05 0.36,-1.64 0,-2.21 -1.79,-4 -4,-4S2,3.79 2,6s1.79,4 4,4c0.59,0 1.14,-0.13 1.64,-0.36L10,12l-2.36,2.36C7.14,14.13 6.59,14 6,14c-2.21,0 -4,1.79 -4,4s1.79,4 4,4 4,-1.79 4,-4c0,-0.59 -0.13,-1.14 -0.36,-1.64L12,14l7,7h3v-1L9.64,7.64zM6,8c-1.1,0 -2,-0.89 -2,-2s0.9,-2 2,-2 2,0.89 2,2 -0.9,2 -2,2zM6,20c-1.1,0 -2,-0.89 -2,-2s0.9,-2 2,-2 2,0.89 2,2 -0.9,2 -2,2zM12,12.5c-0.28,0 -0.5,-0.22 -0.5,-0.5s0.22,-0.5 0.5,-0.5 0.5,0.22 0.5,0.5 -0.22,0.5 -0.5,0.5zM19,3l-6,6 2,2 7,-7L22,3z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/content_paste.xml b/qqq/android/mobileapp/src/main/res/drawable/content_paste.xml new file mode 100644 index 0000000..4b5c724 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/content_paste.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/content/content_paste/materialicons/black/res/drawable/baseline_content_paste_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19,2h-4.18C14.4,0.84 13.3,0 12,0c-1.3,0 -2.4,0.84 -2.82,2L5,2c-1.1,0 -2,0.9 -2,2v16c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2L21,4c0,-1.1 -0.9,-2 -2,-2zM12,2c0.55,0 1,0.45 1,1s-0.45,1 -1,1 -1,-0.45 -1,-1 0.45,-1 1,-1zM19,20L5,20L5,4h2v3h10L17,4h2v16z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/content_paste_go.xml b/qqq/android/mobileapp/src/main/res/drawable/content_paste_go.xml new file mode 100644 index 0000000..60a18be --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/content_paste_go.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/content/content_paste_go/materialicons/black/res/drawable/baseline_content_paste_go_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M5,5h2v3h10V5h2v6h2V5c0,-1.1 -0.9,-2 -2,-2h-4.18C14.4,1.84 13.3,1 12,1S9.6,1.84 9.18,3H5C3.9,3 3,3.9 3,5v14c0,1.1 0.9,2 2,2h5v-2H5V5zM12,3c0.55,0 1,0.45 1,1s-0.45,1 -1,1s-1,-0.45 -1,-1S11.45,3 12,3z" /> + <path + android:fillColor="#FF000000" + android:pathData="M18.01,13l-1.42,1.41l1.58,1.58l-6.17,0l0,2l6.17,0l-1.58,1.59l1.42,1.41l3.99,-4z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/content_paste_off.xml b/qqq/android/mobileapp/src/main/res/drawable/content_paste_off.xml new file mode 100644 index 0000000..18c7594 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/content_paste_off.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/content/content_paste_off/materialicons/black/res/drawable/baseline_content_paste_off_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M21.19,21.19L2.81,2.81L1.39,4.22L3,5.83V19c0,1.1 0.9,2 2,2h13.17l1.61,1.61L21.19,21.19zM5,19V7.83L16.17,19H5zM17,8V5h2v11.17l2,2V5c0,-1.1 -0.9,-2 -2,-2h-4.18C14.4,1.84 13.3,1 12,1S9.6,1.84 9.18,3H5.83l5,5H17zM12,3c0.55,0 1,0.45 1,1s-0.45,1 -1,1s-1,-0.45 -1,-1S11.45,3 12,3z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/content_paste_search.xml b/qqq/android/mobileapp/src/main/res/drawable/content_paste_search.xml new file mode 100644 index 0000000..62a5683 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/content_paste_search.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/content/content_paste_search/materialicons/black/res/drawable/baseline_content_paste_search_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M5,5h2v3h10V5h2v5h2V5c0,-1.1 -0.9,-2 -2,-2h-4.18C14.4,1.84 13.3,1 12,1S9.6,1.84 9.18,3H5C3.9,3 3,3.9 3,5v14c0,1.1 0.9,2 2,2h5v-2H5V5zM12,3c0.55,0 1,0.45 1,1s-0.45,1 -1,1s-1,-0.45 -1,-1S11.45,3 12,3z" /> + <path + android:fillColor="#FF000000" + android:pathData="M20.3,18.9c0.4,-0.7 0.7,-1.5 0.7,-2.4c0,-2.5 -2,-4.5 -4.5,-4.5S12,14 12,16.5s2,4.5 4.5,4.5c0.9,0 1.7,-0.3 2.4,-0.7l2.7,2.7l1.4,-1.4L20.3,18.9zM16.5,19c-1.4,0 -2.5,-1.1 -2.5,-2.5c0,-1.4 1.1,-2.5 2.5,-2.5s2.5,1.1 2.5,2.5C19,17.9 17.9,19 16.5,19z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/contrast.xml b/qqq/android/mobileapp/src/main/res/drawable/contrast.xml new file mode 100644 index 0000000..3d3015c --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/contrast.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/contrast/materialicons/black/res/drawable/baseline_contrast_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,22c5.52,0 10,-4.48 10,-10S17.52,2 12,2S2,6.48 2,12S6.48,22 12,22zM13,4.07c3.94,0.49 7,3.85 7,7.93s-3.05,7.44 -7,7.93V4.07z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/control_camera.xml b/qqq/android/mobileapp/src/main/res/drawable/control_camera.xml new file mode 100644 index 0000000..2283b9d --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/control_camera.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/av/control_camera/materialicons/black/res/drawable/baseline_control_camera_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M15.54,5.54L13.77,7.3 12,5.54 10.23,7.3 8.46,5.54 12,2zM18.46,15.54l-1.76,-1.77L18.46,12l-1.76,-1.77 1.76,-1.77L22,12zM8.46,18.46l1.77,-1.76L12,18.46l1.77,-1.76 1.77,1.76L12,22zM5.54,8.46l1.76,1.77L5.54,12l1.76,1.77 -1.76,1.77L2,12z" /> + <path + android:fillColor="#FF000000" + android:pathData="M12,12m-3,0a3,3 0,1 1,6 0a3,3 0,1 1,-6 0" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/control_point.xml b/qqq/android/mobileapp/src/main/res/drawable/control_point.xml new file mode 100644 index 0000000..f465f1b --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/control_point.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/control_point/materialicons/black/res/drawable/baseline_control_point_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M13,7h-2v4L7,11v2h4v4h2v-4h4v-2h-4L13,7zM12,2C6.49,2 2,6.49 2,12s4.49,10 10,10 10,-4.49 10,-10S17.51,2 12,2zM12,20c-4.41,0 -8,-3.59 -8,-8s3.59,-8 8,-8 8,3.59 8,8 -3.59,8 -8,8z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/control_point_duplicate.xml b/qqq/android/mobileapp/src/main/res/drawable/control_point_duplicate.xml new file mode 100644 index 0000000..96f5f3a --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/control_point_duplicate.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/control_point_duplicate/materialicons/black/res/drawable/baseline_control_point_duplicate_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M16,8h-2v3h-3v2h3v3h2v-3h3v-2h-3zM2,12c0,-2.79 1.64,-5.2 4.01,-6.32L6.01,3.52C2.52,4.76 0,8.09 0,12s2.52,7.24 6.01,8.48v-2.16C3.64,17.2 2,14.79 2,12zM15,3c-4.96,0 -9,4.04 -9,9s4.04,9 9,9 9,-4.04 9,-9 -4.04,-9 -9,-9zM15,19c-3.86,0 -7,-3.14 -7,-7s3.14,-7 7,-7 7,3.14 7,7 -3.14,7 -7,7z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/conveyor_belt.xml b/qqq/android/mobileapp/src/main/res/drawable/conveyor_belt.xml new file mode 100644 index 0000000..e2ea8a2 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/conveyor_belt.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/hardware/conveyor_belt/materialicons/black/res/drawable/baseline_conveyor_belt_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19,15H5c-1.66,0 -3,1.34 -3,3s1.34,3 3,3h14c1.66,0 3,-1.34 3,-3S20.66,15 19,15zM19,19H5c-0.55,0 -1,-0.45 -1,-1s0.45,-1 1,-1h14c0.55,0 1,0.45 1,1S19.55,19 19,19zM9,4v8c0,0.55 0.45,1 1,1h8c0.55,0 1,-0.45 1,-1V4c0,-0.55 -0.45,-1 -1,-1h-8C9.45,3 9,3.45 9,4zM16,8h-4V6.02h4V8zM2,9.02h4.94v1.91H2V9.02zM4.01,6.02h2.93v1.96H4.01V6.02z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/cookie.xml b/qqq/android/mobileapp/src/main/res/drawable/cookie.xml new file mode 100644 index 0000000..904ace9 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/cookie.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/cookie/materialicons/black/res/drawable/baseline_cookie_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M21.95,10.99c-1.79,-0.03 -3.7,-1.95 -2.68,-4.22c-2.98,1 -5.77,-1.59 -5.19,-4.56C6.95,0.71 2,6.58 2,12c0,5.52 4.48,10 10,10C17.89,22 22.54,16.92 21.95,10.99zM8.5,15C7.67,15 7,14.33 7,13.5S7.67,12 8.5,12s1.5,0.67 1.5,1.5S9.33,15 8.5,15zM10.5,10C9.67,10 9,9.33 9,8.5S9.67,7 10.5,7S12,7.67 12,8.5S11.33,10 10.5,10zM15,16c-0.55,0 -1,-0.45 -1,-1c0,-0.55 0.45,-1 1,-1s1,0.45 1,1C16,15.55 15.55,16 15,16z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/copy_all.xml b/qqq/android/mobileapp/src/main/res/drawable/copy_all.xml new file mode 100644 index 0000000..417a852 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/copy_all.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/content/copy_all/materialicons/black/res/drawable/baseline_copy_all_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M18,2H9C7.9,2 7,2.9 7,4v12c0,1.1 0.9,2 2,2h9c1.1,0 2,-0.9 2,-2V4C20,2.9 19.1,2 18,2zM18,16H9V4h9V16zM3,15v-2h2v2H3zM3,9.5h2v2H3V9.5zM10,20h2v2h-2V20zM3,18.5v-2h2v2H3zM5,22c-1.1,0 -2,-0.9 -2,-2h2V22zM8.5,22h-2v-2h2V22zM13.5,22L13.5,22l0,-2h2v0C15.5,21.1 14.6,22 13.5,22zM5,6L5,6l0,2H3v0C3,6.9 3.9,6 5,6z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/copyright.xml b/qqq/android/mobileapp/src/main/res/drawable/copyright.xml new file mode 100644 index 0000000..dfec94b --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/copyright.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/copyright/materialicons/black/res/drawable/baseline_copyright_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M11.88,9.14c1.28,0.06 1.61,1.15 1.63,1.66h1.79c-0.08,-1.98 -1.49,-3.19 -3.45,-3.19C9.64,7.61 8,9 8,12.14c0,1.94 0.93,4.24 3.84,4.24c2.22,0 3.41,-1.65 3.44,-2.95h-1.79c-0.03,0.59 -0.45,1.38 -1.63,1.44C10.55,14.83 10,13.81 10,12.14C10,9.25 11.28,9.16 11.88,9.14zM12,2C6.48,2 2,6.48 2,12s4.48,10 10,10s10,-4.48 10,-10S17.52,2 12,2zM12,20c-4.41,0 -8,-3.59 -8,-8s3.59,-8 8,-8s8,3.59 8,8S16.41,20 12,20z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/coronavirus.xml b/qqq/android/mobileapp/src/main/res/drawable/coronavirus.xml new file mode 100644 index 0000000..0c2ca6a --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/coronavirus.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/coronavirus/materialicons/black/res/drawable/baseline_coronavirus_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M21.25,10.5c-0.41,0 -0.75,0.34 -0.75,0.75h-1.54c-0.15,-1.37 -0.69,-2.63 -1.52,-3.65l1.09,-1.09l0.01,0.01c0.29,0.29 0.77,0.29 1.06,0s0.29,-0.77 0,-1.06L18.54,4.4c-0.29,-0.29 -0.77,-0.29 -1.06,0c-0.29,0.29 -0.29,0.76 -0.01,1.05l-1.09,1.09c-1.02,-0.82 -2.27,-1.36 -3.64,-1.51V3.5h0.01c0.41,0 0.75,-0.34 0.75,-0.75C13.5,2.34 13.16,2 12.75,2h-1.5c-0.41,0 -0.75,0.34 -0.75,0.75c0,0.41 0.33,0.74 0.74,0.75v1.55C9.87,5.19 8.62,5.74 7.6,6.56L6.51,5.47l0.01,-0.01c0.29,-0.29 0.29,-0.77 0,-1.06c-0.29,-0.29 -0.77,-0.29 -1.06,0L4.4,5.46c-0.29,0.29 -0.29,0.77 0,1.06c0.29,0.29 0.76,0.29 1.05,0.01l1.09,1.09c-0.82,1.02 -1.36,2.26 -1.5,3.63H3.5c0,-0.41 -0.34,-0.75 -0.75,-0.75C2.34,10.5 2,10.84 2,11.25v1.5c0,0.41 0.34,0.75 0.75,0.75c0.41,0 0.75,-0.34 0.75,-0.75h1.54c0.15,1.37 0.69,2.61 1.5,3.63l-1.09,1.09c-0.29,-0.29 -0.76,-0.28 -1.05,0.01c-0.29,0.29 -0.29,0.77 0,1.06l1.06,1.06c0.29,0.29 0.77,0.29 1.06,0c0.29,-0.29 0.29,-0.77 0,-1.06l-0.01,-0.01l1.09,-1.09c1.02,0.82 2.26,1.36 3.63,1.51v1.55c-0.41,0.01 -0.74,0.34 -0.74,0.75c0,0.41 0.34,0.75 0.75,0.75h1.5c0.41,0 0.75,-0.34 0.75,-0.75c0,-0.41 -0.34,-0.75 -0.75,-0.75h-0.01v-1.54c1.37,-0.14 2.62,-0.69 3.64,-1.51l1.09,1.09c-0.29,0.29 -0.28,0.76 0.01,1.05c0.29,0.29 0.77,0.29 1.06,0l1.06,-1.06c0.29,-0.29 0.29,-0.77 0,-1.06c-0.29,-0.29 -0.77,-0.29 -1.06,0l-0.01,0.01l-1.09,-1.09c0.82,-1.02 1.37,-2.27 1.52,-3.65h1.54c0,0.41 0.34,0.75 0.75,0.75c0.41,0 0.75,-0.34 0.75,-0.75v-1.5C22,10.84 21.66,10.5 21.25,10.5zM13.75,8c0.55,0 1,0.45 1,1s-0.45,1 -1,1s-1,-0.45 -1,-1S13.2,8 13.75,8zM12,13c-0.55,0 -1,-0.45 -1,-1c0,-0.55 0.45,-1 1,-1s1,0.45 1,1C13,12.55 12.55,13 12,13zM10.25,8c0.55,0 1,0.45 1,1s-0.45,1 -1,1s-1,-0.45 -1,-1S9.7,8 10.25,8zM8.5,13c-0.55,0 -1,-0.45 -1,-1c0,-0.55 0.45,-1 1,-1s1,0.45 1,1C9.5,12.55 9.05,13 8.5,13zM10.25,16c-0.55,0 -1,-0.45 -1,-1c0,-0.55 0.45,-1 1,-1s1,0.45 1,1C11.25,15.55 10.8,16 10.25,16zM13.75,16c-0.55,0 -1,-0.45 -1,-1c0,-0.55 0.45,-1 1,-1s1,0.45 1,1C14.75,15.55 14.3,16 13.75,16zM14.5,12c0,-0.55 0.45,-1 1,-1s1,0.45 1,1c0,0.55 -0.45,1 -1,1S14.5,12.55 14.5,12z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/corporate_fare.xml b/qqq/android/mobileapp/src/main/res/drawable/corporate_fare.xml new file mode 100644 index 0000000..23a2c56 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/corporate_fare.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/places/corporate_fare/materialicons/black/res/drawable/baseline_corporate_fare_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,7V3H2v18h20V7H12zM10,19H4v-2h6V19zM10,15H4v-2h6V15zM10,11H4V9h6V11zM10,7H4V5h6V7zM20,19h-8V9h8V19zM18,11h-4v2h4V11zM18,15h-4v2h4V15z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/cottage.xml b/qqq/android/mobileapp/src/main/res/drawable/cottage.xml new file mode 100644 index 0000000..8c49826 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/cottage.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/places/cottage/materialicons/black/res/drawable/baseline_cottage_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,3L6,7.58V6H4v3.11L1,11.4l1.21,1.59L4,11.62V21h7v-6h2v6h7v-9.38l1.79,1.36L23,11.4L12,3zM10,1c0,1.66 -1.34,3 -3,3C6.45,4 6,4.45 6,5H4c0,-1.66 1.34,-3 3,-3c0.55,0 1,-0.45 1,-1H10z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/countertops.xml b/qqq/android/mobileapp/src/main/res/drawable/countertops.xml new file mode 100644 index 0000000..0dd3632 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/countertops.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/places/countertops/materialicons/black/res/drawable/baseline_countertops_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M18,10V7c0,-1.66 -1.34,-3 -3,-3c-1.66,0 -3,1.34 -3,3h2c0,-0.55 0.45,-1 1,-1c0.55,0 1,0.45 1,1v3H8c1.1,0 2,-0.9 2,-2V4H4v4c0,1.1 0.9,2 2,2H2v2h2v8h16v-8h2v-2H18zM13,18h-2v-6h2V18z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/create.xml b/qqq/android/mobileapp/src/main/res/drawable/create.xml new file mode 100644 index 0000000..ef3f31b --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/create.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/content/create/materialicons/black/res/drawable/baseline_create_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M3,17.25V21h3.75L17.81,9.94l-3.75,-3.75L3,17.25zM20.71,7.04c0.39,-0.39 0.39,-1.02 0,-1.41l-2.34,-2.34c-0.39,-0.39 -1.02,-0.39 -1.41,0l-1.83,1.83 3.75,3.75 1.83,-1.83z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/create_new_folder.xml b/qqq/android/mobileapp/src/main/res/drawable/create_new_folder.xml new file mode 100644 index 0000000..45204cc --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/create_new_folder.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/file/create_new_folder/materialicons/black/res/drawable/baseline_create_new_folder_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,6h-8l-2,-2L4,4c-1.11,0 -1.99,0.89 -1.99,2L2,18c0,1.11 0.89,2 2,2h16c1.11,0 2,-0.89 2,-2L22,8c0,-1.11 -0.89,-2 -2,-2zM19,14h-3v3h-2v-3h-3v-2h3L14,9h2v3h3v2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/credit_card.xml b/qqq/android/mobileapp/src/main/res/drawable/credit_card.xml new file mode 100644 index 0000000..7ee3b5c --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/credit_card.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/credit_card/materialicons/black/res/drawable/baseline_credit_card_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,4L4,4c-1.11,0 -1.99,0.89 -1.99,2L2,18c0,1.11 0.89,2 2,2h16c1.11,0 2,-0.89 2,-2L22,6c0,-1.11 -0.89,-2 -2,-2zM20,18L4,18v-6h16v6zM20,8L4,8L4,6h16v2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/credit_card_off.xml b/qqq/android/mobileapp/src/main/res/drawable/credit_card_off.xml new file mode 100644 index 0000000..f6a8bb6 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/credit_card_off.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/credit_card_off/materialicons/black/res/drawable/baseline_credit_card_off_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M21.9,21.9L2.1,2.1L0.69,3.51l1.55,1.55C2.09,5.34 2.01,5.66 2.01,6L2,18c0,1.11 0.89,2 2,2h13.17l3.31,3.31L21.9,21.9zM4,12V8h1.17l4,4H4zM6.83,4H20c1.11,0 2,0.89 2,2v12c0,0.34 -0.08,0.66 -0.23,0.94L14.83,12H20V8h-9.17L6.83,4z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/credit_score.xml b/qqq/android/mobileapp/src/main/res/drawable/credit_score.xml new file mode 100644 index 0000000..b214483 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/credit_score.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/credit_score/materialicons/black/res/drawable/baseline_credit_score_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,4H4C2.89,4 2.01,4.89 2.01,6L2,18c0,1.11 0.89,2 2,2h5v-2H4v-6h18V6C22,4.89 21.11,4 20,4zM20,8H4V6h16V8zM14.93,19.17l-2.83,-2.83l-1.41,1.41L14.93,22L22,14.93l-1.41,-1.41L14.93,19.17z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/crib.xml b/qqq/android/mobileapp/src/main/res/drawable/crib.xml new file mode 100644 index 0000000..57b58a5 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/crib.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/places/crib/materialicons/black/res/drawable/baseline_crib_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M18,9h-6V4H8C5.79,4 4,5.79 4,8v6c0,1.1 0.9,2 2,2h2v2.93c-0.61,-0.35 -1.16,-0.78 -1.65,-1.27l-1.42,1.42C6.74,20.88 9.24,22 12,22c2.76,0 5.26,-1.12 7.07,-2.93l-1.42,-1.42c-0.49,0.49 -1.05,0.92 -1.65,1.27V16h2c1.1,0 2,-0.9 2,-2v-3C20,9.9 19.1,9 18,9zM14,19.75C13.36,19.91 12.69,20 12,20c-0.69,0 -1.36,-0.09 -2,-0.25V16h4V19.75z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/crisis_alert.xml b/qqq/android/mobileapp/src/main/res/drawable/crisis_alert.xml new file mode 100644 index 0000000..20f9fad --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/crisis_alert.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/crisis_alert/materialicons/black/res/drawable/baseline_crisis_alert_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M14.5,2.5c0,1.5 -1.5,6 -1.5,6h-2c0,0 -1.5,-4.5 -1.5,-6C9.5,1.12 10.62,0 12,0S14.5,1.12 14.5,2.5zM12,10c-1.1,0 -2,0.9 -2,2s0.9,2 2,2s2,-0.9 2,-2S13.1,10 12,10zM16.08,5.11c0.18,-0.75 0.33,-1.47 0.39,-2.06C19.75,4.69 22,8.08 22,12c0,5.52 -4.48,10 -10,10S2,17.52 2,12c0,-3.92 2.25,-7.31 5.53,-8.95C7.6,3.64 7.74,4.37 7.92,5.11C5.58,6.51 4,9.07 4,12c0,4.42 3.58,8 8,8s8,-3.58 8,-8C20,9.07 18.42,6.51 16.08,5.11zM18,12c0,3.31 -2.69,6 -6,6s-6,-2.69 -6,-6c0,-2 0.98,-3.77 2.48,-4.86c0.23,0.81 0.65,2.07 0.65,2.07C8.43,9.93 8,10.92 8,12c0,2.21 1.79,4 4,4s4,-1.79 4,-4c0,-1.08 -0.43,-2.07 -1.13,-2.79c0,0 0.41,-1.22 0.65,-2.07C17.02,8.23 18,10 18,12z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/crop.xml b/qqq/android/mobileapp/src/main/res/drawable/crop.xml new file mode 100644 index 0000000..e7c7181 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/crop.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/crop/materialicons/black/res/drawable/baseline_crop_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M17,15h2V7c0,-1.1 -0.9,-2 -2,-2H9v2h8v8zM7,17V1H5v4H1v2h4v10c0,1.1 0.9,2 2,2h10v4h2v-4h4v-2H7z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/crop_16_9.xml b/qqq/android/mobileapp/src/main/res/drawable/crop_16_9.xml new file mode 100644 index 0000000..fc4bb1f --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/crop_16_9.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/crop_16_9/materialicons/black/res/drawable/baseline_crop_16_9_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19,7H5C3.9,7 3,7.9 3,9v6c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2V9C21,7.9 20.1,7 19,7zM19,15H5V9h14V15z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/crop_3_2.xml b/qqq/android/mobileapp/src/main/res/drawable/crop_3_2.xml new file mode 100644 index 0000000..5d66a9e --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/crop_3_2.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/crop_3_2/materialicons/black/res/drawable/baseline_crop_3_2_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19,6H5C3.9,6 3,6.9 3,8v8c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2V8C21,6.9 20.1,6 19,6zM19,16H5V8h14V16z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/crop_5_4.xml b/qqq/android/mobileapp/src/main/res/drawable/crop_5_4.xml new file mode 100644 index 0000000..9917c94 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/crop_5_4.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/crop_5_4/materialicons/black/res/drawable/baseline_crop_5_4_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19,4H5C3.9,4 3,4.9 3,6v12c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2V6C21,4.9 20.1,4 19,4zM19,18H5V6h14V18z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/crop_7_5.xml b/qqq/android/mobileapp/src/main/res/drawable/crop_7_5.xml new file mode 100644 index 0000000..10a2bcd --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/crop_7_5.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/crop_7_5/materialicons/black/res/drawable/baseline_crop_7_5_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19,5H5C3.9,5 3,5.9 3,7v10c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2V7C21,5.9 20.1,5 19,5zM19,17H5V7h14V17z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/crop_din.xml b/qqq/android/mobileapp/src/main/res/drawable/crop_din.xml new file mode 100644 index 0000000..684c846 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/crop_din.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/crop_din/materialicons/black/res/drawable/baseline_crop_din_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19,3L5,3c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2L21,5c0,-1.1 -0.9,-2 -2,-2zM19,19L5,19L5,5h14v14z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/crop_free.xml b/qqq/android/mobileapp/src/main/res/drawable/crop_free.xml new file mode 100644 index 0000000..359e472 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/crop_free.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/crop_free/materialicons/black/res/drawable/baseline_crop_free_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M3,5v4h2L5,5h4L9,3L5,3c-1.1,0 -2,0.9 -2,2zM5,15L3,15v4c0,1.1 0.9,2 2,2h4v-2L5,19v-4zM19,19h-4v2h4c1.1,0 2,-0.9 2,-2v-4h-2v4zM19,3h-4v2h4v4h2L21,5c0,-1.1 -0.9,-2 -2,-2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/crop_landscape.xml b/qqq/android/mobileapp/src/main/res/drawable/crop_landscape.xml new file mode 100644 index 0000000..fa6e78a --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/crop_landscape.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/crop_landscape/materialicons/black/res/drawable/baseline_crop_landscape_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19,5L5,5c-1.1,0 -2,0.9 -2,2v10c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2L21,7c0,-1.1 -0.9,-2 -2,-2zM19,17L5,17L5,7h14v10z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/crop_original.xml b/qqq/android/mobileapp/src/main/res/drawable/crop_original.xml new file mode 100644 index 0000000..4211e9d --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/crop_original.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/crop_original/materialicons/black/res/drawable/baseline_crop_original_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19,3L5,3c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2L21,5c0,-1.1 -0.9,-2 -2,-2zM19,19L5,19L5,5h14v14zM13.96,12.29l-2.75,3.54 -1.96,-2.36L6.5,17h11l-3.54,-4.71z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/crop_portrait.xml b/qqq/android/mobileapp/src/main/res/drawable/crop_portrait.xml new file mode 100644 index 0000000..dd34bf4 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/crop_portrait.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/crop_portrait/materialicons/black/res/drawable/baseline_crop_portrait_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M17,3L7,3c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h10c1.1,0 2,-0.9 2,-2L19,5c0,-1.1 -0.9,-2 -2,-2zM17,19L7,19L7,5h10v14z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/crop_rotate.xml b/qqq/android/mobileapp/src/main/res/drawable/crop_rotate.xml new file mode 100644 index 0000000..be0e1b5 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/crop_rotate.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/crop_rotate/materialicons/black/res/drawable/baseline_crop_rotate_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M7.47,21.49C4.2,19.93 1.86,16.76 1.5,13L0,13c0.51,6.16 5.66,11 11.95,11 0.23,0 0.44,-0.02 0.66,-0.03L8.8,20.15l-1.33,1.34zM12.05,0c-0.23,0 -0.44,0.02 -0.66,0.04l3.81,3.81 1.33,-1.33C19.8,4.07 22.14,7.24 22.5,11L24,11c-0.51,-6.16 -5.66,-11 -11.95,-11zM16,14h2L18,8c0,-1.11 -0.9,-2 -2,-2h-6v2h6v6zM8,16L8,4L6,4v2L4,6v2h2v8c0,1.1 0.89,2 2,2h8v2h2v-2h2v-2L8,16z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/crop_square.xml b/qqq/android/mobileapp/src/main/res/drawable/crop_square.xml new file mode 100644 index 0000000..2a6ab6e --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/crop_square.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/crop_square/materialicons/black/res/drawable/baseline_crop_square_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M18,4L6,4c-1.1,0 -2,0.9 -2,2v12c0,1.1 0.9,2 2,2h12c1.1,0 2,-0.9 2,-2L20,6c0,-1.1 -0.9,-2 -2,-2zM18,18L6,18L6,6h12v12z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/cruelty_free.xml b/qqq/android/mobileapp/src/main/res/drawable/cruelty_free.xml new file mode 100644 index 0000000..e2db6e6 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/cruelty_free.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/cruelty_free/materialicons/black/res/drawable/baseline_cruelty_free_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M16.84,14.52c-0.26,-0.19 -0.62,-0.63 -0.79,-0.84C17.24,12.01 19,8.87 19,5c0,-1.95 -0.74,-3 -2,-3c-1.54,0 -3.96,2.06 -5,5.97C10.96,4.06 8.54,2 7,2C5.74,2 5,3.05 5,5c0,3.87 1.76,7.01 2.95,8.68c-0.17,0.21 -0.53,0.65 -0.79,0.84c-0.5,0.41 -1.66,1.37 -1.66,2.98c0,2.21 1.79,4 4,4c1.55,0 2.5,-0.56 2.5,-0.56s0.95,0.56 2.5,0.56c2.21,0 4,-1.79 4,-4C18.5,15.89 17.34,14.93 16.84,14.52zM9.35,12.2C8.34,10.7 7,8.12 7,5c0,-0.49 0.06,-0.8 0.12,-0.97c0.94,0.31 3.24,2.71 3.38,7.64C10.03,11.79 9.66,11.97 9.35,12.2zM10.5,16.75c-0.28,0 -0.5,-0.34 -0.5,-0.75c0,-0.41 0.22,-0.75 0.5,-0.75S11,15.59 11,16C11,16.41 10.78,16.75 10.5,16.75zM12,19.5c-0.55,0 -1,-0.72 -1,-1c0,-0.28 0.45,-0.5 1,-0.5s1,0.22 1,0.5C13,18.78 12.55,19.5 12,19.5zM13.5,16.75c-0.28,0 -0.5,-0.34 -0.5,-0.75c0,-0.41 0.22,-0.75 0.5,-0.75S14,15.59 14,16C14,16.41 13.78,16.75 13.5,16.75zM13.5,11.67c0.14,-4.93 2.44,-7.33 3.38,-7.64C16.94,4.2 17,4.51 17,5c0,3.12 -1.34,5.7 -2.35,7.2C14.34,11.97 13.97,11.79 13.5,11.67z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/css.xml b/qqq/android/mobileapp/src/main/res/drawable/css.xml new file mode 100644 index 0000000..ae0f822 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/css.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/css/materialicons/black/res/drawable/baseline_css_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M9.5,14v-1H11v0.5h2v-1h-2.5c-0.55,0 -1,-0.45 -1,-1V10c0,-0.55 0.45,-1 1,-1h3c0.55,0 1,0.45 1,1v1H13v-0.5h-2v1h2.5c0.55,0 1,0.45 1,1V14c0,0.55 -0.45,1 -1,1h-3C9.95,15 9.5,14.55 9.5,14zM17,15h3c0.55,0 1,-0.45 1,-1v-1.5c0,-0.55 -0.45,-1 -1,-1h-2.5v-1h2V11H21v-1c0,-0.55 -0.45,-1 -1,-1h-3c-0.55,0 -1,0.45 -1,1v1.5c0,0.55 0.45,1 1,1h2.5v1h-2V13H16v1C16,14.55 16.45,15 17,15zM8,10c0,-0.55 -0.45,-1 -1,-1H4c-0.55,0 -1,0.45 -1,1v4c0,0.55 0.45,1 1,1h3c0.55,0 1,-0.45 1,-1v-1H6.5v0.5h-2v-3h2V11H8V10z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/currency_bitcoin.xml b/qqq/android/mobileapp/src/main/res/drawable/currency_bitcoin.xml new file mode 100644 index 0000000..bbb677e --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/currency_bitcoin.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/currency_bitcoin/materialicons/black/res/drawable/baseline_currency_bitcoin_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M17.06,11.57C17.65,10.88 18,9.98 18,9c0,-1.86 -1.27,-3.43 -3,-3.87L15,3h-2v2h-2V3H9v2H6v2h2v10H6v2h3v2h2v-2h2v2h2v-2c2.21,0 4,-1.79 4,-4C19,13.55 18.22,12.27 17.06,11.57zM10,7h4c1.1,0 2,0.9 2,2s-0.9,2 -2,2h-4V7zM15,17h-5v-4h5c1.1,0 2,0.9 2,2S16.1,17 15,17z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/currency_exchange.xml b/qqq/android/mobileapp/src/main/res/drawable/currency_exchange.xml new file mode 100644 index 0000000..92420ea --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/currency_exchange.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/currency_exchange/materialicons/black/res/drawable/baseline_currency_exchange_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12.89,11.1c-1.78,-0.59 -2.64,-0.96 -2.64,-1.9c0,-1.02 1.11,-1.39 1.81,-1.39c1.31,0 1.79,0.99 1.9,1.34l1.58,-0.67C15.39,8.03 14.72,6.56 13,6.24V5h-2v1.26C8.52,6.82 8.51,9.12 8.51,9.22c0,2.27 2.25,2.91 3.35,3.31c1.58,0.56 2.28,1.07 2.28,2.03c0,1.13 -1.05,1.61 -1.98,1.61c-1.82,0 -2.34,-1.87 -2.4,-2.09L8.1,14.75c0.63,2.19 2.28,2.78 2.9,2.96V19h2v-1.24c0.4,-0.09 2.9,-0.59 2.9,-3.22C15.9,13.15 15.29,11.93 12.89,11.1zM3,21H1v-6h6v2l-2.48,0c1.61,2.41 4.36,4 7.48,4c4.97,0 9,-4.03 9,-9h2c0,6.08 -4.92,11 -11,11c-3.72,0 -7.01,-1.85 -9,-4.67L3,21zM1,12C1,5.92 5.92,1 12,1c3.72,0 7.01,1.85 9,4.67L21,3h2v6h-6V7l2.48,0C17.87,4.59 15.12,3 12,3c-4.97,0 -9,4.03 -9,9H1z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/currency_franc.xml b/qqq/android/mobileapp/src/main/res/drawable/currency_franc.xml new file mode 100644 index 0000000..57c29f4 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/currency_franc.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/currency_franc/materialicons/black/res/drawable/baseline_currency_franc_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M18,5l0,-2l-11,0l0,13l-2,0l0,2l2,0l0,3l2,0l0,-3l4,0l0,-2l-4,0l0,-3l8,0l0,-2l-8,0l0,-6z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/currency_lira.xml b/qqq/android/mobileapp/src/main/res/drawable/currency_lira.xml new file mode 100644 index 0000000..7495620 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/currency_lira.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/currency_lira/materialicons/black/res/drawable/baseline_currency_lira_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M9,8.76V3h2v4.51L15,5v2.36l-4,2.51l0.01,2.35L15,9.72v2.36l-4,2.51V19c2.76,0 5,-2.24 5,-5h2c0,3.87 -3.13,7 -7,7H9v-5.16l-3,1.88l0,-2.36l3,-1.88v-2.36L6,13l0,-2.36L9,8.76z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/currency_pound.xml b/qqq/android/mobileapp/src/main/res/drawable/currency_pound.xml new file mode 100644 index 0000000..05fb3d6 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/currency_pound.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/currency_pound/materialicons/black/res/drawable/baseline_currency_pound_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M14,21c1.93,0 3.62,-1.17 4,-3l-1.75,-0.88C16,18.21 15.33,19 14,19l-4.9,0c0.83,-1 1.5,-2.34 1.5,-4c0,-0.35 -0.03,-0.69 -0.08,-1L14,14v-2l-4.18,0C9,10.42 8,9.6 8,8c0,-1.93 1.57,-3.5 3.5,-3.5c1.5,0 2.79,0.95 3.28,2.28L16.63,6c-0.8,-2.05 -2.79,-3.5 -5.13,-3.5C8.46,2.5 6,4.96 6,8c0,1.78 0.79,2.9 1.49,4L6,12v2l2.47,0c0.08,0.31 0.13,0.64 0.13,1c0,2.7 -2.6,4 -2.6,4v2H14z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/currency_ruble.xml b/qqq/android/mobileapp/src/main/res/drawable/currency_ruble.xml new file mode 100644 index 0000000..5395ecc --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/currency_ruble.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/currency_ruble/materialicons/black/res/drawable/baseline_currency_ruble_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M13.5,3H7v9H5v2h2v2H5v2h2v3h2v-3h4v-2H9v-2h4.5c3.04,0 5.5,-2.46 5.5,-5.5C19,5.46 16.54,3 13.5,3zM13.5,12H9V5h4.5C15.43,5 17,6.57 17,8.5S15.43,12 13.5,12z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/currency_rupee.xml b/qqq/android/mobileapp/src/main/res/drawable/currency_rupee.xml new file mode 100644 index 0000000..e230521 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/currency_rupee.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/currency_rupee/materialicons/black/res/drawable/baseline_currency_rupee_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M13.66,7C13.1,5.82 11.9,5 10.5,5L6,5V3h12v2l-3.26,0c0.48,0.58 0.84,1.26 1.05,2L18,7v2l-2.02,0c-0.25,2.8 -2.61,5 -5.48,5H9.77l6.73,7h-2.77L7,14v-2h3.5c1.76,0 3.22,-1.3 3.46,-3L6,9V7L13.66,7z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/currency_yen.xml b/qqq/android/mobileapp/src/main/res/drawable/currency_yen.xml new file mode 100644 index 0000000..163c302 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/currency_yen.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/currency_yen/materialicons/black/res/drawable/baseline_currency_yen_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M13.92,11l4.08,0l0,2l-5,0l0,2l5,0l0,2l-5,0l0,4l-2,0l0,-4l-5,0l0,-2l5,0l0,-2l-5,0l0,-2l4.08,0l-5.08,-8l2.37,0l4.63,7.29l4.63,-7.29l2.37,0z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/currency_yuan.xml b/qqq/android/mobileapp/src/main/res/drawable/currency_yuan.xml new file mode 100644 index 0000000..d7b563c --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/currency_yuan.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/currency_yuan/materialicons/black/res/drawable/baseline_currency_yuan_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M13.28,12l4.72,0l0,2l-5,0l0,7l-2,0l0,-7l-5,0l0,-2l4.72,0l-5.72,-9l2.37,0l4.63,7.29l4.63,-7.29l2.37,0z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/curtains.xml b/qqq/android/mobileapp/src/main/res/drawable/curtains.xml new file mode 100644 index 0000000..c63aea5 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/curtains.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/home/curtains/materialicons/black/res/drawable/baseline_curtains_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,19V3H4v16H2v2h20v-2H20zM8.19,12c2.04,-1.35 3.5,-3.94 3.76,-7h0.09c0.26,3.06 1.72,5.65 3.76,7c-2.04,1.35 -3.5,3.94 -3.76,7h-0.09C11.69,15.94 10.23,13.35 8.19,12z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/curtains_closed.xml b/qqq/android/mobileapp/src/main/res/drawable/curtains_closed.xml new file mode 100644 index 0000000..2a09ad6 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/curtains_closed.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/home/curtains_closed/materialicons/black/res/drawable/baseline_curtains_closed_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,19V3H4v16H2v2h20v-2H20zM11,5h2v14h-2V5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/cyclone.xml b/qqq/android/mobileapp/src/main/res/drawable/cyclone.xml new file mode 100644 index 0000000..bf1fbb1 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/cyclone.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/cyclone/materialicons/black/res/drawable/baseline_cyclone_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,8c-2.21,0 -4,1.79 -4,4c0,2.21 1.79,4 4,4c2.21,0 4,-1.79 4,-4C16,9.79 14.21,8 12,8zM12,14c-1.1,0 -2,-0.9 -2,-2c0,-1.1 0.9,-2 2,-2s2,0.9 2,2C14,13.1 13.1,14 12,14z" /> + <path + android:fillColor="#FF000000" + android:pathData="M22,7.47V5.35C20.05,4.77 16.56,4 12,4C9.85,4 7.89,4.86 6.46,6.24C6.59,5.39 6.86,3.84 7.47,2H5.35C4.77,3.95 4,7.44 4,12c0,2.15 0.86,4.11 2.24,5.54c-0.85,-0.14 -2.4,-0.4 -4.24,-1.01v2.12C3.95,19.23 7.44,20 12,20c2.15,0 4.11,-0.86 5.54,-2.24c-0.14,0.85 -0.4,2.4 -1.01,4.24h2.12C19.23,20.05 20,16.56 20,12c0,-2.15 -0.86,-4.11 -2.24,-5.54C18.61,6.59 20.16,6.86 22,7.47zM12,18c-3.31,0 -6,-2.69 -6,-6s2.69,-6 6,-6s6,2.69 6,6S15.31,18 12,18z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/dangerous.xml b/qqq/android/mobileapp/src/main/res/drawable/dangerous.xml new file mode 100644 index 0000000..8948824 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/dangerous.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/dangerous/materialicons/black/res/drawable/baseline_dangerous_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M15.73,3H8.27L3,8.27v7.46L8.27,21h7.46L21,15.73V8.27L15.73,3zM17,15.74L15.74,17 12,13.26 8.26,17 7,15.74 10.74,12 7,8.26 8.26,7 12,10.74 15.74,7 17,8.26 13.26,12 17,15.74z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/dark_mode.xml b/qqq/android/mobileapp/src/main/res/drawable/dark_mode.xml new file mode 100644 index 0000000..3c2bb33 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/dark_mode.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/dark_mode/materialicons/black/res/drawable/baseline_dark_mode_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,3c-4.97,0 -9,4.03 -9,9s4.03,9 9,9s9,-4.03 9,-9c0,-0.46 -0.04,-0.92 -0.1,-1.36c-0.98,1.37 -2.58,2.26 -4.4,2.26c-2.98,0 -5.4,-2.42 -5.4,-5.4c0,-1.81 0.89,-3.42 2.26,-4.4C12.92,3.04 12.46,3 12,3L12,3z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/dashboard.xml b/qqq/android/mobileapp/src/main/res/drawable/dashboard.xml new file mode 100644 index 0000000..0f257dc --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/dashboard.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/dashboard/materialicons/black/res/drawable/baseline_dashboard_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M3,13h8L11,3L3,3v10zM3,21h8v-6L3,15v6zM13,21h8L21,11h-8v10zM13,3v6h8L21,3h-8z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/dashboard_customize.xml b/qqq/android/mobileapp/src/main/res/drawable/dashboard_customize.xml new file mode 100644 index 0000000..11307dd --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/dashboard_customize.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/dashboard_customize/materialicons/black/res/drawable/baseline_dashboard_customize_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M3,3h8v8L3,11zM13,3h8v8h-8zM3,13h8v8L3,21zM18,13h-2v3h-3v2h3v3h2v-3h3v-2h-3z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/data_array.xml b/qqq/android/mobileapp/src/main/res/drawable/data_array.xml new file mode 100644 index 0000000..c3f1124 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/data_array.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/editor/data_array/materialicons/black/res/drawable/baseline_data_array_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M15,4l0,2l3,0l0,12l-3,0l0,2l5,0l0,-16z" /> + <path + android:fillColor="#FF000000" + android:pathData="M4,20l5,0l0,-2l-3,0l0,-12l3,0l0,-2l-5,0z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/data_exploration.xml b/qqq/android/mobileapp/src/main/res/drawable/data_exploration.xml new file mode 100644 index 0000000..0b062b0 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/data_exploration.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/data_exploration/materialicons/black/res/drawable/baseline_data_exploration_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,2C6.48,2 2,6.48 2,12c0,1.33 0.26,2.61 0.74,3.77L8,10.5l3.3,2.78L14.58,10H13V8h5v5h-2v-1.58L11.41,16l-3.29,-2.79l-4.4,4.4C5.52,20.26 8.56,22 12,22h8c1.1,0 2,-0.9 2,-2v-8C22,6.48 17.52,2 12,2zM19.5,20.5c-0.55,0 -1,-0.45 -1,-1s0.45,-1 1,-1s1,0.45 1,1S20.05,20.5 19.5,20.5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/data_object.xml b/qqq/android/mobileapp/src/main/res/drawable/data_object.xml new file mode 100644 index 0000000..d5579e0 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/data_object.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/editor/data_object/materialicons/black/res/drawable/baseline_data_object_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M4,7v2c0,0.55 -0.45,1 -1,1H2v4h1c0.55,0 1,0.45 1,1v2c0,1.65 1.35,3 3,3h3v-2H7c-0.55,0 -1,-0.45 -1,-1v-2c0,-1.3 -0.84,-2.42 -2,-2.83v-0.34C5.16,11.42 6,10.3 6,9V7c0,-0.55 0.45,-1 1,-1h3V4H7C5.35,4 4,5.35 4,7z" /> + <path + android:fillColor="#FF000000" + android:pathData="M21,10c-0.55,0 -1,-0.45 -1,-1V7c0,-1.65 -1.35,-3 -3,-3h-3v2h3c0.55,0 1,0.45 1,1v2c0,1.3 0.84,2.42 2,2.83v0.34c-1.16,0.41 -2,1.52 -2,2.83v2c0,0.55 -0.45,1 -1,1h-3v2h3c1.65,0 3,-1.35 3,-3v-2c0,-0.55 0.45,-1 1,-1h1v-4H21z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/data_saver_off.xml b/qqq/android/mobileapp/src/main/res/drawable/data_saver_off.xml new file mode 100644 index 0000000..10c716f --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/data_saver_off.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/data_saver_off/materialicons/black/res/drawable/baseline_data_saver_off_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M13,2.05v3.03c3.39,0.49 6,3.39 6,6.92c0,0.9 -0.18,1.75 -0.48,2.54l2.6,1.53C21.68,14.83 22,13.45 22,12C22,6.82 18.05,2.55 13,2.05zM12,19c-3.87,0 -7,-3.13 -7,-7c0,-3.53 2.61,-6.43 6,-6.92V2.05C5.94,2.55 2,6.81 2,12c0,5.52 4.47,10 9.99,10c3.31,0 6.24,-1.61 8.06,-4.09l-2.6,-1.53C16.17,17.98 14.21,19 12,19z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/data_saver_on.xml b/qqq/android/mobileapp/src/main/res/drawable/data_saver_on.xml new file mode 100644 index 0000000..dd518dd --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/data_saver_on.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/data_saver_on/materialicons/black/res/drawable/baseline_data_saver_on_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M11,8v3H8v2h3v3h2v-3h3v-2h-3V8H11zM13,2.05v3.03c3.39,0.49 6,3.39 6,6.92c0,0.9 -0.18,1.75 -0.48,2.54l2.6,1.53C21.68,14.83 22,13.45 22,12C22,6.82 18.05,2.55 13,2.05zM12,19c-3.87,0 -7,-3.13 -7,-7c0,-3.53 2.61,-6.43 6,-6.92V2.05C5.94,2.55 2,6.81 2,12c0,5.52 4.47,10 9.99,10c3.31,0 6.24,-1.61 8.06,-4.09l-2.6,-1.53C16.17,17.98 14.21,19 12,19z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/data_thresholding.xml b/qqq/android/mobileapp/src/main/res/drawable/data_thresholding.xml new file mode 100644 index 0000000..ab764a9 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/data_thresholding.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/data_thresholding/materialicons/black/res/drawable/baseline_data_thresholding_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19,3H5C3.9,3 3,3.9 3,5v14c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2V5C21,3.9 20.1,3 19,3zM10.67,8.17l2,2l3.67,-3.67l1.41,1.41L12.67,13l-2,-2l-3,3l-1.41,-1.41L10.67,8.17zM5,16h1.72L5,17.72V16zM5.84,19l3,-3h1.83l-3,3H5.84zM9.8,19l3,-3h1.62l-3,3H9.8zM13.53,19l3,-3h1.62l-3,3H13.53zM19,19h-1.73L19,17.27V19z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/data_usage.xml b/qqq/android/mobileapp/src/main/res/drawable/data_usage.xml new file mode 100644 index 0000000..2b1303a --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/data_usage.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/data_usage/materialicons/black/res/drawable/baseline_data_usage_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M13,2.05v3.03c3.39,0.49 6,3.39 6,6.92 0,0.9 -0.18,1.75 -0.48,2.54l2.6,1.53c0.56,-1.24 0.88,-2.62 0.88,-4.07 0,-5.18 -3.95,-9.45 -9,-9.95zM12,19c-3.87,0 -7,-3.13 -7,-7 0,-3.53 2.61,-6.43 6,-6.92V2.05c-5.06,0.5 -9,4.76 -9,9.95 0,5.52 4.47,10 9.99,10 3.31,0 6.24,-1.61 8.06,-4.09l-2.6,-1.53C16.17,17.98 14.21,19 12,19z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/dataset.xml b/qqq/android/mobileapp/src/main/res/drawable/dataset.xml new file mode 100644 index 0000000..76d316e --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/dataset.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/dataset/materialicons/black/res/drawable/baseline_dataset_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19,3H5C3.9,3 3,3.9 3,5v14c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2V5C21,3.9 20.1,3 19,3zM11,17H7v-4h4V17zM11,11H7V7h4V11zM17,17h-4v-4h4V17zM17,11h-4V7h4V11z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/dataset_linked.xml b/qqq/android/mobileapp/src/main/res/drawable/dataset_linked.xml new file mode 100644 index 0000000..24440d7 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/dataset_linked.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/dataset_linked/materialicons/black/res/drawable/baseline_dataset_linked_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M8.09,17H7v-4h3.69c0.95,-0.63 2.09,-1 3.31,-1h6c0.34,0 0.67,0.04 1,0.09V5c0,-1.1 -0.9,-2 -2,-2H5C3.9,3 3,3.9 3,5v14c0,1.1 0.9,2 2,2h3.81C8.3,20.12 8,19.09 8,18C8,17.66 8.04,17.33 8.09,17zM13,7h4v4h-4V7zM7,7h4v4H7V7z" /> + <path + android:fillColor="#FF000000" + android:pathData="M12,18c0,-1.1 0.9,-2 2,-2h2v-2h-2c-2.21,0 -4,1.79 -4,4c0,2.21 1.79,4 4,4h2v-2h-2C12.9,20 12,19.1 12,18z" /> + <path + android:fillColor="#FF000000" + android:pathData="M20,14h-2v2h2c1.1,0 2,0.9 2,2s-0.9,2 -2,2h-2v2h2c2.21,0 4,-1.79 4,-4C24,15.79 22.21,14 20,14z" /> + <path + android:fillColor="#FF000000" + android:pathData="M14,17h6v2h-6z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/date_range.xml b/qqq/android/mobileapp/src/main/res/drawable/date_range.xml new file mode 100644 index 0000000..5c31b03 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/date_range.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/date_range/materialicons/black/res/drawable/baseline_date_range_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M9,11L7,11v2h2v-2zM13,11h-2v2h2v-2zM17,11h-2v2h2v-2zM19,4h-1L18,2h-2v2L8,4L8,2L6,2v2L5,4c-1.11,0 -1.99,0.9 -1.99,2L3,20c0,1.1 0.89,2 2,2h14c1.1,0 2,-0.9 2,-2L21,6c0,-1.1 -0.9,-2 -2,-2zM19,20L5,20L5,9h14v11z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/deblur.xml b/qqq/android/mobileapp/src/main/res/drawable/deblur.xml new file mode 100644 index 0000000..f29feba --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/deblur.xml @@ -0,0 +1,55 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/deblur/materialicons/black/res/drawable/baseline_deblur_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,3v18c4.97,0 9,-4.03 9,-9C21,7.03 16.97,3 12,3z" /> + <path + android:fillColor="#FF000000" + android:pathData="M6,14m-1,0a1,1 0,1 1,2 0a1,1 0,1 1,-2 0" /> + <path + android:fillColor="#FF000000" + android:pathData="M6,18m-1,0a1,1 0,1 1,2 0a1,1 0,1 1,-2 0" /> + <path + android:fillColor="#FF000000" + android:pathData="M6,10m-1,0a1,1 0,1 1,2 0a1,1 0,1 1,-2 0" /> + <path + android:fillColor="#FF000000" + android:pathData="M3,10m-0.5,0a0.5,0.5 0,1 1,1 0a0.5,0.5 0,1 1,-1 0" /> + <path + android:fillColor="#FF000000" + android:pathData="M6,6m-1,0a1,1 0,1 1,2 0a1,1 0,1 1,-2 0" /> + <path + android:fillColor="#FF000000" + android:pathData="M3,14m-0.5,0a0.5,0.5 0,1 1,1 0a0.5,0.5 0,1 1,-1 0" /> + <path + android:fillColor="#FF000000" + android:pathData="M10,21m-0.5,0a0.5,0.5 0,1 1,1 0a0.5,0.5 0,1 1,-1 0" /> + <path + android:fillColor="#FF000000" + android:pathData="M10,3m-0.5,0a0.5,0.5 0,1 1,1 0a0.5,0.5 0,1 1,-1 0" /> + <path + android:fillColor="#FF000000" + android:pathData="M10,6m-1,0a1,1 0,1 1,2 0a1,1 0,1 1,-2 0" /> + <path + android:fillColor="#FF000000" + android:pathData="M10,14m-1.5,0a1.5,1.5 0,1 1,3 0a1.5,1.5 0,1 1,-3 0" /> + <path + android:fillColor="#FF000000" + android:pathData="M10,10m-1.5,0a1.5,1.5 0,1 1,3 0a1.5,1.5 0,1 1,-3 0" /> + <path + android:fillColor="#FF000000" + android:pathData="M10,18m-1,0a1,1 0,1 1,2 0a1,1 0,1 1,-2 0" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/deck.xml b/qqq/android/mobileapp/src/main/res/drawable/deck.xml new file mode 100644 index 0000000..247dcd7 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/deck.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/deck/materialicons/black/res/drawable/baseline_deck_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M22,9l-10,-7l-10,7l9,0l0,13l2,0l0,-13z" /> + <path + android:fillColor="#FF000000" + android:pathData="M4.14,12l-1.96,0.37l0.82,4.37l0,5.26l2,0l0.02,-4l1.98,0l0,4l2,0l0,-6l-4.1,0z" /> + <path + android:fillColor="#FF000000" + android:pathData="M19.1,16l-4.1,0l0,6l2,0l0,-4l1.98,0l0.02,4l2,0l0,-5.26l0.82,-4.37l-1.96,-0.37z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/dehaze.xml b/qqq/android/mobileapp/src/main/res/drawable/dehaze.xml new file mode 100644 index 0000000..d34ccef --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/dehaze.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/dehaze/materialicons/black/res/drawable/baseline_dehaze_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M2,15.5v2h20v-2L2,15.5zM2,10.5v2h20v-2L2,10.5zM2,5.5v2h20v-2L2,5.5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/delete.xml b/qqq/android/mobileapp/src/main/res/drawable/delete.xml new file mode 100644 index 0000000..53a2b08 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/delete.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/delete/materialicons/black/res/drawable/baseline_delete_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M6,19c0,1.1 0.9,2 2,2h8c1.1,0 2,-0.9 2,-2V7H6v12zM19,4h-3.5l-1,-1h-5l-1,1H5v2h14V4z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/delete_forever.xml b/qqq/android/mobileapp/src/main/res/drawable/delete_forever.xml new file mode 100644 index 0000000..a68ec08 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/delete_forever.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/delete_forever/materialicons/black/res/drawable/baseline_delete_forever_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M6,19c0,1.1 0.9,2 2,2h8c1.1,0 2,-0.9 2,-2L18,7L6,7v12zM8.46,11.88l1.41,-1.41L12,12.59l2.12,-2.12 1.41,1.41L13.41,14l2.12,2.12 -1.41,1.41L12,15.41l-2.12,2.12 -1.41,-1.41L10.59,14l-2.13,-2.12zM15.5,4l-1,-1h-5l-1,1L5,4v2h14L19,4z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/delete_outline.xml b/qqq/android/mobileapp/src/main/res/drawable/delete_outline.xml new file mode 100644 index 0000000..600f0ad --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/delete_outline.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/delete_outline/materialicons/black/res/drawable/baseline_delete_outline_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M6,19c0,1.1 0.9,2 2,2h8c1.1,0 2,-0.9 2,-2L18,7L6,7v12zM8,9h8v10L8,19L8,9zM15.5,4l-1,-1h-5l-1,1L5,4v2h14L19,4z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/delete_sweep.xml b/qqq/android/mobileapp/src/main/res/drawable/delete_sweep.xml new file mode 100644 index 0000000..621d815 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/delete_sweep.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/content/delete_sweep/materialicons/black/res/drawable/baseline_delete_sweep_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M15,16h4v2h-4zM15,8h7v2h-7zM15,12h6v2h-6zM3,18c0,1.1 0.9,2 2,2h6c1.1,0 2,-0.9 2,-2L13,8L3,8v10zM14,5h-3l-1,-1L6,4L5,5L2,5v2h12z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/delivery_dining.xml b/qqq/android/mobileapp/src/main/res/drawable/delivery_dining.xml new file mode 100644 index 0000000..08628e3 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/delivery_dining.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/delivery_dining/materialicons/black/res/drawable/baseline_delivery_dining_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19,7c0,-1.1 -0.9,-2 -2,-2h-3v2h3v2.65L13.52,14H10V9H6c-2.21,0 -4,1.79 -4,4v3h2c0,1.66 1.34,3 3,3s3,-1.34 3,-3h4.48L19,10.35V7zM7,17c-0.55,0 -1,-0.45 -1,-1h2C8,16.55 7.55,17 7,17z" /> + <path + android:fillColor="#FF000000" + android:pathData="M5,6h5v2h-5z" /> + <path + android:fillColor="#FF000000" + android:pathData="M19,13c-1.66,0 -3,1.34 -3,3s1.34,3 3,3s3,-1.34 3,-3S20.66,13 19,13zM19,17c-0.55,0 -1,-0.45 -1,-1s0.45,-1 1,-1s1,0.45 1,1S19.55,17 19,17z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/density_large.xml b/qqq/android/mobileapp/src/main/res/drawable/density_large.xml new file mode 100644 index 0000000..b312ae6 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/density_large.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/density_large/materialicons/black/res/drawable/baseline_density_large_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M3,3h18v2h-18z" /> + <path + android:fillColor="#FF000000" + android:pathData="M3,19h18v2h-18z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/density_medium.xml b/qqq/android/mobileapp/src/main/res/drawable/density_medium.xml new file mode 100644 index 0000000..6ee5050 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/density_medium.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/density_medium/materialicons/black/res/drawable/baseline_density_medium_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M3,3h18v2h-18z" /> + <path + android:fillColor="#FF000000" + android:pathData="M3,19h18v2h-18z" /> + <path + android:fillColor="#FF000000" + android:pathData="M3,11h18v2h-18z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/density_small.xml b/qqq/android/mobileapp/src/main/res/drawable/density_small.xml new file mode 100644 index 0000000..670abe5 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/density_small.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/density_small/materialicons/black/res/drawable/baseline_density_small_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M3,2h18v2h-18z" /> + <path + android:fillColor="#FF000000" + android:pathData="M3,20h18v2h-18z" /> + <path + android:fillColor="#FF000000" + android:pathData="M3,14h18v2h-18z" /> + <path + android:fillColor="#FF000000" + android:pathData="M3,8h18v2h-18z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/departure_board.xml b/qqq/android/mobileapp/src/main/res/drawable/departure_board.xml new file mode 100644 index 0000000..dc97a25 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/departure_board.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/departure_board/materialicons/black/res/drawable/baseline_departure_board_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M16,1c-2.4,0 -4.52,1.21 -5.78,3.05 0.01,-0.01 0.01,-0.02 0.02,-0.03C9.84,4 9.42,4 9,4c-4.42,0 -8,0.5 -8,4v10c0,0.88 0.39,1.67 1,2.22L2,22c0,0.55 0.45,1 1,1h1c0.55,0 1,-0.45 1,-1v-1h8v1c0,0.55 0.45,1 1,1h1c0.55,0 1,-0.45 1,-1v-1.78c0.61,-0.55 1,-1.34 1,-2.22v-3.08c3.39,-0.49 6,-3.39 6,-6.92 0,-3.87 -3.13,-7 -7,-7zM4.5,19c-0.83,0 -1.5,-0.67 -1.5,-1.5S3.67,16 4.5,16s1.5,0.67 1.5,1.5S5.33,19 4.5,19zM3,13L3,8h6c0,1.96 0.81,3.73 2.11,5L3,13zM13.5,19c-0.83,0 -1.5,-0.67 -1.5,-1.5s0.67,-1.5 1.5,-1.5 1.5,0.67 1.5,1.5 -0.67,1.5 -1.5,1.5zM16,13c-2.76,0 -5,-2.24 -5,-5s2.24,-5 5,-5 5,2.24 5,5 -2.24,5 -5,5zM16.5,4L15,4v5l3.62,2.16 0.75,-1.23 -2.87,-1.68z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/description.xml b/qqq/android/mobileapp/src/main/res/drawable/description.xml new file mode 100644 index 0000000..b738685 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/description.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/description/materialicons/black/res/drawable/baseline_description_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M14,2L6,2c-1.1,0 -1.99,0.9 -1.99,2L4,20c0,1.1 0.89,2 1.99,2L18,22c1.1,0 2,-0.9 2,-2L20,8l-6,-6zM16,18L8,18v-2h8v2zM16,14L8,14v-2h8v2zM13,9L13,3.5L18.5,9L13,9z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/deselect.xml b/qqq/android/mobileapp/src/main/res/drawable/deselect.xml new file mode 100644 index 0000000..2104868 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/deselect.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/content/deselect/materialicons/black/res/drawable/baseline_deselect_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M3,13h2v-2H3V13zM7,21h2v-2H7V21zM13,3h-2v2h2V3zM19,3v2h2C21,3.9 20.1,3 19,3zM5,21v-2H3C3,20.1 3.9,21 5,21zM3,17h2v-2H3V17zM11,21h2v-2h-2V21zM19,13h2v-2h-2V13zM19,9h2V7h-2V9zM15,5h2V3h-2V5zM7.83,5L7,4.17V3h2v2H7.83zM19.83,17L19,16.17V15h2v2H19.83zM21.19,21.19L2.81,2.81L1.39,4.22L4.17,7H3v2h2V7.83l2,2V17h7.17l2,2H15v2h2v-1.17l2.78,2.78L21.19,21.19zM9,15v-3.17L12.17,15H9zM15,12.17V9h-3.17l-2,-2H17v7.17L15,12.17z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/design_services.xml b/qqq/android/mobileapp/src/main/res/drawable/design_services.xml new file mode 100644 index 0000000..929f808 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/design_services.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/design_services/materialicons/black/res/drawable/baseline_design_services_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M16.24,11.51l1.57,-1.57l-3.75,-3.75l-1.57,1.57L8.35,3.63c-0.78,-0.78 -2.05,-0.78 -2.83,0l-1.9,1.9c-0.78,0.78 -0.78,2.05 0,2.83l4.13,4.13L3,17.25V21h3.75l4.76,-4.76l4.13,4.13c0.95,0.95 2.23,0.6 2.83,0l1.9,-1.9c0.78,-0.78 0.78,-2.05 0,-2.83L16.24,11.51zM9.18,11.07L5.04,6.94l1.89,-1.9c0,0 0,0 0,0l1.27,1.27L7.02,7.5l1.41,1.41l1.19,-1.19l1.45,1.45L9.18,11.07zM17.06,18.96l-4.13,-4.13l1.9,-1.9l1.45,1.45l-1.19,1.19l1.41,1.41l1.19,-1.19l1.27,1.27L17.06,18.96z" /> + <path + android:fillColor="#FF000000" + android:pathData="M20.71,7.04c0.39,-0.39 0.39,-1.02 0,-1.41l-2.34,-2.34c-0.47,-0.47 -1.12,-0.29 -1.41,0l-1.83,1.83l3.75,3.75L20.71,7.04z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/desk.xml b/qqq/android/mobileapp/src/main/res/drawable/desk.xml new file mode 100644 index 0000000..f70cdf1 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/desk.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/places/desk/materialicons/black/res/drawable/baseline_desk_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M2,6v12h2V8h10v10h2v-2h4v2h2V6H2zM20,8v2h-4V8H20zM16,14v-2h4v2H16z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/desktop_access_disabled.xml b/qqq/android/mobileapp/src/main/res/drawable/desktop_access_disabled.xml new file mode 100644 index 0000000..6359c03 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/desktop_access_disabled.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/communication/desktop_access_disabled/materialicons/black/res/drawable/baseline_desktop_access_disabled_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M23,16c0,1.1 -0.9,2 -2,2h-1l-2,-2h3L21,4L6,4L4,2h17c1.1,0 2,0.9 2,2v12zM17.5,18l-2,-2zM14.9,18l6,6 1.3,-1.3 -4.7,-4.7 -2,-2L1.2,1.8 0,3.1l1,1L1,16c0,1.1 0.9,2 2,2h7v2L8,20v2h8v-2h-2v-2h0.9zM3,16L3,6.1l9.9,9.9L3,16z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/desktop_mac.xml b/qqq/android/mobileapp/src/main/res/drawable/desktop_mac.xml new file mode 100644 index 0000000..5a4a477 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/desktop_mac.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/hardware/desktop_mac/materialicons/black/res/drawable/baseline_desktop_mac_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,3H4C2.9,3 2,3.9 2,5v11c0,1.1 0.9,2 2,2h6l-2,2v1h8v-1l-2,-2h6c1.1,0 2,-0.9 2,-2V5C22,3.9 21.1,3 20,3" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/desktop_windows.xml b/qqq/android/mobileapp/src/main/res/drawable/desktop_windows.xml new file mode 100644 index 0000000..a26a0a5 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/desktop_windows.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/hardware/desktop_windows/materialicons/black/res/drawable/baseline_desktop_windows_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,3H4C2.9,3 2,3.9 2,5v10c0,1.1 0.9,2 2,2h6v2H8v2h8v-2h-2v-2h6c1.1,0 2,-0.9 2,-2V5C22,3.9 21.1,3 20,3" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/details.xml b/qqq/android/mobileapp/src/main/res/drawable/details.xml new file mode 100644 index 0000000..a5cee9a --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/details.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/details/materialicons/black/res/drawable/baseline_details_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,3L2,21h20L12,3zM13,8.92L18.6,19H13V8.92zM11,8.92V19H5.4L11,8.92z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/developer_board.xml b/qqq/android/mobileapp/src/main/res/drawable/developer_board.xml new file mode 100644 index 0000000..999371a --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/developer_board.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/hardware/developer_board/materialicons/black/res/drawable/baseline_developer_board_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M22,9L22,7h-2L20,5c0,-1.1 -0.9,-2 -2,-2L4,3c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2v-2h2v-2h-2v-2h2v-2h-2L20,9h2zM18,19L4,19L4,5h14v14zM6,13h5v4L6,17zM12,7h4v3h-4zM6,7h5v5L6,12zM12,11h4v6h-4z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/developer_board_off.xml b/qqq/android/mobileapp/src/main/res/drawable/developer_board_off.xml new file mode 100644 index 0000000..b6d6e3c --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/developer_board_off.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/hardware/developer_board_off/materialicons/black/res/drawable/baseline_developer_board_off_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M7.83,5H18v10.17L19.83,17H22v-2h-2v-2h2v-2h-2V9h2V7h-2V5c0,-1.1 -0.9,-2 -2,-2H5.83L7.83,5zM12,9.17V7h4v3h-3.17L12,9.17zM9.83,7H11v1.17L9.83,7zM13.83,11H16v2.17L13.83,11zM18,21c0.06,0 0.11,0 0.16,-0.01l2.32,2.32l1.41,-1.41L2.1,2.1L0.69,3.51l1.32,1.32C2,4.89 2,4.94 2,5v14c0,1.1 0.9,2 2,2H18zM4,19V6.83l2,2V12h3.17l1,1H6v4h5v-3.17l1,1V17h2.17l2,2H4z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/developer_mode.xml b/qqq/android/mobileapp/src/main/res/drawable/developer_mode.xml new file mode 100644 index 0000000..ef91329 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/developer_mode.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/developer_mode/materialicons/black/res/drawable/baseline_developer_mode_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M7,5h10v2h2L19,3c0,-1.1 -0.9,-1.99 -2,-1.99L7,1c-1.1,0 -2,0.9 -2,2v4h2L7,5zM15.41,16.59L20,12l-4.59,-4.59L14,8.83 17.17,12 14,15.17l1.41,1.42zM10,15.17L6.83,12 10,8.83 8.59,7.41 4,12l4.59,4.59L10,15.17zM17,19L7,19v-2L5,17v4c0,1.1 0.9,2 2,2h10c1.1,0 2,-0.9 2,-2v-4h-2v2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/device_hub.xml b/qqq/android/mobileapp/src/main/res/drawable/device_hub.xml new file mode 100644 index 0000000..9553d4b --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/device_hub.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/hardware/device_hub/materialicons/black/res/drawable/baseline_device_hub_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M17,16l-4,-4V8.82C14.16,8.4 15,7.3 15,6c0,-1.66 -1.34,-3 -3,-3S9,4.34 9,6c0,1.3 0.84,2.4 2,2.82V12l-4,4H3v5h5v-3.05l4,-4.2 4,4.2V21h5v-5h-4z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/device_thermostat.xml b/qqq/android/mobileapp/src/main/res/drawable/device_thermostat.xml new file mode 100644 index 0000000..85bc33a --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/device_thermostat.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/device_thermostat/materialicons/black/res/drawable/baseline_device_thermostat_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M15,13L15,5c0,-1.66 -1.34,-3 -3,-3S9,3.34 9,5v8c-1.21,0.91 -2,2.37 -2,4 0,2.76 2.24,5 5,5s5,-2.24 5,-5c0,-1.63 -0.79,-3.09 -2,-4zM11,5c0,-0.55 0.45,-1 1,-1s1,0.45 1,1h-1v1h1v2h-1v1h1v2h-2L11,5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/device_unknown.xml b/qqq/android/mobileapp/src/main/res/drawable/device_unknown.xml new file mode 100644 index 0000000..2a74017 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/device_unknown.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/hardware/device_unknown/materialicons/black/res/drawable/baseline_device_unknown_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M17,1L7,1c-1.1,0 -2,0.9 -2,2v18c0,1.1 0.9,2 2,2h10c1.1,0 2,-0.9 2,-2L19,3c0,-1.1 -0.9,-2 -2,-2zM17,19L7,19L7,5h10v14zM12,6.72c-1.96,0 -3.5,1.52 -3.5,3.47h1.75c0,-0.93 0.82,-1.75 1.75,-1.75s1.75,0.82 1.75,1.75c0,1.75 -2.63,1.57 -2.63,4.45h1.76c0,-1.96 2.62,-2.19 2.62,-4.45 0,-1.96 -1.54,-3.47 -3.5,-3.47zM11.12,15.52h1.76v1.76h-1.76z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/devices.xml b/qqq/android/mobileapp/src/main/res/drawable/devices.xml new file mode 100644 index 0000000..2af008c --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/devices.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/devices/materialicons/black/res/drawable/baseline_devices_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M4,6h18L22,4L4,4c-1.1,0 -2,0.9 -2,2v11L0,17v3h14v-3L4,17L4,6zM23,8h-6c-0.55,0 -1,0.45 -1,1v10c0,0.55 0.45,1 1,1h6c0.55,0 1,-0.45 1,-1L24,9c0,-0.55 -0.45,-1 -1,-1zM22,17h-4v-7h4v7z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/devices_fold.xml b/qqq/android/mobileapp/src/main/res/drawable/devices_fold.xml new file mode 100644 index 0000000..10f659d --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/devices_fold.xml @@ -0,0 +1,40 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/devices_fold/materialicons/black/res/drawable/baseline_devices_fold_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,3h-3c0,-1.43 -1.47,-2.4 -2.79,-1.84l-3,1.29C10.48,2.76 10,3.49 10,4.29V19c0,1.1 0.9,2 2,2h8c1.1,0 2,-0.9 2,-2V5C22,3.9 21.1,3 20,3zM20,19h-5.33l1.12,-0.48C16.52,18.2 17,17.48 17,16.68V5h3V19z" /> + <path + android:fillColor="#FF000000" + android:pathData="M2,3h2v2h-2z" /> + <path + android:fillColor="#FF000000" + android:pathData="M2,19h2v2h-2z" /> + <path + android:fillColor="#FF000000" + android:pathData="M2,15h2v2h-2z" /> + <path + android:fillColor="#FF000000" + android:pathData="M2,11h2v2h-2z" /> + <path + android:fillColor="#FF000000" + android:pathData="M2,7h2v2h-2z" /> + <path + android:fillColor="#FF000000" + android:pathData="M6,3h2v2h-2z" /> + <path + android:fillColor="#FF000000" + android:pathData="M6,19h2v2h-2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/devices_other.xml b/qqq/android/mobileapp/src/main/res/drawable/devices_other.xml new file mode 100644 index 0000000..3fb9030 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/devices_other.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/hardware/devices_other/materialicons/black/res/drawable/baseline_devices_other_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M3,6h18L21,4L3,4c-1.1,0 -2,0.9 -2,2v12c0,1.1 0.9,2 2,2h4v-2L3,18L3,6zM13,12L9,12v1.78c-0.61,0.55 -1,1.33 -1,2.22s0.39,1.67 1,2.22L9,20h4v-1.78c0.61,-0.55 1,-1.34 1,-2.22s-0.39,-1.67 -1,-2.22L13,12zM11,17.5c-0.83,0 -1.5,-0.67 -1.5,-1.5s0.67,-1.5 1.5,-1.5 1.5,0.67 1.5,1.5 -0.67,1.5 -1.5,1.5zM22,8h-6c-0.5,0 -1,0.5 -1,1v10c0,0.5 0.5,1 1,1h6c0.5,0 1,-0.5 1,-1L23,9c0,-0.5 -0.5,-1 -1,-1zM21,18h-4v-8h4v8z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/dew_point.xml b/qqq/android/mobileapp/src/main/res/drawable/dew_point.xml new file mode 100644 index 0000000..ad848b5 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/dew_point.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/dew_point/materialicons/black/res/drawable/baseline_dew_point_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,13V5c0,-1.66 -1.34,-3 -3,-3S6,3.34 6,5v8c-1.21,0.91 -2,2.37 -2,4c0,2.76 2.24,5 5,5s5,-2.24 5,-5C14,15.37 13.21,13.91 12,13zM8,11V5c0,-0.55 0.45,-1 1,-1s1,0.45 1,1v1H9v1h1v1v1H9v1h1v1H8zM21,6.5C21,5.66 19.5,4 19.5,4S18,5.66 18,6.5C18,7.33 18.67,8 19.5,8S21,7.33 21,6.5zM17,9.5C17,8.66 15.5,7 15.5,7S14,8.66 14,9.5c0,0.83 0.67,1.5 1.5,1.5S17,10.33 17,9.5zM21,12.5c0,-0.84 -1.5,-2.5 -1.5,-2.5S18,11.66 18,12.5c0,0.83 0.67,1.5 1.5,1.5S21,13.33 21,12.5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/dialer_sip.xml b/qqq/android/mobileapp/src/main/res/drawable/dialer_sip.xml new file mode 100644 index 0000000..3349fbb --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/dialer_sip.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/communication/dialer_sip/materialicons/black/res/drawable/baseline_dialer_sip_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M17,3h-1v5h1L17,3zM15,5h-2L13,4h2L15,3h-3v3h2v1h-2v1h3L15,5zM18,3v5h1L19,6h2L21,3h-3zM20,5h-1L19,4h1v1zM20,15.5c-1.25,0 -2.45,-0.2 -3.57,-0.57 -0.35,-0.11 -0.74,-0.03 -1.01,0.24l-2.2,2.2c-2.83,-1.44 -5.15,-3.75 -6.59,-6.59l2.2,-2.21c0.27,-0.26 0.35,-0.65 0.24,-1C8.7,6.45 8.5,5.25 8.5,4c0,-0.55 -0.45,-1 -1,-1L4,3c-0.55,0 -1,0.45 -1,1 0,9.39 7.61,17 17,17 0.55,0 1,-0.45 1,-1v-3.5c0,-0.55 -0.45,-1 -1,-1z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/dialpad.xml b/qqq/android/mobileapp/src/main/res/drawable/dialpad.xml new file mode 100644 index 0000000..20aa5d4 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/dialpad.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/communication/dialpad/materialicons/black/res/drawable/baseline_dialpad_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,19c-1.1,0 -2,0.9 -2,2s0.9,2 2,2 2,-0.9 2,-2 -0.9,-2 -2,-2zM6,1c-1.1,0 -2,0.9 -2,2s0.9,2 2,2 2,-0.9 2,-2 -0.9,-2 -2,-2zM6,7c-1.1,0 -2,0.9 -2,2s0.9,2 2,2 2,-0.9 2,-2 -0.9,-2 -2,-2zM6,13c-1.1,0 -2,0.9 -2,2s0.9,2 2,2 2,-0.9 2,-2 -0.9,-2 -2,-2zM18,5c1.1,0 2,-0.9 2,-2s-0.9,-2 -2,-2 -2,0.9 -2,2 0.9,2 2,2zM12,13c-1.1,0 -2,0.9 -2,2s0.9,2 2,2 2,-0.9 2,-2 -0.9,-2 -2,-2zM18,13c-1.1,0 -2,0.9 -2,2s0.9,2 2,2 2,-0.9 2,-2 -0.9,-2 -2,-2zM18,7c-1.1,0 -2,0.9 -2,2s0.9,2 2,2 2,-0.9 2,-2 -0.9,-2 -2,-2zM12,7c-1.1,0 -2,0.9 -2,2s0.9,2 2,2 2,-0.9 2,-2 -0.9,-2 -2,-2zM12,1c-1.1,0 -2,0.9 -2,2s0.9,2 2,2 2,-0.9 2,-2 -0.9,-2 -2,-2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/diamond.xml b/qqq/android/mobileapp/src/main/res/drawable/diamond.xml new file mode 100644 index 0000000..c209721 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/diamond.xml @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/diamond/materialicons/black/res/drawable/baseline_diamond_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12.16,3l-0.32,0l-2.63,5.25l5.58,0z" /> + <path + android:fillColor="#FF000000" + android:pathData="M16.46,8.25l5.16,0l-2.62,-5.25l-5.16,0z" /> + <path + android:fillColor="#FF000000" + android:pathData="M21.38,9.75l-8.63,0l0,10.35z" /> + <path + android:fillColor="#FF000000" + android:pathData="M11.25,20.1l0,-10.35l-8.63,0z" /> + <path + android:fillColor="#FF000000" + android:pathData="M7.54,8.25l2.62,-5.25l-5.16,0l-2.62,5.25z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/difference.xml b/qqq/android/mobileapp/src/main/res/drawable/difference.xml new file mode 100644 index 0000000..e72d0af --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/difference.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/file/difference/materialicons/black/res/drawable/baseline_difference_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M18,23H4c-1.1,0 -2,-0.9 -2,-2V7h2v14h14V23zM15,1H8C6.9,1 6.01,1.9 6.01,3L6,17c0,1.1 0.89,2 1.99,2H19c1.1,0 2,-0.9 2,-2V7L15,1zM16.5,15h-6v-2h6V15zM16.5,9h-2v2h-2V9h-2V7h2V5h2v2h2V9z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/dining.xml b/qqq/android/mobileapp/src/main/res/drawable/dining.xml new file mode 100644 index 0000000..d36b69d --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/dining.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/search/dining/materialicons/black/res/drawable/baseline_dining_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,2H4C2.9,2 2,2.9 2,4v16c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2V4C22,2.9 21.1,2 20,2zM11,10.3c0,0.93 -0.64,1.71 -1.5,1.93V19H8v-6.77c-0.86,-0.22 -1.5,-1 -1.5,-1.93V6.5C6.5,6.22 6.72,6 7,6s0.5,0.22 0.5,0.5V9h0.75V6.5c0,-0.28 0.22,-0.5 0.5,-0.5s0.5,0.22 0.5,0.5V9H10V6.5C10,6.22 10.23,6 10.5,6C10.78,6 11,6.22 11,6.5V10.3zM15.58,12.59l-0.08,0.03V19H14v-6.38l-0.08,-0.04c-0.97,-0.47 -1.67,-1.7 -1.67,-3.18c0,-1.88 1.13,-3.4 2.5,-3.4c1.38,0 2.5,1.53 2.5,3.41C17.25,10.89 16.55,12.12 15.58,12.59z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/dinner_dining.xml b/qqq/android/mobileapp/src/main/res/drawable/dinner_dining.xml new file mode 100644 index 0000000..aa9b946 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/dinner_dining.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/dinner_dining/materialicons/black/res/drawable/baseline_dinner_dining_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M2,19h20l-2,2H4L2,19zM5,6h1v1H5V6zM5,4h1v1H5V4zM9,4v1H7V4H9zM9,7H7V6h2V7zM6,15.23c-0.36,0.11 -0.69,0.28 -1,0.47V8h1V15.23zM4,16.52C3.62,16.96 3.32,17.45 3.16,18h16.82c0.01,-0.16 0.03,-0.33 0.03,-0.5c0,-3.04 -2.46,-5.5 -5.5,-5.5c-2.29,0 -4.25,1.4 -5.08,3.4C8.84,15.15 8.19,15 7.5,15c-0.17,0 -0.33,0.02 -0.5,0.04V8h2c1.03,0.06 1.9,-0.96 2,-2h10V5H11c-0.1,-1.05 -0.97,-1.97 -2,-2H3v1h1v1H3v1h1v1H3v1h1V16.52z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/directions.xml b/qqq/android/mobileapp/src/main/res/drawable/directions.xml new file mode 100644 index 0000000..094e146 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/directions.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/directions/materialicons/black/res/drawable/baseline_directions_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M21.41,10.59l-7.99,-8c-0.78,-0.78 -2.05,-0.78 -2.83,0l-8.01,8c-0.78,0.78 -0.78,2.05 0,2.83l8.01,8c0.78,0.78 2.05,0.78 2.83,0l7.99,-8C22.2,12.63 22.2,11.37 21.41,10.59zM13.5,14.5V12H10v3H8v-4c0,-0.55 0.45,-1 1,-1h4.5V7.5L17,11L13.5,14.5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/directions_bike.xml b/qqq/android/mobileapp/src/main/res/drawable/directions_bike.xml new file mode 100644 index 0000000..2be68f6 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/directions_bike.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/directions_bike/materialicons/black/res/drawable/baseline_directions_bike_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M15.5,5.5c1.1,0 2,-0.9 2,-2s-0.9,-2 -2,-2 -2,0.9 -2,2 0.9,2 2,2zM5,12c-2.8,0 -5,2.2 -5,5s2.2,5 5,5 5,-2.2 5,-5 -2.2,-5 -5,-5zM5,20.5c-1.9,0 -3.5,-1.6 -3.5,-3.5s1.6,-3.5 3.5,-3.5 3.5,1.6 3.5,3.5 -1.6,3.5 -3.5,3.5zM10.8,10.5l2.4,-2.4 0.8,0.8c1.3,1.3 3,2.1 5.1,2.1L19.1,9c-1.5,0 -2.7,-0.6 -3.6,-1.5l-1.9,-1.9c-0.5,-0.4 -1,-0.6 -1.6,-0.6s-1.1,0.2 -1.4,0.6L7.8,8.4c-0.4,0.4 -0.6,0.9 -0.6,1.4 0,0.6 0.2,1.1 0.6,1.4L11,14v5h2v-6.2l-2.2,-2.3zM19,12c-2.8,0 -5,2.2 -5,5s2.2,5 5,5 5,-2.2 5,-5 -2.2,-5 -5,-5zM19,20.5c-1.9,0 -3.5,-1.6 -3.5,-3.5s1.6,-3.5 3.5,-3.5 3.5,1.6 3.5,3.5 -1.6,3.5 -3.5,3.5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/directions_boat.xml b/qqq/android/mobileapp/src/main/res/drawable/directions_boat.xml new file mode 100644 index 0000000..764d766 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/directions_boat.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/directions_boat/materialicons/black/res/drawable/baseline_directions_boat_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,21c-1.39,0 -2.78,-0.47 -4,-1.32 -2.44,1.71 -5.56,1.71 -8,0C6.78,20.53 5.39,21 4,21H2v2h2c1.38,0 2.74,-0.35 4,-0.99 2.52,1.29 5.48,1.29 8,0 1.26,0.65 2.62,0.99 4,0.99h2v-2h-2zM3.95,19H4c1.6,0 3.02,-0.88 4,-2 0.98,1.12 2.4,2 4,2s3.02,-0.88 4,-2c0.98,1.12 2.4,2 4,2h0.05l1.89,-6.68c0.08,-0.26 0.06,-0.54 -0.06,-0.78s-0.34,-0.42 -0.6,-0.5L20,10.62V6c0,-1.1 -0.9,-2 -2,-2h-3V1H9v3H6c-1.1,0 -2,0.9 -2,2v4.62l-1.29,0.42c-0.26,0.08 -0.48,0.26 -0.6,0.5s-0.15,0.52 -0.06,0.78L3.95,19zM6,6h12v3.97L12,8 6,9.97V6z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/directions_boat_filled.xml b/qqq/android/mobileapp/src/main/res/drawable/directions_boat_filled.xml new file mode 100644 index 0000000..1b11652 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/directions_boat_filled.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/directions_boat_filled/materialicons/black/res/drawable/baseline_directions_boat_filled_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,21c-1.39,0 -2.78,-0.47 -4,-1.32c-2.44,1.71 -5.56,1.71 -8,0C6.78,20.53 5.39,21 4,21H2v2h2c1.38,0 2.74,-0.35 4,-0.99c2.52,1.29 5.48,1.29 8,0c1.26,0.65 2.62,0.99 4,0.99h2v-2H20zM3.95,19H4c1.6,0 3.02,-0.88 4,-2c0.98,1.12 2.4,2 4,2s3.02,-0.88 4,-2c0.98,1.12 2.4,2 4,2h0.05l1.9,-6.68c0.11,-0.37 0.04,-1.06 -0.66,-1.28L20,10.62V6c0,-1.1 -0.9,-2 -2,-2h-3V1H9v3H6C4.9,4 4,4.9 4,6v4.62l-1.29,0.42c-0.63,0.19 -0.81,0.84 -0.66,1.28L3.95,19zM6,6h12v3.97L12,8L6,9.97V6z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/directions_bus.xml b/qqq/android/mobileapp/src/main/res/drawable/directions_bus.xml new file mode 100644 index 0000000..2a8b5e6 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/directions_bus.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/directions_bus/materialicons/black/res/drawable/baseline_directions_bus_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M4,16c0,0.88 0.39,1.67 1,2.22L5,20c0,0.55 0.45,1 1,1h1c0.55,0 1,-0.45 1,-1v-1h8v1c0,0.55 0.45,1 1,1h1c0.55,0 1,-0.45 1,-1v-1.78c0.61,-0.55 1,-1.34 1,-2.22L20,6c0,-3.5 -3.58,-4 -8,-4s-8,0.5 -8,4v10zM7.5,17c-0.83,0 -1.5,-0.67 -1.5,-1.5S6.67,14 7.5,14s1.5,0.67 1.5,1.5S8.33,17 7.5,17zM16.5,17c-0.83,0 -1.5,-0.67 -1.5,-1.5s0.67,-1.5 1.5,-1.5 1.5,0.67 1.5,1.5 -0.67,1.5 -1.5,1.5zM18,11L6,11L6,6h12v5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/directions_bus_filled.xml b/qqq/android/mobileapp/src/main/res/drawable/directions_bus_filled.xml new file mode 100644 index 0000000..053c50b --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/directions_bus_filled.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/directions_bus_filled/materialicons/black/res/drawable/baseline_directions_bus_filled_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,2C8,2 4,2.5 4,6v9.5c0,0.95 0.38,1.81 1,2.44V20c0,0.55 0.45,1 1,1h1c0.55,0 1,-0.45 1,-1v-1h8v1c0,0.55 0.45,1 1,1h1c0.55,0 1,-0.45 1,-1v-2.06c0.62,-0.63 1,-1.49 1,-2.44V6C20,2.5 16.42,2 12,2zM8.5,16C7.67,16 7,15.33 7,14.5S7.67,13 8.5,13s1.5,0.67 1.5,1.5S9.33,16 8.5,16zM15.5,16c-0.83,0 -1.5,-0.67 -1.5,-1.5s0.67,-1.5 1.5,-1.5s1.5,0.67 1.5,1.5S16.33,16 15.5,16zM18,10H6V7h12V10z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/directions_car.xml b/qqq/android/mobileapp/src/main/res/drawable/directions_car.xml new file mode 100644 index 0000000..29f890c --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/directions_car.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/directions_car/materialicons/black/res/drawable/baseline_directions_car_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M18.92,6.01C18.72,5.42 18.16,5 17.5,5h-11c-0.66,0 -1.21,0.42 -1.42,1.01L3,12v8c0,0.55 0.45,1 1,1h1c0.55,0 1,-0.45 1,-1v-1h12v1c0,0.55 0.45,1 1,1h1c0.55,0 1,-0.45 1,-1v-8l-2.08,-5.99zM6.5,16c-0.83,0 -1.5,-0.67 -1.5,-1.5S5.67,13 6.5,13s1.5,0.67 1.5,1.5S7.33,16 6.5,16zM17.5,16c-0.83,0 -1.5,-0.67 -1.5,-1.5s0.67,-1.5 1.5,-1.5 1.5,0.67 1.5,1.5 -0.67,1.5 -1.5,1.5zM5,11l1.5,-4.5h11L19,11L5,11z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/directions_car_filled.xml b/qqq/android/mobileapp/src/main/res/drawable/directions_car_filled.xml new file mode 100644 index 0000000..c1a4141 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/directions_car_filled.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/directions_car_filled/materialicons/black/res/drawable/baseline_directions_car_filled_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M18.92,6.01C18.72,5.42 18.16,5 17.5,5h-11C5.84,5 5.29,5.42 5.08,6.01L3,12v8c0,0.55 0.45,1 1,1h1c0.55,0 1,-0.45 1,-1v-1h12v1c0,0.55 0.45,1 1,1h1c0.55,0 1,-0.45 1,-1v-8L18.92,6.01zM7.5,16C6.67,16 6,15.33 6,14.5S6.67,13 7.5,13S9,13.67 9,14.5S8.33,16 7.5,16zM16.5,16c-0.83,0 -1.5,-0.67 -1.5,-1.5s0.67,-1.5 1.5,-1.5s1.5,0.67 1.5,1.5S17.33,16 16.5,16zM5.81,10l1.04,-3h10.29l1.04,3H5.81z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/directions_off.xml b/qqq/android/mobileapp/src/main/res/drawable/directions_off.xml new file mode 100644 index 0000000..79d46e3 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/directions_off.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/notification/directions_off/materialicons/black/res/drawable/baseline_directions_off_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12.83,10h0.67V7.5L17,11l-1.59,1.59L18.83,16l2.59,-2.59c0.78,-0.78 0.78,-2.05 0,-2.83l-7.99,-8c-0.78,-0.78 -2.05,-0.78 -2.83,0L8,5.17L12.83,10z" /> + <path + android:fillColor="#FF000000" + android:pathData="M2.81,2.81L1.39,4.22L5.17,8l-2.59,2.59c-0.78,0.78 -0.78,2.05 0,2.83l8.01,8c0.78,0.78 2.05,0.78 2.83,0L16,18.83l3.78,3.78l1.41,-1.41L2.81,2.81zM10,15H8v-4c0,-0.05 0.02,-0.09 0.03,-0.14L10,12.83V15z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/directions_railway.xml b/qqq/android/mobileapp/src/main/res/drawable/directions_railway.xml new file mode 100644 index 0000000..9a22cd7 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/directions_railway.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/directions_railway/materialicons/black/res/drawable/baseline_directions_railway_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M4,15.5C4,17.43 5.57,19 7.5,19L6,20.5v0.5h12v-0.5L16.5,19c1.93,0 3.5,-1.57 3.5,-3.5L20,5c0,-3.5 -3.58,-4 -8,-4s-8,0.5 -8,4v10.5zM12,17c-1.1,0 -2,-0.9 -2,-2s0.9,-2 2,-2 2,0.9 2,2 -0.9,2 -2,2zM18,10L6,10L6,5h12v5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/directions_railway_filled.xml b/qqq/android/mobileapp/src/main/res/drawable/directions_railway_filled.xml new file mode 100644 index 0000000..385e497 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/directions_railway_filled.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/directions_railway_filled/materialicons/black/res/drawable/baseline_directions_railway_filled_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,2C8,2 4,2.5 4,6v9.5C4,17.43 5.57,19 7.5,19L6,20v1h12v-1l-1.5,-1c1.93,0 3.5,-1.57 3.5,-3.5V6C20,2.5 16.42,2 12,2zM12,16c-0.83,0 -1.5,-0.67 -1.5,-1.5S11.17,13 12,13s1.5,0.67 1.5,1.5S12.83,16 12,16zM18,10H6V7h12V10z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/directions_run.xml b/qqq/android/mobileapp/src/main/res/drawable/directions_run.xml new file mode 100644 index 0000000..874c402 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/directions_run.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/directions_run/materialicons/black/res/drawable/baseline_directions_run_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M13.49,5.48c1.1,0 2,-0.9 2,-2s-0.9,-2 -2,-2 -2,0.9 -2,2 0.9,2 2,2zM9.89,19.38l1,-4.4 2.1,2v6h2v-7.5l-2.1,-2 0.6,-3c1.3,1.5 3.3,2.5 5.5,2.5v-2c-1.9,0 -3.5,-1 -4.3,-2.4l-1,-1.6c-0.4,-0.6 -1,-1 -1.7,-1 -0.3,0 -0.5,0.1 -0.8,0.1l-5.2,2.2v4.7h2v-3.4l1.8,-0.7 -1.6,8.1 -4.9,-1 -0.4,2 7,1.4z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/directions_subway.xml b/qqq/android/mobileapp/src/main/res/drawable/directions_subway.xml new file mode 100644 index 0000000..f35dab0 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/directions_subway.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/directions_subway/materialicons/black/res/drawable/baseline_directions_subway_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,2c-4.42,0 -8,0.5 -8,4v9.5C4,17.43 5.57,19 7.5,19L6,20.5v0.5h12v-0.5L16.5,19c1.93,0 3.5,-1.57 3.5,-3.5L20,6c0,-3.5 -3.58,-4 -8,-4zM7.5,17c-0.83,0 -1.5,-0.67 -1.5,-1.5S6.67,14 7.5,14s1.5,0.67 1.5,1.5S8.33,17 7.5,17zM11,11L6,11L6,6h5v5zM16.5,17c-0.83,0 -1.5,-0.67 -1.5,-1.5s0.67,-1.5 1.5,-1.5 1.5,0.67 1.5,1.5 -0.67,1.5 -1.5,1.5zM18,11h-5L13,6h5v5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/directions_subway_filled.xml b/qqq/android/mobileapp/src/main/res/drawable/directions_subway_filled.xml new file mode 100644 index 0000000..fae1919 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/directions_subway_filled.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/directions_subway_filled/materialicons/black/res/drawable/baseline_directions_subway_filled_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,2C8,2 4,2.5 4,6v9.5C4,17.43 5.57,19 7.5,19L6,20v1h12v-1l-1.5,-1c1.93,0 3.5,-1.57 3.5,-3.5V6C20,2.5 16.42,2 12,2zM8.5,16C7.67,16 7,15.33 7,14.5S7.67,13 8.5,13s1.5,0.67 1.5,1.5S9.33,16 8.5,16zM11,10H6V7h5V10zM15.5,16c-0.83,0 -1.5,-0.67 -1.5,-1.5s0.67,-1.5 1.5,-1.5s1.5,0.67 1.5,1.5S16.33,16 15.5,16zM18,10h-5V7h5V10z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/directions_transit.xml b/qqq/android/mobileapp/src/main/res/drawable/directions_transit.xml new file mode 100644 index 0000000..95eded9 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/directions_transit.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/directions_transit/materialicons/black/res/drawable/baseline_directions_transit_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,2c-4.42,0 -8,0.5 -8,4v9.5C4,17.43 5.57,19 7.5,19L6,20.5v0.5h12v-0.5L16.5,19c1.93,0 3.5,-1.57 3.5,-3.5L20,6c0,-3.5 -3.58,-4 -8,-4zM7.5,17c-0.83,0 -1.5,-0.67 -1.5,-1.5S6.67,14 7.5,14s1.5,0.67 1.5,1.5S8.33,17 7.5,17zM11,11L6,11L6,6h5v5zM16.5,17c-0.83,0 -1.5,-0.67 -1.5,-1.5s0.67,-1.5 1.5,-1.5 1.5,0.67 1.5,1.5 -0.67,1.5 -1.5,1.5zM18,11h-5L13,6h5v5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/directions_transit_filled.xml b/qqq/android/mobileapp/src/main/res/drawable/directions_transit_filled.xml new file mode 100644 index 0000000..99d93d1 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/directions_transit_filled.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/directions_transit_filled/materialicons/black/res/drawable/baseline_directions_transit_filled_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,2C8,2 4,2.5 4,6v9.5C4,17.43 5.57,19 7.5,19L6,20v1h12v-1l-1.5,-1c1.93,0 3.5,-1.57 3.5,-3.5V6C20,2.5 16.42,2 12,2zM8.5,16C7.67,16 7,15.33 7,14.5S7.67,13 8.5,13s1.5,0.67 1.5,1.5S9.33,16 8.5,16zM11,10H6V7h5V10zM15.5,16c-0.83,0 -1.5,-0.67 -1.5,-1.5s0.67,-1.5 1.5,-1.5s1.5,0.67 1.5,1.5S16.33,16 15.5,16zM18,10h-5V7h5V10z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/directions_walk.xml b/qqq/android/mobileapp/src/main/res/drawable/directions_walk.xml new file mode 100644 index 0000000..369efb8 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/directions_walk.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/directions_walk/materialicons/black/res/drawable/baseline_directions_walk_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M13.5,5.5c1.1,0 2,-0.9 2,-2s-0.9,-2 -2,-2 -2,0.9 -2,2 0.9,2 2,2zM9.8,8.9L7,23h2.1l1.8,-8 2.1,2v6h2v-7.5l-2.1,-2 0.6,-3C14.8,12 16.8,13 19,13v-2c-1.9,0 -3.5,-1 -4.3,-2.4l-1,-1.6c-0.4,-0.6 -1,-1 -1.7,-1 -0.3,0 -0.5,0.1 -0.8,0.1L6,8.3V13h2V9.6l1.8,-0.7" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/dirty_lens.xml b/qqq/android/mobileapp/src/main/res/drawable/dirty_lens.xml new file mode 100644 index 0000000..59d8abb --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/dirty_lens.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/dirty_lens/materialicons/black/res/drawable/baseline_dirty_lens_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12.95,19L20,19L20,7L4,7v12h7.24c0.14,-0.98 0.42,-2.05 -0.16,-2.43 -0.89,-0.59 -1.27,2.06 -2.8,1.35 -1.39,-1.12 1.05,-1.29 0.5,-3.27 -0.22,-0.79 -2.28,0.36 -2.4,-1.24 -0.08,-1 1.49,-0.74 1.51,-1.49 0.03,-0.75 -1.03,-1.05 -0.25,-1.91 0.22,-0.24 0.71,-0.26 0.91,-0.19 0.79,0.27 1.55,1.82 2.51,1.19 1.03,-0.66 -1.88,-2.35 0,-2.86 1.64,-0.44 1.31,2.08 2.65,2.44 1.94,0.52 2.65,-4.55 4.41,-2.33 1.85,2.33 -3.43,2.27 -2.85,4.01 0.34,1.01 2.15,-1.2 2.76,0.53 0.64,1.83 -3.09,0.82 -3.04,1.66 0.06,0.83 2.41,0.55 1.64,2.12 -1.14,1.86 -3,-1.03 -3.81,0.09 -0.39,0.57 -0.09,1.49 0.13,2.33zM20,5c1.1,0 2,0.9 2,2v12c0,1.1 -0.9,2 -2,2L4,21c-1.1,0 -2,-0.9 -2,-2L2,7c0,-1.1 0.9,-2 2,-2h3.17L9,3h6l1.83,2L20,5zM18.14,18.01c-0.47,0 -0.86,-0.38 -0.86,-0.86s0.38,-0.86 0.86,-0.86c0.47,0 0.86,0.38 0.86,0.86s-0.38,0.86 -0.86,0.86z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/disabled_by_default.xml b/qqq/android/mobileapp/src/main/res/drawable/disabled_by_default.xml new file mode 100644 index 0000000..c0cf28b --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/disabled_by_default.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/disabled_by_default/materialicons/black/res/drawable/baseline_disabled_by_default_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M3,3v18h18V3H3zM17,15.59L15.59,17L12,13.41L8.41,17L7,15.59L10.59,12L7,8.41L8.41,7L12,10.59L15.59,7L17,8.41L13.41,12L17,15.59z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/disabled_visible.xml b/qqq/android/mobileapp/src/main/res/drawable/disabled_visible.xml new file mode 100644 index 0000000..7d0fd3a --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/disabled_visible.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/disabled_visible/materialicons/black/res/drawable/baseline_disabled_visible_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M21.99,12.34C22,12.23 22,12.11 22,12c0,-5.52 -4.48,-10 -10,-10S2,6.48 2,12c0,5.17 3.93,9.43 8.96,9.95c-0.93,-0.73 -1.72,-1.64 -2.32,-2.68C5.9,18 4,15.22 4,12c0,-1.85 0.63,-3.55 1.69,-4.9l5.66,5.66c0.56,-0.4 1.17,-0.73 1.82,-1L7.1,5.69C8.45,4.63 10.15,4 12,4c4.24,0 7.7,3.29 7.98,7.45C20.69,11.67 21.37,11.97 21.99,12.34zM17,13c-3.18,0 -5.9,1.87 -7,4.5c1.1,2.63 3.82,4.5 7,4.5s5.9,-1.87 7,-4.5C22.9,14.87 20.18,13 17,13zM17,20c-1.38,0 -2.5,-1.12 -2.5,-2.5c0,-1.38 1.12,-2.5 2.5,-2.5s2.5,1.12 2.5,2.5C19.5,18.88 18.38,20 17,20zM18.5,17.5c0,0.83 -0.67,1.5 -1.5,1.5s-1.5,-0.67 -1.5,-1.5c0,-0.83 0.67,-1.5 1.5,-1.5S18.5,16.67 18.5,17.5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/disc_full.xml b/qqq/android/mobileapp/src/main/res/drawable/disc_full.xml new file mode 100644 index 0000000..bcae723 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/disc_full.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/notification/disc_full/materialicons/black/res/drawable/baseline_disc_full_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,16h2v-2h-2v2zM20,7v5h2L22,7h-2zM10,4c-4.42,0 -8,3.58 -8,8s3.58,8 8,8 8,-3.58 8,-8 -3.58,-8 -8,-8zM10,14c-1.1,0 -2,-0.9 -2,-2s0.9,-2 2,-2 2,0.9 2,2 -0.9,2 -2,2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/discount.xml b/qqq/android/mobileapp/src/main/res/drawable/discount.xml new file mode 100644 index 0000000..1c9f607 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/discount.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/discount/materialicons/black/res/drawable/baseline_discount_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12.79,21L3,11.21v2c0,0.53 0.21,1.04 0.59,1.41l7.79,7.79c0.78,0.78 2.05,0.78 2.83,0l6.21,-6.21c0.78,-0.78 0.78,-2.05 0,-2.83L12.79,21z" /> + <path + android:fillColor="#FF000000" + android:pathData="M11.38,17.41c0.78,0.78 2.05,0.78 2.83,0l6.21,-6.21c0.78,-0.78 0.78,-2.05 0,-2.83l-7.79,-7.79C12.25,0.21 11.74,0 11.21,0H5C3.9,0 3,0.9 3,2v6.21c0,0.53 0.21,1.04 0.59,1.41L11.38,17.41zM7.25,3C7.94,3 8.5,3.56 8.5,4.25S7.94,5.5 7.25,5.5S6,4.94 6,4.25S6.56,3 7.25,3z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/display_settings.xml b/qqq/android/mobileapp/src/main/res/drawable/display_settings.xml new file mode 100644 index 0000000..d476e1c --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/display_settings.xml @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/display_settings/materialicons/black/res/drawable/baseline_display_settings_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,3H4C2.89,3 2,3.89 2,5v12c0,1.1 0.89,2 2,2h4v2h8v-2h4c1.1,0 2,-0.9 2,-2V5C22,3.89 21.1,3 20,3zM20,17H4V5h16V17z" /> + <path + android:fillColor="#FF000000" + android:pathData="M6,8.25h8v1.5h-8z" /> + <path + android:fillColor="#FF000000" + android:pathData="M16.5,9.75l1.5,0l0,-1.5l-1.5,0l0,-1.25l-1.5,0l0,4l1.5,0z" /> + <path + android:fillColor="#FF000000" + android:pathData="M10,12.25h8v1.5h-8z" /> + <path + android:fillColor="#FF000000" + android:pathData="M7.5,15l1.5,0l0,-4l-1.5,0l0,1.25l-1.5,0l0,1.5l1.5,0z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/diversity_1.xml b/qqq/android/mobileapp/src/main/res/drawable/diversity_1.xml new file mode 100644 index 0000000..55fbf1a --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/diversity_1.xml @@ -0,0 +1,37 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/diversity_1/materialicons/black/res/drawable/baseline_diversity_1_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M4,14m-2,0a2,2 0,1 1,4 0a2,2 0,1 1,-4 0" /> + <path + android:fillColor="#FF000000" + android:pathData="M1.22,17.58C0.48,17.9 0,18.62 0,19.43V21l4.5,0v-1.61c0,-0.83 0.23,-1.61 0.63,-2.29C4.76,17.04 4.39,17 4,17C3.01,17 2.07,17.21 1.22,17.58z" /> + <path + android:fillColor="#FF000000" + android:pathData="M20,14m-2,0a2,2 0,1 1,4 0a2,2 0,1 1,-4 0" /> + <path + android:fillColor="#FF000000" + android:pathData="M22.78,17.58C21.93,17.21 20.99,17 20,17c-0.39,0 -0.76,0.04 -1.13,0.1c0.4,0.68 0.63,1.46 0.63,2.29V21l4.5,0v-1.57C24,18.62 23.52,17.9 22.78,17.58z" /> + <path + android:fillColor="#FF000000" + android:pathData="M16.24,16.65c-1.17,-0.52 -2.61,-0.9 -4.24,-0.9c-1.63,0 -3.07,0.39 -4.24,0.9C6.68,17.13 6,18.21 6,19.39V21h12v-1.61C18,18.21 17.32,17.13 16.24,16.65z" /> + <path + android:fillColor="#FF000000" + android:pathData="M9,12c0,1.66 1.34,3 3,3s3,-1.34 3,-3c0,-1.66 -1.34,-3 -3,-3S9,10.34 9,12z" /> + <path + android:fillColor="#FF000000" + android:pathData="M2.48,10.86C2.17,10.1 2,9.36 2,8.6C2,6.02 4.02,4 6.6,4c2.68,0 3.82,1.74 5.4,3.59C13.57,5.76 14.7,4 17.4,4C19.98,4 22,6.02 22,8.6c0,0.76 -0.17,1.5 -0.48,2.26c0.65,0.31 1.18,0.82 1.53,1.44C23.65,11.1 24,9.88 24,8.6C24,4.9 21.1,2 17.4,2c-2.09,0 -4.09,0.97 -5.4,2.51C10.69,2.97 8.69,2 6.6,2C2.9,2 0,4.9 0,8.6c0,1.28 0.35,2.5 0.96,3.7C1.31,11.68 1.84,11.17 2.48,10.86z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/diversity_2.xml b/qqq/android/mobileapp/src/main/res/drawable/diversity_2.xml new file mode 100644 index 0000000..2bd204f --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/diversity_2.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/diversity_2/materialicons/black/res/drawable/baseline_diversity_2_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M10.1,15.9l1.42,-1.42C8.79,12.05 7,10.41 7,8.85C7,7.8 7.8,7 8.85,7c1.11,0 1.54,0.65 2.68,2h0.93c1.12,-1.31 1.53,-2 2.68,-2c0.87,0 1.55,0.54 1.77,1.32c0.35,-0.04 0.68,-0.06 1,-0.06c0.36,0 0.7,0.03 1.03,0.08C18.7,6.43 17.13,5 15.15,5c-0.12,0 -0.23,0.03 -0.35,0.04C14.92,4.71 15,4.37 15,4c0,-1.66 -1.34,-3 -3,-3S9,2.34 9,4c0,0.37 0.08,0.71 0.2,1.04C9.08,5.03 8.97,5 8.85,5C6.69,5 5,6.69 5,8.85C5,11.27 7.04,13.16 10.1,15.9z" /> + <path + android:fillColor="#FF000000" + android:pathData="M22.5,16.24c-0.32,-0.18 -0.66,-0.29 -1,-0.35c0.07,-0.1 0.15,-0.18 0.21,-0.28c1.08,-1.87 0.46,-4.18 -1.41,-5.26c-2.09,-1.21 -4.76,-0.39 -8.65,0.9l0.52,1.94c3.47,-1.14 5.79,-1.88 7.14,-1.1c0.91,0.53 1.2,1.61 0.68,2.53c-0.56,0.96 -1.33,1 -3.07,1.32l-0.47,0.81c0.58,1.62 0.97,2.33 0.39,3.32c-0.53,0.91 -1.61,1.2 -2.53,0.68c-0.06,-0.03 -0.11,-0.09 -0.17,-0.13c-0.3,0.67 -0.64,1.24 -1.03,1.73c0.07,0.04 0.13,0.09 0.2,0.14c1.87,1.08 4.18,0.46 5.26,-1.41c0.06,-0.1 0.09,-0.21 0.14,-0.32c0.22,0.27 0.48,0.51 0.8,0.69c1.43,0.83 3.27,0.34 4.1,-1.1S23.93,17.06 22.5,16.24z" /> + <path + android:fillColor="#FF000000" + android:pathData="M12.32,14.01c-0.74,3.58 -1.27,5.95 -2.62,6.73c-0.91,0.53 -2,0.24 -2.53,-0.68c-0.56,-0.96 -0.2,-1.66 0.39,-3.32L7.1,15.93c-1.7,-0.31 -2.5,-0.33 -3.07,-1.32c-0.53,-0.91 -0.24,-2 0.68,-2.53c0.09,-0.05 0.19,-0.08 0.29,-0.11c-0.35,-0.56 -0.64,-1.17 -0.82,-1.85c-0.16,0.07 -0.32,0.14 -0.48,0.23c-1.87,1.08 -2.49,3.39 -1.41,5.26c0.06,0.1 0.14,0.18 0.21,0.28c-0.34,0.06 -0.68,0.17 -1,0.35c-1.43,0.83 -1.93,2.66 -1.1,4.1s2.66,1.93 4.1,1.1c0.32,-0.18 0.58,-0.42 0.8,-0.69c0.05,0.11 0.08,0.22 0.14,0.32c1.08,1.87 3.39,2.49 5.26,1.41c2.09,-1.21 2.71,-3.93 3.55,-7.94L12.32,14.01z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/diversity_3.xml b/qqq/android/mobileapp/src/main/res/drawable/diversity_3.xml new file mode 100644 index 0000000..3edb319 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/diversity_3.xml @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/diversity_3/materialicons/black/res/drawable/baseline_diversity_3_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M6.32,13.01c0.96,0.02 1.85,0.5 2.45,1.34C9.5,15.38 10.71,16 12,16c1.29,0 2.5,-0.62 3.23,-1.66c0.6,-0.84 1.49,-1.32 2.45,-1.34C16.96,11.78 14.08,11 12,11C9.93,11 7.04,11.78 6.32,13.01z" /> + <path + android:fillColor="#FF000000" + android:pathData="M4,13L4,13c1.66,0 3,-1.34 3,-3c0,-1.66 -1.34,-3 -3,-3s-3,1.34 -3,3C1,11.66 2.34,13 4,13z" /> + <path + android:fillColor="#FF000000" + android:pathData="M20,13L20,13c1.66,0 3,-1.34 3,-3c0,-1.66 -1.34,-3 -3,-3s-3,1.34 -3,3C17,11.66 18.34,13 20,13z" /> + <path + android:fillColor="#FF000000" + android:pathData="M12,10c1.66,0 3,-1.34 3,-3c0,-1.66 -1.34,-3 -3,-3S9,5.34 9,7C9,8.66 10.34,10 12,10z" /> + <path + android:fillColor="#FF000000" + android:pathData="M21,14h-3.27c-0.77,0 -1.35,0.45 -1.68,0.92C16.01,14.98 14.69,17 12,17c-1.43,0 -3.03,-0.64 -4.05,-2.08C7.56,14.37 6.95,14 6.27,14H3c-1.1,0 -2,0.9 -2,2v4h7v-2.26c1.15,0.8 2.54,1.26 4,1.26s2.85,-0.46 4,-1.26V20h7v-4C23,14.9 22.1,14 21,14z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/dns.xml b/qqq/android/mobileapp/src/main/res/drawable/dns.xml new file mode 100644 index 0000000..b5b841e --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/dns.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/dns/materialicons/black/res/drawable/baseline_dns_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,13H4c-0.55,0 -1,0.45 -1,1v6c0,0.55 0.45,1 1,1h16c0.55,0 1,-0.45 1,-1v-6c0,-0.55 -0.45,-1 -1,-1zM7,19c-1.1,0 -2,-0.9 -2,-2s0.9,-2 2,-2 2,0.9 2,2 -0.9,2 -2,2zM20,3H4c-0.55,0 -1,0.45 -1,1v6c0,0.55 0.45,1 1,1h16c0.55,0 1,-0.45 1,-1V4c0,-0.55 -0.45,-1 -1,-1zM7,9c-1.1,0 -2,-0.9 -2,-2s0.9,-2 2,-2 2,0.9 2,2 -0.9,2 -2,2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/do_disturb.xml b/qqq/android/mobileapp/src/main/res/drawable/do_disturb.xml new file mode 100644 index 0000000..753cd1d --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/do_disturb.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/notification/do_disturb/materialicons/black/res/drawable/baseline_do_disturb_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,2C6.5,2 2,6.5 2,12s4.5,10 10,10s10,-4.5 10,-10S17.5,2 12,2zM4,12c0,-4.4 3.6,-8 8,-8c1.8,0 3.5,0.6 4.9,1.7L5.7,16.9C4.6,15.5 4,13.8 4,12zM12,20c-1.8,0 -3.5,-0.6 -4.9,-1.7L18.3,7.1C19.4,8.5 20,10.2 20,12C20,16.4 16.4,20 12,20z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/do_disturb_alt.xml b/qqq/android/mobileapp/src/main/res/drawable/do_disturb_alt.xml new file mode 100644 index 0000000..6ea9f6e --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/do_disturb_alt.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/notification/do_disturb_alt/materialicons/black/res/drawable/baseline_do_disturb_alt_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10s10,-4.48 10,-10S17.52,2 12,2zM12,20c-4.42,0 -8,-3.58 -8,-8c0,-1.85 0.63,-3.55 1.69,-4.9L16.9,18.31C15.55,19.37 13.85,20 12,20zM18.31,16.9L7.1,5.69C8.45,4.63 10.15,4 12,4c4.42,0 8,3.58 8,8C20,13.85 19.37,15.55 18.31,16.9z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/do_disturb_off.xml b/qqq/android/mobileapp/src/main/res/drawable/do_disturb_off.xml new file mode 100644 index 0000000..97b54fa --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/do_disturb_off.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/notification/do_disturb_off/materialicons/black/res/drawable/baseline_do_disturb_off_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M17,11v2h-1.17l4.51,4.51C21.39,15.93 22,14.04 22,12c0,-5.52 -4.48,-10 -10,-10C9.96,2 8.07,2.61 6.49,3.66L13.83,11H17zM1.39,4.22l2.27,2.27C2.61,8.07 2,9.96 2,12c0,5.52 4.48,10 10,10c2.04,0 3.93,-0.61 5.51,-1.66l2.27,2.27l1.41,-1.41L2.81,2.81L1.39,4.22zM7,11h1.17l2,2H7V11z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/do_disturb_on.xml b/qqq/android/mobileapp/src/main/res/drawable/do_disturb_on.xml new file mode 100644 index 0000000..21da03f --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/do_disturb_on.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/notification/do_disturb_on/materialicons/black/res/drawable/baseline_do_disturb_on_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10s10,-4.48 10,-10S17.52,2 12,2zM17,13H7v-2h10V13z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/do_not_disturb.xml b/qqq/android/mobileapp/src/main/res/drawable/do_not_disturb.xml new file mode 100644 index 0000000..6571cba --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/do_not_disturb.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/notification/do_not_disturb/materialicons/black/res/drawable/baseline_do_not_disturb_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM12,20c-4.42,0 -8,-3.58 -8,-8 0,-1.85 0.63,-3.55 1.69,-4.9L16.9,18.31C15.55,19.37 13.85,20 12,20zM18.31,16.9L7.1,5.69C8.45,4.63 10.15,4 12,4c4.42,0 8,3.58 8,8 0,1.85 -0.63,3.55 -1.69,4.9z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/do_not_disturb_alt.xml b/qqq/android/mobileapp/src/main/res/drawable/do_not_disturb_alt.xml new file mode 100644 index 0000000..cdaca2b --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/do_not_disturb_alt.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/notification/do_not_disturb_alt/materialicons/black/res/drawable/baseline_do_not_disturb_alt_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,2C6.5,2 2,6.5 2,12s4.5,10 10,10 10,-4.5 10,-10S17.5,2 12,2zM4,12c0,-4.4 3.6,-8 8,-8 1.8,0 3.5,0.6 4.9,1.7L5.7,16.9C4.6,15.5 4,13.8 4,12zM12,20c-1.8,0 -3.5,-0.6 -4.9,-1.7L18.3,7.1C19.4,8.5 20,10.2 20,12c0,4.4 -3.6,8 -8,8z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/do_not_disturb_off.xml b/qqq/android/mobileapp/src/main/res/drawable/do_not_disturb_off.xml new file mode 100644 index 0000000..6a15702 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/do_not_disturb_off.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/notification/do_not_disturb_off/materialicons/black/res/drawable/baseline_do_not_disturb_off_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M17,11v2h-1.46l4.68,4.68C21.34,16.07 22,14.11 22,12c0,-5.52 -4.48,-10 -10,-10 -2.11,0 -4.07,0.66 -5.68,1.78L13.54,11H17zM2.27,2.27L1,3.54l2.78,2.78C2.66,7.93 2,9.89 2,12c0,5.52 4.48,10 10,10 2.11,0 4.07,-0.66 5.68,-1.78L20.46,23l1.27,-1.27L11,11 2.27,2.27zM7,13v-2h1.46l2,2H7z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/do_not_disturb_on.xml b/qqq/android/mobileapp/src/main/res/drawable/do_not_disturb_on.xml new file mode 100644 index 0000000..5b0689b --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/do_not_disturb_on.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/notification/do_not_disturb_on/materialicons/black/res/drawable/baseline_do_not_disturb_on_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM17,13L7,13v-2h10v2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/do_not_disturb_on_total_silence.xml b/qqq/android/mobileapp/src/main/res/drawable/do_not_disturb_on_total_silence.xml new file mode 100644 index 0000000..7c80be7 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/do_not_disturb_on_total_silence.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/do_not_disturb_on_total_silence/materialicons/black/res/drawable/baseline_do_not_disturb_on_total_silence_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10s10,-4.48 10,-10S17.52,2 12,2zM12,20c-4.41,0 -8,-3.59 -8,-8s3.59,-8 8,-8s8,3.59 8,8S16.41,20 12,20zM12,6c-3.3,0 -6,2.7 -6,6s2.7,6 6,6s6,-2.7 6,-6S15.4,6 12,6zM15,13H9v-2h6V13z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/do_not_step.xml b/qqq/android/mobileapp/src/main/res/drawable/do_not_step.xml new file mode 100644 index 0000000..3cf844c --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/do_not_step.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/places/do_not_step/materialicons/black/res/drawable/baseline_do_not_step_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M1.39,4.22l7.9,7.9c0.18,0.2 0.18,0.5 -0.01,0.7c-0.1,0.1 -0.23,0.15 -0.35,0.15s-0.26,-0.05 -0.35,-0.15L6.87,11.1c-0.11,0.4 -0.26,0.78 -0.45,1.12l1.4,1.4c0.2,0.2 0.2,0.51 0,0.71c-0.1,0.1 -0.23,0.15 -0.35,0.15s-0.26,-0.05 -0.35,-0.15l-1.27,-1.27c-0.24,0.29 -0.5,0.56 -0.77,0.8l1.28,1.28c0.2,0.2 0.2,0.51 0,0.71C6.26,15.95 6.13,16 6,16s-0.26,-0.05 -0.35,-0.15l-1.38,-1.38c-0.69,0.46 -1.39,0.79 -1.97,1.02C1.52,15.8 1,16.53 1,17.37V20h9.5l3.33,-3.33l5.94,5.94l1.41,-1.41L2.81,2.81L1.39,4.22zM18.51,15.68l-1.41,-1.41l4.48,-4.48L23,11.2L18.51,15.68zM20.88,9.08l-4.48,4.48L9.3,6.47L13.8,2L20.88,9.08z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/do_not_touch.xml b/qqq/android/mobileapp/src/main/res/drawable/do_not_touch.xml new file mode 100644 index 0000000..cf78b9f --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/do_not_touch.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/places/do_not_touch/materialicons/black/res/drawable/baseline_do_not_touch_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M13,10.17l-2.5,-2.5V2.25C10.5,1.56 11.06,1 11.75,1S13,1.56 13,2.25V10.17zM20,12.75V11V5.25C20,4.56 19.44,4 18.75,4S17.5,4.56 17.5,5.25V11h-1V3.25C16.5,2.56 15.94,2 15.25,2S14,2.56 14,3.25v7.92l6,6V12.75zM9.5,4.25C9.5,3.56 8.94,3 8.25,3c-0.67,0 -1.2,0.53 -1.24,1.18L9.5,6.67V4.25zM13,10.17l-2.5,-2.5V2.25C10.5,1.56 11.06,1 11.75,1S13,1.56 13,2.25V10.17zM20,12.75V11V5.25C20,4.56 19.44,4 18.75,4S17.5,4.56 17.5,5.25V11h-1V3.25C16.5,2.56 15.94,2 15.25,2S14,2.56 14,3.25v7.92l6,6V12.75zM9.5,4.25C9.5,3.56 8.94,3 8.25,3c-0.67,0 -1.2,0.53 -1.24,1.18L9.5,6.67V4.25zM21.19,21.19L2.81,2.81L1.39,4.22l5.63,5.63L7,9.83v4.3c-1.11,-0.64 -2.58,-1.47 -2.6,-1.48c-0.17,-0.09 -0.34,-0.14 -0.54,-0.14c-0.26,0 -0.5,0.09 -0.7,0.26C3.12,12.78 2,13.88 2,13.88l6.8,7.18c0.57,0.6 1.35,0.94 2.18,0.94H17c0.62,0 1.18,-0.19 1.65,-0.52l-0.02,-0.02l1.15,1.15L21.19,21.19z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/dock.xml b/qqq/android/mobileapp/src/main/res/drawable/dock.xml new file mode 100644 index 0000000..8f9e723 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/dock.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/hardware/dock/materialicons/black/res/drawable/baseline_dock_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M8,23h8v-2L8,21v2zM16,1.01L8,1c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h8c1.1,0 2,-0.9 2,-2L18,3c0,-1.1 -0.9,-1.99 -2,-1.99zM16,15L8,15L8,5h8v10z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/document_scanner.xml b/qqq/android/mobileapp/src/main/res/drawable/document_scanner.xml new file mode 100644 index 0000000..0c06122 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/document_scanner.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/communication/document_scanner/materialicons/black/res/drawable/baseline_document_scanner_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M7,3H4v3H2V1h5V3zM22,6V1h-5v2h3v3H22zM7,21H4v-3H2v5h5V21zM20,18v3h-3v2h5v-5H20zM19,18c0,1.1 -0.9,2 -2,2H7c-1.1,0 -2,-0.9 -2,-2V6c0,-1.1 0.9,-2 2,-2h10c1.1,0 2,0.9 2,2V18zM15,8H9v2h6V8zM15,11H9v2h6V11zM15,14H9v2h6V14z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/domain.xml b/qqq/android/mobileapp/src/main/res/drawable/domain.xml new file mode 100644 index 0000000..4b30a37 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/domain.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/domain/materialicons/black/res/drawable/baseline_domain_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,7V3H2v18h20V7H12zM6,19H4v-2h2V19zM6,15H4v-2h2V15zM6,11H4V9h2V11zM6,7H4V5h2V7zM10,19H8v-2h2V19zM10,15H8v-2h2V15zM10,11H8V9h2V11zM10,7H8V5h2V7zM20,19h-8v-2h2v-2h-2v-2h2v-2h-2V9h8V19zM18,11h-2v2h2V11zM18,15h-2v2h2V15z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/domain_add.xml b/qqq/android/mobileapp/src/main/res/drawable/domain_add.xml new file mode 100644 index 0000000..2d2c81b --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/domain_add.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/domain_add/materialicons/black/res/drawable/baseline_domain_add_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,7V3H2v18h14v-2h-4v-2h2v-2h-2v-2h2v-2h-2V9h8v6h2V7H12zM6,19H4v-2h2V19zM6,15H4v-2h2V15zM6,11H4V9h2V11zM6,7H4V5h2V7zM10,19H8v-2h2V19zM10,15H8v-2h2V15zM10,11H8V9h2V11zM10,7H8V5h2V7zM24,19v2h-2v2h-2v-2h-2v-2h2v-2h2v2H24zM18,11h-2v2h2V11zM18,15h-2v2h2V15z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/domain_disabled.xml b/qqq/android/mobileapp/src/main/res/drawable/domain_disabled.xml new file mode 100644 index 0000000..661722e --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/domain_disabled.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/communication/domain_disabled/materialicons/black/res/drawable/baseline_domain_disabled_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M8,5h2v2h-0.9L12,9.9L12,9h8v8.9l2,2L22,7L12,7L12,3L5.1,3L8,5.9zM16,11h2v2h-2zM1.3,1.8L0.1,3.1 2,5v16h16l3,3 1.3,-1.3 -21,-20.9zM6,19L4,19v-2h2v2zM6,15L4,15v-2h2v2zM6,11L4,11L4,9h2v2zM10,19L8,19v-2h2v2zM10,15L8,15v-2h2v2zM12,19v-2h2l2,2h-4z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/domain_verification.xml b/qqq/android/mobileapp/src/main/res/drawable/domain_verification.xml new file mode 100644 index 0000000..0546d3f --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/domain_verification.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/communication/domain_verification/materialicons/black/res/drawable/baseline_domain_verification_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M16.6,10.88l-1.42,-1.42l-4.24,4.25l-2.12,-2.13l-1.42,1.42l3.54,3.54z" /> + <path + android:fillColor="#FF000000" + android:pathData="M19,4H5C3.89,4 3,4.9 3,6v12c0,1.1 0.89,2 2,2h14c1.1,0 2,-0.9 2,-2V6C21,4.9 20.11,4 19,4zM19,18H5V8h14V18z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/done.xml b/qqq/android/mobileapp/src/main/res/drawable/done.xml new file mode 100644 index 0000000..c7834f9 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/done.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/done/materialicons/black/res/drawable/baseline_done_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M9,16.2L4.8,12l-1.4,1.4L9,19 21,7l-1.4,-1.4L9,16.2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/done_all.xml b/qqq/android/mobileapp/src/main/res/drawable/done_all.xml new file mode 100644 index 0000000..b72d878 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/done_all.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/done_all/materialicons/black/res/drawable/baseline_done_all_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M18,7l-1.41,-1.41 -6.34,6.34 1.41,1.41L18,7zM22.24,5.59L11.66,16.17 7.48,12l-1.41,1.41L11.66,19l12,-12 -1.42,-1.41zM0.41,13.41L6,19l1.41,-1.41L1.83,12 0.41,13.41z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/done_outline.xml b/qqq/android/mobileapp/src/main/res/drawable/done_outline.xml new file mode 100644 index 0000000..72b6084 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/done_outline.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/done_outline/materialicons/black/res/drawable/baseline_done_outline_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19.77,5.03l1.4,1.4L8.43,19.17l-5.6,-5.6 1.4,-1.4 4.2,4.2L19.77,5.03m0,-2.83L8.43,13.54l-4.2,-4.2L0,13.57 8.43,22 24,6.43 19.77,2.2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/donut_large.xml b/qqq/android/mobileapp/src/main/res/drawable/donut_large.xml new file mode 100644 index 0000000..94da972 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/donut_large.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/donut_large/materialicons/black/res/drawable/baseline_donut_large_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M11,5.08V2C6,2.5 2,6.81 2,12s4,9.5 9,10v-3.08c-3,-0.48 -6,-3.4 -6,-6.92S8,5.56 11,5.08zM18.97,11H22c-0.47,-5 -4,-8.53 -9,-9v3.08C16,5.51 18.54,8 18.97,11zM13,18.92V22c5,-0.47 8.53,-4 9,-9h-3.03C18.54,16 16,18.49 13,18.92z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/donut_small.xml b/qqq/android/mobileapp/src/main/res/drawable/donut_small.xml new file mode 100644 index 0000000..a8119c2 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/donut_small.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/donut_small/materialicons/black/res/drawable/baseline_donut_small_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M11,9.16V2c-5,0.5 -9,4.79 -9,10s4,9.5 9,10v-7.16c-1,-0.41 -2,-1.52 -2,-2.84s1,-2.43 2,-2.84zM14.86,11H22c-0.48,-4.75 -4,-8.53 -9,-9v7.16c1,0.3 1.52,0.98 1.86,1.84zM13,14.84V22c5,-0.47 8.52,-4.25 9,-9h-7.14c-0.34,0.86 -0.86,1.54 -1.86,1.84z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/door_back.xml b/qqq/android/mobileapp/src/main/res/drawable/door_back.xml new file mode 100644 index 0000000..c6cc5a5 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/door_back.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/search/door_back/materialicons/black/res/drawable/baseline_door_back_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19,19V5c0,-1.1 -0.9,-2 -2,-2H7C5.9,3 5,3.9 5,5v14H3v2h18v-2H19zM11,13H9v-2h2V13z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/door_front.xml b/qqq/android/mobileapp/src/main/res/drawable/door_front.xml new file mode 100644 index 0000000..5a4a5e4 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/door_front.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/search/door_front/materialicons/black/res/drawable/baseline_door_front_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19,19V5c0,-1.1 -0.9,-2 -2,-2H7C5.9,3 5,3.9 5,5v14H3v2h18v-2H19zM15,13h-2v-2h2V13z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/door_sliding.xml b/qqq/android/mobileapp/src/main/res/drawable/door_sliding.xml new file mode 100644 index 0000000..12b3ba5 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/door_sliding.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/search/door_sliding/materialicons/black/res/drawable/baseline_door_sliding_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,19V5c0,-1.1 -0.9,-2 -2,-2h-5.25v16h-1.5V3H6C4.9,3 4,3.9 4,5v14H3v2h18v-2H20zM10,13H8v-2h2V13zM16,13h-2v-2h2V13z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/doorbell.xml b/qqq/android/mobileapp/src/main/res/drawable/doorbell.xml new file mode 100644 index 0000000..6dad1b7 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/doorbell.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/search/doorbell/materialicons/black/res/drawable/baseline_doorbell_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,3L4,9v12h16V9L12,3zM12,17.5c-0.55,0 -1,-0.45 -1,-1h2C13,17.05 12.55,17.5 12,17.5zM16,16H8v-1h1v-2.34c0,-1.54 0.82,-2.82 2.25,-3.16V9.25c0,-0.41 0.34,-0.75 0.75,-0.75s0.75,0.34 0.75,0.75V9.5C14.19,9.84 15,11.12 15,12.66V15h1V16z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/double_arrow.xml b/qqq/android/mobileapp/src/main/res/drawable/double_arrow.xml new file mode 100644 index 0000000..938f54c --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/double_arrow.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/navigation/double_arrow/materialicons/black/res/drawable/baseline_double_arrow_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M15.5,5l-4.5,0l5,7l-5,7l4.5,0l5,-7z" /> + <path + android:fillColor="#FF000000" + android:pathData="M8.5,5l-4.5,0l5,7l-5,7l4.5,0l5,-7z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/downhill_skiing.xml b/qqq/android/mobileapp/src/main/res/drawable/downhill_skiing.xml new file mode 100644 index 0000000..6a7a403 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/downhill_skiing.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/downhill_skiing/materialicons/black/res/drawable/baseline_downhill_skiing_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M18.5,4.5c0,1.1 -0.9,2 -2,2s-2,-0.9 -2,-2s0.9,-2 2,-2S18.5,3.4 18.5,4.5zM15.78,20.9l0.76,0.27c0.62,0.21 1.27,0.33 1.96,0.33c0.84,0 1.65,-0.18 2.38,-0.5L22,22.13C20.95,22.68 19.76,23 18.5,23c-0.86,0 -1.68,-0.14 -2.45,-0.41L2,17.47l0.5,-1.41l6.9,2.51l1.72,-4.44L7.55,10.4C6.66,9.46 6.88,7.93 8,7.28l3.48,-2.01c1.1,-0.64 2.52,-0.1 2.91,1.11l0.33,1.08c0.44,1.42 1.48,2.57 2.83,3.14L18.07,9l1.43,0.46l-1.12,3.45c-2.45,-0.4 -4.48,-2.07 -5.38,-4.32l-2.53,1.45l3.03,3.46l-2.22,5.76l3.09,1.12l2.1,-6.44h0l0,0c0.46,0.18 0.94,0.31 1.44,0.41L15.78,20.9z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/download.xml b/qqq/android/mobileapp/src/main/res/drawable/download.xml new file mode 100644 index 0000000..1311d8d --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/download.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/file/download/materialicons/black/res/drawable/baseline_download_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M5,20h14v-2H5V20zM19,9h-4V3H9v6H5l7,7L19,9z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/download_done.xml b/qqq/android/mobileapp/src/main/res/drawable/download_done.xml new file mode 100644 index 0000000..c167e37 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/download_done.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/file/download_done/materialicons/black/res/drawable/baseline_download_done_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20.13,5.41l-1.41,-1.41l-9.19,9.19l-4.25,-4.24l-1.41,1.41l5.66,5.66z" /> + <path + android:fillColor="#FF000000" + android:pathData="M5,18h14v2h-14z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/download_for_offline.xml b/qqq/android/mobileapp/src/main/res/drawable/download_for_offline.xml new file mode 100644 index 0000000..d432ae2 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/download_for_offline.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/file/download_for_offline/materialicons/black/res/drawable/baseline_download_for_offline_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,2C6.49,2 2,6.49 2,12s4.49,10 10,10s10,-4.49 10,-10S17.51,2 12,2zM11,10V6h2v4h3l-4,4l-4,-4H11zM17,17H7v-2h10V17z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/downloading.xml b/qqq/android/mobileapp/src/main/res/drawable/downloading.xml new file mode 100644 index 0000000..e7bce0b --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/downloading.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/file/downloading/materialicons/black/res/drawable/baseline_downloading_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M18.32,4.26C16.84,3.05 15.01,2.25 13,2.05v2.02c1.46,0.18 2.79,0.76 3.9,1.62L18.32,4.26zM19.93,11h2.02c-0.2,-2.01 -1,-3.84 -2.21,-5.32L18.31,7.1C19.17,8.21 19.75,9.54 19.93,11zM18.31,16.9l1.43,1.43c1.21,-1.48 2.01,-3.32 2.21,-5.32h-2.02C19.75,14.46 19.17,15.79 18.31,16.9zM13,19.93v2.02c2.01,-0.2 3.84,-1 5.32,-2.21l-1.43,-1.43C15.79,19.17 14.46,19.75 13,19.93zM13,12V7h-2v5H7l5,5l5,-5H13zM11,19.93v2.02c-5.05,-0.5 -9,-4.76 -9,-9.95s3.95,-9.45 9,-9.95v2.02C7.05,4.56 4,7.92 4,12S7.05,19.44 11,19.93z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/drafts.xml b/qqq/android/mobileapp/src/main/res/drawable/drafts.xml new file mode 100644 index 0000000..13a09ae --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/drafts.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/content/drafts/materialicons/black/res/drawable/baseline_drafts_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M21.99,8c0,-0.72 -0.37,-1.35 -0.94,-1.7L12,1 2.95,6.3C2.38,6.65 2,7.28 2,8v10c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2l-0.01,-10zM12,13L3.74,7.84 12,3l8.26,4.84L12,13z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/drag_handle.xml b/qqq/android/mobileapp/src/main/res/drawable/drag_handle.xml new file mode 100644 index 0000000..9650c71 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/drag_handle.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/editor/drag_handle/materialicons/black/res/drawable/baseline_drag_handle_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,9H4v2h16V9zM4,15h16v-2H4V15z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/drag_indicator.xml b/qqq/android/mobileapp/src/main/res/drawable/drag_indicator.xml new file mode 100644 index 0000000..5a44a9e --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/drag_indicator.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/drag_indicator/materialicons/black/res/drawable/baseline_drag_indicator_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M11,18c0,1.1 -0.9,2 -2,2s-2,-0.9 -2,-2 0.9,-2 2,-2 2,0.9 2,2zM9,10c-1.1,0 -2,0.9 -2,2s0.9,2 2,2 2,-0.9 2,-2 -0.9,-2 -2,-2zM9,4c-1.1,0 -2,0.9 -2,2s0.9,2 2,2 2,-0.9 2,-2 -0.9,-2 -2,-2zM15,8c1.1,0 2,-0.9 2,-2s-0.9,-2 -2,-2 -2,0.9 -2,2 0.9,2 2,2zM15,10c-1.1,0 -2,0.9 -2,2s0.9,2 2,2 2,-0.9 2,-2 -0.9,-2 -2,-2zM15,16c-1.1,0 -2,0.9 -2,2s0.9,2 2,2 2,-0.9 2,-2 -0.9,-2 -2,-2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/draw.xml b/qqq/android/mobileapp/src/main/res/drawable/draw.xml new file mode 100644 index 0000000..695efc0 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/draw.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/editor/draw/materialicons/black/res/drawable/baseline_draw_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M18.85,10.39l1.06,-1.06c0.78,-0.78 0.78,-2.05 0,-2.83L18.5,5.09c-0.78,-0.78 -2.05,-0.78 -2.83,0l-1.06,1.06L18.85,10.39zM13.19,7.56L4,16.76V21h4.24l9.19,-9.19L13.19,7.56zM19,17.5c0,2.19 -2.54,3.5 -5,3.5c-0.55,0 -1,-0.45 -1,-1s0.45,-1 1,-1c1.54,0 3,-0.73 3,-1.5c0,-0.47 -0.48,-0.87 -1.23,-1.2l1.48,-1.48C18.32,15.45 19,16.29 19,17.5zM4.58,13.35C3.61,12.79 3,12.06 3,11c0,-1.8 1.89,-2.63 3.56,-3.36C7.59,7.18 9,6.56 9,6c0,-0.41 -0.78,-1 -2,-1C5.74,5 5.2,5.61 5.17,5.64C4.82,6.05 4.19,6.1 3.77,5.76C3.36,5.42 3.28,4.81 3.62,4.38C3.73,4.24 4.76,3 7,3c2.24,0 4,1.32 4,3c0,1.87 -1.93,2.72 -3.64,3.47C6.42,9.88 5,10.5 5,11c0,0.31 0.43,0.6 1.07,0.86L4.58,13.35z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/drive_eta.xml b/qqq/android/mobileapp/src/main/res/drawable/drive_eta.xml new file mode 100644 index 0000000..6db7f52 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/drive_eta.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/notification/drive_eta/materialicons/black/res/drawable/baseline_drive_eta_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M18.92,5.01C18.72,4.42 18.16,4 17.5,4h-11c-0.66,0 -1.21,0.42 -1.42,1.01L3,11v8c0,0.55 0.45,1 1,1h1c0.55,0 1,-0.45 1,-1v-1h12v1c0,0.55 0.45,1 1,1h1c0.55,0 1,-0.45 1,-1v-8l-2.08,-5.99zM6.5,15c-0.83,0 -1.5,-0.67 -1.5,-1.5S5.67,12 6.5,12s1.5,0.67 1.5,1.5S7.33,15 6.5,15zM17.5,15c-0.83,0 -1.5,-0.67 -1.5,-1.5s0.67,-1.5 1.5,-1.5 1.5,0.67 1.5,1.5 -0.67,1.5 -1.5,1.5zM5,10l1.5,-4.5h11L19,10L5,10z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/drive_file_move.xml b/qqq/android/mobileapp/src/main/res/drawable/drive_file_move.xml new file mode 100644 index 0000000..f4ff51e --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/drive_file_move.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/file/drive_file_move/materialicons/black/res/drawable/baseline_drive_file_move_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,6h-8l-2,-2L4,4c-1.1,0 -2,0.9 -2,2v12c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2L22,8c0,-1.1 -0.9,-2 -2,-2zM14,18v-3h-4v-4h4L14,8l5,5 -5,5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/drive_file_move_outline.xml b/qqq/android/mobileapp/src/main/res/drawable/drive_file_move_outline.xml new file mode 100644 index 0000000..c7e586c --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/drive_file_move_outline.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/file/drive_file_move_outline/materialicons/black/res/drawable/baseline_drive_file_move_outline_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,6h-8l-2,-2L4,4c-1.1,0 -1.99,0.9 -1.99,2L2,18c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2L22,8c0,-1.1 -0.9,-2 -2,-2zM20,18L4,18L4,8h16v10zM11.99,9l-1.41,1.41L12.16,12L8,12v2h4.16l-1.59,1.59L11.99,17 16,13.01 11.99,9z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/drive_file_move_rtl.xml b/qqq/android/mobileapp/src/main/res/drawable/drive_file_move_rtl.xml new file mode 100644 index 0000000..b641621 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/drive_file_move_rtl.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/file/drive_file_move_rtl/materialicons/black/res/drawable/baseline_drive_file_move_rtl_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,6h-8l-2,-2H4C2.9,4 2,4.9 2,6v12c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2V8C22,6.9 21.1,6 20,6zM12,17l-4,-4l4,-4v3h4v2h-4V17z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/drive_file_rename_outline.xml b/qqq/android/mobileapp/src/main/res/drawable/drive_file_rename_outline.xml new file mode 100644 index 0000000..97ae8f8 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/drive_file_rename_outline.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/file/drive_file_rename_outline/materialicons/black/res/drawable/baseline_drive_file_rename_outline_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M18.41,5.8L17.2,4.59c-0.78,-0.78 -2.05,-0.78 -2.83,0l-2.68,2.68L3,15.96V20h4.04l8.74,-8.74 2.63,-2.63c0.79,-0.78 0.79,-2.05 0,-2.83zM6.21,18H5v-1.21l8.66,-8.66 1.21,1.21L6.21,18zM11,20l4,-4h6v4H11z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/drive_folder_upload.xml b/qqq/android/mobileapp/src/main/res/drawable/drive_folder_upload.xml new file mode 100644 index 0000000..fa85d6c --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/drive_folder_upload.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/file/drive_folder_upload/materialicons/black/res/drawable/baseline_drive_folder_upload_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,6h-8l-2,-2L4,4c-1.1,0 -1.99,0.9 -1.99,2L2,18c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2L22,8c0,-1.1 -0.9,-2 -2,-2zM20,18L4,18L4,8h16v10zM8,13.01l1.41,1.41L11,12.84L11,17h2v-4.16l1.59,1.59L16,13.01 12.01,9 8,13.01z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/dry.xml b/qqq/android/mobileapp/src/main/res/drawable/dry.xml new file mode 100644 index 0000000..428ebd3 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/dry.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/places/dry/materialicons/black/res/drawable/baseline_dry_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M15.65,4.86l-0.07,-0.07c-0.57,-0.62 -0.82,-1.41 -0.67,-2.2L15,2h-1.89l-0.06,0.43c-0.2,1.36 0.27,2.71 1.3,3.72l0.07,0.06c0.57,0.62 0.82,1.41 0.67,2.2L14.98,9h1.91l0.06,-0.43C17.16,7.21 16.68,5.86 15.65,4.86zM19.65,4.86l-0.07,-0.07c-0.57,-0.62 -0.82,-1.41 -0.67,-2.2L19,2h-1.89l-0.06,0.43c-0.2,1.36 0.27,2.71 1.3,3.72l0.07,0.06c0.57,0.62 0.82,1.41 0.67,2.2L18.98,9h1.91l0.06,-0.43C21.16,7.21 20.68,5.86 19.65,4.86zM9.12,5l-7.18,6.79C1.34,12.35 1,13.14 1,13.97V20c0,1.66 1.34,3 3,3h6.25H12h5.75c0.69,0 1.25,-0.56 1.25,-1.25s-0.56,-1.25 -1.25,-1.25H12v-1h7.75c0.69,0 1.25,-0.56 1.25,-1.25S20.44,17 19.75,17H12v-1h8.75c0.69,0 1.25,-0.56 1.25,-1.25s-0.56,-1.25 -1.25,-1.25H12v-1h6.75c0.69,0 1.25,-0.56 1.25,-1.25S19.44,10 18.75,10H8.86c0.64,-1.11 1.48,-2.58 1.49,-2.61c0.09,-0.16 0.14,-0.33 0.14,-0.53c0,-0.26 -0.09,-0.5 -0.26,-0.7C10.22,6.12 9.12,5 9.12,5L9.12,5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/dry_cleaning.xml b/qqq/android/mobileapp/src/main/res/drawable/dry_cleaning.xml new file mode 100644 index 0000000..c12b049 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/dry_cleaning.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/dry_cleaning/materialicons/black/res/drawable/baseline_dry_cleaning_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19.56,11.36L13,8.44V7c0,-0.55 -0.45,-1 -1,-1l0,0c-0.55,0 -1,-0.45 -1,-1s0.45,-1 1,-1s1,0.45 1,1h2c0,-1.84 -1.66,-3.3 -3.56,-2.95C10.26,2.27 9.29,3.22 9.06,4.4C8.76,5.96 9.66,7.34 11,7.82v0.63l-6.56,2.92C3.56,11.75 3,12.62 3,13.57v0.01C3,14.92 4.08,16 5.42,16H7v6h10v-6h1.58c1.34,0 2.42,-1.08 2.42,-2.42v-0.01C21,12.62 20.44,11.75 19.56,11.36zM18.58,14H17v-1H7v1H5.42C5.19,14 5,13.81 5,13.57c0,-0.17 0.1,-0.32 0.25,-0.38l6.75,-3l6.75,3C18.9,13.26 19,13.41 19,13.58C19,13.81 18.81,14 18.58,14z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/duo.xml b/qqq/android/mobileapp/src/main/res/drawable/duo.xml new file mode 100644 index 0000000..9d20ddf --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/duo.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/communication/duo/materialicons/black/res/drawable/baseline_duo_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,2h-8C6.38,2 2,6.66 2,12.28 2,17.5 6.49,22 11.72,22 17.39,22 22,17.62 22,12L22,4c0,-1.1 -0.9,-2 -2,-2zM17,15l-3,-2v2L7,15L7,9h7v2l3,-2v6z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/dvr.xml b/qqq/android/mobileapp/src/main/res/drawable/dvr.xml new file mode 100644 index 0000000..35cac3a --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/dvr.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/dvr/materialicons/black/res/drawable/baseline_dvr_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M21,3L3,3c-1.1,0 -2,0.9 -2,2v12c0,1.1 0.9,2 2,2h5v2h8v-2h5c1.1,0 1.99,-0.9 1.99,-2L23,5c0,-1.1 -0.9,-2 -2,-2zM21,17L3,17L3,5h18v12zM19,8L8,8v2h11L19,8zM19,12L8,12v2h11v-2zM7,8L5,8v2h2L7,8zM7,12L5,12v2h2v-2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/dynamic_feed.xml b/qqq/android/mobileapp/src/main/res/drawable/dynamic_feed.xml new file mode 100644 index 0000000..48649d9 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/dynamic_feed.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/content/dynamic_feed/materialicons/black/res/drawable/baseline_dynamic_feed_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M8,8H6v7c0,1.1 0.9,2 2,2h9v-2H8V8z" /> + <path + android:fillColor="#FF000000" + android:pathData="M20,3h-8c-1.1,0 -2,0.9 -2,2v6c0,1.1 0.9,2 2,2h8c1.1,0 2,-0.9 2,-2V5C22,3.9 21.1,3 20,3zM20,11h-8V7h8V11z" /> + <path + android:fillColor="#FF000000" + android:pathData="M4,12H2v7c0,1.1 0.9,2 2,2h9v-2H4V12z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/dynamic_form.xml b/qqq/android/mobileapp/src/main/res/drawable/dynamic_form.xml new file mode 100644 index 0000000..d316619 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/dynamic_form.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/dynamic_form/materialicons/black/res/drawable/baseline_dynamic_form_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M17,20v-9h-2V4h7l-2,5h2L17,20zM15,13v7H4c-1.1,0 -2,-0.9 -2,-2v-3c0,-1.1 0.9,-2 2,-2H15zM6.25,15.75h-1.5v1.5h1.5V15.75zM13,4v7H4c-1.1,0 -2,-0.9 -2,-2V6c0,-1.1 0.9,-2 2,-2H13zM6.25,6.75h-1.5v1.5h1.5V6.75z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/e_mobiledata.xml b/qqq/android/mobileapp/src/main/res/drawable/e_mobiledata.xml new file mode 100644 index 0000000..197c76f --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/e_mobiledata.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/e_mobiledata/materialicons/black/res/drawable/baseline_e_mobiledata_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M16,9V7H8v10h8v-2h-6v-2h6v-2h-6V9H16z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/earbuds.xml b/qqq/android/mobileapp/src/main/res/drawable/earbuds.xml new file mode 100644 index 0000000..f0c670d --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/earbuds.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/hardware/earbuds/materialicons/black/res/drawable/baseline_earbuds_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M6.2,3.01C4.44,2.89 3,4.42 3,6.19L3,16c0,2.76 2.24,5 5,5h0c2.76,0 5,-2.24 5,-5V8c0,-1.66 1.34,-3 3,-3h0c1.66,0 3,1.34 3,3v7l-0.83,0c-1.61,0 -3.06,1.18 -3.17,2.79c-0.12,1.69 1.16,3.1 2.8,3.21c1.76,0.12 3.2,-1.42 3.2,-3.18L21,8c0,-2.76 -2.24,-5 -5,-5h0c-2.76,0 -5,2.24 -5,5v8c0,1.66 -1.34,3 -3,3l0,0c-1.66,0 -3,-1.34 -3,-3V9l0.83,0C7.44,9 8.89,7.82 9,6.21C9.11,4.53 7.83,3.11 6.2,3.01z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/earbuds_battery.xml b/qqq/android/mobileapp/src/main/res/drawable/earbuds_battery.xml new file mode 100644 index 0000000..8fe8746 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/earbuds_battery.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/hardware/earbuds_battery/materialicons/black/res/drawable/baseline_earbuds_battery_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M21,7h-1V6h-2v1h-1c-0.55,0 -1,0.45 -1,1v9c0,0.55 0.45,1 1,1h4c0.55,0 1,-0.45 1,-1V8C22,7.45 21.55,7 21,7z" /> + <path + android:fillColor="#FF000000" + android:pathData="M10.62,6C8.76,6 7.25,7.51 7.25,9.38v5.25c0,1.04 -0.84,1.88 -1.88,1.88S3.5,15.66 3.5,14.62v-4.7C3.66,9.97 3.83,10 4,10c1.1,0 2,-0.9 2,-2S5.1,6 4,6S2,6.9 2,8c0,0.04 0,6.62 0,6.62C2,16.49 3.51,18 5.38,18s3.38,-1.51 3.38,-3.38V9.38c0,-1.04 0.84,-1.88 1.88,-1.88s1.88,0.84 1.88,1.88v4.7C12.34,14.03 12.17,14 12,14c-1.1,0 -2,0.9 -2,2s0.9,2 2,2s2,-0.9 2,-2c0,-0.04 0,-6.62 0,-6.62C14,7.51 12.49,6 10.62,6z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/east.xml b/qqq/android/mobileapp/src/main/res/drawable/east.xml new file mode 100644 index 0000000..614b086 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/east.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/navigation/east/materialicons/black/res/drawable/baseline_east_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M15,5l-1.41,1.41L18.17,11H2V13h16.17l-4.59,4.59L15,19l7,-7L15,5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/eco.xml b/qqq/android/mobileapp/src/main/res/drawable/eco.xml new file mode 100644 index 0000000..a61908c --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/eco.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/eco/materialicons/black/res/drawable/baseline_eco_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M6.05,8.05c-2.73,2.73 -2.73,7.15 -0.02,9.88c1.47,-3.4 4.09,-6.24 7.36,-7.93c-2.77,2.34 -4.71,5.61 -5.39,9.32c2.6,1.23 5.8,0.78 7.95,-1.37C19.43,14.47 20,4 20,4S9.53,4.57 6.05,8.05z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/edgesensor_high.xml b/qqq/android/mobileapp/src/main/res/drawable/edgesensor_high.xml new file mode 100644 index 0000000..d13395a --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/edgesensor_high.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/edgesensor_high/materialicons/black/res/drawable/baseline_edgesensor_high_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M3,7h2v7H3V7zM0,10h2v7H0V10zM22,7h2v7h-2V7zM19,10h2v7h-2V10zM16,2.01L8,2C6.9,2 6,2.9 6,4v16c0,1.1 0.9,2 2,2h8c1.1,0 2,-0.9 2,-2V4C18,2.9 17.1,2.01 16,2.01zM16,17H8V7h8V17z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/edgesensor_low.xml b/qqq/android/mobileapp/src/main/res/drawable/edgesensor_low.xml new file mode 100644 index 0000000..e435a08 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/edgesensor_low.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/edgesensor_low/materialicons/black/res/drawable/baseline_edgesensor_low_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M2,7h2v7H2V7zM20,10h2v7h-2V10zM16,2.01L8,2C6.9,2 6,2.9 6,4v16c0,1.1 0.9,2 2,2h8c1.1,0 2,-0.9 2,-2V4C18,2.9 17.1,2.01 16,2.01zM16,17H8V7h8V17z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/edit.xml b/qqq/android/mobileapp/src/main/res/drawable/edit.xml new file mode 100644 index 0000000..21675db --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/edit.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/edit/materialicons/black/res/drawable/baseline_edit_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M3,17.25V21h3.75L17.81,9.94l-3.75,-3.75L3,17.25zM20.71,7.04c0.39,-0.39 0.39,-1.02 0,-1.41l-2.34,-2.34c-0.39,-0.39 -1.02,-0.39 -1.41,0l-1.83,1.83 3.75,3.75 1.83,-1.83z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/edit_attributes.xml b/qqq/android/mobileapp/src/main/res/drawable/edit_attributes.xml new file mode 100644 index 0000000..fdd9963 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/edit_attributes.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/edit_attributes/materialicons/black/res/drawable/baseline_edit_attributes_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M17.63,7H6.37C3.96,7 2,9.24 2,12s1.96,5 4.37,5h11.26c2.41,0 4.37,-2.24 4.37,-5s-1.96,-5 -4.37,-5zM7.24,14.46l-2.57,-2.57 0.7,-0.7 1.87,1.87 3.52,-3.52 0.7,0.7 -4.22,4.22z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/edit_calendar.xml b/qqq/android/mobileapp/src/main/res/drawable/edit_calendar.xml new file mode 100644 index 0000000..c5ad5c6 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/edit_calendar.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/edit_calendar/materialicons/black/res/drawable/baseline_edit_calendar_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,22H5c-1.11,0 -2,-0.9 -2,-2L3.01,6c0,-1.1 0.88,-2 1.99,-2h1V2h2v2h8V2h2v2h1c1.1,0 2,0.9 2,2v6h-2v-2H5v10h7V22zM22.13,16.99l0.71,-0.71c0.39,-0.39 0.39,-1.02 0,-1.41l-0.71,-0.71c-0.39,-0.39 -1.02,-0.39 -1.41,0l-0.71,0.71L22.13,16.99zM21.42,17.7l-5.3,5.3H14v-2.12l5.3,-5.3L21.42,17.7z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/edit_document.xml b/qqq/android/mobileapp/src/main/res/drawable/edit_document.xml new file mode 100644 index 0000000..6d3e7ec --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/edit_document.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/edit_document/materialicons/black/res/drawable/baseline_edit_document_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M14,19.88l0,2.12l2.12,0l5.17,-5.17l-2.12,-2.12z" /> + <path + android:fillColor="#FF000000" + android:pathData="M20,8l-6,-6H6C4.9,2 4.01,2.9 4.01,4L4,20c0,1.1 0.89,2 1.99,2H12v-2.95l8,-8V8zM13,9V3.5L18.5,9H13z" /> + <path + android:fillColor="#FF000000" + android:pathData="M22.71,14L22,13.29c-0.39,-0.39 -1.02,-0.39 -1.41,0L19.88,14L22,16.12l0.71,-0.71C23.1,15.02 23.1,14.39 22.71,14z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/edit_location.xml b/qqq/android/mobileapp/src/main/res/drawable/edit_location.xml new file mode 100644 index 0000000..9dca56c --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/edit_location.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/edit_location/materialicons/black/res/drawable/baseline_edit_location_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,2C8.14,2 5,5.14 5,9c0,5.25 7,13 7,13s7,-7.75 7,-13c0,-3.86 -3.14,-7 -7,-7zM10.44,12L9,12v-1.44l3.35,-3.34 1.43,1.43L10.44,12zM14.89,7.55l-0.7,0.7 -1.44,-1.44 0.7,-0.7c0.15,-0.15 0.39,-0.15 0.54,0l0.9,0.9c0.15,0.15 0.15,0.39 0,0.54z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/edit_location_alt.xml b/qqq/android/mobileapp/src/main/res/drawable/edit_location_alt.xml new file mode 100644 index 0000000..eeb0068 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/edit_location_alt.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/edit_location_alt/materialicons/black/res/drawable/baseline_edit_location_alt_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M13.95,13H9V8.05l5.61,-5.61C13.78,2.16 12.9,2 12,2c-4.2,0 -8,3.22 -8,8.2c0,3.32 2.67,7.25 8,11.8c5.33,-4.55 8,-8.48 8,-11.8c0,-1.01 -0.16,-1.94 -0.45,-2.8L13.95,13z" /> + <path + android:fillColor="#FF000000" + android:pathData="M11,11l2.12,0l6.16,-6.16l-2.12,-2.12l-6.16,6.16z" /> + <path + android:fillColor="#FF000000" + android:pathData="M20.71,2L20,1.29C19.8,1.1 19.55,1 19.29,1c-0.13,0 -0.48,0.07 -0.71,0.29l-0.72,0.72l2.12,2.12l0.72,-0.72C21.1,3.02 21.1,2.39 20.71,2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/edit_note.xml b/qqq/android/mobileapp/src/main/res/drawable/edit_note.xml new file mode 100644 index 0000000..2051c57 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/edit_note.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/editor/edit_note/materialicons/black/res/drawable/baseline_edit_note_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M3,10h11v2H3V10zM3,8h11V6H3V8zM3,16h7v-2H3V16zM18.01,12.87l0.71,-0.71c0.39,-0.39 1.02,-0.39 1.41,0l0.71,0.71c0.39,0.39 0.39,1.02 0,1.41l-0.71,0.71L18.01,12.87zM17.3,13.58l-5.3,5.3V21h2.12l5.3,-5.3L17.3,13.58z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/edit_notifications.xml b/qqq/android/mobileapp/src/main/res/drawable/edit_notifications.xml new file mode 100644 index 0000000..fe4b281 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/edit_notifications.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/edit_notifications/materialicons/black/res/drawable/baseline_edit_notifications_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M17.58,6.25l1.77,1.77L14.37,13H12.6v-1.77L17.58,6.25zM20.85,5.81l-1.06,-1.06c-0.2,-0.2 -0.51,-0.2 -0.71,0l-0.85,0.85l1.77,1.77l0.85,-0.85C21.05,6.32 21.05,6 20.85,5.81zM18,12.2V17h2v2H4v-2h2v-7c0,-2.79 1.91,-5.14 4.5,-5.8V3.5C10.5,2.67 11.17,2 12,2s1.5,0.67 1.5,1.5v0.7c0.82,0.21 1.57,0.59 2.21,1.09L10.6,10.4V15h4.6L18,12.2zM10,20h4c0,1.1 -0.9,2 -2,2S10,21.1 10,20z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/edit_off.xml b/qqq/android/mobileapp/src/main/res/drawable/edit_off.xml new file mode 100644 index 0000000..fa89483 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/edit_off.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/edit_off/materialicons/black/res/drawable/baseline_edit_off_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12.126,8.125l1.937,-1.937 3.747,3.747 -1.937,1.938zM20.71,5.63l-2.34,-2.34a1,1 0,0 0,-1.41 0l-1.83,1.83 3.75,3.75L20.71,7a1,1 0,0 0,0 -1.37zM2,5l6.63,6.63L3,17.25V21h3.75l5.63,-5.62L18,21l2,-2L4,3 2,5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/edit_road.xml b/qqq/android/mobileapp/src/main/res/drawable/edit_road.xml new file mode 100644 index 0000000..72c1ae4 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/edit_road.xml @@ -0,0 +1,34 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/edit_road/materialicons/black/res/drawable/baseline_edit_road_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M18,4l-2,0l0,7.9l2,-2z" /> + <path + android:fillColor="#FF000000" + android:pathData="M4,4h2v16h-2z" /> + <path + android:fillColor="#FF000000" + android:pathData="M10,4h2v4h-2z" /> + <path + android:fillColor="#FF000000" + android:pathData="M10,10h2v4h-2z" /> + <path + android:fillColor="#FF000000" + android:pathData="M10,16h2v4h-2z" /> + <path + android:fillColor="#FF000000" + android:pathData="M22.56,12.59l-1.15,-1.15c-0.59,-0.59 -1.54,-0.59 -2.12,0L14,16.73V20h3.27l5.29,-5.29C23.15,14.12 23.15,13.17 22.56,12.59zM16.58,18.45h-1.03v-1.03L19,13.97L20.03,15L16.58,18.45z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/edit_square.xml b/qqq/android/mobileapp/src/main/res/drawable/edit_square.xml new file mode 100644 index 0000000..05a38b0 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/edit_square.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/edit_square/materialicons/black/res/drawable/baseline_edit_square_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M7,17V9.93L13.93,3l0,0H5C3.9,3 3,3.9 3,5v14c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2v-8.93L14.07,17H7z" /> + <path + android:fillColor="#FF000000" + android:pathData="M9,15l4.24,0l7.2,-7.2l-4.24,-4.24l-7.2,7.2z" /> + <path + android:fillColor="#FF000000" + android:pathData="M22.91,2.49l-1.41,-1.41c-0.78,-0.78 -2.05,-0.78 -2.83,0l-1.06,1.06l4.24,4.24l1.06,-1.06C23.7,4.54 23.7,3.27 22.91,2.49z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/egg.xml b/qqq/android/mobileapp/src/main/res/drawable/egg.xml new file mode 100644 index 0000000..b88894b --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/egg.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/egg/materialicons/black/res/drawable/baseline_egg_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,3C8.5,3 5,9.33 5,14c0,3.87 3.13,7 7,7s7,-3.13 7,-7C19,9.33 15.5,3 12,3zM13,18c-3,0 -5,-1.99 -5,-5c0,-0.55 0.45,-1 1,-1s1,0.45 1,1c0,2.92 2.42,3 3,3c0.55,0 1,0.45 1,1S13.55,18 13,18z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/egg_alt.xml b/qqq/android/mobileapp/src/main/res/drawable/egg_alt.xml new file mode 100644 index 0000000..9bf66ce --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/egg_alt.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/egg_alt/materialicons/black/res/drawable/baseline_egg_alt_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19,9C17,7 15.99,2 9.97,2C4.95,2 1.94,6 2,11.52C2.06,17.04 6.96,19 9.97,19c2.01,0 2.01,3 6.02,3C19,22 22,19 22,15.02C22,12 21.01,11 19,9zM12,15.5c-1.93,0 -3.5,-1.57 -3.5,-3.5s1.57,-3.5 3.5,-3.5s3.5,1.57 3.5,3.5S13.93,15.5 12,15.5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/eject.xml b/qqq/android/mobileapp/src/main/res/drawable/eject.xml new file mode 100644 index 0000000..9dc3b58 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/eject.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/eject/materialicons/black/res/drawable/baseline_eject_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M5,17h14v2L5,19zM12,5L5.33,15h13.34z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/elderly.xml b/qqq/android/mobileapp/src/main/res/drawable/elderly.xml new file mode 100644 index 0000000..ccd23dd --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/elderly.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/elderly/materialicons/black/res/drawable/baseline_elderly_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M13.5,5.5c1.1,0 2,-0.9 2,-2s-0.9,-2 -2,-2s-2,0.9 -2,2S12.4,5.5 13.5,5.5zM20,12.5V23h-1V12.5c0,-0.28 -0.22,-0.5 -0.5,-0.5S18,12.22 18,12.5v1h-1v-0.69c-1.46,-0.38 -2.7,-1.29 -3.51,-2.52C13.18,11.16 13,12.07 13,13c0,0.23 0.02,0.46 0.03,0.69L15,16.5V23h-2v-5l-1.78,-2.54L11,19l-3,4l-1.6,-1.2L9,18.33V13c0,-1.15 0.18,-2.29 0.5,-3.39L8,10.46V14H6V9.3l5.4,-3.07l0,0.01c0.59,-0.31 1.32,-0.33 1.94,0.03c0.36,0.21 0.63,0.51 0.8,0.85l0,0l0.79,1.67C15.58,10.1 16.94,11 18.5,11C19.33,11 20,11.67 20,12.5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/elderly_woman.xml b/qqq/android/mobileapp/src/main/res/drawable/elderly_woman.xml new file mode 100644 index 0000000..2d70d2e --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/elderly_woman.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/elderly_woman/materialicons/black/res/drawable/baseline_elderly_woman_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M18.5,11c-1.56,0 -2.92,-0.9 -3.58,-2.21l-0.79,-1.67l0,0C14.12,7.1 13.63,6 12.34,6l0,0C8.72,6 6,16.69 6,19h2.5l-2.1,2.8L8,23l3,-4h2v4h2v-4.03L13,13l0.49,-2.71c0.81,1.23 2.05,2.14 3.51,2.52v0.69h1v-1c0,-0.28 0.22,-0.5 0.5,-0.5s0.5,0.22 0.5,0.5V23h1V12.5C20,11.67 19.33,11 18.5,11z" /> + <path + android:fillColor="#FF000000" + android:pathData="M11.6,2.91c-0.06,0.19 -0.1,0.38 -0.1,0.59c0,1.1 0.9,2 2,2s2,-0.9 2,-2c0,-1.1 -0.9,-2 -2,-2c-0.21,0 -0.4,0.04 -0.59,0.1C12.76,1.25 12.41,1 12,1c-0.55,0 -1,0.45 -1,1C11,2.41 11.25,2.76 11.6,2.91z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/electric_bike.xml b/qqq/android/mobileapp/src/main/res/drawable/electric_bike.xml new file mode 100644 index 0000000..26bc4c7 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/electric_bike.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/electric_bike/materialicons/black/res/drawable/baseline_electric_bike_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19,7h-0.82l-1.7,-4.68C16.19,1.53 15.44,1 14.6,1H12v2h2.6l1.46,4h-4.81l-0.36,-1H12V4H7v2h1.75l1.82,5H9.9C9.46,8.77 7.59,7.12 5.25,7.01C2.45,6.87 0,9.2 0,12c0,2.8 2.2,5 5,5c2.46,0 4.45,-1.69 4.9,-4h4.2c0.44,2.23 2.31,3.88 4.65,3.99c2.8,0.13 5.25,-2.19 5.25,-5C24,9.2 21.8,7 19,7zM7.82,13c-0.4,1.17 -1.49,2 -2.82,2c-1.68,0 -3,-1.32 -3,-3s1.32,-3 3,-3c1.33,0 2.42,0.83 2.82,2H5v2H7.82zM14.1,11h-1.4l-0.73,-2H15C14.56,9.58 14.24,10.25 14.1,11zM19,15c-1.68,0 -3,-1.32 -3,-3c0,-0.93 0.41,-1.73 1.05,-2.28l0.96,2.64l1.88,-0.68l-0.97,-2.67C18.94,9.01 18.97,9 19,9c1.68,0 3,1.32 3,3S20.68,15 19,15z" /> + <path + android:fillColor="#FF000000" + android:pathData="M11,20l-4,0l6,3l0,-2l4,0l-6,-3z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/electric_bolt.xml b/qqq/android/mobileapp/src/main/res/drawable/electric_bolt.xml new file mode 100644 index 0000000..275e217 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/electric_bolt.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/home/electric_bolt/materialicons/black/res/drawable/baseline_electric_bolt_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M14.69,2.21L4.33,11.49c-0.64,0.58 -0.28,1.65 0.58,1.73L13,14l-4.85,6.76c-0.22,0.31 -0.19,0.74 0.08,1.01h0c0.3,0.3 0.77,0.31 1.08,0.02l10.36,-9.28c0.64,-0.58 0.28,-1.65 -0.58,-1.73L11,10l4.85,-6.76c0.22,-0.31 0.19,-0.74 -0.08,-1.01l0,0C15.47,1.93 15,1.92 14.69,2.21z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/electric_car.xml b/qqq/android/mobileapp/src/main/res/drawable/electric_car.xml new file mode 100644 index 0000000..f6242dc --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/electric_car.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/electric_car/materialicons/black/res/drawable/baseline_electric_car_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M18.92,2.01C18.72,1.42 18.16,1 17.5,1h-11C5.84,1 5.29,1.42 5.08,2.01L3,8v8c0,0.55 0.45,1 1,1h1c0.55,0 1,-0.45 1,-1v-1h12v1c0,0.55 0.45,1 1,1h1c0.55,0 1,-0.45 1,-1V8L18.92,2.01zM6.5,12C5.67,12 5,11.33 5,10.5S5.67,9 6.5,9S8,9.67 8,10.5S7.33,12 6.5,12zM17.5,12c-0.83,0 -1.5,-0.67 -1.5,-1.5S16.67,9 17.5,9S19,9.67 19,10.5S18.33,12 17.5,12zM5,7l1.5,-4.5h11L19,7H5z" /> + <path + android:fillColor="#FF000000" + android:pathData="M7,20l4,0l0,-2l6,3l-4,0l0,2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/electric_meter.xml b/qqq/android/mobileapp/src/main/res/drawable/electric_meter.xml new file mode 100644 index 0000000..1046bf0 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/electric_meter.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/home/electric_meter/materialicons/black/res/drawable/baseline_electric_meter_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,2c-4.96,0 -9,4.04 -9,9c0,3.91 2.51,7.24 6,8.47V22h2v-2.06c0.33,0.04 0.66,0.06 1,0.06s0.67,-0.02 1,-0.06V22h2v-2.53c3.49,-1.24 6,-4.57 6,-8.47C21,6.04 16.96,2 12,2zM14.25,14l-3,3l-1.5,-1.5L11,14.25L9.75,13l3,-3l1.5,1.5L13,12.75L14.25,14zM16,9H8V7h8V9z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/electric_moped.xml b/qqq/android/mobileapp/src/main/res/drawable/electric_moped.xml new file mode 100644 index 0000000..667dcac --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/electric_moped.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/electric_moped/materialicons/black/res/drawable/baseline_electric_moped_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19,5c0,-1.1 -0.9,-2 -2,-2h-3v2h3v2.65L13.52,12H10V7H6c-2.21,0 -4,1.79 -4,4v3h2c0,1.66 1.34,3 3,3s3,-1.34 3,-3h4.48L19,8.35V5zM7,15c-0.55,0 -1,-0.45 -1,-1h2C8,14.55 7.55,15 7,15z" /> + <path + android:fillColor="#FF000000" + android:pathData="M5,4h5v2h-5z" /> + <path + android:fillColor="#FF000000" + android:pathData="M19,11c-1.66,0 -3,1.34 -3,3s1.34,3 3,3s3,-1.34 3,-3S20.66,11 19,11zM19,15c-0.55,0 -1,-0.45 -1,-1s0.45,-1 1,-1s1,0.45 1,1S19.55,15 19,15z" /> + <path + android:fillColor="#FF000000" + android:pathData="M7,20l4,0l0,-2l6,3l-4,0l0,2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/electric_rickshaw.xml b/qqq/android/mobileapp/src/main/res/drawable/electric_rickshaw.xml new file mode 100644 index 0000000..0e6e247 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/electric_rickshaw.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/electric_rickshaw/materialicons/black/res/drawable/baseline_electric_rickshaw_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M21,11.18V9.72c0,-0.47 -0.16,-0.92 -0.46,-1.28L16.6,3.72C16.22,3.26 15.66,3 15.06,3H3C1.9,3 1,3.9 1,5v8c0,1.1 0.9,2 2,2h0.18C3.6,16.16 4.7,17 6,17s2.4,-0.84 2.82,-2h8.37c0.41,1.16 1.51,2 2.82,2c1.66,0 3,-1.34 3,-3C23,12.7 22.16,11.6 21,11.18zM18.4,9H16V6.12L18.4,9zM3,5h4v4H3V5zM6,15c-0.55,0 -1,-0.45 -1,-1s0.45,-1 1,-1s1,0.45 1,1S6.55,15 6,15zM9,13v-2h3V9H9V5h5v8H9zM20,15c-0.55,0 -1,-0.45 -1,-1s0.45,-1 1,-1s1,0.45 1,1S20.55,15 20,15z" /> + <path + android:fillColor="#FF000000" + android:pathData="M7,20l4,0l0,-2l6,3l-4,0l0,2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/electric_scooter.xml b/qqq/android/mobileapp/src/main/res/drawable/electric_scooter.xml new file mode 100644 index 0000000..9d05577 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/electric_scooter.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/electric_scooter/materialicons/black/res/drawable/baseline_electric_scooter_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M7.82,16H15v-1c0,-2.21 1.79,-4 4,-4h0.74l-1.9,-8.44C17.63,1.65 16.82,1 15.89,1H12v2h3.89l1.4,6.25c0,0 -0.01,0 -0.01,0c-2.16,0.65 -3.81,2.48 -4.19,4.75H7.82c-0.48,-1.34 -1.86,-2.24 -3.42,-1.94c-1.18,0.23 -2.13,1.2 -2.35,2.38C1.7,16.34 3.16,18 5,18C6.3,18 7.4,17.16 7.82,16zM5,16c-0.55,0 -1,-0.45 -1,-1s0.45,-1 1,-1s1,0.45 1,1S5.55,16 5,16z" /> + <path + android:fillColor="#FF000000" + android:pathData="M19,12c-1.66,0 -3,1.34 -3,3s1.34,3 3,3s3,-1.34 3,-3S20.66,12 19,12zM19,16c-0.55,0 -1,-0.45 -1,-1s0.45,-1 1,-1s1,0.45 1,1S19.55,16 19,16z" /> + <path + android:fillColor="#FF000000" + android:pathData="M11,20l-4,0l6,3l0,-2l4,0l-6,-3z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/electrical_services.xml b/qqq/android/mobileapp/src/main/res/drawable/electrical_services.xml new file mode 100644 index 0000000..5e4574a --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/electrical_services.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/electrical_services/materialicons/black/res/drawable/baseline_electrical_services_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M21,14c0,-0.55 -0.45,-1 -1,-1h-2v2h2C20.55,15 21,14.55 21,14z" /> + <path + android:fillColor="#FF000000" + android:pathData="M20,17h-2v2h2c0.55,0 1,-0.45 1,-1C21,17.45 20.55,17 20,17z" /> + <path + android:fillColor="#FF000000" + android:pathData="M12,14h-2v4h2c0,1.1 0.9,2 2,2h3v-8h-3C12.9,12 12,12.9 12,14z" /> + <path + android:fillColor="#FF000000" + android:pathData="M5,13c0,-1.1 0.9,-2 2,-2h1.5c1.93,0 3.5,-1.57 3.5,-3.5S10.43,4 8.5,4H5C4.45,4 4,4.45 4,5c0,0.55 0.45,1 1,1h3.5C9.33,6 10,6.67 10,7.5S9.33,9 8.5,9H7c-2.21,0 -4,1.79 -4,4c0,2.21 1.79,4 4,4h2v-2H7C5.9,15 5,14.1 5,13z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/elevator.xml b/qqq/android/mobileapp/src/main/res/drawable/elevator.xml new file mode 100644 index 0000000..60d0b11 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/elevator.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/places/elevator/materialicons/black/res/drawable/baseline_elevator_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19,3H5C3.9,3 3,3.9 3,5v14c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2V5C21,3.9 20.1,3 19,3zM8.5,6c0.69,0 1.25,0.56 1.25,1.25c0,0.69 -0.56,1.25 -1.25,1.25S7.25,7.94 7.25,7.25C7.25,6.56 7.81,6 8.5,6zM11,14h-1v4H7v-4H6v-2.5c0,-1.1 0.9,-2 2,-2h1c1.1,0 2,0.9 2,2V14zM15.5,17L13,13h5L15.5,17zM13,11l2.5,-4l2.5,4H13z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/email.xml b/qqq/android/mobileapp/src/main/res/drawable/email.xml new file mode 100644 index 0000000..749a6c8 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/email.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/communication/email/materialicons/black/res/drawable/baseline_email_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,4L4,4c-1.1,0 -1.99,0.9 -1.99,2L2,18c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2L22,6c0,-1.1 -0.9,-2 -2,-2zM20,8l-8,5 -8,-5L4,6l8,5 8,-5v2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/emergency.xml b/qqq/android/mobileapp/src/main/res/drawable/emergency.xml new file mode 100644 index 0000000..4bf77ef --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/emergency.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/emergency/materialicons/black/res/drawable/baseline_emergency_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20.79,9.23l-2,-3.46l-4.79,2.77l0,-5.54l-4,0l0,5.54l-4.79,-2.77l-2,3.46l4.79,2.77l-4.79,2.77l2,3.46l4.79,-2.77l0,5.54l4,0l0,-5.54l4.79,2.77l2,-3.46l-4.79,-2.77z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/emergency_recording.xml b/qqq/android/mobileapp/src/main/res/drawable/emergency_recording.xml new file mode 100644 index 0000000..863102e --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/emergency_recording.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/emergency_recording/materialicons/black/res/drawable/baseline_emergency_recording_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M18,10.48V6c0,-1.1 -0.9,-2 -2,-2H4C2.9,4 2,4.9 2,6v12c0,1.1 0.9,2 2,2h12c1.1,0 2,-0.9 2,-2v-4.48l4,3.98v-11L18,10.48zM12,12l3,1.73l-1,1.73l-3,-1.73V17H9v-3.27l-3,1.73l-1,-1.73L8,12l-3,-1.73l1,-1.73l3,1.73V7h2v3.27l3,-1.73l1,1.73L12,12z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/emergency_share.xml b/qqq/android/mobileapp/src/main/res/drawable/emergency_share.xml new file mode 100644 index 0000000..c3f893a --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/emergency_share.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/emergency_share/materialicons/black/res/drawable/baseline_emergency_share_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,9c-3.15,0 -6,2.41 -6,6.15c0,2.49 2,5.44 6,8.85c4,-3.41 6,-6.36 6,-8.85C18,11.41 15.15,9 12,9zM12,16.5c-0.83,0 -1.5,-0.67 -1.5,-1.5s0.67,-1.5 1.5,-1.5s1.5,0.67 1.5,1.5S12.83,16.5 12,16.5zM12,4c1.93,0 3.68,0.78 4.95,2.05l-1.41,1.41C14.63,6.56 13.38,6 12,6S9.37,6.56 8.46,7.46L7.05,6.05C8.32,4.78 10.07,4 12,4zM19.78,3.23l-1.41,1.41C16.74,3.01 14.49,2 12.01,2S7.27,3.01 5.64,4.63L4.22,3.22C6.22,1.23 8.97,0 12.01,0S17.79,1.23 19.78,3.23z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/emoji_emotions.xml b/qqq/android/mobileapp/src/main/res/drawable/emoji_emotions.xml new file mode 100644 index 0000000..39c1413 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/emoji_emotions.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/emoji_emotions/materialicons/black/res/drawable/baseline_emoji_emotions_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M11.99,2C6.47,2 2,6.48 2,12c0,5.52 4.47,10 9.99,10C17.52,22 22,17.52 22,12C22,6.48 17.52,2 11.99,2zM8.5,8C9.33,8 10,8.67 10,9.5S9.33,11 8.5,11S7,10.33 7,9.5S7.67,8 8.5,8zM12,18c-2.28,0 -4.22,-1.66 -5,-4h10C16.22,16.34 14.28,18 12,18zM15.5,11c-0.83,0 -1.5,-0.67 -1.5,-1.5S14.67,8 15.5,8S17,8.67 17,9.5S16.33,11 15.5,11z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/emoji_events.xml b/qqq/android/mobileapp/src/main/res/drawable/emoji_events.xml new file mode 100644 index 0000000..8a0c799 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/emoji_events.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/emoji_events/materialicons/black/res/drawable/baseline_emoji_events_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19,5h-2V3H7v2H5C3.9,5 3,5.9 3,7v1c0,2.55 1.92,4.63 4.39,4.94c0.63,1.5 1.98,2.63 3.61,2.96V19H7v2h10v-2h-4v-3.1c1.63,-0.33 2.98,-1.46 3.61,-2.96C19.08,12.63 21,10.55 21,8V7C21,5.9 20.1,5 19,5zM5,8V7h2v3.82C5.84,10.4 5,9.3 5,8zM19,8c0,1.3 -0.84,2.4 -2,2.82V7h2V8z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/emoji_flags.xml b/qqq/android/mobileapp/src/main/res/drawable/emoji_flags.xml new file mode 100644 index 0000000..a6e1ae5 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/emoji_flags.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/emoji_flags/materialicons/black/res/drawable/baseline_emoji_flags_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M14,9l-1,-2H7V5.72C7.6,5.38 8,4.74 8,4c0,-1.1 -0.9,-2 -2,-2S4,2.9 4,4c0,0.74 0.4,1.38 1,1.72V21h2v-4h5l1,2h7V9H14zM18,17h-4l-1,-2H7V9h5l1,2h5V17z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/emoji_food_beverage.xml b/qqq/android/mobileapp/src/main/res/drawable/emoji_food_beverage.xml new file mode 100644 index 0000000..e45fe3d --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/emoji_food_beverage.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/emoji_food_beverage/materialicons/black/res/drawable/baseline_emoji_food_beverage_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,3H9v2.4l1.81,1.45C10.93,6.94 11,7.09 11,7.24v4.26c0,0.28 -0.22,0.5 -0.5,0.5h-4C6.22,12 6,11.78 6,11.5V7.24c0,-0.15 0.07,-0.3 0.19,-0.39L8,5.4V3H4v10c0,2.21 1.79,4 4,4h6c2.21,0 4,-1.79 4,-4v-3h2c1.11,0 2,-0.9 2,-2V5C22,3.89 21.11,3 20,3zM20,8h-2V5h2V8z" /> + <path + android:fillColor="#FF000000" + android:pathData="M4,19h16v2h-16z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/emoji_nature.xml b/qqq/android/mobileapp/src/main/res/drawable/emoji_nature.xml new file mode 100644 index 0000000..e1d34dd --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/emoji_nature.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/emoji_nature/materialicons/black/res/drawable/baseline_emoji_nature_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M21.94,4.88C21.76,4.35 21.25,4 20.68,4c-0.03,0 -0.06,0 -0.09,0H19.6l-0.31,-0.97C19.15,2.43 18.61,2 18,2h0c-0.61,0 -1.15,0.43 -1.29,1.04L16.4,4h-0.98c-0.03,0 -0.06,0 -0.09,0c-0.57,0 -1.08,0.35 -1.26,0.88c-0.19,0.56 0.04,1.17 0.56,1.48l0.87,0.52L15.1,8.12c-0.23,0.58 -0.04,1.25 0.45,1.62C15.78,9.91 16.06,10 16.33,10c0.31,0 0.61,-0.11 0.86,-0.32L18,8.98l0.81,0.7C19.06,9.89 19.36,10 19.67,10c0.27,0 0.55,-0.09 0.78,-0.26c0.5,-0.37 0.68,-1.04 0.45,-1.62l-0.39,-1.24l0.87,-0.52C21.89,6.05 22.12,5.44 21.94,4.88zM18,7c-0.55,0 -1,-0.45 -1,-1c0,-0.55 0.45,-1 1,-1s1,0.45 1,1C19,6.55 18.55,7 18,7z" /> + <path + android:fillColor="#FF000000" + android:pathData="M13.49,10.51c-0.43,-0.43 -0.94,-0.73 -1.49,-0.93V8h-1v1.38c-0.11,-0.01 -0.23,-0.03 -0.34,-0.03c-1.02,0 -2.05,0.39 -2.83,1.17c-0.16,0.16 -0.3,0.34 -0.43,0.53L6,10.52c-1.56,-0.55 -3.28,0.27 -3.83,1.82c0,0 0,0 0,0c-0.27,0.75 -0.23,1.57 0.12,2.29c0.23,0.48 0.58,0.87 1,1.16c-0.38,1.35 -0.06,2.85 1,3.91c1.06,1.06 2.57,1.38 3.91,1c0.29,0.42 0.68,0.77 1.16,1C9.78,21.9 10.21,22 10.65,22c0.34,0 0.68,-0.06 1.01,-0.17c0,0 0,0 0,0c1.56,-0.55 2.38,-2.27 1.82,-3.85l-0.52,-1.37c0.18,-0.13 0.36,-0.27 0.53,-0.43c0.87,-0.87 1.24,-2.04 1.14,-3.17H16v-1h-1.59C14.22,11.46 13.92,10.95 13.49,10.51zM4.67,14.29c-0.25,-0.09 -0.45,-0.27 -0.57,-0.51s-0.13,-0.51 -0.04,-0.76c0.19,-0.52 0.76,-0.79 1.26,-0.61l3.16,1.19C7.33,14.2 5.85,14.71 4.67,14.29zM10.99,19.94c-0.25,0.09 -0.52,0.08 -0.76,-0.04c-0.24,-0.11 -0.42,-0.32 -0.51,-0.57c-0.42,-1.18 0.09,-2.65 0.7,-3.8l1.18,3.13C11.78,19.18 11.51,19.76 10.99,19.94zM12.2,14.6l-0.61,-1.61c0,-0.01 -0.01,-0.02 -0.02,-0.03c-0.02,-0.04 -0.04,-0.08 -0.06,-0.12c-0.02,-0.04 -0.04,-0.07 -0.07,-0.11c-0.03,-0.03 -0.06,-0.06 -0.09,-0.09c-0.03,-0.03 -0.06,-0.06 -0.09,-0.09c-0.03,-0.03 -0.07,-0.05 -0.11,-0.07c-0.04,-0.02 -0.07,-0.05 -0.12,-0.06c-0.01,0 -0.02,-0.01 -0.03,-0.02L9.4,11.8c0.36,-0.29 0.79,-0.46 1.26,-0.46c0.53,0 1.04,0.21 1.41,0.59C12.8,12.66 12.84,13.81 12.2,14.6z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/emoji_objects.xml b/qqq/android/mobileapp/src/main/res/drawable/emoji_objects.xml new file mode 100644 index 0000000..bdc6e58 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/emoji_objects.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/emoji_objects/materialicons/black/res/drawable/baseline_emoji_objects_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,3c-0.46,0 -0.93,0.04 -1.4,0.14C7.84,3.67 5.64,5.9 5.12,8.66c-0.48,2.61 0.48,5.01 2.22,6.56C7.77,15.6 8,16.13 8,16.69V19c0,1.1 0.9,2 2,2h0.28c0.35,0.6 0.98,1 1.72,1s1.38,-0.4 1.72,-1H14c1.1,0 2,-0.9 2,-2v-2.31c0,-0.55 0.22,-1.09 0.64,-1.46C18.09,13.95 19,12.08 19,10C19,6.13 15.87,3 12,3zM14,19h-4v-1h4V19zM14,17h-4v-1h4V17zM12.5,11.41V14h-1v-2.59L9.67,9.59l0.71,-0.71L12,10.5l1.62,-1.62l0.71,0.71L12.5,11.41z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/emoji_people.xml b/qqq/android/mobileapp/src/main/res/drawable/emoji_people.xml new file mode 100644 index 0000000..4af51f3 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/emoji_people.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/emoji_people/materialicons/black/res/drawable/baseline_emoji_people_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,4m-2,0a2,2 0,1 1,4 0a2,2 0,1 1,-4 0" /> + <path + android:fillColor="#FF000000" + android:pathData="M15.89,8.11C15.5,7.72 14.83,7 13.53,7c-0.21,0 -1.42,0 -2.54,0C8.24,6.99 6,4.75 6,2H4c0,3.16 2.11,5.84 5,6.71V22h2v-6h2v6h2V10.05L18.95,14l1.41,-1.41L15.89,8.11z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/emoji_symbols.xml b/qqq/android/mobileapp/src/main/res/drawable/emoji_symbols.xml new file mode 100644 index 0000000..5eeac76 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/emoji_symbols.xml @@ -0,0 +1,37 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/emoji_symbols/materialicons/black/res/drawable/baseline_emoji_symbols_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M3,2h8v2h-8z" /> + <path + android:fillColor="#FF000000" + android:pathData="M6,11l2,0l0,-4l3,0l0,-2l-8,0l0,2l3,0z" /> + <path + android:fillColor="#FF000000" + android:pathData="M12.4036,20.1819l7.7781,-7.7781l1.4142,1.4142l-7.7781,7.7781z" /> + <path + android:fillColor="#FF000000" + android:pathData="M14.5,14.5m-1.5,0a1.5,1.5 0,1 1,3 0a1.5,1.5 0,1 1,-3 0" /> + <path + android:fillColor="#FF000000" + android:pathData="M19.5,19.5m-1.5,0a1.5,1.5 0,1 1,3 0a1.5,1.5 0,1 1,-3 0" /> + <path + android:fillColor="#FF000000" + android:pathData="M15.5,11c1.38,0 2.5,-1.12 2.5,-2.5V4h3V2h-4v4.51C16.58,6.19 16.07,6 15.5,6C14.12,6 13,7.12 13,8.5C13,9.88 14.12,11 15.5,11z" /> + <path + android:fillColor="#FF000000" + android:pathData="M9.74,15.96l-1.41,1.41l-0.71,-0.71l0.35,-0.35c0.98,-0.98 0.98,-2.56 0,-3.54c-0.49,-0.49 -1.13,-0.73 -1.77,-0.73c-0.64,0 -1.28,0.24 -1.77,0.73c-0.98,0.98 -0.98,2.56 0,3.54l0.35,0.35l-1.06,1.06c-0.98,0.98 -0.98,2.56 0,3.54C4.22,21.76 4.86,22 5.5,22s1.28,-0.24 1.77,-0.73l1.06,-1.06l1.41,1.41l1.41,-1.41l-1.41,-1.41l1.41,-1.41L9.74,15.96zM5.85,14.2c0.12,-0.12 0.26,-0.15 0.35,-0.15s0.23,0.03 0.35,0.15c0.19,0.2 0.19,0.51 0,0.71l-0.35,0.35L5.85,14.9C5.66,14.71 5.66,14.39 5.85,14.2zM5.85,19.85C5.73,19.97 5.59,20 5.5,20s-0.23,-0.03 -0.35,-0.15c-0.19,-0.19 -0.19,-0.51 0,-0.71l1.06,-1.06l0.71,0.71L5.85,19.85z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/emoji_transportation.xml b/qqq/android/mobileapp/src/main/res/drawable/emoji_transportation.xml new file mode 100644 index 0000000..649d2b5 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/emoji_transportation.xml @@ -0,0 +1,34 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/emoji_transportation/materialicons/black/res/drawable/baseline_emoji_transportation_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20.57,10.66C20.43,10.26 20.05,10 19.6,10h-7.19c-0.46,0 -0.83,0.26 -0.98,0.66L10,14.77l0.01,5.51c0,0.38 0.31,0.72 0.69,0.72h0.62C11.7,21 12,20.62 12,20.24V19h8v1.24c0,0.38 0.31,0.76 0.69,0.76h0.61c0.38,0 0.69,-0.34 0.69,-0.72L22,18.91v-4.14L20.57,10.66zM12.41,11h7.19l1.03,3h-9.25L12.41,11zM12,17c-0.55,0 -1,-0.45 -1,-1s0.45,-1 1,-1s1,0.45 1,1S12.55,17 12,17zM20,17c-0.55,0 -1,-0.45 -1,-1s0.45,-1 1,-1s1,0.45 1,1S20.55,17 20,17z" /> + <path + android:fillColor="#FF000000" + android:pathData="M14,9l1,0l0,-6l-8,0l0,5l-5,0l0,13l1,0l0,-12l5,0l0,-5l6,0z" /> + <path + android:fillColor="#FF000000" + android:pathData="M5,11h2v2h-2z" /> + <path + android:fillColor="#FF000000" + android:pathData="M10,5h2v2h-2z" /> + <path + android:fillColor="#FF000000" + android:pathData="M5,15h2v2h-2z" /> + <path + android:fillColor="#FF000000" + android:pathData="M5,19h2v2h-2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/energy_savings_leaf.xml b/qqq/android/mobileapp/src/main/res/drawable/energy_savings_leaf.xml new file mode 100644 index 0000000..b2cc226 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/energy_savings_leaf.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/home/energy_savings_leaf/materialicons/black/res/drawable/baseline_energy_savings_leaf_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,3c-4.8,0 -9,3.86 -9,9c0,2.12 0.74,4.07 1.97,5.61L3,19.59L4.41,21l1.97,-1.97C7.93,20.26 9.88,21 12,21c2.3,0 4.61,-0.88 6.36,-2.64C20.12,16.61 21,14.3 21,12l0,-9L12,3zM15.83,12.26l-5.16,4.63c-0.16,0.15 -0.41,0.14 -0.56,-0.01c-0.14,-0.14 -0.16,-0.36 -0.04,-0.52l2.44,-3.33l-4.05,-0.4c-0.44,-0.04 -0.63,-0.59 -0.3,-0.89l5.16,-4.63c0.16,-0.15 0.41,-0.14 0.56,0.01c0.14,0.14 0.16,0.36 0.04,0.52l-2.44,3.33l4.05,0.4C15.98,11.41 16.16,11.96 15.83,12.26z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/engineering.xml b/qqq/android/mobileapp/src/main/res/drawable/engineering.xml new file mode 100644 index 0000000..00e5073 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/engineering.xml @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/engineering/materialicons/black/res/drawable/baseline_engineering_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M9,15c-2.67,0 -8,1.34 -8,4v2h16v-2C17,16.34 11.67,15 9,15z" /> + <path + android:fillColor="#FF000000" + android:pathData="M22.1,6.84c0.01,-0.11 0.02,-0.22 0.02,-0.34c0,-0.12 -0.01,-0.23 -0.03,-0.34l0.74,-0.58c0.07,-0.05 0.08,-0.15 0.04,-0.22l-0.7,-1.21c-0.04,-0.08 -0.14,-0.1 -0.21,-0.08L21.1,4.42c-0.18,-0.14 -0.38,-0.25 -0.59,-0.34l-0.13,-0.93C20.36,3.06 20.29,3 20.2,3h-1.4c-0.09,0 -0.16,0.06 -0.17,0.15L18.5,4.08c-0.21,0.09 -0.41,0.21 -0.59,0.34l-0.87,-0.35c-0.08,-0.03 -0.17,0 -0.21,0.08l-0.7,1.21c-0.04,0.08 -0.03,0.17 0.04,0.22l0.74,0.58c-0.02,0.11 -0.03,0.23 -0.03,0.34c0,0.11 0.01,0.23 0.03,0.34l-0.74,0.58c-0.07,0.05 -0.08,0.15 -0.04,0.22l0.7,1.21c0.04,0.08 0.14,0.1 0.21,0.08l0.87,-0.35c0.18,0.14 0.38,0.25 0.59,0.34l0.13,0.93C18.64,9.94 18.71,10 18.8,10h1.4c0.09,0 0.16,-0.06 0.17,-0.15l0.13,-0.93c0.21,-0.09 0.41,-0.21 0.59,-0.34l0.87,0.35c0.08,0.03 0.17,0 0.21,-0.08l0.7,-1.21c0.04,-0.08 0.03,-0.17 -0.04,-0.22L22.1,6.84zM19.5,7.75c-0.69,0 -1.25,-0.56 -1.25,-1.25s0.56,-1.25 1.25,-1.25s1.25,0.56 1.25,1.25S20.19,7.75 19.5,7.75z" /> + <path + android:fillColor="#FF000000" + android:pathData="M19.92,11.68l-0.5,-0.87c-0.03,-0.06 -0.1,-0.08 -0.15,-0.06l-0.62,0.25c-0.13,-0.1 -0.27,-0.18 -0.42,-0.24l-0.09,-0.66C18.12,10.04 18.06,10 18,10h-1c-0.06,0 -0.11,0.04 -0.12,0.11l-0.09,0.66c-0.15,0.06 -0.29,0.15 -0.42,0.24l-0.62,-0.25c-0.06,-0.02 -0.12,0 -0.15,0.06l-0.5,0.87c-0.03,0.06 -0.02,0.12 0.03,0.16l0.53,0.41c-0.01,0.08 -0.02,0.16 -0.02,0.24c0,0.08 0.01,0.17 0.02,0.24l-0.53,0.41c-0.05,0.04 -0.06,0.11 -0.03,0.16l0.5,0.87c0.03,0.06 0.1,0.08 0.15,0.06l0.62,-0.25c0.13,0.1 0.27,0.18 0.42,0.24l0.09,0.66C16.89,14.96 16.94,15 17,15h1c0.06,0 0.12,-0.04 0.12,-0.11l0.09,-0.66c0.15,-0.06 0.29,-0.15 0.42,-0.24l0.62,0.25c0.06,0.02 0.12,0 0.15,-0.06l0.5,-0.87c0.03,-0.06 0.02,-0.12 -0.03,-0.16l-0.52,-0.41c0.01,-0.08 0.02,-0.16 0.02,-0.24c0,-0.08 -0.01,-0.17 -0.02,-0.24l0.53,-0.41C19.93,11.81 19.94,11.74 19.92,11.68zM17.5,13.33c-0.46,0 -0.83,-0.38 -0.83,-0.83c0,-0.46 0.38,-0.83 0.83,-0.83s0.83,0.38 0.83,0.83C18.33,12.96 17.96,13.33 17.5,13.33z" /> + <path + android:fillColor="#FF000000" + android:pathData="M4.74,9h8.53c0.27,0 0.49,-0.22 0.49,-0.49V8.49c0,-0.27 -0.22,-0.49 -0.49,-0.49H13c0,-1.48 -0.81,-2.75 -2,-3.45V5.5C11,5.78 10.78,6 10.5,6S10,5.78 10,5.5V4.14C9.68,4.06 9.35,4 9,4S8.32,4.06 8,4.14V5.5C8,5.78 7.78,6 7.5,6S7,5.78 7,5.5V4.55C5.81,5.25 5,6.52 5,8H4.74C4.47,8 4.25,8.22 4.25,8.49v0.03C4.25,8.78 4.47,9 4.74,9z" /> + <path + android:fillColor="#FF000000" + android:pathData="M9,13c1.86,0 3.41,-1.28 3.86,-3H5.14C5.59,11.72 7.14,13 9,13z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/enhanced_encryption.xml b/qqq/android/mobileapp/src/main/res/drawable/enhanced_encryption.xml new file mode 100644 index 0000000..0905b4c --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/enhanced_encryption.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/notification/enhanced_encryption/materialicons/black/res/drawable/baseline_enhanced_encryption_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M18,8h-1V6c0,-2.76 -2.24,-5 -5,-5S7,3.24 7,6v2H6c-1.1,0 -2,0.9 -2,2v10c0,1.1 0.9,2 2,2h12c1.1,0 2,-0.9 2,-2V10c0,-1.1 -0.9,-2 -2,-2zM8.9,6c0,-1.71 1.39,-3.1 3.1,-3.1s3.1,1.39 3.1,3.1v2H8.9V6zM16,16h-3v3h-2v-3H8v-2h3v-3h2v3h3v2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/equalizer.xml b/qqq/android/mobileapp/src/main/res/drawable/equalizer.xml new file mode 100644 index 0000000..f01fc97 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/equalizer.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/av/equalizer/materialicons/black/res/drawable/baseline_equalizer_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M10,20h4L14,4h-4v16zM4,20h4v-8L4,12v8zM16,9v11h4L20,9h-4z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/error.xml b/qqq/android/mobileapp/src/main/res/drawable/error.xml new file mode 100644 index 0000000..5656e22 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/error.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/alert/error/materialicons/black/res/drawable/baseline_error_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM13,17h-2v-2h2v2zM13,13h-2L11,7h2v6z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/error_outline.xml b/qqq/android/mobileapp/src/main/res/drawable/error_outline.xml new file mode 100644 index 0000000..6420009 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/error_outline.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/alert/error_outline/materialicons/black/res/drawable/baseline_error_outline_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M11,15h2v2h-2zM11,7h2v6h-2zM11.99,2C6.47,2 2,6.48 2,12s4.47,10 9.99,10C17.52,22 22,17.52 22,12S17.52,2 11.99,2zM12,20c-4.42,0 -8,-3.58 -8,-8s3.58,-8 8,-8 8,3.58 8,8 -3.58,8 -8,8z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/escalator.xml b/qqq/android/mobileapp/src/main/res/drawable/escalator.xml new file mode 100644 index 0000000..8366995 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/escalator.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/places/escalator/materialicons/black/res/drawable/baseline_escalator_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19,3H5C3.9,3 3,3.9 3,5v14c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2l0,-14C21,3.9 20.1,3 19,3zM17,9h-1.7l-5,9H7c-0.83,0 -1.5,-0.67 -1.5,-1.5S6.17,15 7,15h1.7l5,-9H17c0.83,0 1.5,0.67 1.5,1.5S17.83,9 17,9z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/escalator_warning.xml b/qqq/android/mobileapp/src/main/res/drawable/escalator_warning.xml new file mode 100644 index 0000000..900f266 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/escalator_warning.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/places/escalator_warning/materialicons/black/res/drawable/baseline_escalator_warning_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M6.5,2c1.1,0 2,0.9 2,2s-0.9,2 -2,2s-2,-0.9 -2,-2S5.4,2 6.5,2zM15.5,9.5c0,0.83 0.67,1.5 1.5,1.5s1.5,-0.67 1.5,-1.5S17.83,8 17,8S15.5,8.67 15.5,9.5zM18.5,12h-2.84c-0.58,0.01 -1.14,0.32 -1.45,0.86l-0.92,1.32L9.72,8C9.35,7.37 8.69,7.01 8.01,7H5C3.9,7 3,7.9 3,9v6h1.5v7h5V11.61L12.03,16h2.2L15,14.9V22h4v-5h1v-3.5C20,12.68 19.33,12 18.5,12z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/euro.xml b/qqq/android/mobileapp/src/main/res/drawable/euro.xml new file mode 100644 index 0000000..396efc2 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/euro.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/euro/materialicons/black/res/drawable/baseline_euro_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M15,18.5c-2.51,0 -4.68,-1.42 -5.76,-3.5H15l1,-2H8.58c-0.05,-0.33 -0.08,-0.66 -0.08,-1s0.03,-0.67 0.08,-1H15l1,-2H9.24C10.32,6.92 12.5,5.5 15,5.5c1.61,0 3.09,0.59 4.23,1.57L21,5.3C19.41,3.87 17.3,3 15,3c-3.92,0 -7.24,2.51 -8.48,6H3l-1,2h4.06C6.02,11.33 6,11.66 6,12s0.02,0.67 0.06,1H3l-1,2h4.52c1.24,3.49 4.56,6 8.48,6c2.31,0 4.41,-0.87 6,-2.3l-1.78,-1.77C18.09,17.91 16.62,18.5 15,18.5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/euro_symbol.xml b/qqq/android/mobileapp/src/main/res/drawable/euro_symbol.xml new file mode 100644 index 0000000..1d9d883 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/euro_symbol.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/euro_symbol/materialicons/black/res/drawable/baseline_euro_symbol_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M15,18.5c-2.51,0 -4.68,-1.42 -5.76,-3.5H15v-2H8.58c-0.05,-0.33 -0.08,-0.66 -0.08,-1s0.03,-0.67 0.08,-1H15V9H9.24C10.32,6.92 12.5,5.5 15,5.5c1.61,0 3.09,0.59 4.23,1.57L21,5.3C19.41,3.87 17.3,3 15,3c-3.92,0 -7.24,2.51 -8.48,6H3v2h3.06c-0.04,0.33 -0.06,0.66 -0.06,1 0,0.34 0.02,0.67 0.06,1H3v2h3.52c1.24,3.49 4.56,6 8.48,6 2.31,0 4.41,-0.87 6,-2.3l-1.78,-1.77c-1.13,0.98 -2.6,1.57 -4.22,1.57z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/ev_station.xml b/qqq/android/mobileapp/src/main/res/drawable/ev_station.xml new file mode 100644 index 0000000..2f0f832 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/ev_station.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/ev_station/materialicons/black/res/drawable/baseline_ev_station_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19.77,7.23l0.01,-0.01 -3.72,-3.72L15,4.56l2.11,2.11c-0.94,0.36 -1.61,1.26 -1.61,2.33 0,1.38 1.12,2.5 2.5,2.5 0.36,0 0.69,-0.08 1,-0.21v7.21c0,0.55 -0.45,1 -1,1s-1,-0.45 -1,-1V14c0,-1.1 -0.9,-2 -2,-2h-1V5c0,-1.1 -0.9,-2 -2,-2H6c-1.1,0 -2,0.9 -2,2v16h10v-7.5h1.5v5c0,1.38 1.12,2.5 2.5,2.5s2.5,-1.12 2.5,-2.5V9c0,-0.69 -0.28,-1.32 -0.73,-1.77zM18,10c-0.55,0 -1,-0.45 -1,-1s0.45,-1 1,-1 1,0.45 1,1 -0.45,1 -1,1zM8,18v-4.5H6L10,6v5h2l-4,7z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/event.xml b/qqq/android/mobileapp/src/main/res/drawable/event.xml new file mode 100644 index 0000000..d663b30 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/event.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/event/materialicons/black/res/drawable/baseline_event_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M17,12h-5v5h5v-5zM16,1v2L8,3L8,1L6,1v2L5,3c-1.11,0 -1.99,0.9 -1.99,2L3,19c0,1.1 0.89,2 2,2h14c1.1,0 2,-0.9 2,-2L21,5c0,-1.1 -0.9,-2 -2,-2h-1L18,1h-2zM19,19L5,19L5,8h14v11z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/event_available.xml b/qqq/android/mobileapp/src/main/res/drawable/event_available.xml new file mode 100644 index 0000000..c8d68ec --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/event_available.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/notification/event_available/materialicons/black/res/drawable/baseline_event_available_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M16.53,11.06L15.47,10l-4.88,4.88 -2.12,-2.12 -1.06,1.06L10.59,17l5.94,-5.94zM19,3h-1L18,1h-2v2L8,3L8,1L6,1v2L5,3c-1.11,0 -1.99,0.9 -1.99,2L3,19c0,1.1 0.89,2 2,2h14c1.1,0 2,-0.9 2,-2L21,5c0,-1.1 -0.9,-2 -2,-2zM19,19L5,19L5,8h14v11z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/event_busy.xml b/qqq/android/mobileapp/src/main/res/drawable/event_busy.xml new file mode 100644 index 0000000..67a1b13 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/event_busy.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/notification/event_busy/materialicons/black/res/drawable/baseline_event_busy_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M9.31,17l2.44,-2.44L14.19,17l1.06,-1.06 -2.44,-2.44 2.44,-2.44L14.19,10l-2.44,2.44L9.31,10l-1.06,1.06 2.44,2.44 -2.44,2.44L9.31,17zM19,3h-1L18,1h-2v2L8,3L8,1L6,1v2L5,3c-1.11,0 -1.99,0.9 -1.99,2L3,19c0,1.1 0.89,2 2,2h14c1.1,0 2,-0.9 2,-2L21,5c0,-1.1 -0.9,-2 -2,-2zM19,19L5,19L5,8h14v11z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/event_note.xml b/qqq/android/mobileapp/src/main/res/drawable/event_note.xml new file mode 100644 index 0000000..10a046a --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/event_note.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/notification/event_note/materialicons/black/res/drawable/baseline_event_note_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M17,10L7,10v2h10v-2zM19,3h-1L18,1h-2v2L8,3L8,1L6,1v2L5,3c-1.11,0 -1.99,0.9 -1.99,2L3,19c0,1.1 0.89,2 2,2h14c1.1,0 2,-0.9 2,-2L21,5c0,-1.1 -0.9,-2 -2,-2zM19,19L5,19L5,8h14v11zM14,14L7,14v2h7v-2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/event_repeat.xml b/qqq/android/mobileapp/src/main/res/drawable/event_repeat.xml new file mode 100644 index 0000000..99a0f76 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/event_repeat.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/event_repeat/materialicons/black/res/drawable/baseline_event_repeat_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M21,12V6c0,-1.1 -0.9,-2 -2,-2h-1V2h-2v2H8V2H6v2H5C3.9,4 3,4.9 3,6v14c0,1.1 0.9,2 2,2h7v-2H5V10h14v2H21zM15.64,20c0.43,1.45 1.77,2.5 3.36,2.5c1.93,0 3.5,-1.57 3.5,-3.5s-1.57,-3.5 -3.5,-3.5c-0.95,0 -1.82,0.38 -2.45,1l1.45,0V18h-4v-4h1.5l0,1.43C16.4,14.55 17.64,14 19,14c2.76,0 5,2.24 5,5s-2.24,5 -5,5c-2.42,0 -4.44,-1.72 -4.9,-4L15.64,20z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/event_seat.xml b/qqq/android/mobileapp/src/main/res/drawable/event_seat.xml new file mode 100644 index 0000000..96530aa --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/event_seat.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/event_seat/materialicons/black/res/drawable/baseline_event_seat_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M4,18v3h3v-3h10v3h3v-6H4V18zM19,10h3v3h-3V10zM2,10h3v3H2V10zM17,13H7V5c0,-1.1 0.9,-2 2,-2h6c1.1,0 2,0.9 2,2V13z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/exit_to_app.xml b/qqq/android/mobileapp/src/main/res/drawable/exit_to_app.xml new file mode 100644 index 0000000..fd02628 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/exit_to_app.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/exit_to_app/materialicons/black/res/drawable/baseline_exit_to_app_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M10.09,15.59L11.5,17l5,-5 -5,-5 -1.41,1.41L12.67,11H3v2h9.67l-2.58,2.59zM19,3H5c-1.11,0 -2,0.9 -2,2v4h2V5h14v14H5v-4H3v4c0,1.1 0.89,2 2,2h14c1.1,0 2,-0.9 2,-2V5c0,-1.1 -0.9,-2 -2,-2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/expand.xml b/qqq/android/mobileapp/src/main/res/drawable/expand.xml new file mode 100644 index 0000000..8c4cb70 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/expand.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/expand/materialicons/black/res/drawable/baseline_expand_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M4,20h16v2L4,22zM4,2h16v2L4,4zM13,9h3l-4,-4 -4,4h3v6L8,15l4,4 4,-4h-3z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/expand_circle_down.xml b/qqq/android/mobileapp/src/main/res/drawable/expand_circle_down.xml new file mode 100644 index 0000000..9aa891a --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/expand_circle_down.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/navigation/expand_circle_down/materialicons/black/res/drawable/baseline_expand_circle_down_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,2C6.48,2 2,6.48 2,12c0,5.52 4.48,10 10,10s10,-4.48 10,-10C22,6.48 17.52,2 12,2zM12,15.5L7.5,11l1.42,-1.41L12,12.67l3.08,-3.08L16.5,11L12,15.5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/expand_less.xml b/qqq/android/mobileapp/src/main/res/drawable/expand_less.xml new file mode 100644 index 0000000..203750e --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/expand_less.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/navigation/expand_less/materialicons/black/res/drawable/baseline_expand_less_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,8l-6,6 1.41,1.41L12,10.83l4.59,4.58L18,14z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/expand_more.xml b/qqq/android/mobileapp/src/main/res/drawable/expand_more.xml new file mode 100644 index 0000000..1d8d399 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/expand_more.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/navigation/expand_more/materialicons/black/res/drawable/baseline_expand_more_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M16.59,8.59L12,13.17 7.41,8.59 6,10l6,6 6,-6z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/explicit.xml b/qqq/android/mobileapp/src/main/res/drawable/explicit.xml new file mode 100644 index 0000000..9afa8c0 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/explicit.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/av/explicit/materialicons/black/res/drawable/baseline_explicit_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19,3L5,3c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2L21,5c0,-1.1 -0.9,-2 -2,-2zM15,9h-4v2h4v2h-4v2h4v2L9,17L9,7h6v2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/explore.xml b/qqq/android/mobileapp/src/main/res/drawable/explore.xml new file mode 100644 index 0000000..c5fb598 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/explore.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/explore/materialicons/black/res/drawable/baseline_explore_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,10.9c-0.61,0 -1.1,0.49 -1.1,1.1s0.49,1.1 1.1,1.1c0.61,0 1.1,-0.49 1.1,-1.1s-0.49,-1.1 -1.1,-1.1zM12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM14.19,14.19L6,18l3.81,-8.19L18,6l-3.81,8.19z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/explore_off.xml b/qqq/android/mobileapp/src/main/res/drawable/explore_off.xml new file mode 100644 index 0000000..1f6efe0 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/explore_off.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/explore_off/materialicons/black/res/drawable/baseline_explore_off_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M14.19,14.19l-1.41,-1.41 -1.56,-1.56L11,11 9.81,9.81 4.93,4.93 2.27,2.27 1,3.54l2.78,2.78c-0.11,0.16 -0.21,0.32 -0.31,0.48 -0.04,0.07 -0.09,0.14 -0.13,0.21 -0.09,0.15 -0.17,0.31 -0.25,0.47 -0.05,0.1 -0.1,0.21 -0.16,0.32 -0.06,0.14 -0.13,0.28 -0.19,0.43 -0.1,0.24 -0.19,0.48 -0.27,0.73l-0.09,0.3c-0.05,0.2 -0.1,0.39 -0.14,0.59 -0.02,0.11 -0.04,0.22 -0.07,0.33 -0.04,0.2 -0.07,0.4 -0.09,0.61 -0.01,0.1 -0.03,0.2 -0.03,0.3 -0.03,0.29 -0.05,0.6 -0.05,0.91 0,5.52 4.48,10 10,10 0.31,0 0.62,-0.02 0.92,-0.05l0.3,-0.03c0.2,-0.02 0.41,-0.06 0.61,-0.09 0.11,-0.02 0.22,-0.04 0.33,-0.07 0.2,-0.04 0.39,-0.09 0.58,-0.15 0.1,-0.03 0.2,-0.05 0.3,-0.09 0.25,-0.08 0.49,-0.17 0.73,-0.27 0.15,-0.06 0.29,-0.13 0.43,-0.19 0.11,-0.05 0.22,-0.1 0.33,-0.16 0.16,-0.08 0.31,-0.16 0.46,-0.25 0.07,-0.04 0.14,-0.09 0.21,-0.13 0.16,-0.1 0.32,-0.2 0.48,-0.31L20.46,23l1.27,-1.27 -2.66,-2.66 -4.88,-4.88zM6,18l3,-6.46L12.46,15 6,18zM22,12c0,0.31 -0.02,0.62 -0.05,0.92l-0.03,0.3c-0.02,0.2 -0.06,0.41 -0.09,0.61 -0.02,0.11 -0.04,0.22 -0.07,0.33 -0.04,0.2 -0.09,0.39 -0.15,0.58 -0.03,0.1 -0.05,0.21 -0.09,0.31 -0.08,0.25 -0.17,0.49 -0.27,0.73 -0.06,0.15 -0.13,0.29 -0.19,0.43 -0.05,0.11 -0.1,0.22 -0.16,0.33 -0.08,0.16 -0.16,0.31 -0.25,0.46 -0.04,0.07 -0.09,0.14 -0.13,0.21 -0.1,0.16 -0.2,0.32 -0.31,0.48L15,12.46 18,6l-6.46,3 -5.22,-5.22c0.16,-0.11 0.32,-0.21 0.48,-0.31 0.07,-0.04 0.14,-0.09 0.21,-0.13 0.15,-0.09 0.31,-0.17 0.46,-0.25 0.11,-0.05 0.22,-0.1 0.33,-0.16 0.14,-0.06 0.28,-0.13 0.43,-0.19 0.24,-0.1 0.48,-0.19 0.73,-0.27l0.31,-0.09c0.19,-0.05 0.38,-0.11 0.58,-0.15 0.11,-0.02 0.22,-0.04 0.33,-0.07 0.2,-0.04 0.4,-0.07 0.61,-0.09 0.1,-0.01 0.2,-0.03 0.3,-0.03 0.29,-0.02 0.6,-0.04 0.91,-0.04 5.52,0 10,4.48 10,10z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/exposure.xml b/qqq/android/mobileapp/src/main/res/drawable/exposure.xml new file mode 100644 index 0000000..4f79ffe --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/exposure.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/exposure/materialicons/black/res/drawable/baseline_exposure_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19,3L5,3c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2L21,5c0,-1.1 -0.9,-2 -2,-2zM6,7h5v1.5L6,8.5L6,7zM19,19L5,19L19,5v14zM14.5,16v2L16,18v-2h2v-1.5h-2v-2h-1.5v2h-2L12.5,16z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/exposure_neg_1.xml b/qqq/android/mobileapp/src/main/res/drawable/exposure_neg_1.xml new file mode 100644 index 0000000..31d9ca3 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/exposure_neg_1.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/exposure_neg_1/materialicons/black/res/drawable/baseline_exposure_neg_1_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M4,11v2h8v-2L4,11zM19,18h-2L17,7.38L14,8.4L14,6.7L18.7,5h0.3v13z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/exposure_neg_2.xml b/qqq/android/mobileapp/src/main/res/drawable/exposure_neg_2.xml new file mode 100644 index 0000000..fd6b8d9 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/exposure_neg_2.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/exposure_neg_2/materialicons/black/res/drawable/baseline_exposure_neg_2_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M15.05,16.29l2.86,-3.07c0.38,-0.39 0.72,-0.79 1.04,-1.18 0.32,-0.39 0.59,-0.78 0.82,-1.17 0.23,-0.39 0.41,-0.78 0.54,-1.17s0.19,-0.79 0.19,-1.18c0,-0.53 -0.09,-1.02 -0.27,-1.46 -0.18,-0.44 -0.44,-0.81 -0.78,-1.11 -0.34,-0.31 -0.77,-0.54 -1.26,-0.71 -0.51,-0.16 -1.08,-0.24 -1.72,-0.24 -0.69,0 -1.31,0.11 -1.85,0.32 -0.54,0.21 -1,0.51 -1.36,0.88 -0.37,0.37 -0.65,0.8 -0.84,1.3 -0.18,0.47 -0.27,0.97 -0.28,1.5h2.14c0.01,-0.31 0.05,-0.6 0.13,-0.87 0.09,-0.29 0.23,-0.54 0.4,-0.75 0.18,-0.21 0.41,-0.37 0.68,-0.49 0.27,-0.12 0.6,-0.18 0.96,-0.18 0.31,0 0.58,0.05 0.81,0.15 0.23,0.1 0.43,0.25 0.59,0.43 0.16,0.18 0.28,0.4 0.37,0.65 0.08,0.25 0.13,0.52 0.13,0.81 0,0.22 -0.03,0.43 -0.08,0.65 -0.06,0.22 -0.15,0.45 -0.29,0.7 -0.14,0.25 -0.32,0.53 -0.56,0.83 -0.23,0.3 -0.52,0.65 -0.88,1.03l-4.17,4.55V18H21v-1.71h-5.95zM2,11v2h8v-2H2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/exposure_plus_1.xml b/qqq/android/mobileapp/src/main/res/drawable/exposure_plus_1.xml new file mode 100644 index 0000000..56bfa07 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/exposure_plus_1.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/exposure_plus_1/materialicons/black/res/drawable/baseline_exposure_plus_1_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M10,7L8,7v4L4,11v2h4v4h2v-4h4v-2h-4L10,7zM20,18h-2L18,7.38L15,8.4L15,6.7L19.7,5h0.3v13z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/exposure_plus_2.xml b/qqq/android/mobileapp/src/main/res/drawable/exposure_plus_2.xml new file mode 100644 index 0000000..660c8f8 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/exposure_plus_2.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/exposure_plus_2/materialicons/black/res/drawable/baseline_exposure_plus_2_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M16.05,16.29l2.86,-3.07c0.38,-0.39 0.72,-0.79 1.04,-1.18 0.32,-0.39 0.59,-0.78 0.82,-1.17 0.23,-0.39 0.41,-0.78 0.54,-1.17 0.13,-0.39 0.19,-0.79 0.19,-1.18 0,-0.53 -0.09,-1.02 -0.27,-1.46 -0.18,-0.44 -0.44,-0.81 -0.78,-1.11 -0.34,-0.31 -0.77,-0.54 -1.26,-0.71 -0.51,-0.16 -1.08,-0.24 -1.72,-0.24 -0.69,0 -1.31,0.11 -1.85,0.32 -0.54,0.21 -1,0.51 -1.36,0.88 -0.37,0.37 -0.65,0.8 -0.84,1.3 -0.18,0.47 -0.27,0.97 -0.28,1.5h2.14c0.01,-0.31 0.05,-0.6 0.13,-0.87 0.09,-0.29 0.23,-0.54 0.4,-0.75 0.18,-0.21 0.41,-0.37 0.68,-0.49 0.27,-0.12 0.6,-0.18 0.96,-0.18 0.31,0 0.58,0.05 0.81,0.15 0.23,0.1 0.43,0.25 0.59,0.43 0.16,0.18 0.28,0.4 0.37,0.65 0.08,0.25 0.13,0.52 0.13,0.81 0,0.22 -0.03,0.43 -0.08,0.65 -0.06,0.22 -0.15,0.45 -0.29,0.7 -0.14,0.25 -0.32,0.53 -0.56,0.83 -0.23,0.3 -0.52,0.65 -0.88,1.03l-4.17,4.55V18H22v-1.71h-5.95zM8,7H6v4H2v2h4v4h2v-4h4v-2H8V7z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/exposure_zero.xml b/qqq/android/mobileapp/src/main/res/drawable/exposure_zero.xml new file mode 100644 index 0000000..2fa2c5e --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/exposure_zero.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/exposure_zero/materialicons/black/res/drawable/baseline_exposure_zero_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M16.14,12.5c0,1 -0.1,1.85 -0.3,2.55 -0.2,0.7 -0.48,1.27 -0.83,1.7 -0.36,0.44 -0.79,0.75 -1.3,0.95 -0.51,0.2 -1.07,0.3 -1.7,0.3 -0.62,0 -1.18,-0.1 -1.69,-0.3 -0.51,-0.2 -0.95,-0.51 -1.31,-0.95 -0.36,-0.44 -0.65,-1.01 -0.85,-1.7 -0.2,-0.7 -0.3,-1.55 -0.3,-2.55v-2.04c0,-1 0.1,-1.85 0.3,-2.55 0.2,-0.7 0.48,-1.26 0.84,-1.69 0.36,-0.43 0.8,-0.74 1.31,-0.93C10.81,5.1 11.38,5 12,5c0.63,0 1.19,0.1 1.7,0.29 0.51,0.19 0.95,0.5 1.31,0.93 0.36,0.43 0.64,0.99 0.84,1.69 0.2,0.7 0.3,1.54 0.3,2.55v2.04zM14.03,10.14c0,-0.64 -0.05,-1.18 -0.13,-1.62 -0.09,-0.44 -0.22,-0.79 -0.4,-1.06 -0.17,-0.27 -0.39,-0.46 -0.64,-0.58 -0.25,-0.13 -0.54,-0.19 -0.86,-0.19 -0.32,0 -0.61,0.06 -0.86,0.18s-0.47,0.31 -0.64,0.58c-0.17,0.27 -0.31,0.62 -0.4,1.06s-0.13,0.98 -0.13,1.62v2.67c0,0.64 0.05,1.18 0.14,1.62 0.09,0.45 0.23,0.81 0.4,1.09s0.39,0.48 0.64,0.61 0.54,0.19 0.87,0.19c0.33,0 0.62,-0.06 0.87,-0.19s0.46,-0.33 0.63,-0.61c0.17,-0.28 0.3,-0.64 0.39,-1.09 0.09,-0.45 0.13,-0.99 0.13,-1.62v-2.66z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/extension.xml b/qqq/android/mobileapp/src/main/res/drawable/extension.xml new file mode 100644 index 0000000..239bdb1 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/extension.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/extension/materialicons/black/res/drawable/baseline_extension_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20.5,11H19V7c0,-1.1 -0.9,-2 -2,-2h-4V3.5C13,2.12 11.88,1 10.5,1S8,2.12 8,3.5V5H4c-1.1,0 -1.99,0.9 -1.99,2v3.8H3.5c1.49,0 2.7,1.21 2.7,2.7s-1.21,2.7 -2.7,2.7H2V20c0,1.1 0.9,2 2,2h3.8v-1.5c0,-1.49 1.21,-2.7 2.7,-2.7 1.49,0 2.7,1.21 2.7,2.7V22H17c1.1,0 2,-0.9 2,-2v-4h1.5c1.38,0 2.5,-1.12 2.5,-2.5S21.88,11 20.5,11z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/extension_off.xml b/qqq/android/mobileapp/src/main/res/drawable/extension_off.xml new file mode 100644 index 0000000..f2c8b60 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/extension_off.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/extension_off/materialicons/black/res/drawable/baseline_extension_off_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19.78,22.61l-1.63,-1.63C18.1,20.98 18.05,21 18,21h-3.8c0,-2.71 -2.16,-3 -2.7,-3s-2.7,0.29 -2.7,3H5c-1.1,0 -2,-0.9 -2,-2v-3.8c2.71,0 3,-2.16 3,-2.7c0,-0.54 -0.3,-2.7 -2.99,-2.7V6c0,-0.05 0.02,-0.09 0.02,-0.14L1.39,4.22l1.41,-1.41l18.38,18.38L19.78,22.61zM20,17.17V15c1.38,0 2.5,-1.12 2.5,-2.5S21.38,10 20,10V6c0,-1.1 -0.9,-2 -2,-2h-4c0,-1.38 -1.12,-2.5 -2.5,-2.5S9,2.62 9,4H6.83L20,17.17z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/face.xml b/qqq/android/mobileapp/src/main/res/drawable/face.xml new file mode 100644 index 0000000..b04342a --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/face.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/face/materialicons/black/res/drawable/baseline_face_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M9,11.75c-0.69,0 -1.25,0.56 -1.25,1.25s0.56,1.25 1.25,1.25 1.25,-0.56 1.25,-1.25 -0.56,-1.25 -1.25,-1.25zM15,11.75c-0.69,0 -1.25,0.56 -1.25,1.25s0.56,1.25 1.25,1.25 1.25,-0.56 1.25,-1.25 -0.56,-1.25 -1.25,-1.25zM12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM12,20c-4.41,0 -8,-3.59 -8,-8 0,-0.29 0.02,-0.58 0.05,-0.86 2.36,-1.05 4.23,-2.98 5.21,-5.37C11.07,8.33 14.05,10 17.42,10c0.78,0 1.53,-0.09 2.25,-0.26 0.21,0.71 0.33,1.47 0.33,2.26 0,4.41 -3.59,8 -8,8z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/face_2.xml b/qqq/android/mobileapp/src/main/res/drawable/face_2.xml new file mode 100644 index 0000000..50c9d0f --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/face_2.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/face_2/materialicons/black/res/drawable/baseline_face_2_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M21.97,13.52c0,-0.01 0,-0.02 0,-0.04C23.21,12.38 24,10.78 24,9c0,-3.31 -2.69,-6 -6,-6c-0.26,0 -0.52,0.02 -0.78,0.06C16.19,1.23 14.24,0 12,0S7.81,1.23 6.78,3.06C6.52,3.02 6.26,3 6,3C2.69,3 0,5.69 0,9c0,1.78 0.79,3.38 2.02,4.48c0,0.01 0,0.02 0,0.04C0.79,14.62 0,16.22 0,18c0,3.31 2.69,6 6,6c1.39,0 2.67,-0.48 3.69,-1.28C10.43,22.9 11.2,23 12,23s1.57,-0.1 2.31,-0.28C15.33,23.52 16.61,24 18,24c3.31,0 6,-2.69 6,-6C24,16.22 23.21,14.62 21.97,13.52zM12,21c-4.41,0 -8,-3.59 -8,-8c0,-3.72 2.56,-6.85 6,-7.74c0,0.02 0,0.03 0,0.05c0,3.34 2.72,6.06 6.06,6.06c1.26,0 2.45,-0.39 3.45,-1.09C19.82,11.14 20,12.05 20,13C20,17.41 16.41,21 12,21z" /> + <path + android:fillColor="#FF000000" + android:pathData="M9,14m-1.25,0a1.25,1.25 0,1 1,2.5 0a1.25,1.25 0,1 1,-2.5 0" /> + <path + android:fillColor="#FF000000" + android:pathData="M15,14m-1.25,0a1.25,1.25 0,1 1,2.5 0a1.25,1.25 0,1 1,-2.5 0" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/face_3.xml b/qqq/android/mobileapp/src/main/res/drawable/face_3.xml new file mode 100644 index 0000000..f3a1a48 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/face_3.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/face_3/materialicons/black/res/drawable/baseline_face_3_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M9,13m-1.25,0a1.25,1.25 0,1 1,2.5 0a1.25,1.25 0,1 1,-2.5 0" /> + <path + android:fillColor="#FF000000" + android:pathData="M15,13m-1.25,0a1.25,1.25 0,1 1,2.5 0a1.25,1.25 0,1 1,-2.5 0" /> + <path + android:fillColor="#FF000000" + android:pathData="M22.91,11.96C22.39,6.32 17.66,2 12,2S1.61,6.32 1.09,11.96l-0.9,9.86C0.09,22.99 1.01,24 2.19,24h19.62c1.18,0 2.1,-1.01 1.99,-2.18L22.91,11.96zM4.54,9.13C5.41,9.68 6.43,10 7.5,10C9.36,10 11,9.07 12,7.65C13,9.07 14.64,10 16.5,10c1.07,0 2.09,-0.32 2.96,-0.87C19.8,10.02 20,10.99 20,12c0,4.41 -3.59,8 -8,8s-8,-3.59 -8,-8C4,10.99 4.2,10.02 4.54,9.13z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/face_4.xml b/qqq/android/mobileapp/src/main/res/drawable/face_4.xml new file mode 100644 index 0000000..85a0c39 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/face_4.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/face_4/materialicons/black/res/drawable/baseline_face_4_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,2c-0.96,0 -1.88,0.14 -2.75,0.39C8.37,0.96 6.8,0 5,0C2.24,0 0,2.24 0,5c0,1.8 0.96,3.37 2.39,4.25C2.14,10.12 2,11.04 2,12c0,5.52 4.48,10 10,10s10,-4.48 10,-10S17.52,2 12,2zM12,20c-4.41,0 -8,-3.59 -8,-8c0,-0.05 0.01,-0.1 0.01,-0.15c2.6,-0.98 4.68,-2.99 5.74,-5.55C11.58,8.56 14.37,10 17.5,10c0.75,0 1.47,-0.09 2.17,-0.24C19.88,10.47 20,11.22 20,12C20,16.41 16.41,20 12,20z" /> + <path + android:fillColor="#FF000000" + android:pathData="M9,13m-1.25,0a1.25,1.25 0,1 1,2.5 0a1.25,1.25 0,1 1,-2.5 0" /> + <path + android:fillColor="#FF000000" + android:pathData="M15,13m-1.25,0a1.25,1.25 0,1 1,2.5 0a1.25,1.25 0,1 1,-2.5 0" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/face_5.xml b/qqq/android/mobileapp/src/main/res/drawable/face_5.xml new file mode 100644 index 0000000..254c26d --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/face_5.xml @@ -0,0 +1,85 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/face_5/materialicons/black/res/drawable/baseline_face_5_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10s10,-4.48 10,-10S17.52,2 12,2zM12,20c-4.41,0 -8,-3.59 -8,-8c0,-1.12 0.23,-2.18 0.65,-3.15C4.74,8.94 4.86,9 5,9c0.28,0 0.5,-0.22 0.5,-0.5c0,-0.25 -0.19,-0.45 -0.43,-0.49c0.15,-0.26 0.32,-0.51 0.49,-0.75C5.53,7.34 5.5,7.41 5.5,7.5C5.5,7.78 5.72,8 6,8s0.5,-0.22 0.5,-0.5C6.5,7.22 6.28,7 6,7C5.87,7 5.75,7.05 5.66,7.13c0.52,-0.68 1.15,-1.28 1.86,-1.76C7.51,5.41 7.5,5.45 7.5,5.5C7.5,5.78 7.72,6 8,6s0.5,-0.22 0.5,-0.5c0,-0.24 -0.17,-0.43 -0.4,-0.48c0.16,-0.09 0.32,-0.17 0.49,-0.25C8.68,4.91 8.83,5 9,5c0.28,0 0.5,-0.22 0.5,-0.5c0,-0.03 -0.01,-0.06 -0.02,-0.09c0.39,-0.13 0.79,-0.23 1.21,-0.3C10.58,4.21 10.5,4.34 10.5,4.5C10.5,4.78 10.72,5 11,5s0.5,-0.22 0.5,-0.5c0,-0.21 -0.13,-0.38 -0.3,-0.46C11.46,4.01 11.73,4 12,4s0.54,0.01 0.8,0.04c-0.18,0.08 -0.3,0.25 -0.3,0.46C12.5,4.78 12.72,5 13,5s0.5,-0.22 0.5,-0.5c0,-0.16 -0.08,-0.29 -0.19,-0.38c0.41,0.07 0.82,0.17 1.21,0.3C14.51,4.44 14.5,4.47 14.5,4.5C14.5,4.78 14.72,5 15,5c0.17,0 0.32,-0.09 0.41,-0.23c0.17,0.08 0.33,0.16 0.49,0.25c-0.23,0.05 -0.4,0.24 -0.4,0.48C15.5,5.78 15.72,6 16,6s0.5,-0.22 0.5,-0.5c0,-0.05 -0.01,-0.09 -0.03,-0.13c0.71,0.48 1.34,1.08 1.86,1.76C18.25,7.05 18.13,7 18,7c-0.28,0 -0.5,0.22 -0.5,0.5C17.5,7.78 17.72,8 18,8s0.5,-0.22 0.5,-0.5c0,-0.09 -0.03,-0.16 -0.07,-0.23c0.18,0.24 0.34,0.49 0.49,0.75C18.69,8.05 18.5,8.25 18.5,8.5C18.5,8.78 18.72,9 19,9c0.14,0 0.26,-0.06 0.35,-0.15C19.77,9.82 20,10.88 20,12C20,16.41 16.41,20 12,20z" /> + <path + android:fillColor="#FF000000" + android:pathData="M9,13m-1.25,0a1.25,1.25 0,1 1,2.5 0a1.25,1.25 0,1 1,-2.5 0" /> + <path + android:fillColor="#FF000000" + android:pathData="M12,5.5m-0.5,0a0.5,0.5 0,1 1,1 0a0.5,0.5 0,1 1,-1 0" /> + <path + android:fillColor="#FF000000" + android:pathData="M14,5.5m-0.5,0a0.5,0.5 0,1 1,1 0a0.5,0.5 0,1 1,-1 0" /> + <path + android:fillColor="#FF000000" + android:pathData="M10,5.5m-0.5,0a0.5,0.5 0,1 1,1 0a0.5,0.5 0,1 1,-1 0" /> + <path + android:fillColor="#FF000000" + android:pathData="M17,6.5m-0.5,0a0.5,0.5 0,1 1,1 0a0.5,0.5 0,1 1,-1 0" /> + <path + android:fillColor="#FF000000" + android:pathData="M9,6.5m-0.5,0a0.5,0.5 0,1 1,1 0a0.5,0.5 0,1 1,-1 0" /> + <path + android:fillColor="#FF000000" + android:pathData="M7,6.5m-0.5,0a0.5,0.5 0,1 1,1 0a0.5,0.5 0,1 1,-1 0" /> + <path + android:fillColor="#FF000000" + android:pathData="M11,6.5m-0.5,0a0.5,0.5 0,1 1,1 0a0.5,0.5 0,1 1,-1 0" /> + <path + android:fillColor="#FF000000" + android:pathData="M13,6.5m-0.5,0a0.5,0.5 0,1 1,1 0a0.5,0.5 0,1 1,-1 0" /> + <path + android:fillColor="#FF000000" + android:pathData="M15,6.5m-0.5,0a0.5,0.5 0,1 1,1 0a0.5,0.5 0,1 1,-1 0" /> + <path + android:fillColor="#FF000000" + android:pathData="M12,7.5m-0.5,0a0.5,0.5 0,1 1,1 0a0.5,0.5 0,1 1,-1 0" /> + <path + android:fillColor="#FF000000" + android:pathData="M14,7.5m-0.5,0a0.5,0.5 0,1 1,1 0a0.5,0.5 0,1 1,-1 0" /> + <path + android:fillColor="#FF000000" + android:pathData="M16,7.5m-0.5,0a0.5,0.5 0,1 1,1 0a0.5,0.5 0,1 1,-1 0" /> + <path + android:fillColor="#FF000000" + android:pathData="M10,7.5m-0.5,0a0.5,0.5 0,1 1,1 0a0.5,0.5 0,1 1,-1 0" /> + <path + android:fillColor="#FF000000" + android:pathData="M8,7.5m-0.5,0a0.5,0.5 0,1 1,1 0a0.5,0.5 0,1 1,-1 0" /> + <path + android:fillColor="#FF000000" + android:pathData="M9,8.5m-0.5,0a0.5,0.5 0,1 1,1 0a0.5,0.5 0,1 1,-1 0" /> + <path + android:fillColor="#FF000000" + android:pathData="M7,8.5m-0.5,0a0.5,0.5 0,1 1,1 0a0.5,0.5 0,1 1,-1 0" /> + <path + android:fillColor="#FF000000" + android:pathData="M11,8.5m-0.5,0a0.5,0.5 0,1 1,1 0a0.5,0.5 0,1 1,-1 0" /> + <path + android:fillColor="#FF000000" + android:pathData="M13,8.5m-0.5,0a0.5,0.5 0,1 1,1 0a0.5,0.5 0,1 1,-1 0" /> + <path + android:fillColor="#FF000000" + android:pathData="M15,8.5m-0.5,0a0.5,0.5 0,1 1,1 0a0.5,0.5 0,1 1,-1 0" /> + <path + android:fillColor="#FF000000" + android:pathData="M17,8.5m-0.5,0a0.5,0.5 0,1 1,1 0a0.5,0.5 0,1 1,-1 0" /> + <path + android:fillColor="#FF000000" + android:pathData="M15,13m-1.25,0a1.25,1.25 0,1 1,2.5 0a1.25,1.25 0,1 1,-2.5 0" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/face_6.xml b/qqq/android/mobileapp/src/main/res/drawable/face_6.xml new file mode 100644 index 0000000..6dc106f --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/face_6.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/face_6/materialicons/black/res/drawable/baseline_face_6_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10s10,-4.48 10,-10S17.52,2 12,2zM12,20c-4.41,0 -8,-3.59 -8,-8c0,-0.01 0,-0.02 0,-0.03c2.31,-0.22 3.43,-1.59 4.34,-3.41C8.51,8.21 8.85,8 9.24,8h5.53c0.38,0 0.72,0.21 0.89,0.55c0.9,1.8 1.99,3.19 4.34,3.41c0,0.01 0,0.02 0,0.03C20,16.41 16.41,20 12,20z" /> + <path + android:fillColor="#FF000000" + android:pathData="M9,13m-1.25,0a1.25,1.25 0,1 1,2.5 0a1.25,1.25 0,1 1,-2.5 0" /> + <path + android:fillColor="#FF000000" + android:pathData="M15,13m-1.25,0a1.25,1.25 0,1 1,2.5 0a1.25,1.25 0,1 1,-2.5 0" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/face_retouching_natural.xml b/qqq/android/mobileapp/src/main/res/drawable/face_retouching_natural.xml new file mode 100644 index 0000000..4b80b0d --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/face_retouching_natural.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/face_retouching_natural/materialicons/black/res/drawable/baseline_face_retouching_natural_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M9,13m-1.25,0a1.25,1.25 0,1 1,2.5 0a1.25,1.25 0,1 1,-2.5 0" /> + <path + android:fillColor="#FF000000" + android:pathData="M20.77,8.58l-0.92,2.01c0.09,0.46 0.15,0.93 0.15,1.41 0,4.41 -3.59,8 -8,8s-8,-3.59 -8,-8c0,-0.05 0.01,-0.1 0,-0.14 2.6,-0.98 4.69,-2.99 5.74,-5.55C11.58,8.56 14.37,10 17.5,10c0.45,0 0.89,-0.04 1.33,-0.1l-0.6,-1.32 -0.88,-1.93 -1.93,-0.88 -2.79,-1.27 2.79,-1.27 0.71,-0.32C14.87,2.33 13.47,2 12,2 6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10c0,-1.47 -0.33,-2.87 -0.9,-4.13l-0.33,0.71z" /> + <path + android:fillColor="#FF000000" + android:pathData="M15,13m-1.25,0a1.25,1.25 0,1 1,2.5 0a1.25,1.25 0,1 1,-2.5 0" /> + <path + android:fillColor="#FF000000" + android:pathData="M20.6,5.6L19.5,8l-1.1,-2.4L16,4.5l2.4,-1.1L19.5,1l1.1,2.4L23,4.5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/face_retouching_off.xml b/qqq/android/mobileapp/src/main/res/drawable/face_retouching_off.xml new file mode 100644 index 0000000..325112b --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/face_retouching_off.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/face_retouching_off/materialicons/black/res/drawable/baseline_face_retouching_off_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M9,13m-1.25,0a1.25,1.25 0,1 1,2.5 0a1.25,1.25 0,1 1,-2.5 0" /> + <path + android:fillColor="#FF000000" + android:pathData="M17.5,10c0.75,0 1.47,-0.09 2.17,-0.24C19.88,10.47 20,11.22 20,12c0,1.22 -0.28,2.37 -0.77,3.4l1.49,1.49C21.53,15.44 22,13.78 22,12c0,-5.52 -4.48,-10 -10,-10c-1.78,0 -3.44,0.47 -4.89,1.28l5.33,5.33C13.93,9.49 15.65,10 17.5,10z" /> + <path + android:fillColor="#FF000000" + android:pathData="M1.89,3.72l2.19,2.19C2.78,7.6 2,9.71 2,12c0,5.52 4.48,10 10,10c2.29,0 4.4,-0.78 6.09,-2.08l2.19,2.19l1.41,-1.41L3.31,2.31L1.89,3.72zM16.66,18.49C15.35,19.44 13.74,20 12,20c-4.41,0 -8,-3.59 -8,-8c0,-0.05 0.01,-0.1 0,-0.14c1.39,-0.52 2.63,-1.35 3.64,-2.39L16.66,18.49z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/facebook.xml b/qqq/android/mobileapp/src/main/res/drawable/facebook.xml new file mode 100644 index 0000000..54562b3 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/facebook.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/facebook/materialicons/black/res/drawable/baseline_facebook_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M22,12c0,-5.52 -4.48,-10 -10,-10S2,6.48 2,12c0,4.84 3.44,8.87 8,9.8V15H8v-3h2V9.5C10,7.57 11.57,6 13.5,6H16v3h-2c-0.55,0 -1,0.45 -1,1v2h3v3h-3v6.95C18.05,21.45 22,17.19 22,12z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/fact_check.xml b/qqq/android/mobileapp/src/main/res/drawable/fact_check.xml new file mode 100644 index 0000000..7ffa81f --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/fact_check.xml @@ -0,0 +1,20 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/fact_check/materialicons/black/res/drawable/baseline_fact_check_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,3H4C2.9,3 2,3.9 2,5v14c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2V5C22,3.9 21.1,3 20,3zM10,17H5v-2h5V17zM10,13H5v-2h5V13zM10,9H5V7h5V9zM14.82,15L12,12.16l1.41,-1.41l1.41,1.42L17.99,9l1.42,1.42L14.82,15z" + android:fillType="evenOdd" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/factory.xml b/qqq/android/mobileapp/src/main/res/drawable/factory.xml new file mode 100644 index 0000000..3094e19 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/factory.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/factory/materialicons/black/res/drawable/baseline_factory_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M22,10v12H2V10l7,-3v2l5,-2l0,0l0,3H22zM17.2,8.5L18,2h3l0.8,6.5H17.2zM11,18h2v-4h-2V18zM7,18h2v-4H7V18zM17,14h-2v4h2V14z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/family_restroom.xml b/qqq/android/mobileapp/src/main/res/drawable/family_restroom.xml new file mode 100644 index 0000000..a683186 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/family_restroom.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/places/family_restroom/materialicons/black/res/drawable/baseline_family_restroom_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M16,4c0,-1.11 0.89,-2 2,-2s2,0.89 2,2s-0.89,2 -2,2S16,5.11 16,4zM20,22v-6h2.5l-2.54,-7.63C19.68,7.55 18.92,7 18.06,7h-0.12c-0.86,0 -1.63,0.55 -1.9,1.37l-0.86,2.58C16.26,11.55 17,12.68 17,14v8H20zM12.5,11.5c0.83,0 1.5,-0.67 1.5,-1.5s-0.67,-1.5 -1.5,-1.5S11,9.17 11,10S11.67,11.5 12.5,11.5zM5.5,6c1.11,0 2,-0.89 2,-2s-0.89,-2 -2,-2s-2,0.89 -2,2S4.39,6 5.5,6zM7.5,22v-7H9V9c0,-1.1 -0.9,-2 -2,-2H4C2.9,7 2,7.9 2,9v6h1.5v7H7.5zM14,22v-4h1v-4c0,-0.82 -0.68,-1.5 -1.5,-1.5h-2c-0.82,0 -1.5,0.68 -1.5,1.5v4h1v4H14z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/fast_forward.xml b/qqq/android/mobileapp/src/main/res/drawable/fast_forward.xml new file mode 100644 index 0000000..53717b2 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/fast_forward.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/av/fast_forward/materialicons/black/res/drawable/baseline_fast_forward_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M4,18l8.5,-6L4,6v12zM13,6v12l8.5,-6L13,6z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/fast_rewind.xml b/qqq/android/mobileapp/src/main/res/drawable/fast_rewind.xml new file mode 100644 index 0000000..accc6af --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/fast_rewind.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/av/fast_rewind/materialicons/black/res/drawable/baseline_fast_rewind_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M11,18L11,6l-8.5,6 8.5,6zM11.5,12l8.5,6L20,6l-8.5,6z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/fastfood.xml b/qqq/android/mobileapp/src/main/res/drawable/fastfood.xml new file mode 100644 index 0000000..04d3f2b --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/fastfood.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/fastfood/materialicons/black/res/drawable/baseline_fastfood_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M18.06,22.99h1.66c0.84,0 1.53,-0.64 1.63,-1.46L23,5.05h-5L18,1h-1.97v4.05h-4.97l0.3,2.34c1.71,0.47 3.31,1.32 4.27,2.26 1.44,1.42 2.43,2.89 2.43,5.29v8.05zM1,21.99L1,21h15.03v0.99c0,0.55 -0.45,1 -1.01,1L2.01,22.99c-0.56,0 -1.01,-0.45 -1.01,-1zM16.03,14.99c0,-8 -15.03,-8 -15.03,0h15.03zM1.02,17h15v2h-15z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/favorite.xml b/qqq/android/mobileapp/src/main/res/drawable/favorite.xml new file mode 100644 index 0000000..27449e0 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/favorite.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/favorite/materialicons/black/res/drawable/baseline_favorite_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,21.35l-1.45,-1.32C5.4,15.36 2,12.28 2,8.5 2,5.42 4.42,3 7.5,3c1.74,0 3.41,0.81 4.5,2.09C13.09,3.81 14.76,3 16.5,3 19.58,3 22,5.42 22,8.5c0,3.78 -3.4,6.86 -8.55,11.54L12,21.35z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/favorite_border.xml b/qqq/android/mobileapp/src/main/res/drawable/favorite_border.xml new file mode 100644 index 0000000..8a48fb7 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/favorite_border.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/favorite_border/materialicons/black/res/drawable/baseline_favorite_border_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M16.5,3c-1.74,0 -3.41,0.81 -4.5,2.09C10.91,3.81 9.24,3 7.5,3 4.42,3 2,5.42 2,8.5c0,3.78 3.4,6.86 8.55,11.54L12,21.35l1.45,-1.32C18.6,15.36 22,12.28 22,8.5 22,5.42 19.58,3 16.5,3zM12.1,18.55l-0.1,0.1 -0.1,-0.1C7.14,14.24 4,11.39 4,8.5 4,6.5 5.5,5 7.5,5c1.54,0 3.04,0.99 3.57,2.36h1.87C13.46,5.99 14.96,5 16.5,5c2,0 3.5,1.5 3.5,3.5 0,2.89 -3.14,5.74 -7.9,10.05z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/fax.xml b/qqq/android/mobileapp/src/main/res/drawable/fax.xml new file mode 100644 index 0000000..200a338 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/fax.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/fax/materialicons/black/res/drawable/baseline_fax_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19,9h-1V4H8v14.5V20h14v-8C22,10.34 20.66,9 19,9zM10,6h6v3h-6V6zM14,17h-4v-5h4V17zM16,17c-0.55,0 -1,-0.45 -1,-1c0,-0.55 0.45,-1 1,-1s1,0.45 1,1C17,16.55 16.55,17 16,17zM16,14c-0.55,0 -1,-0.45 -1,-1c0,-0.55 0.45,-1 1,-1s1,0.45 1,1C17,13.55 16.55,14 16,14zM19,17c-0.55,0 -1,-0.45 -1,-1c0,-0.55 0.45,-1 1,-1s1,0.45 1,1C20,16.55 19.55,17 19,17zM19,14c-0.55,0 -1,-0.45 -1,-1c0,-0.55 0.45,-1 1,-1s1,0.45 1,1C20,13.55 19.55,14 19,14z" /> + <path + android:fillColor="#FF000000" + android:pathData="M4.5,8C3.12,8 2,9.12 2,10.5v8C2,19.88 3.12,21 4.5,21S7,19.88 7,18.5v-8C7,9.12 5.88,8 4.5,8z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/featured_play_list.xml b/qqq/android/mobileapp/src/main/res/drawable/featured_play_list.xml new file mode 100644 index 0000000..ef6c343 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/featured_play_list.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/av/featured_play_list/materialicons/black/res/drawable/baseline_featured_play_list_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M21,3L3,3c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h18c1.1,0 2,-0.9 2,-2L23,5c0,-1.1 -0.9,-2 -2,-2zM12,11L3,11L3,9h9v2zM12,7L3,7L3,5h9v2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/featured_video.xml b/qqq/android/mobileapp/src/main/res/drawable/featured_video.xml new file mode 100644 index 0000000..6bf098d --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/featured_video.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/av/featured_video/materialicons/black/res/drawable/baseline_featured_video_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M21,3L3,3c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h18c1.1,0 2,-0.9 2,-2L23,5c0,-1.1 -0.9,-2 -2,-2zM12,12L3,12L3,5h9v7z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/feed.xml b/qqq/android/mobileapp/src/main/res/drawable/feed.xml new file mode 100644 index 0000000..c74f300 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/feed.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/search/feed/materialicons/black/res/drawable/baseline_feed_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M16,3H5C3.9,3 3,3.9 3,5v14c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2V8L16,3zM7,7h5v2H7V7zM17,17H7v-2h10V17zM17,13H7v-2h10V13zM15,9V5l4,4H15z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/feedback.xml b/qqq/android/mobileapp/src/main/res/drawable/feedback.xml new file mode 100644 index 0000000..ff8d32d --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/feedback.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/feedback/materialicons/black/res/drawable/baseline_feedback_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,2L4,2c-1.1,0 -1.99,0.9 -1.99,2L2,22l4,-4h14c1.1,0 2,-0.9 2,-2L22,4c0,-1.1 -0.9,-2 -2,-2zM13,14h-2v-2h2v2zM13,10h-2L11,6h2v4z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/female.xml b/qqq/android/mobileapp/src/main/res/drawable/female.xml new file mode 100644 index 0000000..56ccb8a --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/female.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/female/materialicons/black/res/drawable/baseline_female_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M17.5,9.5C17.5,6.46 15.04,4 12,4S6.5,6.46 6.5,9.5c0,2.7 1.94,4.93 4.5,5.4V17H9v2h2v2h2v-2h2v-2h-2v-2.1C15.56,14.43 17.5,12.2 17.5,9.5zM8.5,9.5C8.5,7.57 10.07,6 12,6s3.5,1.57 3.5,3.5S13.93,13 12,13S8.5,11.43 8.5,9.5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/fence.xml b/qqq/android/mobileapp/src/main/res/drawable/fence.xml new file mode 100644 index 0000000..45f50f6 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/fence.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/places/fence/materialicons/black/res/drawable/baseline_fence_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M21,12v-2h-2V7l-3,-3l-2,2l-2,-2l-2,2L8,4L5,7v3H3v2h2v2H3v2h2v4h14v-4h2v-2h-2v-2H21zM16,6.83l1,1V10h-2V7.83l0.41,-0.41L16,6.83zM12,6.83l0.59,0.59L13,7.83V10h-2V7.83l0.41,-0.41L12,6.83zM11,14v-2h2v2H11zM13,16v2h-2v-2H13zM7,7.83l1,-1l0.59,0.59L9,7.83V10H7V7.83zM7,12h2v2H7V12zM7,16h2v2H7V16zM17,18h-2v-2h2V18zM17,14h-2v-2h2V14z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/festival.xml b/qqq/android/mobileapp/src/main/res/drawable/festival.xml new file mode 100644 index 0000000..dd84e82 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/festival.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/festival/materialicons/black/res/drawable/baseline_festival_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M13,5.7l0,-1.7l3,0l-1,-1.49l1,-1.51l-5,0l0,4.7l-9,6.3l0,10l7,0l0,-5l3.03,-2l2.97,2l0,5l7,0l0,-10z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/fiber_dvr.xml b/qqq/android/mobileapp/src/main/res/drawable/fiber_dvr.xml new file mode 100644 index 0000000..cf4f852 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/fiber_dvr.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/av/fiber_dvr/materialicons/black/res/drawable/baseline_fiber_dvr_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M17.5,10.5h2v1h-2V10.5zM4.5,10.5h2v3h-2V10.5zM21,3H3C1.89,3 1,3.89 1,5v14c0,1.1 0.89,2 2,2h18c1.11,0 2,-0.9 2,-2V5C23,3.89 22.11,3 21,3zM8,13.5C8,14.35 7.35,15 6.5,15H3V9h3.5C7.35,9 8,9.65 8,10.5V13.5zM12.62,15h-1.5L9.37,9h1.5l1,3.43l1,-3.43h1.5L12.62,15zM21,11.5c0,0.6 -0.4,1.15 -0.9,1.4L21,15h-1.5l-0.85,-2H17.5v2H16V9h3.5c0.85,0 1.5,0.65 1.5,1.5V11.5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/fiber_manual_record.xml b/qqq/android/mobileapp/src/main/res/drawable/fiber_manual_record.xml new file mode 100644 index 0000000..eef9a08 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/fiber_manual_record.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/av/fiber_manual_record/materialicons/black/res/drawable/baseline_fiber_manual_record_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,12m-8,0a8,8 0,1 1,16 0a8,8 0,1 1,-16 0" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/fiber_new.xml b/qqq/android/mobileapp/src/main/res/drawable/fiber_new.xml new file mode 100644 index 0000000..d50777c --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/fiber_new.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/av/fiber_new/materialicons/black/res/drawable/baseline_fiber_new_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,4H4C2.89,4 2.01,4.89 2.01,6L2,18c0,1.11 0.89,2 2,2h16c1.11,0 2,-0.89 2,-2V6C22,4.89 21.11,4 20,4zM8.5,15H7.3l-2.55,-3.5V15H3.5V9h1.25l2.5,3.5V9H8.5V15zM13.5,10.26H11v1.12h2.5v1.26H11v1.11h2.5V15h-4V9h4V10.26zM20.5,14c0,0.55 -0.45,1 -1,1h-4c-0.55,0 -1,-0.45 -1,-1V9h1.25v4.51h1.13V9.99h1.25v3.51h1.12V9h1.25V14z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/fiber_pin.xml b/qqq/android/mobileapp/src/main/res/drawable/fiber_pin.xml new file mode 100644 index 0000000..33668e1 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/fiber_pin.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/av/fiber_pin/materialicons/black/res/drawable/baseline_fiber_pin_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M5.5,10.5h2v1h-2zM20,4L4,4c-1.11,0 -1.99,0.89 -1.99,2L2,18c0,1.11 0.89,2 2,2h16c1.11,0 2,-0.89 2,-2L22,6c0,-1.11 -0.89,-2 -2,-2zM9,11.5c0,0.85 -0.65,1.5 -1.5,1.5h-2v2L4,15L4,9h3.5c0.85,0 1.5,0.65 1.5,1.5v1zM12.5,15L11,15L11,9h1.5v6zM20,15h-1.2l-2.55,-3.5L16.25,15L15,15L15,9h1.25l2.5,3.5L18.75,9L20,9v6z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/fiber_smart_record.xml b/qqq/android/mobileapp/src/main/res/drawable/fiber_smart_record.xml new file mode 100644 index 0000000..955ad0f --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/fiber_smart_record.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/av/fiber_smart_record/materialicons/black/res/drawable/baseline_fiber_smart_record_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M9,12m-8,0a8,8 0,1 1,16 0a8,8 0,1 1,-16 0" /> + <path + android:fillColor="#FF000000" + android:pathData="M17,4.26v2.09c2.33,0.82 4,3.04 4,5.65s-1.67,4.83 -4,5.65v2.09c3.45,-0.89 6,-4.01 6,-7.74s-2.55,-6.85 -6,-7.74z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/file_copy.xml b/qqq/android/mobileapp/src/main/res/drawable/file_copy.xml new file mode 100644 index 0000000..792ccc4 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/file_copy.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/content/file_copy/materialicons/black/res/drawable/baseline_file_copy_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M16,1L4,1c-1.1,0 -2,0.9 -2,2v14h2L4,3h12L16,1zM15,5l6,6v10c0,1.1 -0.9,2 -2,2L7.99,23C6.89,23 6,22.1 6,21l0.01,-14c0,-1.1 0.89,-2 1.99,-2h7zM14,12h5.5L14,6.5L14,12z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/file_download.xml b/qqq/android/mobileapp/src/main/res/drawable/file_download.xml new file mode 100644 index 0000000..ab0185d --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/file_download.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/file/file_download/materialicons/black/res/drawable/baseline_file_download_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19,9h-4V3H9v6H5l7,7 7,-7zM5,18v2h14v-2H5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/file_download_done.xml b/qqq/android/mobileapp/src/main/res/drawable/file_download_done.xml new file mode 100644 index 0000000..8dceb5e --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/file_download_done.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/file/file_download_done/materialicons/black/res/drawable/baseline_file_download_done_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M5,18h14v2L5,20v-2zM9.6,15.3L5,10.7l2,-1.9 2.6,2.6L17,4l2,2 -9.4,9.3z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/file_download_off.xml b/qqq/android/mobileapp/src/main/res/drawable/file_download_off.xml new file mode 100644 index 0000000..c068ade --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/file_download_off.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/file/file_download_off/materialicons/black/res/drawable/baseline_file_download_off_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M9,6.17V3h6v6h4l-3.59,3.59L9,6.17zM21.19,21.19L2.81,2.81L1.39,4.22L6.17,9H5l7,7l0.59,-0.59L15.17,18H5v2h12.17l2.61,2.61L21.19,21.19z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/file_open.xml b/qqq/android/mobileapp/src/main/res/drawable/file_open.xml new file mode 100644 index 0000000..f665388 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/file_open.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/file/file_open/materialicons/black/res/drawable/baseline_file_open_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M14,2H6C4.9,2 4,2.9 4,4v16c0,1.1 0.89,2 1.99,2H15v-8h5V8L14,2zM13,9V3.5L18.5,9H13zM17,21.66V16h5.66v2h-2.24l2.95,2.95l-1.41,1.41L19,19.41l0,2.24H17z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/file_present.xml b/qqq/android/mobileapp/src/main/res/drawable/file_present.xml new file mode 100644 index 0000000..99bb830 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/file_present.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/file_present/materialicons/black/res/drawable/baseline_file_present_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M15,2L6,2c-1.1,0 -2,0.9 -2,2v16c0,1.1 0.9,2 2,2h12c1.1,0 2,-0.9 2,-2L20,7l-5,-5zM6,20L6,4h8v4h4v12L6,20zM16,10v5c0,2.21 -1.79,4 -4,4s-4,-1.79 -4,-4L8,8.5c0,-1.47 1.26,-2.64 2.76,-2.49 1.3,0.13 2.24,1.32 2.24,2.63L13,15h-2L11,8.5c0,-0.28 -0.22,-0.5 -0.5,-0.5s-0.5,0.22 -0.5,0.5L10,15c0,1.1 0.9,2 2,2s2,-0.9 2,-2v-5h2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/file_upload.xml b/qqq/android/mobileapp/src/main/res/drawable/file_upload.xml new file mode 100644 index 0000000..812aa20 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/file_upload.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/file/file_upload/materialicons/black/res/drawable/baseline_file_upload_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M9,16h6v-6h4l-7,-7 -7,7h4zM5,18h14v2L5,20z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/file_upload_off.xml b/qqq/android/mobileapp/src/main/res/drawable/file_upload_off.xml new file mode 100644 index 0000000..8788266 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/file_upload_off.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/file/file_upload_off/materialicons/black/res/drawable/baseline_file_upload_off_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M21.19,21.19l-18.38,-18.38l-1.42,1.41l4.7,4.69l-1.09,1.09l2.17,0l1.83,1.83l0,4.17l4.17,0l2,2l-10.17,0l0,2l12.17,0l2.61,2.61z" /> + <path + android:fillColor="#FF000000" + android:pathData="M15,10l4,0l-7,-7l-3.09,3.09l6.09,6.08z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/filter.xml b/qqq/android/mobileapp/src/main/res/drawable/filter.xml new file mode 100644 index 0000000..8d556ee --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/filter.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/filter/materialicons/black/res/drawable/baseline_filter_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M15.96,10.29l-2.75,3.54 -1.96,-2.36L8.5,15h11l-3.54,-4.71zM3,5L1,5v16c0,1.1 0.9,2 2,2h16v-2L3,21L3,5zM21,1L7,1c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2L23,3c0,-1.1 -0.9,-2 -2,-2zM21,17L7,17L7,3h14v14z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/filter_1.xml b/qqq/android/mobileapp/src/main/res/drawable/filter_1.xml new file mode 100644 index 0000000..d406ffa --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/filter_1.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/filter_1/materialicons/black/res/drawable/baseline_filter_1_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M3,5L1,5v16c0,1.1 0.9,2 2,2h16v-2L3,21L3,5zM14,15h2L16,5h-4v2h2v8zM21,1L7,1c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2L23,3c0,-1.1 -0.9,-2 -2,-2zM21,17L7,17L7,3h14v14z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/filter_2.xml b/qqq/android/mobileapp/src/main/res/drawable/filter_2.xml new file mode 100644 index 0000000..4f51db4 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/filter_2.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/filter_2/materialicons/black/res/drawable/baseline_filter_2_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M3,5L1,5v16c0,1.1 0.9,2 2,2h16v-2L3,21L3,5zM21,1L7,1c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2L23,3c0,-1.1 -0.9,-2 -2,-2zM21,17L7,17L7,3h14v14zM17,13h-4v-2h2c1.1,0 2,-0.89 2,-2L17,7c0,-1.11 -0.9,-2 -2,-2h-4v2h4v2h-2c-1.1,0 -2,0.89 -2,2v4h6v-2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/filter_3.xml b/qqq/android/mobileapp/src/main/res/drawable/filter_3.xml new file mode 100644 index 0000000..b9ba12a --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/filter_3.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/filter_3/materialicons/black/res/drawable/baseline_filter_3_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M21,1L7,1c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2L23,3c0,-1.1 -0.9,-2 -2,-2zM21,17L7,17L7,3h14v14zM3,5L1,5v16c0,1.1 0.9,2 2,2h16v-2L3,21L3,5zM17,13v-1.5c0,-0.83 -0.67,-1.5 -1.5,-1.5 0.83,0 1.5,-0.67 1.5,-1.5L17,7c0,-1.11 -0.9,-2 -2,-2h-4v2h4v2h-2v2h2v2h-4v2h4c1.1,0 2,-0.89 2,-2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/filter_4.xml b/qqq/android/mobileapp/src/main/res/drawable/filter_4.xml new file mode 100644 index 0000000..f259ecb --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/filter_4.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/filter_4/materialicons/black/res/drawable/baseline_filter_4_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M3,5L1,5v16c0,1.1 0.9,2 2,2h16v-2L3,21L3,5zM15,15h2L17,5h-2v4h-2L13,5h-2v6h4v4zM21,1L7,1c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2L23,3c0,-1.1 -0.9,-2 -2,-2zM21,17L7,17L7,3h14v14z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/filter_5.xml b/qqq/android/mobileapp/src/main/res/drawable/filter_5.xml new file mode 100644 index 0000000..7fb0575 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/filter_5.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/filter_5/materialicons/black/res/drawable/baseline_filter_5_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M21,1L7,1c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2L23,3c0,-1.1 -0.9,-2 -2,-2zM21,17L7,17L7,3h14v14zM3,5L1,5v16c0,1.1 0.9,2 2,2h16v-2L3,21L3,5zM17,13v-2c0,-1.11 -0.9,-2 -2,-2h-2L13,7h4L17,5h-6v6h4v2h-4v2h4c1.1,0 2,-0.89 2,-2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/filter_6.xml b/qqq/android/mobileapp/src/main/res/drawable/filter_6.xml new file mode 100644 index 0000000..cbdd2fb --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/filter_6.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/filter_6/materialicons/black/res/drawable/baseline_filter_6_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M3,5L1,5v16c0,1.1 0.9,2 2,2h16v-2L3,21L3,5zM21,1L7,1c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2L23,3c0,-1.1 -0.9,-2 -2,-2zM21,17L7,17L7,3h14v14zM13,15h2c1.1,0 2,-0.89 2,-2v-2c0,-1.11 -0.9,-2 -2,-2h-2L13,7h4L17,5h-4c-1.1,0 -2,0.89 -2,2v6c0,1.11 0.9,2 2,2zM13,11h2v2h-2v-2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/filter_7.xml b/qqq/android/mobileapp/src/main/res/drawable/filter_7.xml new file mode 100644 index 0000000..db2bde2 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/filter_7.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/filter_7/materialicons/black/res/drawable/baseline_filter_7_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M3,5L1,5v16c0,1.1 0.9,2 2,2h16v-2L3,21L3,5zM21,1L7,1c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2L23,3c0,-1.1 -0.9,-2 -2,-2zM21,17L7,17L7,3h14v14zM13,15l4,-8L17,5h-6v2h4l-4,8h2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/filter_8.xml b/qqq/android/mobileapp/src/main/res/drawable/filter_8.xml new file mode 100644 index 0000000..e021d40 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/filter_8.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/filter_8/materialicons/black/res/drawable/baseline_filter_8_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M3,5L1,5v16c0,1.1 0.9,2 2,2h16v-2L3,21L3,5zM21,1L7,1c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2L23,3c0,-1.1 -0.9,-2 -2,-2zM21,17L7,17L7,3h14v14zM13,15h2c1.1,0 2,-0.89 2,-2v-1.5c0,-0.83 -0.67,-1.5 -1.5,-1.5 0.83,0 1.5,-0.67 1.5,-1.5L17,7c0,-1.11 -0.9,-2 -2,-2h-2c-1.1,0 -2,0.89 -2,2v1.5c0,0.83 0.67,1.5 1.5,1.5 -0.83,0 -1.5,0.67 -1.5,1.5L11,13c0,1.11 0.9,2 2,2zM13,7h2v2h-2L13,7zM13,11h2v2h-2v-2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/filter_9.xml b/qqq/android/mobileapp/src/main/res/drawable/filter_9.xml new file mode 100644 index 0000000..6c4ce35 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/filter_9.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/filter_9/materialicons/black/res/drawable/baseline_filter_9_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M3,5L1,5v16c0,1.1 0.9,2 2,2h16v-2L3,21L3,5zM21,1L7,1c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2L23,3c0,-1.1 -0.9,-2 -2,-2zM21,17L7,17L7,3h14v14zM15,5h-2c-1.1,0 -2,0.89 -2,2v2c0,1.11 0.9,2 2,2h2v2h-4v2h4c1.1,0 2,-0.89 2,-2L17,7c0,-1.11 -0.9,-2 -2,-2zM15,9h-2L13,7h2v2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/filter_9_plus.xml b/qqq/android/mobileapp/src/main/res/drawable/filter_9_plus.xml new file mode 100644 index 0000000..b51f5ee --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/filter_9_plus.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/filter_9_plus/materialicons/black/res/drawable/baseline_filter_9_plus_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M3,5L1,5v16c0,1.1 0.9,2 2,2h16v-2L3,21L3,5zM14,12L14,8c0,-1.11 -0.9,-2 -2,-2h-1c-1.1,0 -2,0.89 -2,2v1c0,1.11 0.9,2 2,2h1v1L9,12v2h3c1.1,0 2,-0.89 2,-2zM11,9L11,8h1v1h-1zM21,1L7,1c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2L23,3c0,-1.1 -0.9,-2 -2,-2zM21,9h-2L19,7h-2v2h-2v2h2v2h2v-2h2v6L7,17L7,3h14v6z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/filter_alt.xml b/qqq/android/mobileapp/src/main/res/drawable/filter_alt.xml new file mode 100644 index 0000000..94621ae --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/filter_alt.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/filter_alt/materialicons/black/res/drawable/baseline_filter_alt_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M4.25,5.61C6.27,8.2 10,13 10,13v6c0,0.55 0.45,1 1,1h2c0.55,0 1,-0.45 1,-1v-6c0,0 3.72,-4.8 5.74,-7.39C20.25,4.95 19.78,4 18.95,4H5.04C4.21,4 3.74,4.95 4.25,5.61z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/filter_alt_off.xml b/qqq/android/mobileapp/src/main/res/drawable/filter_alt_off.xml new file mode 100644 index 0000000..0b9410d --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/filter_alt_off.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/filter_alt_off/materialicons/black/res/drawable/baseline_filter_alt_off_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19.79,5.61C20.3,4.95 19.83,4 19,4H6.83l7.97,7.97L19.79,5.61z" /> + <path + android:fillColor="#FF000000" + android:pathData="M2.81,2.81L1.39,4.22L10,13v6c0,0.55 0.45,1 1,1h2c0.55,0 1,-0.45 1,-1v-2.17l5.78,5.78l1.41,-1.41L2.81,2.81z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/filter_b_and_w.xml b/qqq/android/mobileapp/src/main/res/drawable/filter_b_and_w.xml new file mode 100644 index 0000000..26925fd --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/filter_b_and_w.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/filter_b_and_w/materialicons/black/res/drawable/baseline_filter_b_and_w_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19,3L5,3c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2L21,5c0,-1.1 -0.9,-2 -2,-2zM19,19l-7,-8v8L5,19l7,-8L12,5h7v14z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/filter_center_focus.xml b/qqq/android/mobileapp/src/main/res/drawable/filter_center_focus.xml new file mode 100644 index 0000000..28878f8 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/filter_center_focus.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/filter_center_focus/materialicons/black/res/drawable/baseline_filter_center_focus_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M5,15L3,15v4c0,1.1 0.9,2 2,2h4v-2L5,19v-4zM5,5h4L9,3L5,3c-1.1,0 -2,0.9 -2,2v4h2L5,5zM19,3h-4v2h4v4h2L21,5c0,-1.1 -0.9,-2 -2,-2zM19,19h-4v2h4c1.1,0 2,-0.9 2,-2v-4h-2v4zM12,9c-1.66,0 -3,1.34 -3,3s1.34,3 3,3 3,-1.34 3,-3 -1.34,-3 -3,-3z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/filter_drama.xml b/qqq/android/mobileapp/src/main/res/drawable/filter_drama.xml new file mode 100644 index 0000000..9c32853 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/filter_drama.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/filter_drama/materialicons/black/res/drawable/baseline_filter_drama_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19.35,10.04C18.67,6.59 15.64,4 12,4 9.11,4 6.61,5.64 5.36,8.04 2.35,8.36 0,10.9 0,14c0,3.31 2.69,6 6,6h13c2.76,0 5,-2.24 5,-5 0,-2.64 -2.05,-4.78 -4.65,-4.96zM19,18H6c-2.21,0 -4,-1.79 -4,-4s1.79,-4 4,-4 4,1.79 4,4h2c0,-2.76 -1.86,-5.08 -4.4,-5.78C8.61,6.88 10.2,6 12,6c3.03,0 5.5,2.47 5.5,5.5v0.5H19c1.65,0 3,1.35 3,3s-1.35,3 -3,3z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/filter_frames.xml b/qqq/android/mobileapp/src/main/res/drawable/filter_frames.xml new file mode 100644 index 0000000..f6fe428 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/filter_frames.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/filter_frames/materialicons/black/res/drawable/baseline_filter_frames_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,4h-4l-4,-4 -4,4L4,4c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2L22,6c0,-1.1 -0.9,-2 -2,-2zM20,20L4,20L4,6h4.52l3.52,-3.5L15.52,6L20,6v14zM18,8L6,8v10h12" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/filter_hdr.xml b/qqq/android/mobileapp/src/main/res/drawable/filter_hdr.xml new file mode 100644 index 0000000..61edeb4 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/filter_hdr.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/filter_hdr/materialicons/black/res/drawable/baseline_filter_hdr_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M14,6l-3.75,5 2.85,3.8 -1.6,1.2C9.81,13.75 7,10 7,10l-6,8h22L14,6z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/filter_list.xml b/qqq/android/mobileapp/src/main/res/drawable/filter_list.xml new file mode 100644 index 0000000..b9039e2 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/filter_list.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/content/filter_list/materialicons/black/res/drawable/baseline_filter_list_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M10,18h4v-2h-4v2zM3,6v2h18L21,6L3,6zM6,13h12v-2L6,11v2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/filter_list_alt.xml b/qqq/android/mobileapp/src/main/res/drawable/filter_list_alt.xml new file mode 100644 index 0000000..45a8b5e --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/filter_list_alt.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/filter_list_alt/materialicons/black/res/drawable/baseline_filter_list_alt_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M4.25,5.66c0.1,0.13 5.74,7.33 5.74,7.33V19c0,0.55 0.45,1 1.01,1h2.01c0.55,0 1.01,-0.45 1.01,-1v-6.02s5.49,-7.02 5.75,-7.34C20.03,5.32 20,5 20,5c0,-0.55 -0.45,-1 -1.01,-1H5.01C4.4,4 4,4.48 4,5c0,0.2 0.06,0.44 0.25,0.66z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/filter_list_off.xml b/qqq/android/mobileapp/src/main/res/drawable/filter_list_off.xml new file mode 100644 index 0000000..02d969e --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/filter_list_off.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/content/filter_list_off/materialicons/black/res/drawable/baseline_filter_list_off_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M10.83,8H21V6H8.83L10.83,8zM15.83,13H18v-2h-4.17L15.83,13zM14,16.83V18h-4v-2h3.17l-3,-3H6v-2h2.17l-3,-3H3V6h0.17L1.39,4.22l1.41,-1.41l18.38,18.38l-1.41,1.41L14,16.83z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/filter_none.xml b/qqq/android/mobileapp/src/main/res/drawable/filter_none.xml new file mode 100644 index 0000000..e29fdb1 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/filter_none.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/filter_none/materialicons/black/res/drawable/baseline_filter_none_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M3,5L1,5v16c0,1.1 0.9,2 2,2h16v-2L3,21L3,5zM21,1L7,1c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2L23,3c0,-1.1 -0.9,-2 -2,-2zM21,17L7,17L7,3h14v14z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/filter_tilt_shift.xml b/qqq/android/mobileapp/src/main/res/drawable/filter_tilt_shift.xml new file mode 100644 index 0000000..67fc309 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/filter_tilt_shift.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/filter_tilt_shift/materialicons/black/res/drawable/baseline_filter_tilt_shift_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M11,4.07L11,2.05c-2.01,0.2 -3.84,1 -5.32,2.21L7.1,5.69c1.11,-0.86 2.44,-1.44 3.9,-1.62zM18.32,4.26C16.84,3.05 15.01,2.25 13,2.05v2.02c1.46,0.18 2.79,0.76 3.9,1.62l1.42,-1.43zM19.93,11h2.02c-0.2,-2.01 -1,-3.84 -2.21,-5.32L18.31,7.1c0.86,1.11 1.44,2.44 1.62,3.9zM5.69,7.1L4.26,5.68C3.05,7.16 2.25,8.99 2.05,11h2.02c0.18,-1.46 0.76,-2.79 1.62,-3.9zM4.07,13L2.05,13c0.2,2.01 1,3.84 2.21,5.32l1.43,-1.43c-0.86,-1.1 -1.44,-2.43 -1.62,-3.89zM15,12c0,-1.66 -1.34,-3 -3,-3s-3,1.34 -3,3 1.34,3 3,3 3,-1.34 3,-3zM18.31,16.9l1.43,1.43c1.21,-1.48 2.01,-3.32 2.21,-5.32h-2.02c-0.18,1.45 -0.76,2.78 -1.62,3.89zM13,19.93v2.02c2.01,-0.2 3.84,-1 5.32,-2.21l-1.43,-1.43c-1.1,0.86 -2.43,1.44 -3.89,1.62zM5.68,19.74C7.16,20.95 9,21.75 11,21.95v-2.02c-1.46,-0.18 -2.79,-0.76 -3.9,-1.62l-1.42,1.43z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/filter_vintage.xml b/qqq/android/mobileapp/src/main/res/drawable/filter_vintage.xml new file mode 100644 index 0000000..6acdab4 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/filter_vintage.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/filter_vintage/materialicons/black/res/drawable/baseline_filter_vintage_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M18.7,12.4c-0.28,-0.16 -0.57,-0.29 -0.86,-0.4 0.29,-0.11 0.58,-0.24 0.86,-0.4 1.92,-1.11 2.99,-3.12 3,-5.19 -1.79,-1.03 -4.07,-1.11 -6,0 -0.28,0.16 -0.54,0.35 -0.78,0.54 0.05,-0.31 0.08,-0.63 0.08,-0.95 0,-2.22 -1.21,-4.15 -3,-5.19C10.21,1.85 9,3.78 9,6c0,0.32 0.03,0.64 0.08,0.95 -0.24,-0.2 -0.5,-0.39 -0.78,-0.55 -1.92,-1.11 -4.2,-1.03 -6,0 0,2.07 1.07,4.08 3,5.19 0.28,0.16 0.57,0.29 0.86,0.4 -0.29,0.11 -0.58,0.24 -0.86,0.4 -1.92,1.11 -2.99,3.12 -3,5.19 1.79,1.03 4.07,1.11 6,0 0.28,-0.16 0.54,-0.35 0.78,-0.54 -0.05,0.32 -0.08,0.64 -0.08,0.96 0,2.22 1.21,4.15 3,5.19 1.79,-1.04 3,-2.97 3,-5.19 0,-0.32 -0.03,-0.64 -0.08,-0.95 0.24,0.2 0.5,0.38 0.78,0.54 1.92,1.11 4.2,1.03 6,0 -0.01,-2.07 -1.08,-4.08 -3,-5.19zM12,16c-2.21,0 -4,-1.79 -4,-4s1.79,-4 4,-4 4,1.79 4,4 -1.79,4 -4,4z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/find_in_page.xml b/qqq/android/mobileapp/src/main/res/drawable/find_in_page.xml new file mode 100644 index 0000000..866f068 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/find_in_page.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/find_in_page/materialicons/black/res/drawable/baseline_find_in_page_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,19.59V8l-6,-6H6c-1.1,0 -1.99,0.9 -1.99,2L4,20c0,1.1 0.89,2 1.99,2H18c0.45,0 0.85,-0.15 1.19,-0.4l-4.43,-4.43c-0.8,0.52 -1.74,0.83 -2.76,0.83 -2.76,0 -5,-2.24 -5,-5s2.24,-5 5,-5 5,2.24 5,5c0,1.02 -0.31,1.96 -0.83,2.75L20,19.59zM9,13c0,1.66 1.34,3 3,3s3,-1.34 3,-3 -1.34,-3 -3,-3 -3,1.34 -3,3z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/find_replace.xml b/qqq/android/mobileapp/src/main/res/drawable/find_replace.xml new file mode 100644 index 0000000..0bb542d --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/find_replace.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/find_replace/materialicons/black/res/drawable/baseline_find_replace_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M11,6c1.38,0 2.63,0.56 3.54,1.46L12,10h6L18,4l-2.05,2.05C14.68,4.78 12.93,4 11,4c-3.53,0 -6.43,2.61 -6.92,6L6.1,10c0.46,-2.28 2.48,-4 4.9,-4zM16.64,15.14c0.66,-0.9 1.12,-1.97 1.28,-3.14L15.9,12c-0.46,2.28 -2.48,4 -4.9,4 -1.38,0 -2.63,-0.56 -3.54,-1.46L10,12L4,12v6l2.05,-2.05C7.32,17.22 9.07,18 11,18c1.55,0 2.98,-0.51 4.14,-1.36L20,21.49 21.49,20l-4.85,-4.86z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/fingerprint.xml b/qqq/android/mobileapp/src/main/res/drawable/fingerprint.xml new file mode 100644 index 0000000..a0db42b --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/fingerprint.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/fingerprint/materialicons/black/res/drawable/baseline_fingerprint_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M17.81,4.47c-0.08,0 -0.16,-0.02 -0.23,-0.06C15.66,3.42 14,3 12.01,3c-1.98,0 -3.86,0.47 -5.57,1.41 -0.24,0.13 -0.54,0.04 -0.68,-0.2 -0.13,-0.24 -0.04,-0.55 0.2,-0.68C7.82,2.52 9.86,2 12.01,2c2.13,0 3.99,0.47 6.03,1.52 0.25,0.13 0.34,0.43 0.21,0.67 -0.09,0.18 -0.26,0.28 -0.44,0.28zM3.5,9.72c-0.1,0 -0.2,-0.03 -0.29,-0.09 -0.23,-0.16 -0.28,-0.47 -0.12,-0.7 0.99,-1.4 2.25,-2.5 3.75,-3.27C9.98,4.04 14,4.03 17.15,5.65c1.5,0.77 2.76,1.86 3.75,3.25 0.16,0.22 0.11,0.54 -0.12,0.7 -0.23,0.16 -0.54,0.11 -0.7,-0.12 -0.9,-1.26 -2.04,-2.25 -3.39,-2.94 -2.87,-1.47 -6.54,-1.47 -9.4,0.01 -1.36,0.7 -2.5,1.7 -3.4,2.96 -0.08,0.14 -0.23,0.21 -0.39,0.21zM9.75,21.79c-0.13,0 -0.26,-0.05 -0.35,-0.15 -0.87,-0.87 -1.34,-1.43 -2.01,-2.64 -0.69,-1.23 -1.05,-2.73 -1.05,-4.34 0,-2.97 2.54,-5.39 5.66,-5.39s5.66,2.42 5.66,5.39c0,0.28 -0.22,0.5 -0.5,0.5s-0.5,-0.22 -0.5,-0.5c0,-2.42 -2.09,-4.39 -4.66,-4.39 -2.57,0 -4.66,1.97 -4.66,4.39 0,1.44 0.32,2.77 0.93,3.85 0.64,1.15 1.08,1.64 1.85,2.42 0.19,0.2 0.19,0.51 0,0.71 -0.11,0.1 -0.24,0.15 -0.37,0.15zM16.92,19.94c-1.19,0 -2.24,-0.3 -3.1,-0.89 -1.49,-1.01 -2.38,-2.65 -2.38,-4.39 0,-0.28 0.22,-0.5 0.5,-0.5s0.5,0.22 0.5,0.5c0,1.41 0.72,2.74 1.94,3.56 0.71,0.48 1.54,0.71 2.54,0.71 0.24,0 0.64,-0.03 1.04,-0.1 0.27,-0.05 0.53,0.13 0.58,0.41 0.05,0.27 -0.13,0.53 -0.41,0.58 -0.57,0.11 -1.07,0.12 -1.21,0.12zM14.91,22c-0.04,0 -0.09,-0.01 -0.13,-0.02 -1.59,-0.44 -2.63,-1.03 -3.72,-2.1 -1.4,-1.39 -2.17,-3.24 -2.17,-5.22 0,-1.62 1.38,-2.94 3.08,-2.94 1.7,0 3.08,1.32 3.08,2.94 0,1.07 0.93,1.94 2.08,1.94s2.08,-0.87 2.08,-1.94c0,-3.77 -3.25,-6.83 -7.25,-6.83 -2.84,0 -5.44,1.58 -6.61,4.03 -0.39,0.81 -0.59,1.76 -0.59,2.8 0,0.78 0.07,2.01 0.67,3.61 0.1,0.26 -0.03,0.55 -0.29,0.64 -0.26,0.1 -0.55,-0.04 -0.64,-0.29 -0.49,-1.31 -0.73,-2.61 -0.73,-3.96 0,-1.2 0.23,-2.29 0.68,-3.24 1.33,-2.79 4.28,-4.6 7.51,-4.6 4.55,0 8.25,3.51 8.25,7.83 0,1.62 -1.38,2.94 -3.08,2.94s-3.08,-1.32 -3.08,-2.94c0,-1.07 -0.93,-1.94 -2.08,-1.94s-2.08,0.87 -2.08,1.94c0,1.71 0.66,3.31 1.87,4.51 0.95,0.94 1.86,1.46 3.27,1.85 0.27,0.07 0.42,0.35 0.35,0.61 -0.05,0.23 -0.26,0.38 -0.47,0.38z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/fire_extinguisher.xml b/qqq/android/mobileapp/src/main/res/drawable/fire_extinguisher.xml new file mode 100644 index 0000000..5d2e8af --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/fire_extinguisher.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/places/fire_extinguisher/materialicons/black/res/drawable/baseline_fire_extinguisher_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M7,19h10v1c0,1.1 -0.9,2 -2,2H9c-1.1,0 -2,-0.9 -2,-2V19zM7,18h10v-5H7V18zM17,3v6l-3.15,-0.66c-0.01,0 -0.01,0.01 -0.02,0.02c1.55,0.62 2.72,1.98 3.07,3.64H7.1c0.34,-1.66 1.52,-3.02 3.07,-3.64c-0.33,-0.26 -0.6,-0.58 -0.8,-0.95L5,6.5v-1l4.37,-0.91C9.87,3.65 10.86,3 12,3c0.7,0 1.34,0.25 1.85,0.66L17,3zM13,6c-0.03,-0.59 -0.45,-1 -1,-1s-1,0.45 -1,1s0.45,1 1,1S13,6.55 13,6z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/fire_hydrant_alt.xml b/qqq/android/mobileapp/src/main/res/drawable/fire_hydrant_alt.xml new file mode 100644 index 0000000..26fb089 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/fire_hydrant_alt.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/fire_hydrant_alt/materialicons/black/res/drawable/baseline_fire_hydrant_alt_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19,11h-1V8h2V6h-2.35C16.83,3.67 14.61,2 12,2S7.17,3.67 6.35,6H4v2h2v3H5c-1.1,0 -2,0.9 -2,2v2c0,1.1 0.9,2 2,2h1v3H4v2h16v-2h-2v-3h1c1.1,0 2,-0.9 2,-2v-2C21,11.9 20.1,11 19,11zM12,17.5c-1.93,0 -3.5,-1.57 -3.5,-3.5s1.57,-3.5 3.5,-3.5s3.5,1.57 3.5,3.5S13.93,17.5 12,17.5z" /> + <path + android:fillColor="#FF000000" + android:pathData="M12,14m-1.5,0a1.5,1.5 0,1 1,3 0a1.5,1.5 0,1 1,-3 0" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/fire_truck.xml b/qqq/android/mobileapp/src/main/res/drawable/fire_truck.xml new file mode 100644 index 0000000..0f8682f --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/fire_truck.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/fire_truck/materialicons/black/res/drawable/baseline_fire_truck_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M22.9,10.69l-1.44,-4.32C21.18,5.55 20.42,5 19.56,5H19V4c0,-0.55 -0.45,-1 -1,-1h-1c-0.55,0 -1,0.45 -1,1v1h-2c-1.1,0 -2,0.9 -2,2v4H1v5c0,1.1 0.9,2 2,2h1c0,1.66 1.34,3 3,3s3,-1.34 3,-3h4c0,1.66 1.34,3 3,3s3,-1.34 3,-3h3v-6.68C23,11.11 22.97,10.9 22.9,10.69zM7,19c-0.55,0 -1,-0.45 -1,-1s0.45,-1 1,-1s1,0.45 1,1S7.55,19 7,19zM17,19c-0.55,0 -1,-0.45 -1,-1s0.45,-1 1,-1s1,0.45 1,1S17.55,19 17,19zM14,11V7h5.56l1.33,4H14z" /> + <path + android:fillColor="#FF000000" + android:pathData="M11,8.5h-1v-2h1V5H1v1.5h1v2H1V10h10V8.5zM5.25,8.5H3.5v-2h1.75V8.5zM8.5,8.5H6.75v-2H8.5V8.5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/fireplace.xml b/qqq/android/mobileapp/src/main/res/drawable/fireplace.xml new file mode 100644 index 0000000..d545021 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/fireplace.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/fireplace/materialicons/black/res/drawable/baseline_fireplace_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M2,2v20h20V2H2zM11.86,16.96c0.76,-0.24 1.4,-1.04 1.53,-1.63c0.13,-0.56 -0.1,-1.05 -0.2,-1.6c-0.08,-0.46 -0.07,-0.85 0.08,-1.28c0.54,1.21 2.15,1.64 1.98,3.18C15.06,17.33 13.14,18.01 11.86,16.96zM20,20h-2v-2h-2.02c0.63,-0.84 1.02,-1.87 1.02,-3c0,-1.89 -1.09,-2.85 -1.85,-3.37C12.2,9.61 13,7 13,7c-6.73,3.57 -6.02,7.47 -6,8c0.03,0.96 0.49,2.07 1.23,3H6v2H4V4h16V20z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/first_page.xml b/qqq/android/mobileapp/src/main/res/drawable/first_page.xml new file mode 100644 index 0000000..cf93f41 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/first_page.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/navigation/first_page/materialicons/black/res/drawable/baseline_first_page_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M18.41,16.59L13.82,12l4.59,-4.59L17,6l-6,6 6,6zM6,6h2v12H6z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/fit_screen.xml b/qqq/android/mobileapp/src/main/res/drawable/fit_screen.xml new file mode 100644 index 0000000..57a503f --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/fit_screen.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/fit_screen/materialicons/black/res/drawable/baseline_fit_screen_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M17,4h3c1.1,0 2,0.9 2,2v2h-2L20,6h-3L17,4zM4,8L4,6h3L7,4L4,4c-1.1,0 -2,0.9 -2,2v2h2zM20,16v2h-3v2h3c1.1,0 2,-0.9 2,-2v-2h-2zM7,18L4,18v-2L2,16v2c0,1.1 0.9,2 2,2h3v-2zM18,8L6,8v8h12L18,8z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/fitbit.xml b/qqq/android/mobileapp/src/main/res/drawable/fitbit.xml new file mode 100644 index 0000000..692800c --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/fitbit.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/fitbit/materialicons/black/res/drawable/baseline_fitbit_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19.89,13.89c1.04,0 1.89,-0.85 1.89,-1.89s-0.85,-1.89 -1.89,-1.89C18.85,10.11 18,10.96 18,12S18.85,13.89 19.89,13.89zM15.65,13.68c0.93,0 1.68,-0.75 1.68,-1.68s-0.75,-1.68 -1.68,-1.68c-0.93,0 -1.68,0.75 -1.68,1.68S14.72,13.68 15.65,13.68zM15.65,9.42c0.93,0 1.68,-0.75 1.68,-1.68c0,-0.93 -0.75,-1.68 -1.68,-1.68c-0.93,0 -1.68,0.75 -1.68,1.68C13.97,8.67 14.72,9.42 15.65,9.42zM15.65,17.93c0.93,0 1.68,-0.75 1.68,-1.68c0,-0.93 -0.75,-1.68 -1.68,-1.68c-0.93,0 -1.68,0.75 -1.68,1.68C13.97,17.17 14.72,17.93 15.65,17.93zM11.41,13.47c0.81,0 1.47,-0.66 1.47,-1.47s-0.66,-1.47 -1.47,-1.47c-0.81,0 -1.47,0.66 -1.47,1.47S10.59,13.47 11.41,13.47zM11.41,9.21c0.81,0 1.47,-0.66 1.47,-1.47s-0.66,-1.47 -1.47,-1.47c-0.81,0 -1.47,0.66 -1.47,1.47S10.59,9.21 11.41,9.21zM11.41,17.73c0.81,0 1.47,-0.66 1.47,-1.47c0,-0.81 -0.66,-1.47 -1.47,-1.47c-0.81,0 -1.47,0.66 -1.47,1.47C9.93,17.07 10.59,17.73 11.41,17.73zM11.41,22c0.81,0 1.47,-0.66 1.47,-1.47c0,-0.81 -0.66,-1.47 -1.47,-1.47c-0.81,0 -1.47,0.66 -1.47,1.47C9.93,21.34 10.59,22 11.41,22zM11.41,4.94c0.81,0 1.47,-0.66 1.47,-1.47S12.22,2 11.41,2c-0.81,0 -1.47,0.66 -1.47,1.47S10.59,4.94 11.41,4.94zM7.16,13.26c0.7,0 1.26,-0.57 1.26,-1.26s-0.57,-1.26 -1.26,-1.26c-0.7,0 -1.26,0.57 -1.26,1.26S6.46,13.26 7.16,13.26zM7.16,17.51c0.7,0 1.26,-0.57 1.26,-1.26c0,-0.7 -0.57,-1.26 -1.26,-1.26c-0.7,0 -1.26,0.57 -1.26,1.26C5.9,16.94 6.46,17.51 7.16,17.51zM7.16,9.02c0.7,0 1.26,-0.57 1.26,-1.26c0,-0.7 -0.57,-1.26 -1.26,-1.26c-0.7,0 -1.26,0.57 -1.26,1.26C5.9,8.45 6.46,9.02 7.16,9.02zM3.29,13.05c0.58,0 1.05,-0.47 1.05,-1.05s-0.47,-1.05 -1.05,-1.05c-0.58,0 -1.05,0.47 -1.05,1.05S2.71,13.05 3.29,13.05z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/fitness_center.xml b/qqq/android/mobileapp/src/main/res/drawable/fitness_center.xml new file mode 100644 index 0000000..cab07c1 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/fitness_center.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/places/fitness_center/materialicons/black/res/drawable/baseline_fitness_center_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20.57,14.86L22,13.43 20.57,12 17,15.57 8.43,7 12,3.43 10.57,2 9.14,3.43 7.71,2 5.57,4.14 4.14,2.71 2.71,4.14l1.43,1.43L2,7.71l1.43,1.43L2,10.57 3.43,12 7,8.43 15.57,17 12,20.57 13.43,22l1.43,-1.43L16.29,22l2.14,-2.14 1.43,1.43 1.43,-1.43 -1.43,-1.43L22,16.29z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/flag.xml b/qqq/android/mobileapp/src/main/res/drawable/flag.xml new file mode 100644 index 0000000..4e13b7a --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/flag.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/content/flag/materialicons/black/res/drawable/baseline_flag_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M14.4,6L14,4H5v17h2v-7h5.6l0.4,2h7V6z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/flag_circle.xml b/qqq/android/mobileapp/src/main/res/drawable/flag_circle.xml new file mode 100644 index 0000000..7267b64 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/flag_circle.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/content/flag_circle/materialicons/black/res/drawable/baseline_flag_circle_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,2C6.48,2 2,6.48 2,12c0,5.52 4.48,10 10,10s10,-4.48 10,-10C22,6.48 17.52,2 12,2zM18,15h-5l-1,-2H9.5v5H8V7h6l1,2h3V15z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/flaky.xml b/qqq/android/mobileapp/src/main/res/drawable/flaky.xml new file mode 100644 index 0000000..53e020e --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/flaky.xml @@ -0,0 +1,20 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/flaky/materialicons/black/res/drawable/baseline_flaky_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M14.05,17.58l-0.01,0.01l-2.4,-2.4l1.06,-1.06l1.35,1.35L16.54,13l1.06,1.06l-3.54,3.54L14.05,17.58zM12,2C6.5,2 2,6.5 2,12s4.5,10 10,10s10,-4.5 10,-10S17.5,2 12,2zM7.34,6.28l1.41,1.41l1.41,-1.41l1.06,1.06L9.81,8.75l1.41,1.41l-1.06,1.06L8.75,9.81l-1.41,1.41l-1.06,-1.06l1.41,-1.41L6.28,7.34L7.34,6.28zM12,20c-2.2,0 -4.2,-0.9 -5.7,-2.3L17.7,6.3C19.1,7.8 20,9.8 20,12C20,16.4 16.4,20 12,20z" + android:fillType="evenOdd" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/flare.xml b/qqq/android/mobileapp/src/main/res/drawable/flare.xml new file mode 100644 index 0000000..26639d4 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/flare.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/flare/materialicons/black/res/drawable/baseline_flare_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M7,11L1,11v2h6v-2zM9.17,7.76L7.05,5.64 5.64,7.05l2.12,2.12 1.41,-1.41zM13,1h-2v6h2L13,1zM18.36,7.05l-1.41,-1.41 -2.12,2.12 1.41,1.41 2.12,-2.12zM17,11v2h6v-2h-6zM12,9c-1.66,0 -3,1.34 -3,3s1.34,3 3,3 3,-1.34 3,-3 -1.34,-3 -3,-3zM14.83,16.24l2.12,2.12 1.41,-1.41 -2.12,-2.12 -1.41,1.41zM5.64,16.95l1.41,1.41 2.12,-2.12 -1.41,-1.41 -2.12,2.12zM11,23h2v-6h-2v6z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/flash_auto.xml b/qqq/android/mobileapp/src/main/res/drawable/flash_auto.xml new file mode 100644 index 0000000..6a1669f --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/flash_auto.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/flash_auto/materialicons/black/res/drawable/baseline_flash_auto_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M3,2v12h3v9l7,-12L9,11l4,-9L3,2zM19,2h-2l-3.2,9h1.9l0.7,-2h3.2l0.7,2h1.9L19,2zM16.85,7.65L18,4l1.15,3.65h-2.3z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/flash_off.xml b/qqq/android/mobileapp/src/main/res/drawable/flash_off.xml new file mode 100644 index 0000000..065f1a2 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/flash_off.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/flash_off/materialicons/black/res/drawable/baseline_flash_off_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M3.27,3L2,4.27l5,5V13h3v9l3.58,-6.14L17.73,20 19,18.73 3.27,3zM17,10h-4l4,-8H7v2.18l8.46,8.46L17,10z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/flash_on.xml b/qqq/android/mobileapp/src/main/res/drawable/flash_on.xml new file mode 100644 index 0000000..c4f2084 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/flash_on.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/flash_on/materialicons/black/res/drawable/baseline_flash_on_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M7,2v11h3v9l7,-12h-4l4,-8z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/flashlight_off.xml b/qqq/android/mobileapp/src/main/res/drawable/flashlight_off.xml new file mode 100644 index 0000000..c6d34a7 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/flashlight_off.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/flashlight_off/materialicons/black/res/drawable/baseline_flashlight_off_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M18,5l0,-3l-12,0l0,1.17l1.83,1.83z" /> + <path + android:fillColor="#FF000000" + android:pathData="M16,11l2,-3l0,-1l-8.17,0l6.17,6.17z" /> + <path + android:fillColor="#FF000000" + android:pathData="M2.81,2.81L1.39,4.22L8,10.83V22h8v-3.17l3.78,3.78l1.41,-1.41L2.81,2.81z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/flashlight_on.xml b/qqq/android/mobileapp/src/main/res/drawable/flashlight_on.xml new file mode 100644 index 0000000..cc17472 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/flashlight_on.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/flashlight_on/materialicons/black/res/drawable/baseline_flashlight_on_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M6,2h12v3h-12z" /> + <path + android:fillColor="#FF000000" + android:pathData="M6,7v1l2,3v11h8V11l2,-3V7H6zM12,15.5c-0.83,0 -1.5,-0.67 -1.5,-1.5s0.67,-1.5 1.5,-1.5s1.5,0.67 1.5,1.5S12.83,15.5 12,15.5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/flatware.xml b/qqq/android/mobileapp/src/main/res/drawable/flatware.xml new file mode 100644 index 0000000..21dca45 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/flatware.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/search/flatware/materialicons/black/res/drawable/baseline_flatware_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M16,7.08c0,1.77 -0.84,3.25 -2,3.82V21h-2V10.9c-1.16,-0.57 -2,-2.05 -2,-3.82C10.01,4.83 11.35,3 13,3C14.66,3 16,4.83 16,7.08zM17,3v18h2v-8h2V7C21,5.24 19.76,3 17,3zM8.28,3c-0.4,0 -0.72,0.32 -0.72,0.72V7H6.72V3.72C6.72,3.32 6.4,3 6,3S5.28,3.32 5.28,3.72V7H4.44V3.72C4.44,3.32 4.12,3 3.72,3S3,3.32 3,3.72V9c0,1.1 0.9,2 2,2v10h2V11c1.1,0 2,-0.9 2,-2V3.72C9,3.32 8.68,3 8.28,3z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/flight.xml b/qqq/android/mobileapp/src/main/res/drawable/flight.xml new file mode 100644 index 0000000..5d13a84 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/flight.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/flight/materialicons/black/res/drawable/baseline_flight_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M21,16v-2l-8,-5V3.5c0,-0.83 -0.67,-1.5 -1.5,-1.5S10,2.67 10,3.5V9l-8,5v2l8,-2.5V19l-2,1.5V22l3.5,-1 3.5,1v-1.5L13,19v-5.5l8,2.5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/flight_class.xml b/qqq/android/mobileapp/src/main/res/drawable/flight_class.xml new file mode 100644 index 0000000..7c3abcf --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/flight_class.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/flight_class/materialicons/black/res/drawable/baseline_flight_class_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M16,4h-2c-1.1,0 -2,0.9 -2,2v5c0,1.1 0.9,2 2,2h2c1.1,0 2,-0.9 2,-2V6C18,4.9 17.1,4 16,4zM9.5,16H18v2H9.49c-0.88,0 -1.66,-0.58 -1.92,-1.43L5,8V4h2v4L9.5,16zM8,19h10v2H8V19z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/flight_land.xml b/qqq/android/mobileapp/src/main/res/drawable/flight_land.xml new file mode 100644 index 0000000..e7a042c --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/flight_land.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/flight_land/materialicons/black/res/drawable/baseline_flight_land_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M2.5,19h19v2h-19V19zM19.34,15.85c0.8,0.21 1.62,-0.26 1.84,-1.06c0.21,-0.8 -0.26,-1.62 -1.06,-1.84l-5.31,-1.42l-2.76,-9.02L10.12,2v8.28L5.15,8.95L4.22,6.63L2.77,6.24v5.17L19.34,15.85z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/flight_takeoff.xml b/qqq/android/mobileapp/src/main/res/drawable/flight_takeoff.xml new file mode 100644 index 0000000..cbe358f --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/flight_takeoff.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/flight_takeoff/materialicons/black/res/drawable/baseline_flight_takeoff_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M2.5,19h19v2h-19V19zM22.07,9.64c-0.21,-0.8 -1.04,-1.28 -1.84,-1.06L14.92,10l-6.9,-6.43L6.09,4.08l4.14,7.17l-4.97,1.33l-1.97,-1.54l-1.45,0.39l2.59,4.49c0,0 7.12,-1.9 16.57,-4.43C21.81,11.26 22.28,10.44 22.07,9.64z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/flip.xml b/qqq/android/mobileapp/src/main/res/drawable/flip.xml new file mode 100644 index 0000000..e5fe18f --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/flip.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/flip/materialicons/black/res/drawable/baseline_flip_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M15,21h2v-2h-2v2zM19,9h2L21,7h-2v2zM3,5v14c0,1.1 0.9,2 2,2h4v-2L5,19L5,5h4L9,3L5,3c-1.1,0 -2,0.9 -2,2zM19,3v2h2c0,-1.1 -0.9,-2 -2,-2zM11,23h2L13,1h-2v22zM19,17h2v-2h-2v2zM15,5h2L17,3h-2v2zM19,13h2v-2h-2v2zM19,21c1.1,0 2,-0.9 2,-2h-2v2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/flip_camera_android.xml b/qqq/android/mobileapp/src/main/res/drawable/flip_camera_android.xml new file mode 100644 index 0000000..7cbaae1 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/flip_camera_android.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/flip_camera_android/materialicons/black/res/drawable/baseline_flip_camera_android_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M9,12c0,1.66 1.34,3 3,3s3,-1.34 3,-3s-1.34,-3 -3,-3S9,10.34 9,12z" /> + <path + android:fillColor="#FF000000" + android:pathData="M8,10V8H5.09C6.47,5.61 9.05,4 12,4c3.72,0 6.85,2.56 7.74,6h2.06c-0.93,-4.56 -4.96,-8 -9.8,-8C8.73,2 5.82,3.58 4,6.01V4H2v6H8z" /> + <path + android:fillColor="#FF000000" + android:pathData="M16,14v2h2.91c-1.38,2.39 -3.96,4 -6.91,4c-3.72,0 -6.85,-2.56 -7.74,-6H2.2c0.93,4.56 4.96,8 9.8,8c3.27,0 6.18,-1.58 8,-4.01V20h2v-6H16z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/flip_camera_ios.xml b/qqq/android/mobileapp/src/main/res/drawable/flip_camera_ios.xml new file mode 100644 index 0000000..99bf5ae --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/flip_camera_ios.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/flip_camera_ios/materialicons/black/res/drawable/baseline_flip_camera_ios_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,5h-3.17L15,3H9L7.17,5H4C2.9,5 2,5.9 2,7v12c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2V7C22,5.9 21.1,5 20,5zM12,18c-2.76,0 -5,-2.24 -5,-5H5l2.5,-2.5L10,13H8c0,2.21 1.79,4 4,4c0.58,0 1.13,-0.13 1.62,-0.35l0.74,0.74C13.65,17.76 12.86,18 12,18zM16.5,15.5L14,13h2c0,-2.21 -1.79,-4 -4,-4c-0.58,0 -1.13,0.13 -1.62,0.35L9.64,8.62C10.35,8.24 11.14,8 12,8c2.76,0 5,2.24 5,5h2L16.5,15.5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/flip_to_back.xml b/qqq/android/mobileapp/src/main/res/drawable/flip_to_back.xml new file mode 100644 index 0000000..7c1ec95 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/flip_to_back.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/flip_to_back/materialicons/black/res/drawable/baseline_flip_to_back_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M9,7L7,7v2h2L9,7zM9,11L7,11v2h2v-2zM9,3c-1.11,0 -2,0.9 -2,2h2L9,3zM13,15h-2v2h2v-2zM19,3v2h2c0,-1.1 -0.9,-2 -2,-2zM13,3h-2v2h2L13,3zM9,17v-2L7,15c0,1.1 0.89,2 2,2zM19,13h2v-2h-2v2zM19,9h2L21,7h-2v2zM19,17c1.1,0 2,-0.9 2,-2h-2v2zM5,7L3,7v12c0,1.1 0.89,2 2,2h12v-2L5,19L5,7zM15,5h2L17,3h-2v2zM15,17h2v-2h-2v2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/flip_to_front.xml b/qqq/android/mobileapp/src/main/res/drawable/flip_to_front.xml new file mode 100644 index 0000000..9bd9157 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/flip_to_front.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/flip_to_front/materialicons/black/res/drawable/baseline_flip_to_front_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M3,13h2v-2L3,11v2zM3,17h2v-2L3,15v2zM5,21v-2L3,19c0,1.1 0.89,2 2,2zM3,9h2L5,7L3,7v2zM15,21h2v-2h-2v2zM19,3L9,3c-1.11,0 -2,0.9 -2,2v10c0,1.1 0.89,2 2,2h10c1.1,0 2,-0.9 2,-2L21,5c0,-1.1 -0.9,-2 -2,-2zM19,15L9,15L9,5h10v10zM11,21h2v-2h-2v2zM7,21h2v-2L7,19v2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/flood.xml b/qqq/android/mobileapp/src/main/res/drawable/flood.xml new file mode 100644 index 0000000..51bb8d5 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/flood.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/flood/materialicons/black/res/drawable/baseline_flood_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M18.67,19c-1.95,0 -2.09,1 -3.33,1c-1.19,0 -1.42,-1 -3.33,-1c-1.95,0 -2.1,1 -3.34,1c-1.24,0 -1.38,-1 -3.33,-1c-1.95,0 -2.1,1 -3.34,1v2c1.95,0 2.11,-1 3.34,-1c1.24,0 1.38,1 3.33,1c1.95,0 2.1,-1 3.34,-1c1.22,0 1.4,1 3.33,1c1.93,0 2.1,-1 3.33,-1c1.22,0 1.4,1 3.33,1v-2C20.76,20 20.62,19 18.67,19z" /> + <path + android:fillColor="#FF000000" + android:pathData="M8.68,17.5c1.95,0 2.09,-1 3.33,-1c1.19,0 1.42,1 3.33,1c1.95,0 2.09,-1 3.33,-1c1.19,0 1.4,0.98 3.31,1v-2c-0.63,0 -1,-0.28 -1.48,-0.55l-2.02,-7.53l2.09,0.85l0.74,-1.86L9.78,2L2,11.61l1.57,1.23l1.39,-1.78l0.93,3.48c-0.18,-0.02 -0.35,-0.05 -0.56,-0.05c-1.95,0 -2.09,1 -3.33,1v2c1.9,0 2.17,-1 3.35,-1C6.54,16.5 6.77,17.5 8.68,17.5zM14.04,10.18l1.42,5.31c-1.34,0.09 -1.47,-0.99 -3.47,-0.99c-0.36,0 -0.65,0.04 -0.91,0.1l-0.91,-3.39L14.04,10.18z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/flourescent.xml b/qqq/android/mobileapp/src/main/res/drawable/flourescent.xml new file mode 100644 index 0000000..d7549a0 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/flourescent.xml @@ -0,0 +1,37 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/fluorescent/materialicons/black/res/drawable/baseline_fluorescent_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M5,9h14v6h-14z" /> + <path + android:fillColor="#FF000000" + android:pathData="M11,2h2v3h-2z" /> + <path + android:fillColor="#FF000000" + android:pathData="M17.286,6.399l1.79,-1.802l1.419,1.409l-1.79,1.802z" /> + <path + android:fillColor="#FF000000" + android:pathData="M11,19h2v3h-2z" /> + <path + android:fillColor="#FF000000" + android:pathData="M17.29,17.71l1.79,1.8l1.42,-1.42l-1.8,-1.79z" /> + <path + android:fillColor="#FF000000" + android:pathData="M3.495,6.009l1.407,-1.407l1.789,1.789l-1.407,1.407z" /> + <path + android:fillColor="#FF000000" + android:pathData="M3.492,18.076l1.802,-1.79l1.409,1.419l-1.802,1.79z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/fluorescent.xml b/qqq/android/mobileapp/src/main/res/drawable/fluorescent.xml new file mode 100644 index 0000000..d7549a0 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/fluorescent.xml @@ -0,0 +1,37 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/fluorescent/materialicons/black/res/drawable/baseline_fluorescent_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M5,9h14v6h-14z" /> + <path + android:fillColor="#FF000000" + android:pathData="M11,2h2v3h-2z" /> + <path + android:fillColor="#FF000000" + android:pathData="M17.286,6.399l1.79,-1.802l1.419,1.409l-1.79,1.802z" /> + <path + android:fillColor="#FF000000" + android:pathData="M11,19h2v3h-2z" /> + <path + android:fillColor="#FF000000" + android:pathData="M17.29,17.71l1.79,1.8l1.42,-1.42l-1.8,-1.79z" /> + <path + android:fillColor="#FF000000" + android:pathData="M3.495,6.009l1.407,-1.407l1.789,1.789l-1.407,1.407z" /> + <path + android:fillColor="#FF000000" + android:pathData="M3.492,18.076l1.802,-1.79l1.409,1.419l-1.802,1.79z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/flutter_dash.xml b/qqq/android/mobileapp/src/main/res/drawable/flutter_dash.xml new file mode 100644 index 0000000..74b331d --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/flutter_dash.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/flutter_dash/materialicons/black/res/drawable/baseline_flutter_dash_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M11.07,11.7c0.29,-0.39 0.81,-0.56 1.27,-0.37c0.17,0.07 0.32,0.18 0.43,0.33c0.22,0.28 0.25,0.59 0.22,0.85c-0.05,0.33 -0.25,0.63 -0.54,0.79c0,0 -4.87,2.95 -5.07,2.69S11.07,11.7 11.07,11.7zM22,10c0,2.5 -1,3 -1.5,3c-0.23,0 -0.44,-0.1 -0.62,-0.26c-0.48,3.32 -2.36,5.31 -5.33,5.99c0.11,0.44 0.48,0.77 0.95,0.77l0,0h0.58c0.22,0 0.41,0.15 0.48,0.36c0.17,0.52 0.66,1.02 1.02,1.32c0.25,0.21 0.24,0.59 -0.03,0.78c-0.34,0.24 -0.9,0.49 -1.79,0.53c-0.18,0.01 -0.35,-0.07 -0.45,-0.22C15.18,22.07 15,21.71 15,21.26c0,-0.3 0.04,-0.57 0.09,-0.8c-0.78,-0.16 -1.39,-0.78 -1.55,-1.56c-0.49,0.06 -1,0.1 -1.54,0.1c-0.88,0 -1.7,-0.09 -2.45,-0.25C9.53,18.83 9.5,18.91 9.5,19c0,0.55 0.45,1 1,1l0,0h0.58c0.22,0 0.41,0.15 0.48,0.36c0.17,0.52 0.66,1.02 1.02,1.32c0.25,0.21 0.24,0.59 -0.03,0.78c-0.34,0.24 -0.9,0.49 -1.79,0.53c-0.18,0.01 -0.35,-0.07 -0.45,-0.22C10.18,22.57 10,22.21 10,21.76c0,-0.3 0.04,-0.57 0.09,-0.8C9.19,20.77 8.5,19.96 8.5,19c0,-0.18 0.03,-0.36 0.08,-0.53c-2.46,-0.86 -4.03,-2.78 -4.46,-5.74C3.94,12.9 3.74,13 3.5,13C3,13 2,12.5 2,10c0,-2.27 1.7,-4.5 3,-4.5c0.43,0 0.49,0.49 0.5,0.85c1.28,-1.78 3.26,-3.02 5.55,-3.29C11.25,2.1 12.13,1.5 13,1.5v1c0,0 0.33,-0.5 1,-0.5c0.67,0 1,0.5 1,0.5c-0.49,0 -0.85,0.35 -0.96,0.77c1.82,0.48 3.39,1.59 4.46,3.08C18.51,5.99 18.57,5.5 19,5.5C20.3,5.5 22,7.73 22,10zM5,11c0,0.81 0.1,1.53 0.25,2.21c0.18,-0.69 0.46,-1.33 0.83,-1.92c-0.21,-0.47 -0.34,-0.99 -0.34,-1.54C5.75,7.68 7.43,6 9.5,6c0.96,0 1.84,0.37 2.5,0.97C12.66,6.37 13.54,6 14.5,6c2.07,0 3.75,1.68 3.75,3.75c0,0.55 -0.12,1.07 -0.34,1.54c0.37,0.59 0.66,1.24 0.84,1.94C18.9,12.55 19,11.82 19,11c0,-3.86 -3.14,-7 -7,-7C8.14,4 5,7.14 5,11zM17.98,15.29c0,-0.1 0.02,-0.19 0.02,-0.29c0,-1.01 -0.26,-1.95 -0.7,-2.78c-0.69,0.78 -1.68,1.28 -2.8,1.28c-0.27,0 -0.54,-0.03 -0.79,-0.09c0.14,-0.23 0.23,-0.49 0.27,-0.77c0.01,-0.07 0.01,-0.13 0.02,-0.19c0.17,0.03 0.33,0.05 0.5,0.05c1.52,0 2.75,-1.23 2.75,-2.75S16.02,7 14.5,7c-0.67,0 -1.32,0.25 -1.83,0.72L12,8.32l-0.67,-0.6C10.82,7.25 10.17,7 9.5,7C7.98,7 6.75,8.23 6.75,9.75c0,1.34 0.96,2.46 2.23,2.7l-0.76,0.83c-0.6,-0.22 -1.12,-0.59 -1.53,-1.05C6.26,13.06 6,14 6,15c0,0.08 0.01,0.15 0.01,0.24C7.13,17.06 9.14,18 12,18C14.88,18 16.88,17.09 17.98,15.29zM16,9.75c0,0.97 -0.67,1.75 -1.5,1.75S13,10.72 13,9.75S13.67,8 14.5,8S16,8.78 16,9.75zM15.25,8.88c0,-0.21 -0.17,-0.38 -0.38,-0.38S14.5,8.67 14.5,8.88s0.17,0.38 0.38,0.38S15.25,9.08 15.25,8.88zM11,9.75c0,0.97 -0.67,1.75 -1.5,1.75S8,10.72 8,9.75S8.67,8 9.5,8S11,8.78 11,9.75zM10.25,8.88c0,-0.21 -0.17,-0.38 -0.38,-0.38S9.5,8.67 9.5,8.88s0.17,0.38 0.38,0.38S10.25,9.08 10.25,8.88z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/fmd_bad.xml b/qqq/android/mobileapp/src/main/res/drawable/fmd_bad.xml new file mode 100644 index 0000000..76190e5 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/fmd_bad.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/fmd_bad/materialicons/black/res/drawable/baseline_fmd_bad_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,2c-4.2,0 -8,3.22 -8,8.2c0,3.32 2.67,7.25 8,11.8c5.33,-4.55 8,-8.48 8,-11.8C20,5.22 16.2,2 12,2zM13,15h-2v-2h2V15zM13,11h-2V6h2V11z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/fmd_good.xml b/qqq/android/mobileapp/src/main/res/drawable/fmd_good.xml new file mode 100644 index 0000000..1081867 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/fmd_good.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/fmd_good/materialicons/black/res/drawable/baseline_fmd_good_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,2c-4.2,0 -8,3.22 -8,8.2c0,3.32 2.67,7.25 8,11.8c5.33,-4.55 8,-8.48 8,-11.8C20,5.22 16.2,2 12,2zM12,12c-1.1,0 -2,-0.9 -2,-2c0,-1.1 0.9,-2 2,-2c1.1,0 2,0.9 2,2C14,11.1 13.1,12 12,12z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/foggy.xml b/qqq/android/mobileapp/src/main/res/drawable/foggy.xml new file mode 100644 index 0000000..00fbf6b --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/foggy.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/home/foggy/materialicons/black/res/drawable/baseline_foggy_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M17.92,7.02C17.45,4.18 14.97,2 12,2C9.82,2 7.83,3.18 6.78,5.06C4.09,5.41 2,7.74 2,10.5C2,13.53 4.47,16 7.5,16h10c2.48,0 4.5,-2.02 4.5,-4.5C22,9.16 20.21,7.23 17.92,7.02zM18,17.01c0.55,0 1,0.45 1,1s-0.45,1 -1,1s-1,-0.45 -1,-1S17.45,17.01 18,17.01zM7,20.01c0.55,0 1,0.45 1,1s-0.45,1 -1,1s-1,-0.45 -1,-1S6.45,20.01 7,20.01zM6,17.01h9c0.55,0 1,0.45 1,1l0,0c0,0.55 -0.45,1 -1,1H6c-0.55,0 -1,-0.45 -1,-1l0,0C5,17.46 5.45,17.01 6,17.01zM10,20.01h7c0.55,0 1,0.45 1,1l0,0c0,0.55 -0.45,1 -1,1h-7c-0.55,0 -1,-0.45 -1,-1l0,0C9,20.46 9.45,20.01 10,20.01z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/folder.xml b/qqq/android/mobileapp/src/main/res/drawable/folder.xml new file mode 100644 index 0000000..a0ff947 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/folder.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/file/folder/materialicons/black/res/drawable/baseline_folder_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M10,4H4c-1.1,0 -1.99,0.9 -1.99,2L2,18c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2V8c0,-1.1 -0.9,-2 -2,-2h-8l-2,-2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/folder_copy.xml b/qqq/android/mobileapp/src/main/res/drawable/folder_copy.xml new file mode 100644 index 0000000..7fae361 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/folder_copy.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/file/folder_copy/materialicons/black/res/drawable/baseline_folder_copy_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M3,6H1v13c0,1.1 0.9,2 2,2h17v-2H3V6z" /> + <path + android:fillColor="#FF000000" + android:pathData="M21,4h-7l-2,-2H7C5.9,2 5.01,2.9 5.01,4L5,15c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2V6C23,4.9 22.1,4 21,4z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/folder_delete.xml b/qqq/android/mobileapp/src/main/res/drawable/folder_delete.xml new file mode 100644 index 0000000..be7b72d --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/folder_delete.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/file/folder_delete/materialicons/black/res/drawable/baseline_folder_delete_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M22,8v10c0,1.1 -0.9,2 -2,2H4c-1.1,0 -2,-0.9 -2,-2L2.01,6C2.01,4.9 2.9,4 4,4h6l2,2h8C21.1,6 22,6.9 22,8zM16.5,10V9h-2v1H12v1.5h1v4c0,0.83 0.67,1.5 1.5,1.5h2c0.83,0 1.5,-0.67 1.5,-1.5v-4h1V10H16.5zM16.5,15.5h-2v-4h2V15.5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/folder_off.xml b/qqq/android/mobileapp/src/main/res/drawable/folder_off.xml new file mode 100644 index 0000000..e8637e7 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/folder_off.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/file/folder_off/materialicons/black/res/drawable/baseline_folder_off_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,6h-8l-2,-2H6.83l14.93,14.93C21.91,18.65 22,18.34 22,18V8C22,6.9 21.1,6 20,6z" /> + <path + android:fillColor="#FF000000" + android:pathData="M2.1,2.1L0.69,3.51l1.56,1.56C2.1,5.35 2.01,5.66 2.01,6L2,18c0,1.1 0.9,2 2,2h13.17l3.31,3.31l1.41,-1.41L2.1,2.1z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/folder_open.xml b/qqq/android/mobileapp/src/main/res/drawable/folder_open.xml new file mode 100644 index 0000000..59eea9a --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/folder_open.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/file/folder_open/materialicons/black/res/drawable/baseline_folder_open_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,6h-8l-2,-2L4,4c-1.1,0 -1.99,0.9 -1.99,2L2,18c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2L22,8c0,-1.1 -0.9,-2 -2,-2zM20,18L4,18L4,8h16v10z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/folder_shared.xml b/qqq/android/mobileapp/src/main/res/drawable/folder_shared.xml new file mode 100644 index 0000000..1f8fac9 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/folder_shared.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/file/folder_shared/materialicons/black/res/drawable/baseline_folder_shared_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,6h-8l-2,-2L4,4c-1.1,0 -1.99,0.9 -1.99,2L2,18c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2L22,8c0,-1.1 -0.9,-2 -2,-2zM15,9c1.1,0 2,0.9 2,2s-0.9,2 -2,2 -2,-0.9 -2,-2 0.9,-2 2,-2zM19,17h-8v-1c0,-1.33 2.67,-2 4,-2s4,0.67 4,2v1z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/folder_special.xml b/qqq/android/mobileapp/src/main/res/drawable/folder_special.xml new file mode 100644 index 0000000..60a4378 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/folder_special.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/notification/folder_special/materialicons/black/res/drawable/baseline_folder_special_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,6h-8l-2,-2L4,4c-1.1,0 -2,0.9 -2,2v12c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2L22,8c0,-1.1 -0.9,-2 -2,-2zM17.94,17L15,15.28 12.06,17l0.78,-3.33 -2.59,-2.24 3.41,-0.29L15,8l1.34,3.14 3.41,0.29 -2.59,2.24 0.78,3.33z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/folder_zip.xml b/qqq/android/mobileapp/src/main/res/drawable/folder_zip.xml new file mode 100644 index 0000000..498f350 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/folder_zip.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/file/folder_zip/materialicons/black/res/drawable/baseline_folder_zip_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,6h-8l-2,-2H4C2.9,4 2.01,4.9 2.01,6L2,18c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2V8C22,6.9 21.1,6 20,6zM18,12h-2v2h2v2h-2v2h-2v-2h2v-2h-2v-2h2v-2h-2V8h2v2h2V12z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/follow_the_signs.xml b/qqq/android/mobileapp/src/main/res/drawable/follow_the_signs.xml new file mode 100644 index 0000000..aeaf0e1 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/follow_the_signs.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/follow_the_signs/materialicons/black/res/drawable/baseline_follow_the_signs_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M9.5,5.5c1.1,0 2,-0.9 2,-2s-0.9,-2 -2,-2s-2,0.9 -2,2S8.4,5.5 9.5,5.5zM5.75,8.9L3,23h2.1l1.75,-8L9,17v6h2v-7.55L8.95,13.4l0.6,-3C10.85,12 12.8,13 15,13v-2c-1.85,0 -3.45,-1 -4.35,-2.45L9.7,6.95C9.35,6.35 8.7,6 8,6C7.75,6 7.5,6.05 7.25,6.15L2,8.3V13h2V9.65L5.75,8.9M13,2v7h3.75v14h1.5V9H22V2H13zM18.01,8V6.25H14.5v-1.5h3.51V3l2.49,2.5L18.01,8z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/font_download.xml b/qqq/android/mobileapp/src/main/res/drawable/font_download.xml new file mode 100644 index 0000000..c8cb6a4 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/font_download.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/content/font_download/materialicons/black/res/drawable/baseline_font_download_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M9.93,13.5h4.14L12,7.98zM20,2L4,2c-1.1,0 -2,0.9 -2,2v16c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2L22,4c0,-1.1 -0.9,-2 -2,-2zM15.95,18.5l-1.14,-3L9.17,15.5l-1.12,3L5.96,18.5l5.11,-13h1.86l5.11,13h-2.09z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/font_download_off.xml b/qqq/android/mobileapp/src/main/res/drawable/font_download_off.xml new file mode 100644 index 0000000..e86e23c --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/font_download_off.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/content/font_download_off/materialicons/black/res/drawable/baseline_font_download_off_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12.58,9.75l-0.87,-0.87l0.23,-0.66h0.1L12.58,9.75zM10.35,7.52L10.92,6h2.14l2.55,6.79L22,19.17V4c0,-1.1 -0.9,-2 -2,-2H4.83L10.35,7.52zM20.49,23.31L19.17,22H4c-1.1,0 -2,-0.9 -2,-2V4.83L0.69,3.51L2.1,2.1l19.8,19.8L20.49,23.31zM12.1,14.93l-3.3,-3.3L6.41,18h2.08l1.09,-3.07H12.1z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/food_bank.xml b/qqq/android/mobileapp/src/main/res/drawable/food_bank.xml new file mode 100644 index 0000000..f12b107 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/food_bank.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/places/food_bank/materialicons/black/res/drawable/baseline_food_bank_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,3L4,9v12h16V9L12,3zM12.5,12.5c0,0.83 -0.67,1.5 -1.5,1.5v4h-1v-4c-0.83,0 -1.5,-0.67 -1.5,-1.5v-3h1v3H10v-3h1v3h0.5v-3h1V12.5zM15,18h-1v-3.5h-1v-3c0,-1.1 0.9,-2 2,-2V18z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/forest.xml b/qqq/android/mobileapp/src/main/res/drawable/forest.xml new file mode 100644 index 0000000..fa7851d --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/forest.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/forest/materialicons/black/res/drawable/baseline_forest_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M16,12l-7,-10l-7,10l1.86,0l-3.86,6l7,0l0,4l4,0l0,-4l7,0l-3.86,-6z" /> + <path + android:fillColor="#FF000000" + android:pathData="M20.14,12l1.86,0l-7,-10l-2.39,3.41l5.31,7.59l-1.92,0l-0.03,0l3.22,5l4.81,0z" /> + <path + android:fillColor="#FF000000" + android:pathData="M13,19h4v3h-4z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/fork_left.xml b/qqq/android/mobileapp/src/main/res/drawable/fork_left.xml new file mode 100644 index 0000000..520c6ce --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/fork_left.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/fork_left/materialicons/black/res/drawable/baseline_fork_left_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M9.41,15.59L8,17l-4,-4l4,-4l1.41,1.41L7.83,12c1.51,-0.33 3.73,0.08 5.17,1.36l0,-6.53l-1.59,1.59L10,7l4,-4l4,4l-1.41,1.41L15,6.83V21l-2,0v-4c-0.73,-2.58 -3.07,-3.47 -5.17,-3L9.41,15.59z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/fork_right.xml b/qqq/android/mobileapp/src/main/res/drawable/fork_right.xml new file mode 100644 index 0000000..fadb3e0 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/fork_right.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/fork_right/materialicons/black/res/drawable/baseline_fork_right_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M14.59,15.59L16,17l4,-4l-4,-4l-1.41,1.41L16.17,12c-1.51,-0.33 -3.73,0.08 -5.17,1.36l0,-6.53l1.59,1.59L14,7l-4,-4L6,7l1.41,1.41L9,6.83V21l2,0v-4c0.73,-2.58 3.07,-3.47 5.17,-3L14.59,15.59z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/forklift.xml b/qqq/android/mobileapp/src/main/res/drawable/forklift.xml new file mode 100644 index 0000000..d98a463 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/forklift.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/hardware/forklift/materialicons/black/res/drawable/baseline_forklift_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M23,17v2h-5V3h2v14H23zM16.73,15.15C16.9,15.57 17,16.02 17,16.5c0,1.93 -1.57,3.5 -3.5,3.5c-1.4,0 -2.6,-0.82 -3.16,-2H6.83C6.42,19.17 5.31,20 4,20c-1.66,0 -3,-1.34 -3,-3c0,-0.89 0.39,-1.69 1,-2.24L2,10h2V4h8L16.73,15.15zM5,17c0,-0.55 -0.45,-1 -1,-1s-1,0.45 -1,1c0,0.55 0.45,1 1,1S5,17.55 5,17zM13.65,13l-2.97,-7H6v4l2.92,3H13.65zM15,16.5c0,-0.83 -0.67,-1.5 -1.5,-1.5S12,15.67 12,16.5s0.67,1.5 1.5,1.5S15,17.33 15,16.5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/format_align_center.xml b/qqq/android/mobileapp/src/main/res/drawable/format_align_center.xml new file mode 100644 index 0000000..4459d74 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/format_align_center.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/editor/format_align_center/materialicons/black/res/drawable/baseline_format_align_center_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M7,15v2h10v-2L7,15zM3,21h18v-2L3,19v2zM3,13h18v-2L3,11v2zM7,7v2h10L17,7L7,7zM3,3v2h18L21,3L3,3z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/format_align_justify.xml b/qqq/android/mobileapp/src/main/res/drawable/format_align_justify.xml new file mode 100644 index 0000000..8e6498e --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/format_align_justify.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/editor/format_align_justify/materialicons/black/res/drawable/baseline_format_align_justify_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M3,21h18v-2L3,19v2zM3,17h18v-2L3,15v2zM3,13h18v-2L3,11v2zM3,9h18L21,7L3,7v2zM3,3v2h18L21,3L3,3z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/format_align_left.xml b/qqq/android/mobileapp/src/main/res/drawable/format_align_left.xml new file mode 100644 index 0000000..c51f3bb --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/format_align_left.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/editor/format_align_left/materialicons/black/res/drawable/baseline_format_align_left_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M15,15L3,15v2h12v-2zM15,7L3,7v2h12L15,7zM3,13h18v-2L3,11v2zM3,21h18v-2L3,19v2zM3,3v2h18L21,3L3,3z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/format_align_right.xml b/qqq/android/mobileapp/src/main/res/drawable/format_align_right.xml new file mode 100644 index 0000000..9b501ee --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/format_align_right.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/editor/format_align_right/materialicons/black/res/drawable/baseline_format_align_right_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M3,21h18v-2L3,19v2zM9,17h12v-2L9,15v2zM3,13h18v-2L3,11v2zM9,9h12L21,7L9,7v2zM3,3v2h18L21,3L3,3z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/format_bold.xml b/qqq/android/mobileapp/src/main/res/drawable/format_bold.xml new file mode 100644 index 0000000..576dc4d --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/format_bold.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/editor/format_bold/materialicons/black/res/drawable/baseline_format_bold_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M15.6,10.79c0.97,-0.67 1.65,-1.77 1.65,-2.79 0,-2.26 -1.75,-4 -4,-4L7,4v14h7.04c2.09,0 3.71,-1.7 3.71,-3.79 0,-1.52 -0.86,-2.82 -2.15,-3.42zM10,6.5h3c0.83,0 1.5,0.67 1.5,1.5s-0.67,1.5 -1.5,1.5h-3v-3zM13.5,15.5L10,15.5v-3h3.5c0.83,0 1.5,0.67 1.5,1.5s-0.67,1.5 -1.5,1.5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/format_clear.xml b/qqq/android/mobileapp/src/main/res/drawable/format_clear.xml new file mode 100644 index 0000000..4102970 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/format_clear.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/editor/format_clear/materialicons/black/res/drawable/baseline_format_clear_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M3.27,5L2,6.27l6.97,6.97L6.5,19h3l1.57,-3.66L16.73,21 18,19.73 3.55,5.27 3.27,5zM6,5v0.18L8.82,8h2.4l-0.72,1.68 2.1,2.1L14.21,8H20V5H6z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/format_color_fill.xml b/qqq/android/mobileapp/src/main/res/drawable/format_color_fill.xml new file mode 100644 index 0000000..6100a88 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/format_color_fill.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/editor/format_color_fill/materialicons/black/res/drawable/baseline_format_color_fill_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M16.56,8.94L7.62,0L6.21,1.41l2.38,2.38L3.44,8.94c-0.59,0.59 -0.59,1.54 0,2.12l5.5,5.5C9.23,16.85 9.62,17 10,17s0.77,-0.15 1.06,-0.44l5.5,-5.5C17.15,10.48 17.15,9.53 16.56,8.94zM5.21,10L10,5.21L14.79,10H5.21zM19,11.5c0,0 -2,2.17 -2,3.5c0,1.1 0.9,2 2,2s2,-0.9 2,-2C21,13.67 19,11.5 19,11.5zM2,20h20v4H2V20z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/format_color_reset.xml b/qqq/android/mobileapp/src/main/res/drawable/format_color_reset.xml new file mode 100644 index 0000000..290f04c --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/format_color_reset.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/editor/format_color_reset/materialicons/black/res/drawable/baseline_format_color_reset_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M18,14c0,-4 -6,-10.8 -6,-10.8s-1.33,1.51 -2.73,3.52l8.59,8.59c0.09,-0.42 0.14,-0.86 0.14,-1.31zM17.12,17.12L12.5,12.5 5.27,5.27 4,6.55l3.32,3.32C6.55,11.32 6,12.79 6,14c0,3.31 2.69,6 6,6 1.52,0 2.9,-0.57 3.96,-1.5l2.63,2.63 1.27,-1.27 -2.74,-2.74z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/format_color_text.xml b/qqq/android/mobileapp/src/main/res/drawable/format_color_text.xml new file mode 100644 index 0000000..5ba7976 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/format_color_text.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/editor/format_color_text/materialicons/black/res/drawable/baseline_format_color_text_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M2,20h20v4H2V20zM5.49,17h2.42l1.27,-3.58h5.65L16.09,17h2.42L13.25,3h-2.5L5.49,17zM9.91,11.39l2.03,-5.79h0.12l2.03,5.79H9.91z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/format_indent_decrease.xml b/qqq/android/mobileapp/src/main/res/drawable/format_indent_decrease.xml new file mode 100644 index 0000000..2c060af --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/format_indent_decrease.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/editor/format_indent_decrease/materialicons/black/res/drawable/baseline_format_indent_decrease_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M11,17h10v-2L11,15v2zM3,12l4,4L7,8l-4,4zM3,21h18v-2L3,19v2zM3,3v2h18L21,3L3,3zM11,9h10L21,7L11,7v2zM11,13h10v-2L11,11v2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/format_indent_increase.xml b/qqq/android/mobileapp/src/main/res/drawable/format_indent_increase.xml new file mode 100644 index 0000000..261f993 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/format_indent_increase.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/editor/format_indent_increase/materialicons/black/res/drawable/baseline_format_indent_increase_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M3,21h18v-2L3,19v2zM3,8v8l4,-4 -4,-4zM11,17h10v-2L11,15v2zM3,3v2h18L21,3L3,3zM11,9h10L21,7L11,7v2zM11,13h10v-2L11,11v2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/format_italic.xml b/qqq/android/mobileapp/src/main/res/drawable/format_italic.xml new file mode 100644 index 0000000..7c9b759 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/format_italic.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/editor/format_italic/materialicons/black/res/drawable/baseline_format_italic_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M10,4v3h2.21l-3.42,8H6v3h8v-3h-2.21l3.42,-8H18V4z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/format_line_spacing.xml b/qqq/android/mobileapp/src/main/res/drawable/format_line_spacing.xml new file mode 100644 index 0000000..34df696 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/format_line_spacing.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/editor/format_line_spacing/materialicons/black/res/drawable/baseline_format_line_spacing_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M6,7h2.5L5,3.5 1.5,7L4,7v10L1.5,17L5,20.5 8.5,17L6,17L6,7zM10,5v2h12L22,5L10,5zM10,19h12v-2L10,17v2zM10,13h12v-2L10,11v2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/format_list_bulleted.xml b/qqq/android/mobileapp/src/main/res/drawable/format_list_bulleted.xml new file mode 100644 index 0000000..3ed61ee --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/format_list_bulleted.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/editor/format_list_bulleted/materialicons/black/res/drawable/baseline_format_list_bulleted_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M4,10.5c-0.83,0 -1.5,0.67 -1.5,1.5s0.67,1.5 1.5,1.5 1.5,-0.67 1.5,-1.5 -0.67,-1.5 -1.5,-1.5zM4,4.5c-0.83,0 -1.5,0.67 -1.5,1.5S3.17,7.5 4,7.5 5.5,6.83 5.5,6 4.83,4.5 4,4.5zM4,16.5c-0.83,0 -1.5,0.68 -1.5,1.5s0.68,1.5 1.5,1.5 1.5,-0.68 1.5,-1.5 -0.67,-1.5 -1.5,-1.5zM7,19h14v-2L7,17v2zM7,13h14v-2L7,11v2zM7,5v2h14L21,5L7,5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/format_list_bulleted_add.xml b/qqq/android/mobileapp/src/main/res/drawable/format_list_bulleted_add.xml new file mode 100644 index 0000000..7a7448d --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/format_list_bulleted_add.xml @@ -0,0 +1,37 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/editor/format_list_bulleted_add/materialicons/black/res/drawable/baseline_format_list_bulleted_add_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M18,13c-2.76,0 -5,2.24 -5,5s2.24,5 5,5s5,-2.24 5,-5S20.76,13 18,13zM21,18.5h-2.5V21h-1v-2.5H15v-1h2.5V15h1v2.5H21V18.5z" /> + <path + android:fillColor="#FF000000" + android:pathData="M7,5h13v2h-13z" /> + <path + android:fillColor="#FF000000" + android:pathData="M3.5,18m-1.5,0a1.5,1.5 0,1 1,3 0a1.5,1.5 0,1 1,-3 0" /> + <path + android:fillColor="#FF000000" + android:pathData="M18,11H7v2h6.11C14.37,11.76 16.1,11 18,11z" /> + <path + android:fillColor="#FF000000" + android:pathData="M7,17v2h4.08C11.03,18.67 11,18.34 11,18s0.03,-0.67 0.08,-1H7z" /> + <path + android:fillColor="#FF000000" + android:pathData="M3.5,6m-1.5,0a1.5,1.5 0,1 1,3 0a1.5,1.5 0,1 1,-3 0" /> + <path + android:fillColor="#FF000000" + android:pathData="M3.5,12m-1.5,0a1.5,1.5 0,1 1,3 0a1.5,1.5 0,1 1,-3 0" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/format_list_numbered.xml b/qqq/android/mobileapp/src/main/res/drawable/format_list_numbered.xml new file mode 100644 index 0000000..ba56d58 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/format_list_numbered.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/editor/format_list_numbered/materialicons/black/res/drawable/baseline_format_list_numbered_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M2,17h2v0.5L3,17.5v1h1v0.5L2,19v1h3v-4L2,16v1zM3,8h1L4,4L2,4v1h1v3zM2,11h1.8L2,13.1v0.9h3v-1L3.2,13L5,10.9L5,10L2,10v1zM7,5v2h14L21,5L7,5zM7,19h14v-2L7,17v2zM7,13h14v-2L7,11v2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/format_list_numbered_rtl.xml b/qqq/android/mobileapp/src/main/res/drawable/format_list_numbered_rtl.xml new file mode 100644 index 0000000..6273e86 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/format_list_numbered_rtl.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/editor/format_list_numbered_rtl/materialicons/black/res/drawable/baseline_format_list_numbered_rtl_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M18,17h2v0.5h-1v1h1v0.5h-2v1h3v-4h-3zM19,8h1L20,4h-2v1h1zM18,11h1.8L18,13.1v0.9h3v-1h-1.8l1.8,-2.1L21,10h-3zM2,5h14v2L2,7zM2,17h14v2L2,19zM2,11h14v2L2,13z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/format_overline.xml b/qqq/android/mobileapp/src/main/res/drawable/format_overline.xml new file mode 100644 index 0000000..6e37ec9 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/format_overline.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/file/format_overline/materialicons/black/res/drawable/baseline_format_overline_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19,3v2H5V3H19zM12,7c-3.87,0 -7,3.13 -7,7c0,3.87 3.13,7 7,7s7,-3.13 7,-7C19,10.13 15.87,7 12,7zM12,18.5c-2.49,0 -4.5,-2.01 -4.5,-4.5S9.51,9.5 12,9.5s4.5,2.01 4.5,4.5S14.49,18.5 12,18.5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/format_paint.xml b/qqq/android/mobileapp/src/main/res/drawable/format_paint.xml new file mode 100644 index 0000000..1d8bd41 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/format_paint.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/editor/format_paint/materialicons/black/res/drawable/baseline_format_paint_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M18,4V3c0,-0.55 -0.45,-1 -1,-1H5c-0.55,0 -1,0.45 -1,1v4c0,0.55 0.45,1 1,1h12c0.55,0 1,-0.45 1,-1V6h1v4H9v11c0,0.55 0.45,1 1,1h2c0.55,0 1,-0.45 1,-1v-9h8V4h-3z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/format_quote.xml b/qqq/android/mobileapp/src/main/res/drawable/format_quote.xml new file mode 100644 index 0000000..fa7a385 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/format_quote.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/editor/format_quote/materialicons/black/res/drawable/baseline_format_quote_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M6,17h3l2,-4L11,7L5,7v6h3zM14,17h3l2,-4L19,7h-6v6h3z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/format_shapes.xml b/qqq/android/mobileapp/src/main/res/drawable/format_shapes.xml new file mode 100644 index 0000000..96178e8 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/format_shapes.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/editor/format_shapes/materialicons/black/res/drawable/baseline_format_shapes_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M23,7L23,1h-6v2L7,3L7,1L1,1v6h2v10L1,17v6h6v-2h10v2h6v-6h-2L21,7h2zM3,3h2v2L3,5L3,3zM5,21L3,21v-2h2v2zM17,19L7,19v-2L5,17L5,7h2L7,5h10v2h2v10h-2v2zM21,21h-2v-2h2v2zM19,5L19,3h2v2h-2zM13.73,14h-3.49l-0.73,2L7.89,16l3.4,-9h1.4l3.41,9h-1.63l-0.74,-2zM10.69,12.74h2.61L12,8.91l-1.31,3.83z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/format_size.xml b/qqq/android/mobileapp/src/main/res/drawable/format_size.xml new file mode 100644 index 0000000..0ed8a20 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/format_size.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/editor/format_size/materialicons/black/res/drawable/baseline_format_size_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M9,4v3h5v12h3L17,7h5L22,4L9,4zM3,12h3v7h3v-7h3L12,9L3,9v3z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/format_strikethrough.xml b/qqq/android/mobileapp/src/main/res/drawable/format_strikethrough.xml new file mode 100644 index 0000000..6a569e5 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/format_strikethrough.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/editor/format_strikethrough/materialicons/black/res/drawable/baseline_format_strikethrough_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M10,19h4v-3h-4v3zM5,4v3h5v3h4V7h5V4H5zM3,14h18v-2H3v2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/format_textdirection_l_to_r.xml b/qqq/android/mobileapp/src/main/res/drawable/format_textdirection_l_to_r.xml new file mode 100644 index 0000000..c6966ee --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/format_textdirection_l_to_r.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/editor/format_textdirection_l_to_r/materialicons/black/res/drawable/baseline_format_textdirection_l_to_r_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M9,10v5h2L11,4h2v11h2L15,4h2L17,2L9,2C6.79,2 5,3.79 5,6s1.79,4 4,4zM21,18l-4,-4v3L5,17v2h12v3l4,-4z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/format_textdirection_r_to_l.xml b/qqq/android/mobileapp/src/main/res/drawable/format_textdirection_r_to_l.xml new file mode 100644 index 0000000..c63ec05 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/format_textdirection_r_to_l.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/editor/format_textdirection_r_to_l/materialicons/black/res/drawable/baseline_format_textdirection_r_to_l_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M10,10v5h2L12,4h2v11h2L16,4h2L18,2h-8C7.79,2 6,3.79 6,6s1.79,4 4,4zM8,17v-3l-4,4 4,4v-3h12v-2L8,17z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/format_underlined.xml b/qqq/android/mobileapp/src/main/res/drawable/format_underlined.xml new file mode 100644 index 0000000..c61cd39 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/format_underlined.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/editor/format_underlined/materialicons/black/res/drawable/baseline_format_underlined_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,17c3.31,0 6,-2.69 6,-6L18,3h-2.5v8c0,1.93 -1.57,3.5 -3.5,3.5S8.5,12.93 8.5,11L8.5,3L6,3v8c0,3.31 2.69,6 6,6zM5,19v2h14v-2L5,19z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/fort.xml b/qqq/android/mobileapp/src/main/res/drawable/fort.xml new file mode 100644 index 0000000..ef41435 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/fort.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/fort/materialicons/black/res/drawable/baseline_fort_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M21,3v2h-2V3h-2v2h-2V3h-2v4l2,2v1H9V9l2,-2V3H9v2H7V3H5v2H3V3H1v4l2,2v6l-2,2v4h9v-3c0,-1.1 0.9,-2 2,-2s2,0.9 2,2v3h9v-4l-2,-2V9l2,-2V3H21z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/forum.xml b/qqq/android/mobileapp/src/main/res/drawable/forum.xml new file mode 100644 index 0000000..bdc6f00 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/forum.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/communication/forum/materialicons/black/res/drawable/baseline_forum_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M21,6h-2v9L6,15v2c0,0.55 0.45,1 1,1h11l4,4L22,7c0,-0.55 -0.45,-1 -1,-1zM17,12L17,3c0,-0.55 -0.45,-1 -1,-1L3,2c-0.55,0 -1,0.45 -1,1v14l4,-4h10c0.55,0 1,-0.45 1,-1z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/forward.xml b/qqq/android/mobileapp/src/main/res/drawable/forward.xml new file mode 100644 index 0000000..0ff0d37 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/forward.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/content/forward/materialicons/black/res/drawable/baseline_forward_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,8V4l8,8 -8,8v-4H4V8z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/forward_10.xml b/qqq/android/mobileapp/src/main/res/drawable/forward_10.xml new file mode 100644 index 0000000..d26d8d9 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/forward_10.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/av/forward_10/materialicons/black/res/drawable/baseline_forward_10_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M18,13c0,3.31 -2.69,6 -6,6s-6,-2.69 -6,-6s2.69,-6 6,-6v4l5,-5l-5,-5v4c-4.42,0 -8,3.58 -8,8c0,4.42 3.58,8 8,8s8,-3.58 8,-8H18z" /> + <path + android:fillColor="#FF000000" + android:pathData="M10.86,15.94l0,-4.27l-0.09,0l-1.77,0.63l0,0.69l1.01,-0.31l0,3.26z" /> + <path + android:fillColor="#FF000000" + android:pathData="M12.25,13.44v0.74c0,1.9 1.31,1.82 1.44,1.82c0.14,0 1.44,0.09 1.44,-1.82v-0.74c0,-1.9 -1.31,-1.82 -1.44,-1.82C13.55,11.62 12.25,11.53 12.25,13.44zM14.29,13.32v0.97c0,0.77 -0.21,1.03 -0.59,1.03c-0.38,0 -0.6,-0.26 -0.6,-1.03v-0.97c0,-0.75 0.22,-1.01 0.59,-1.01C14.07,12.3 14.29,12.57 14.29,13.32z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/forward_30.xml b/qqq/android/mobileapp/src/main/res/drawable/forward_30.xml new file mode 100644 index 0000000..d2073c7 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/forward_30.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/av/forward_30/materialicons/black/res/drawable/baseline_forward_30_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M18,13c0,3.31 -2.69,6 -6,6s-6,-2.69 -6,-6s2.69,-6 6,-6v4l5,-5l-5,-5v4c-4.42,0 -8,3.58 -8,8c0,4.42 3.58,8 8,8s8,-3.58 8,-8H18z" /> + <path + android:fillColor="#FF000000" + android:pathData="M10.06,15.38c-0.29,0 -0.62,-0.17 -0.62,-0.54H8.59c0,0.97 0.9,1.23 1.45,1.23c0.87,0 1.51,-0.46 1.51,-1.25c0,-0.66 -0.45,-0.9 -0.71,-1c0.11,-0.05 0.65,-0.32 0.65,-0.92c0,-0.21 -0.05,-1.22 -1.44,-1.22c-0.62,0 -1.4,0.35 -1.4,1.16h0.85c0,-0.34 0.31,-0.48 0.57,-0.48c0.59,0 0.58,0.5 0.58,0.54c0,0.52 -0.41,0.59 -0.63,0.59H9.56v0.66h0.45c0.65,0 0.7,0.42 0.7,0.64C10.71,15.11 10.5,15.38 10.06,15.38z" /> + <path + android:fillColor="#FF000000" + android:pathData="M13.85,11.68c-0.14,0 -1.44,-0.08 -1.44,1.82v0.74c0,1.9 1.31,1.82 1.44,1.82c0.14,0 1.44,0.09 1.44,-1.82V13.5C15.3,11.59 13.99,11.68 13.85,11.68zM14.45,14.35c0,0.77 -0.21,1.03 -0.59,1.03c-0.38,0 -0.6,-0.26 -0.6,-1.03v-0.97c0,-0.75 0.22,-1.01 0.59,-1.01c0.38,0 0.6,0.26 0.6,1.01V14.35z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/forward_5.xml b/qqq/android/mobileapp/src/main/res/drawable/forward_5.xml new file mode 100644 index 0000000..84686da --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/forward_5.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/av/forward_5/materialicons/black/res/drawable/baseline_forward_5_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M18,13c0,3.31 -2.69,6 -6,6s-6,-2.69 -6,-6s2.69,-6 6,-6v4l5,-5l-5,-5v4c-4.42,0 -8,3.58 -8,8c0,4.42 3.58,8 8,8c4.42,0 8,-3.58 8,-8H18z" /> + <path + android:fillColor="#FF000000" + android:pathData="M12.03,15.38c-0.44,0 -0.58,-0.31 -0.6,-0.56h-0.84c0.03,0.85 0.79,1.25 1.44,1.25c0.93,0 1.44,-0.63 1.44,-1.43c0,-1.33 -0.97,-1.44 -1.3,-1.44c-0.2,0 -0.43,0.05 -0.64,0.16l0.11,-0.92h1.7v-0.71h-2.39l-0.25,2.17l0.67,0.17c0.13,-0.13 0.28,-0.23 0.57,-0.23c0.4,0 0.69,0.23 0.69,0.75C12.62,14.64 12.65,15.38 12.03,15.38z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/forward_to_inbox.xml b/qqq/android/mobileapp/src/main/res/drawable/forward_to_inbox.xml new file mode 100644 index 0000000..8f7972f --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/forward_to_inbox.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/communication/forward_to_inbox/materialicons/black/res/drawable/baseline_forward_to_inbox_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,4H4C2.9,4 2,4.9 2,6v12c0,1.1 0.9,2 2,2h9v-2H4V8l8,5l8,-5v5h2V6C22,4.9 21.1,4 20,4zM12,11L4,6h16L12,11zM19,15l4,4l-4,4v-3h-4v-2h4V15z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/foundation.xml b/qqq/android/mobileapp/src/main/res/drawable/foundation.xml new file mode 100644 index 0000000..484c7c9 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/foundation.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/places/foundation/materialicons/black/res/drawable/baseline_foundation_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19,12h3L12,3L2,12h3v3H3v2h2v3h2v-3h4v3h2v-3h4v3h2v-3h2v-2h-2V12zM7,15v-4.81l4,-3.6V15H7zM13,15V6.59l4,3.6V15H13z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/free_breakfast.xml b/qqq/android/mobileapp/src/main/res/drawable/free_breakfast.xml new file mode 100644 index 0000000..e1fffc3 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/free_breakfast.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/places/free_breakfast/materialicons/black/res/drawable/baseline_free_breakfast_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,3L4,3v10c0,2.21 1.79,4 4,4h6c2.21,0 4,-1.79 4,-4v-3h2c1.11,0 2,-0.9 2,-2L22,5c0,-1.11 -0.89,-2 -2,-2zM20,8h-2L18,5h2v3zM4,19h16v2L4,21z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/free_cancellation.xml b/qqq/android/mobileapp/src/main/res/drawable/free_cancellation.xml new file mode 100644 index 0000000..1e26156 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/free_cancellation.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/free_cancellation/materialicons/black/res/drawable/baseline_free_cancellation_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M11.21,20H5V10h14v4.38l2,-2V6c0,-1.1 -0.9,-2 -2,-2h-1V2h-2v2H8V2H6v2H5C3.89,4 3.01,4.9 3.01,6L3,20c0,1.1 0.89,2 2,2h8.21L11.21,20zM16.54,22.5L13,18.96l1.41,-1.41l2.12,2.12l4.24,-4.24l1.41,1.41L16.54,22.5zM10.41,14L12,15.59L10.59,17L9,15.41L7.41,17L6,15.59L7.59,14L6,12.41L7.41,11L9,12.59L10.59,11L12,12.41L10.41,14z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/front_hand.xml b/qqq/android/mobileapp/src/main/res/drawable/front_hand.xml new file mode 100644 index 0000000..d669b76 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/front_hand.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/front_hand/materialicons/black/res/drawable/baseline_front_hand_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19.75,8c-0.69,0 -1.25,0.56 -1.25,1.25V15H18c-1.65,0 -3,1.35 -3,3h-1c0,-2.04 1.53,-3.72 3.5,-3.97l0,-10.78C17.5,2.56 16.94,2 16.25,2C15.56,2 15,2.56 15,3.25V11h-1V1.25C14,0.56 13.44,0 12.75,0S11.5,0.56 11.5,1.25V11h-1V2.75c0,-0.69 -0.56,-1.25 -1.25,-1.25S8,2.06 8,2.75V12H7V5.75C7,5.06 6.44,4.5 5.75,4.5S4.5,5.06 4.5,5.75v10c0,4.56 3.69,8.25 8.25,8.25S21,20.31 21,15.75v-6.5C21,8.56 20.44,8 19.75,8z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/front_loader.xml b/qqq/android/mobileapp/src/main/res/drawable/front_loader.xml new file mode 100644 index 0000000..37789f2 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/front_loader.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/hardware/front_loader/materialicons/black/res/drawable/baseline_front_loader_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19.5,6.5l-1.91,1.91C17.21,8.79 17,9.3 17,9.83V11h-1V7c0,-1.66 -1.34,-3 -3,-3H8v5H3c-1.1,0 -2,0.9 -2,2l0,5.85c0,1.58 1.16,3.01 2.74,3.14c1.41,0.12 2.63,-0.75 3.07,-1.98L11.18,18c0.47,1.34 1.85,2.24 3.41,1.94c1.18,-0.23 2.14,-1.21 2.35,-2.39c0.2,-1.11 -0.22,-2.11 -0.95,-2.77V13h1c0,1.1 0.9,2 2,2h5L19.5,6.5zM4,18c-0.55,0 -1,-0.45 -1,-1s0.45,-1 1,-1s1,0.45 1,1S4.55,18 4,18zM10,6h3c0.55,0 1,0.45 1,1v4h-4V6zM14,18c-0.55,0 -1,-0.45 -1,-1s0.45,-1 1,-1c0.55,0 1,0.45 1,1S14.55,18 14,18z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/fullscreen.xml b/qqq/android/mobileapp/src/main/res/drawable/fullscreen.xml new file mode 100644 index 0000000..7be7dd9 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/fullscreen.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/navigation/fullscreen/materialicons/black/res/drawable/baseline_fullscreen_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M7,14L5,14v5h5v-2L7,17v-3zM5,10h2L7,7h3L10,5L5,5v5zM17,17h-3v2h5v-5h-2v3zM14,5v2h3v3h2L19,5h-5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/fullscreen_exit.xml b/qqq/android/mobileapp/src/main/res/drawable/fullscreen_exit.xml new file mode 100644 index 0000000..6634f57 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/fullscreen_exit.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/navigation/fullscreen_exit/materialicons/black/res/drawable/baseline_fullscreen_exit_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M5,16h3v3h2v-5L5,14v2zM8,8L5,8v2h5L10,5L8,5v3zM14,19h2v-3h3v-2h-5v5zM16,8L16,5h-2v5h5L19,8h-3z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/functions.xml b/qqq/android/mobileapp/src/main/res/drawable/functions.xml new file mode 100644 index 0000000..1fafdb8 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/functions.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/editor/functions/materialicons/black/res/drawable/baseline_functions_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M18,4H6v2l6.5,6L6,18v2h12v-3h-7l5,-5 -5,-5h7z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/g_mobiledata.xml b/qqq/android/mobileapp/src/main/res/drawable/g_mobiledata.xml new file mode 100644 index 0000000..90329ff --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/g_mobiledata.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/g_mobiledata/materialicons/black/res/drawable/baseline_g_mobiledata_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,11v2h2v2H9V9h7c0,-1.1 -0.9,-2 -2,-2H9C7.9,7 7,7.9 7,9v6c0,1.1 0.9,2 2,2h5c1.1,0 2,-0.9 2,-2v-4H12z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/g_translate.xml b/qqq/android/mobileapp/src/main/res/drawable/g_translate.xml new file mode 100644 index 0000000..7de710f --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/g_translate.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/g_translate/materialicons/black/res/drawable/baseline_g_translate_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M21,4L11,4l-1,-3L3,1c-1.1,0 -2,0.9 -2,2v15c0,1.1 0.9,2 2,2h8l1,3h9c1.1,0 2,-0.9 2,-2L23,6c0,-1.1 -0.9,-2 -2,-2zM7,16c-2.76,0 -5,-2.24 -5,-5s2.24,-5 5,-5c1.35,0 2.48,0.5 3.35,1.3L9.03,8.57c-0.38,-0.36 -1.04,-0.78 -2.03,-0.78 -1.74,0 -3.15,1.44 -3.15,3.21S5.26,14.21 7,14.21c2.01,0 2.84,-1.44 2.92,-2.41L7,11.8v-1.71h4.68c0.07,0.31 0.12,0.61 0.12,1.02C11.8,13.97 9.89,16 7,16zM13.17,10.58h3.7c-0.43,1.25 -1.11,2.43 -2.05,3.47 -0.31,-0.35 -0.6,-0.72 -0.86,-1.1l-0.79,-2.37zM21.5,20.5c0,0.55 -0.45,1 -1,1L14,21.5l2,-2.5 -1.04,-3.1 3.1,3.1 0.92,-0.92 -3.3,-3.25 0.02,-0.02c1.13,-1.25 1.93,-2.69 2.4,-4.22L20,10.59v-1.3h-4.53L15.47,8h-1.29v1.29h-1.44L11.46,5.5h9.04c0.55,0 1,0.45 1,1v14z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/gamepad.xml b/qqq/android/mobileapp/src/main/res/drawable/gamepad.xml new file mode 100644 index 0000000..b63f88c --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/gamepad.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/hardware/gamepad/materialicons/black/res/drawable/baseline_gamepad_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M15,7.5V2H9v5.5l3,3 3,-3zM7.5,9H2v6h5.5l3,-3 -3,-3zM9,16.5V22h6v-5.5l-3,-3 -3,3zM16.5,9l-3,3 3,3H22V9h-5.5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/games.xml b/qqq/android/mobileapp/src/main/res/drawable/games.xml new file mode 100644 index 0000000..23288f2 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/games.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/av/games/materialicons/black/res/drawable/baseline_games_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M15,7.5V2H9v5.5l3,3 3,-3zM7.5,9H2v6h5.5l3,-3 -3,-3zM9,16.5V22h6v-5.5l-3,-3 -3,3zM16.5,9l-3,3 3,3H22V9h-5.5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/garage.xml b/qqq/android/mobileapp/src/main/res/drawable/garage.xml new file mode 100644 index 0000000..f56f0a8 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/garage.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/search/garage/materialicons/black/res/drawable/baseline_garage_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M15,13m-1,0a1,1 0,1 1,2 0a1,1 0,1 1,-2 0" /> + <path + android:fillColor="#FF000000" + android:pathData="M9,13m-1,0a1,1 0,1 1,2 0a1,1 0,1 1,-2 0" /> + <path + android:fillColor="#FF000000" + android:pathData="M8.33,7.5l-0.66,2l8.66,0l-0.66,-2z" /> + <path + android:fillColor="#FF000000" + android:pathData="M20,2H4C2.9,2 2,2.9 2,4v16c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2V4C22,2.9 21.1,2 20,2zM19,17.69c0,0.45 -0.35,0.81 -0.78,0.81h-0.44c-0.44,0 -0.78,-0.36 -0.78,-0.81V16.5H7v1.19c0,0.45 -0.35,0.81 -0.78,0.81H5.78C5.35,18.5 5,18.14 5,17.69v-6.5C5.82,8.72 6.34,7.16 6.56,6.5c0.05,-0.16 0.12,-0.29 0.19,-0.4C6.77,6.08 6.78,6.06 6.8,6.04C7.18,5.51 7.72,5.5 7.72,5.5h8.56c0,0 0.54,0.01 0.92,0.53c0.02,0.03 0.03,0.05 0.05,0.07c0.07,0.11 0.14,0.24 0.19,0.4c0.22,0.66 0.74,2.23 1.56,4.69V17.69z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/gas_meter.xml b/qqq/android/mobileapp/src/main/res/drawable/gas_meter.xml new file mode 100644 index 0000000..845b3b7 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/gas_meter.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/home/gas_meter/materialicons/black/res/drawable/baseline_gas_meter_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M16,4h-1V2h-2v2h-2V2H9v2H8C5.79,4 4,5.79 4,8v10c0,2.21 1.79,4 4,4h8c2.21,0 4,-1.79 4,-4V8C20,5.79 18.21,4 16,4zM12,18c-1.38,0 -2.5,-1.1 -2.5,-2.46c0,-1.09 0.43,-1.39 2.5,-3.79c2.05,2.38 2.5,2.7 2.5,3.79C14.5,16.9 13.38,18 12,18zM16,10H8V8h8V10z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/gavel.xml b/qqq/android/mobileapp/src/main/res/drawable/gavel.xml new file mode 100644 index 0000000..a0666d9 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/gavel.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/gavel/materialicons/black/res/drawable/baseline_gavel_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M5.2496,8.0688l2.83,-2.8268l14.134,14.15l-2.83,2.8268z" /> + <path + android:fillColor="#FF000000" + android:pathData="M9.4857,3.8272l2.828,-2.8288l5.6576,5.656l-2.828,2.8288z" /> + <path + android:fillColor="#FF000000" + android:pathData="M0.9989,12.3147l2.8284,-2.8284l5.6568,5.6568l-2.8284,2.8284z" /> + <path + android:fillColor="#FF000000" + android:pathData="M1,21h12v2h-12z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/generating_tokens.xml b/qqq/android/mobileapp/src/main/res/drawable/generating_tokens.xml new file mode 100644 index 0000000..97bc0ea --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/generating_tokens.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/generating_tokens/materialicons/black/res/drawable/baseline_generating_tokens_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M9,4c-4.42,0 -8,3.58 -8,8c0,4.42 3.58,8 8,8s8,-3.58 8,-8C17,7.58 13.42,4 9,4zM12,10.5h-2v5H8v-5H6V9h6V10.5zM20.25,3.75L23,5l-2.75,1.25L19,9l-1.25,-2.75L15,5l2.75,-1.25L19,1L20.25,3.75zM20.25,17.75L23,19l-2.75,1.25L19,23l-1.25,-2.75L15,19l2.75,-1.25L19,15L20.25,17.75z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/gesture.xml b/qqq/android/mobileapp/src/main/res/drawable/gesture.xml new file mode 100644 index 0000000..01329fd --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/gesture.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/content/gesture/materialicons/black/res/drawable/baseline_gesture_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M4.59,6.89c0.7,-0.71 1.4,-1.35 1.71,-1.22 0.5,0.2 0,1.03 -0.3,1.52 -0.25,0.42 -2.86,3.89 -2.86,6.31 0,1.28 0.48,2.34 1.34,2.98 0.75,0.56 1.74,0.73 2.64,0.46 1.07,-0.31 1.95,-1.4 3.06,-2.77 1.21,-1.49 2.83,-3.44 4.08,-3.44 1.63,0 1.65,1.01 1.76,1.79 -3.78,0.64 -5.38,3.67 -5.38,5.37 0,1.7 1.44,3.09 3.21,3.09 1.63,0 4.29,-1.33 4.69,-6.1L21,14.88v-2.5h-2.47c-0.15,-1.65 -1.09,-4.2 -4.03,-4.2 -2.25,0 -4.18,1.91 -4.94,2.84 -0.58,0.73 -2.06,2.48 -2.29,2.72 -0.25,0.3 -0.68,0.84 -1.11,0.84 -0.45,0 -0.72,-0.83 -0.36,-1.92 0.35,-1.09 1.4,-2.86 1.85,-3.52 0.78,-1.14 1.3,-1.92 1.3,-3.28C8.95,3.69 7.31,3 6.44,3 5.12,3 3.97,4 3.72,4.25c-0.36,0.36 -0.66,0.66 -0.88,0.93l1.75,1.71zM13.88,18.55c-0.31,0 -0.74,-0.26 -0.74,-0.72 0,-0.6 0.73,-2.2 2.87,-2.76 -0.3,2.69 -1.43,3.48 -2.13,3.48z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/get_app.xml b/qqq/android/mobileapp/src/main/res/drawable/get_app.xml new file mode 100644 index 0000000..83ac301 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/get_app.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/get_app/materialicons/black/res/drawable/baseline_get_app_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19,9h-4V3H9v6H5l7,7 7,-7zM5,18v2h14v-2H5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/gif.xml b/qqq/android/mobileapp/src/main/res/drawable/gif.xml new file mode 100644 index 0000000..1568c0c --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/gif.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/gif/materialicons/black/res/drawable/baseline_gif_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M11.5,9h1.5v6h-1.5z" /> + <path + android:fillColor="#FF000000" + android:pathData="M9,9H6c-0.6,0 -1,0.5 -1,1v4c0,0.5 0.4,1 1,1h3c0.6,0 1,-0.5 1,-1v-2H8.5v1.5h-2v-3H10V10C10,9.5 9.6,9 9,9z" /> + <path + android:fillColor="#FF000000" + android:pathData="M19,10.5l0,-1.5l-4.5,0l0,6l1.5,0l0,-2l2,0l0,-1.5l-2,0l0,-1z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/gif_box.xml b/qqq/android/mobileapp/src/main/res/drawable/gif_box.xml new file mode 100644 index 0000000..20fabc0 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/gif_box.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/gif_box/materialicons/black/res/drawable/baseline_gif_box_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19,3H5C3.9,3 3,3.9 3,5v14c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2V5C21,3.9 20.1,3 19,3zM9.5,13v-1h1v1c0,0.55 -0.45,1 -1,1h-1c-0.55,0 -1,-0.45 -1,-1v-2c0,-0.55 0.45,-1 1,-1h1c0.55,0 1,0.45 1,1h-2v2H9.5zM12.5,14h-1v-4h1V14zM16.5,11h-2v0.5H16v1h-1.5V14h-1v-4h3V11z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/girl.xml b/qqq/android/mobileapp/src/main/res/drawable/girl.xml new file mode 100644 index 0000000..19acb99 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/girl.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/girl/materialicons/black/res/drawable/baseline_girl_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,7.5c0.97,0 1.75,-0.78 1.75,-1.75S12.97,4 12,4s-1.75,0.78 -1.75,1.75S11.03,7.5 12,7.5zM14,16v4h-4v-4H8l2.38,-6.38C10.63,8.95 11.28,8.5 12,8.5s1.37,0.45 1.62,1.12L16,16H14z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/gite.xml b/qqq/android/mobileapp/src/main/res/drawable/gite.xml new file mode 100644 index 0000000..6a0f3cd --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/gite.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/places/gite/materialicons/black/res/drawable/baseline_gite_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M18,6H9V4H7v2H6l-4,4v9h20v-9L18,6zM4,12h10v5H4V12zM20,17h-4v-6.17l2,-2v0l2,2V17z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/golf_course.xml b/qqq/android/mobileapp/src/main/res/drawable/golf_course.xml new file mode 100644 index 0000000..689e5a0 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/golf_course.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/places/golf_course/materialicons/black/res/drawable/baseline_golf_course_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19.5,19.5m-1.5,0a1.5,1.5 0,1 1,3 0a1.5,1.5 0,1 1,-3 0" /> + <path + android:fillColor="#FF000000" + android:pathData="M17,5.92L9,2v18H7v-1.73c-1.79,0.35 -3,0.99 -3,1.73 0,1.1 2.69,2 6,2s6,-0.9 6,-2c0,-0.99 -2.16,-1.81 -5,-1.97V8.98l6,-3.06z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/gpp_bad.xml b/qqq/android/mobileapp/src/main/res/drawable/gpp_bad.xml new file mode 100644 index 0000000..80ba719 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/gpp_bad.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/gpp_bad/materialicons/black/res/drawable/baseline_gpp_bad_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,2L4,5v6.09c0,5.05 3.41,9.76 8,10.91c4.59,-1.15 8,-5.86 8,-10.91V5L12,2zM15.5,14.09l-1.41,1.41L12,13.42L9.91,15.5L8.5,14.09L10.59,12L8.5,9.91L9.91,8.5L12,10.59l2.09,-2.09l1.41,1.41L13.42,12L15.5,14.09z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/gpp_good.xml b/qqq/android/mobileapp/src/main/res/drawable/gpp_good.xml new file mode 100644 index 0000000..c945a4e --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/gpp_good.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/gpp_good/materialicons/black/res/drawable/baseline_gpp_good_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,2L4,5v6.09c0,5.05 3.41,9.76 8,10.91c4.59,-1.15 8,-5.86 8,-10.91V5L12,2zM10.94,15.54L7.4,12l1.41,-1.41l2.12,2.12l4.24,-4.24l1.41,1.41L10.94,15.54z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/gpp_maybe.xml b/qqq/android/mobileapp/src/main/res/drawable/gpp_maybe.xml new file mode 100644 index 0000000..63c658c --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/gpp_maybe.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/gpp_maybe/materialicons/black/res/drawable/baseline_gpp_maybe_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,2L4,5v6.09c0,5.05 3.41,9.76 8,10.91c4.59,-1.15 8,-5.86 8,-10.91V5L12,2zM13,16h-2v-2h2V16zM13,12h-2V7h2V12z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/gps_fixed.xml b/qqq/android/mobileapp/src/main/res/drawable/gps_fixed.xml new file mode 100644 index 0000000..f6b15e8 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/gps_fixed.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/gps_fixed/materialicons/black/res/drawable/baseline_gps_fixed_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,8c-2.21,0 -4,1.79 -4,4s1.79,4 4,4 4,-1.79 4,-4 -1.79,-4 -4,-4zM20.94,11c-0.46,-4.17 -3.77,-7.48 -7.94,-7.94L13,1h-2v2.06C6.83,3.52 3.52,6.83 3.06,11L1,11v2h2.06c0.46,4.17 3.77,7.48 7.94,7.94L11,23h2v-2.06c4.17,-0.46 7.48,-3.77 7.94,-7.94L23,13v-2h-2.06zM12,19c-3.87,0 -7,-3.13 -7,-7s3.13,-7 7,-7 7,3.13 7,7 -3.13,7 -7,7z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/gps_not_fixed.xml b/qqq/android/mobileapp/src/main/res/drawable/gps_not_fixed.xml new file mode 100644 index 0000000..0df6491 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/gps_not_fixed.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/gps_not_fixed/materialicons/black/res/drawable/baseline_gps_not_fixed_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20.94,11c-0.46,-4.17 -3.77,-7.48 -7.94,-7.94V1h-2v2.06C6.83,3.52 3.52,6.83 3.06,11H1v2h2.06c0.46,4.17 3.77,7.48 7.94,7.94V23h2v-2.06c4.17,-0.46 7.48,-3.77 7.94,-7.94H23v-2h-2.06zM12,19c-3.87,0 -7,-3.13 -7,-7s3.13,-7 7,-7 7,3.13 7,7 -3.13,7 -7,7z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/gps_off.xml b/qqq/android/mobileapp/src/main/res/drawable/gps_off.xml new file mode 100644 index 0000000..edd7833 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/gps_off.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/gps_off/materialicons/black/res/drawable/baseline_gps_off_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20.94,11c-0.46,-4.17 -3.77,-7.48 -7.94,-7.94L13,1h-2v2.06c-1.13,0.12 -2.19,0.46 -3.16,0.97l1.5,1.5C10.16,5.19 11.06,5 12,5c3.87,0 7,3.13 7,7 0,0.94 -0.19,1.84 -0.52,2.65l1.5,1.5c0.5,-0.96 0.84,-2.02 0.97,-3.15L23,13v-2h-2.06zM3,4.27l2.04,2.04C3.97,7.62 3.25,9.23 3.06,11L1,11v2h2.06c0.46,4.17 3.77,7.48 7.94,7.94L11,23h2v-2.06c1.77,-0.2 3.38,-0.91 4.69,-1.98L19.73,21 21,19.73 4.27,3 3,4.27zM16.27,17.54C15.09,18.45 13.61,19 12,19c-3.87,0 -7,-3.13 -7,-7 0,-1.61 0.55,-3.09 1.46,-4.27l9.81,9.81z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/grade.xml b/qqq/android/mobileapp/src/main/res/drawable/grade.xml new file mode 100644 index 0000000..3cd2109 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/grade.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/grade/materialicons/black/res/drawable/baseline_grade_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,17.27L18.18,21l-1.64,-7.03L22,9.24l-7.19,-0.61L12,2 9.19,8.63 2,9.24l5.46,4.73L5.82,21z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/gradient.xml b/qqq/android/mobileapp/src/main/res/drawable/gradient.xml new file mode 100644 index 0000000..e8fde7c --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/gradient.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/gradient/materialicons/black/res/drawable/baseline_gradient_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M11,9h2v2h-2zM9,11h2v2L9,13zM13,11h2v2h-2zM15,9h2v2h-2zM7,9h2v2L7,11zM19,3L5,3c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2L21,5c0,-1.1 -0.9,-2 -2,-2zM9,18L7,18v-2h2v2zM13,18h-2v-2h2v2zM17,18h-2v-2h2v2zM19,11h-2v2h2v2h-2v-2h-2v2h-2v-2h-2v2L9,15v-2L7,13v2L5,15v-2h2v-2L5,11L5,5h14v6z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/grading.xml b/qqq/android/mobileapp/src/main/res/drawable/grading.xml new file mode 100644 index 0000000..d574079 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/grading.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/grading/materialicons/black/res/drawable/baseline_grading_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M4,7h16v2H4V7zM4,13h16v-2H4V13zM4,17h7v-2H4V17zM4,21h7v-2H4V21zM15.41,18.17L14,16.75l-1.41,1.41L15.41,21L20,16.42L18.58,15L15.41,18.17zM4,3v2h16V3H4z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/grain.xml b/qqq/android/mobileapp/src/main/res/drawable/grain.xml new file mode 100644 index 0000000..023ad62 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/grain.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/grain/materialicons/black/res/drawable/baseline_grain_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M10,12c-1.1,0 -2,0.9 -2,2s0.9,2 2,2 2,-0.9 2,-2 -0.9,-2 -2,-2zM6,8c-1.1,0 -2,0.9 -2,2s0.9,2 2,2 2,-0.9 2,-2 -0.9,-2 -2,-2zM6,16c-1.1,0 -2,0.9 -2,2s0.9,2 2,2 2,-0.9 2,-2 -0.9,-2 -2,-2zM18,8c1.1,0 2,-0.9 2,-2s-0.9,-2 -2,-2 -2,0.9 -2,2 0.9,2 2,2zM14,16c-1.1,0 -2,0.9 -2,2s0.9,2 2,2 2,-0.9 2,-2 -0.9,-2 -2,-2zM18,12c-1.1,0 -2,0.9 -2,2s0.9,2 2,2 2,-0.9 2,-2 -0.9,-2 -2,-2zM14,8c-1.1,0 -2,0.9 -2,2s0.9,2 2,2 2,-0.9 2,-2 -0.9,-2 -2,-2zM10,4c-1.1,0 -2,0.9 -2,2s0.9,2 2,2 2,-0.9 2,-2 -0.9,-2 -2,-2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/graphic_eq.xml b/qqq/android/mobileapp/src/main/res/drawable/graphic_eq.xml new file mode 100644 index 0000000..affc9b4 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/graphic_eq.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/graphic_eq/materialicons/black/res/drawable/baseline_graphic_eq_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M7,18h2L9,6L7,6v12zM11,22h2L13,2h-2v20zM3,14h2v-4L3,10v4zM15,18h2L17,6h-2v12zM19,10v4h2v-4h-2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/grass.xml b/qqq/android/mobileapp/src/main/res/drawable/grass.xml new file mode 100644 index 0000000..7ed63fb --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/grass.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/places/grass/materialicons/black/res/drawable/baseline_grass_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,20H2v-2h5.75l0,0C7.02,15.19 4.81,12.99 2,12.26C2.64,12.1 3.31,12 4,12C8.42,12 12,15.58 12,20zM22,12.26C21.36,12.1 20.69,12 20,12c-2.93,0 -5.48,1.58 -6.88,3.93c0.29,0.66 0.53,1.35 0.67,2.07c0.13,0.65 0.2,1.32 0.2,2h2h6v-2h-5.75C16.98,15.19 19.19,12.99 22,12.26zM15.64,11.02c0.78,-2.09 2.23,-3.84 4.09,-5C15.44,6.16 12,9.67 12,14c0,0.01 0,0.02 0,0.02C12.95,12.75 14.2,11.72 15.64,11.02zM11.42,8.85C10.58,6.66 8.88,4.89 6.7,4C8.14,5.86 9,8.18 9,10.71c0,0.21 -0.03,0.41 -0.04,0.61c0.43,0.24 0.83,0.52 1.22,0.82C10.39,10.96 10.83,9.85 11.42,8.85z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/grid_3x3.xml b/qqq/android/mobileapp/src/main/res/drawable/grid_3x3.xml new file mode 100644 index 0000000..faaa740 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/grid_3x3.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/grid_3x3/materialicons/black/res/drawable/baseline_grid_3x3_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,10V8h-4V4h-2v4h-4V4H8v4H4v2h4v4H4v2h4v4h2v-4h4v4h2v-4h4v-2h-4v-4H20zM14,14h-4v-4h4V14z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/grid_4x4.xml b/qqq/android/mobileapp/src/main/res/drawable/grid_4x4.xml new file mode 100644 index 0000000..01b9c00 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/grid_4x4.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/grid_4x4/materialicons/black/res/drawable/baseline_grid_4x4_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M22,7V5h-3V2h-2v3h-4V2h-2v3H7V2H5v3H2v2h3v4H2v2h3v4H2v2h3v3h2v-3h4v3h2v-3h4v3h2v-3h3v-2h-3v-4h3v-2h-3V7H22zM7,7h4v4H7V7zM7,17v-4h4v4H7zM17,17h-4v-4h4V17zM17,11h-4V7h4V11z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/grid_goldenratio.xml b/qqq/android/mobileapp/src/main/res/drawable/grid_goldenratio.xml new file mode 100644 index 0000000..9dd9c35 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/grid_goldenratio.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/grid_goldenratio/materialicons/black/res/drawable/baseline_grid_goldenratio_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M22,11V9h-7V2h-2v7h-2V2H9v7H2v2h7v2H2v2h7v7h2v-7h2v7h2v-7h7v-2h-7v-2H22zM13,13h-2v-2h2V13z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/grid_off.xml b/qqq/android/mobileapp/src/main/res/drawable/grid_off.xml new file mode 100644 index 0000000..5001afc --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/grid_off.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/grid_off/materialicons/black/res/drawable/baseline_grid_off_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M8,4v1.45l2,2L10,4h4v4h-3.45l2,2L14,10v1.45l2,2L16,10h4v4h-3.45l2,2L20,16v1.45l2,2L22,4c0,-1.1 -0.9,-2 -2,-2L4.55,2l2,2L8,4zM16,4h4v4h-4L16,4zM1.27,1.27L0,2.55l2,2L2,20c0,1.1 0.9,2 2,2h15.46l2,2 1.27,-1.27L1.27,1.27zM10,12.55L11.45,14L10,14v-1.45zM4,6.55L5.45,8L4,8L4,6.55zM8,20L4,20v-4h4v4zM8,14L4,14v-4h3.45l0.55,0.55L8,14zM14,20h-4v-4h3.45l0.55,0.54L14,20zM16,20v-1.46L17.46,20L16,20z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/grid_on.xml b/qqq/android/mobileapp/src/main/res/drawable/grid_on.xml new file mode 100644 index 0000000..0b7f5df --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/grid_on.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/grid_on/materialicons/black/res/drawable/baseline_grid_on_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,2L4,2c-1.1,0 -2,0.9 -2,2v16c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2L22,4c0,-1.1 -0.9,-2 -2,-2zM8,20L4,20v-4h4v4zM8,14L4,14v-4h4v4zM8,8L4,8L4,4h4v4zM14,20h-4v-4h4v4zM14,14h-4v-4h4v4zM14,8h-4L10,4h4v4zM20,20h-4v-4h4v4zM20,14h-4v-4h4v4zM20,8h-4L16,4h4v4z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/grid_view.xml b/qqq/android/mobileapp/src/main/res/drawable/grid_view.xml new file mode 100644 index 0000000..c9fb2d1 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/grid_view.xml @@ -0,0 +1,20 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/file/grid_view/materialicons/black/res/drawable/baseline_grid_view_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M3,3v8h8L11,3L3,3zM9,9L5,9L5,5h4v4zM3,13v8h8v-8L3,13zM9,19L5,19v-4h4v4zM13,3v8h8L21,3h-8zM19,9h-4L15,5h4v4zM13,13v8h8v-8h-8zM19,19h-4v-4h4v4z" + android:fillType="evenOdd" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/group.xml b/qqq/android/mobileapp/src/main/res/drawable/group.xml new file mode 100644 index 0000000..de0c8b0 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/group.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/group/materialicons/black/res/drawable/baseline_group_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M16,11c1.66,0 2.99,-1.34 2.99,-3S17.66,5 16,5c-1.66,0 -3,1.34 -3,3s1.34,3 3,3zM8,11c1.66,0 2.99,-1.34 2.99,-3S9.66,5 8,5C6.34,5 5,6.34 5,8s1.34,3 3,3zM8,13c-2.33,0 -7,1.17 -7,3.5L1,19h14v-2.5c0,-2.33 -4.67,-3.5 -7,-3.5zM16,13c-0.29,0 -0.62,0.02 -0.97,0.05 1.16,0.84 1.97,1.97 1.97,3.45L17,19h6v-2.5c0,-2.33 -4.67,-3.5 -7,-3.5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/group_add.xml b/qqq/android/mobileapp/src/main/res/drawable/group_add.xml new file mode 100644 index 0000000..43d4465 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/group_add.xml @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/group_add/materialicons/black/res/drawable/baseline_group_add_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M22,9l0,-2l-2,0l0,2l-2,0l0,2l2,0l0,2l2,0l0,-2l2,0l0,-2z" /> + <path + android:fillColor="#FF000000" + android:pathData="M8,12c2.21,0 4,-1.79 4,-4s-1.79,-4 -4,-4S4,5.79 4,8S5.79,12 8,12z" /> + <path + android:fillColor="#FF000000" + android:pathData="M8,13c-2.67,0 -8,1.34 -8,4v3h16v-3C16,14.34 10.67,13 8,13z" /> + <path + android:fillColor="#FF000000" + android:pathData="M12.51,4.05C13.43,5.11 14,6.49 14,8s-0.57,2.89 -1.49,3.95C14.47,11.7 16,10.04 16,8S14.47,4.3 12.51,4.05z" /> + <path + android:fillColor="#FF000000" + android:pathData="M16.53,13.83C17.42,14.66 18,15.7 18,17v3h2v-3C20,15.55 18.41,14.49 16.53,13.83z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/group_off.xml b/qqq/android/mobileapp/src/main/res/drawable/group_off.xml new file mode 100644 index 0000000..4c4b8ea --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/group_off.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/group_off/materialicons/black/res/drawable/baseline_group_off_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M15,8c0,-1.42 -0.5,-2.73 -1.33,-3.76C14.09,4.1 14.53,4 15,4c2.21,0 4,1.79 4,4s-1.79,4 -4,4c-0.06,0 -0.12,0 -0.18,0l-0.77,-0.77C14.65,10.29 15,9.18 15,8zM22.83,20H23v-3c0,-2.18 -3.58,-3.47 -6.34,-3.87c1.1,0.75 1.95,1.71 2.23,2.94L22.83,20zM7.24,4.41C7.77,4.15 8.37,4 9,4c2.21,0 4,1.79 4,4c0,0.63 -0.15,1.23 -0.41,1.76L7.24,4.41zM9.17,12C9.11,12 9.06,12 9,12c-2.21,0 -4,-1.79 -4,-4c0,-0.06 0,-0.11 0,-0.17L0.69,3.51L2.1,2.1l19.8,19.8l-1.41,1.41L17,19.83V20H1v-3c0,-2.66 5.33,-4 8,-4c0.37,0 0.8,0.03 1.25,0.08L9.17,12z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/group_remove.xml b/qqq/android/mobileapp/src/main/res/drawable/group_remove.xml new file mode 100644 index 0000000..34b83a1 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/group_remove.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/group_remove/materialicons/black/res/drawable/baseline_group_remove_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M24,9v2h-6V9H24zM8,4C5.79,4 4,5.79 4,8s1.79,4 4,4s4,-1.79 4,-4S10.21,4 8,4zM8,13c-2.67,0 -8,1.34 -8,4v3h16v-3C16,14.34 10.67,13 8,13zM12.51,4.05C13.43,5.11 14,6.49 14,8s-0.57,2.89 -1.49,3.95C14.47,11.7 16,10.04 16,8S14.47,4.3 12.51,4.05zM16.53,13.83C17.42,14.66 18,15.7 18,17v3h2v-3C20,15.55 18.41,14.49 16.53,13.83z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/group_work.xml b/qqq/android/mobileapp/src/main/res/drawable/group_work.xml new file mode 100644 index 0000000..7250034 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/group_work.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/group_work/materialicons/black/res/drawable/baseline_group_work_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM8,17.5c-1.38,0 -2.5,-1.12 -2.5,-2.5s1.12,-2.5 2.5,-2.5 2.5,1.12 2.5,2.5 -1.12,2.5 -2.5,2.5zM9.5,8c0,-1.38 1.12,-2.5 2.5,-2.5s2.5,1.12 2.5,2.5 -1.12,2.5 -2.5,2.5S9.5,9.38 9.5,8zM16,17.5c-1.38,0 -2.5,-1.12 -2.5,-2.5s1.12,-2.5 2.5,-2.5 2.5,1.12 2.5,2.5 -1.12,2.5 -2.5,2.5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/groups.xml b/qqq/android/mobileapp/src/main/res/drawable/groups.xml new file mode 100644 index 0000000..343697d --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/groups.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/groups/materialicons/black/res/drawable/baseline_groups_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,12.75c1.63,0 3.07,0.39 4.24,0.9c1.08,0.48 1.76,1.56 1.76,2.73L18,18H6l0,-1.61c0,-1.18 0.68,-2.26 1.76,-2.73C8.93,13.14 10.37,12.75 12,12.75zM4,13c1.1,0 2,-0.9 2,-2c0,-1.1 -0.9,-2 -2,-2s-2,0.9 -2,2C2,12.1 2.9,13 4,13zM5.13,14.1C4.76,14.04 4.39,14 4,14c-0.99,0 -1.93,0.21 -2.78,0.58C0.48,14.9 0,15.62 0,16.43V18l4.5,0v-1.61C4.5,15.56 4.73,14.78 5.13,14.1zM20,13c1.1,0 2,-0.9 2,-2c0,-1.1 -0.9,-2 -2,-2s-2,0.9 -2,2C18,12.1 18.9,13 20,13zM24,16.43c0,-0.81 -0.48,-1.53 -1.22,-1.85C21.93,14.21 20.99,14 20,14c-0.39,0 -0.76,0.04 -1.13,0.1c0.4,0.68 0.63,1.46 0.63,2.29V18l4.5,0V16.43zM12,6c1.66,0 3,1.34 3,3c0,1.66 -1.34,3 -3,3s-3,-1.34 -3,-3C9,7.34 10.34,6 12,6z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/groups_2.xml b/qqq/android/mobileapp/src/main/res/drawable/groups_2.xml new file mode 100644 index 0000000..f8b6c7c --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/groups_2.xml @@ -0,0 +1,34 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/groups_2/materialicons/black/res/drawable/baseline_groups_2_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M10.27,12h3.46c0.93,0 1.63,-0.83 1.48,-1.75l-0.3,-1.79C14.67,7.04 13.44,6 12,6S9.33,7.04 9.09,8.47l-0.3,1.79C8.64,11.17 9.34,12 10.27,12z" /> + <path + android:fillColor="#FF000000" + android:pathData="M1.66,11.11c-0.13,0.26 -0.18,0.57 -0.1,0.88c0.16,0.69 0.76,1.03 1.53,1c0,0 1.49,0 1.95,0c0.83,0 1.51,-0.58 1.51,-1.29c0,-0.14 -0.03,-0.27 -0.07,-0.4c-0.01,-0.03 -0.01,-0.05 0.01,-0.08c0.09,-0.16 0.14,-0.34 0.14,-0.53c0,-0.31 -0.14,-0.6 -0.36,-0.82c-0.03,-0.03 -0.03,-0.06 -0.02,-0.1c0.07,-0.2 0.07,-0.43 0.01,-0.65C6.1,8.69 5.71,8.4 5.27,8.38c-0.03,0 -0.05,-0.01 -0.07,-0.03C5.03,8.14 4.72,8 4.37,8C4.07,8 3.8,8.1 3.62,8.26C3.59,8.29 3.56,8.29 3.53,8.28c-0.14,-0.06 -0.3,-0.09 -0.46,-0.09c-0.65,0 -1.18,0.49 -1.24,1.12c0,0.02 -0.01,0.04 -0.03,0.06c-0.29,0.26 -0.46,0.65 -0.41,1.05c0.03,0.22 0.12,0.43 0.25,0.6C1.67,11.04 1.67,11.08 1.66,11.11z" /> + <path + android:fillColor="#FF000000" + android:pathData="M16.24,13.65c-1.17,-0.52 -2.61,-0.9 -4.24,-0.9c-1.63,0 -3.07,0.39 -4.24,0.9C6.68,14.13 6,15.21 6,16.39V18h12v-1.61C18,15.21 17.32,14.13 16.24,13.65z" /> + <path + android:fillColor="#FF000000" + android:pathData="M1.22,14.58C0.48,14.9 0,15.62 0,16.43V18l4.5,0v-1.61c0,-0.83 0.23,-1.61 0.63,-2.29C4.76,14.04 4.39,14 4,14C3.01,14 2.07,14.21 1.22,14.58z" /> + <path + android:fillColor="#FF000000" + android:pathData="M22.78,14.58C21.93,14.21 20.99,14 20,14c-0.39,0 -0.76,0.04 -1.13,0.1c0.4,0.68 0.63,1.46 0.63,2.29V18l4.5,0v-1.57C24,15.62 23.52,14.9 22.78,14.58z" /> + <path + android:fillColor="#FF000000" + android:pathData="M22,11v-0.5c0,-1.1 -0.9,-2 -2,-2h-2c-0.42,0 -0.65,0.48 -0.39,0.81l0.7,0.63C18.12,10.25 18,10.61 18,11c0,1.1 0.9,2 2,2S22,12.1 22,11z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/groups_3.xml b/qqq/android/mobileapp/src/main/res/drawable/groups_3.xml new file mode 100644 index 0000000..868bcbe --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/groups_3.xml @@ -0,0 +1,34 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/groups_3/materialicons/black/res/drawable/baseline_groups_3_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M16.24,13.65c-1.17,-0.52 -2.61,-0.9 -4.24,-0.9c-1.63,0 -3.07,0.39 -4.24,0.9C6.68,14.13 6,15.21 6,16.39V18h12v-1.61C18,15.21 17.32,14.13 16.24,13.65z" /> + <path + android:fillColor="#FF000000" + android:pathData="M1.22,14.58C0.48,14.9 0,15.62 0,16.43V18l4.5,0v-1.61c0,-0.83 0.23,-1.61 0.63,-2.29C4.76,14.04 4.39,14 4,14C3.01,14 2.07,14.21 1.22,14.58z" /> + <path + android:fillColor="#FF000000" + android:pathData="M22.78,14.58C21.93,14.21 20.99,14 20,14c-0.39,0 -0.76,0.04 -1.13,0.1c0.4,0.68 0.63,1.46 0.63,2.29V18l4.5,0v-1.57C24,15.62 23.52,14.9 22.78,14.58z" /> + <path + android:fillColor="#FF000000" + android:pathData="M12,12c1.66,0 3,-1.34 3,-3c0,-1.66 -1.34,-3 -3,-3S9,7.34 9,9C9,10.66 10.34,12 12,12z" /> + <path + android:fillColor="#FF000000" + android:pathData="M1.497,11l2.503,-2.503l2.503,2.503l-2.503,2.503z" /> + <path + android:fillColor="#FF000000" + android:pathData="M20,9l-2.5,4l5,0z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/h_mobiledata.xml b/qqq/android/mobileapp/src/main/res/drawable/h_mobiledata.xml new file mode 100644 index 0000000..dc966e7 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/h_mobiledata.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/h_mobiledata/materialicons/black/res/drawable/baseline_h_mobiledata_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M15,11H9V7H7v10h2v-4h6v4h2V7h-2V11z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/h_plus_mobiledata.xml b/qqq/android/mobileapp/src/main/res/drawable/h_plus_mobiledata.xml new file mode 100644 index 0000000..3ecfa98 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/h_plus_mobiledata.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/h_plus_mobiledata/materialicons/black/res/drawable/baseline_h_plus_mobiledata_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,11H6V7H4v10h2v-4h6v4h2V7h-2V11zM22,11h-2V9h-2v2h-2v2h2v2h2v-2h2V11z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/hail.xml b/qqq/android/mobileapp/src/main/res/drawable/hail.xml new file mode 100644 index 0000000..46173a2 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/hail.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/hail/materialicons/black/res/drawable/baseline_hail_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,6c-1.1,0 -2,-0.9 -2,-2s0.9,-2 2,-2 2,0.9 2,2 -0.9,2 -2,2zM17,2h2v0.4c-0.1,2.2 -0.8,3.9 -2.3,5.1 -0.5,0.4 -1.1,0.7 -1.7,0.9L15,22h-2v-6h-2v6L9,22L9,10.1c-0.3,0.1 -0.5,0.2 -0.6,0.3 -0.9,0.7 -1.39,1.6 -1.4,3.1v0.5L5,14v-0.5c0,-2 0.71,-3.59 2.11,-4.79C8.21,7.81 10,7 12,7s2.68,-0.46 3.48,-1.06C16.48,5.14 17,4 17,2.5L17,2zM4,16h3v6L4,22v-6z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/handshake.xml b/qqq/android/mobileapp/src/main/res/drawable/handshake.xml new file mode 100644 index 0000000..c87d3c6 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/handshake.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/handshake/materialicons/black/res/drawable/baseline_handshake_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M16.48,10.41c-0.39,0.39 -1.04,0.39 -1.43,0l-4.47,-4.46l-7.05,7.04l-0.66,-0.63c-1.17,-1.17 -1.17,-3.07 0,-4.24l4.24,-4.24c1.17,-1.17 3.07,-1.17 4.24,0L16.48,9C16.87,9.39 16.87,10.02 16.48,10.41zM17.18,8.29c0.78,0.78 0.78,2.05 0,2.83c-1.27,1.27 -2.61,0.22 -2.83,0l-3.76,-3.76l-5.57,5.57c-0.39,0.39 -0.39,1.02 0,1.41c0.39,0.39 1.02,0.39 1.42,0l4.62,-4.62l0.71,0.71l-4.62,4.62c-0.39,0.39 -0.39,1.02 0,1.41c0.39,0.39 1.02,0.39 1.42,0l4.62,-4.62l0.71,0.71l-4.62,4.62c-0.39,0.39 -0.39,1.02 0,1.41c0.39,0.39 1.02,0.39 1.41,0l4.62,-4.62l0.71,0.71l-4.62,4.62c-0.39,0.39 -0.39,1.02 0,1.41c0.39,0.39 1.02,0.39 1.41,0l8.32,-8.34c1.17,-1.17 1.17,-3.07 0,-4.24l-4.24,-4.24c-1.15,-1.15 -3.01,-1.17 -4.18,-0.06L17.18,8.29z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/handyman.xml b/qqq/android/mobileapp/src/main/res/drawable/handyman.xml new file mode 100644 index 0000000..5809017 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/handyman.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/handyman/materialicons/black/res/drawable/baseline_handyman_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M21.67,18.17l-5.3,-5.3h-0.99l-2.54,2.54v0.99l5.3,5.3c0.39,0.39 1.02,0.39 1.41,0l2.12,-2.12C22.06,19.2 22.06,18.56 21.67,18.17z" /> + <path + android:fillColor="#FF000000" + android:pathData="M17.34,10.19l1.41,-1.41l2.12,2.12c1.17,-1.17 1.17,-3.07 0,-4.24l-3.54,-3.54l-1.41,1.41V1.71L15.22,1l-3.54,3.54l0.71,0.71h2.83l-1.41,1.41l1.06,1.06l-2.89,2.89L7.85,6.48V5.06L4.83,2.04L2,4.87l3.03,3.03h1.41l4.13,4.13l-0.85,0.85H7.6l-5.3,5.3c-0.39,0.39 -0.39,1.02 0,1.41l2.12,2.12c0.39,0.39 1.02,0.39 1.41,0l5.3,-5.3v-2.12l5.15,-5.15L17.34,10.19z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/hardware.xml b/qqq/android/mobileapp/src/main/res/drawable/hardware.xml new file mode 100644 index 0000000..da465d3 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/hardware.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/hardware/materialicons/black/res/drawable/baseline_hardware_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M18,3l-3,3V3H9C6.24,3 4,5.24 4,8h5v3h6V8l3,3h2V3H18z" /> + <path + android:fillColor="#FF000000" + android:pathData="M9,13v7c0,0.55 0.45,1 1,1h4c0.55,0 1,-0.45 1,-1v-7H9z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/hd.xml b/qqq/android/mobileapp/src/main/res/drawable/hd.xml new file mode 100644 index 0000000..5fc24f4 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/hd.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/av/hd/materialicons/black/res/drawable/baseline_hd_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19,3L5,3c-1.11,0 -2,0.9 -2,2v14c0,1.1 0.89,2 2,2h14c1.1,0 2,-0.9 2,-2L21,5c0,-1.1 -0.9,-2 -2,-2zM11,15L9.5,15v-2h-2v2L6,15L6,9h1.5v2.5h2L9.5,9L11,9v6zM13,9h4c0.55,0 1,0.45 1,1v4c0,0.55 -0.45,1 -1,1h-4L13,9zM14.5,13.5h2v-3h-2v3z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/hdr_auto.xml b/qqq/android/mobileapp/src/main/res/drawable/hdr_auto.xml new file mode 100644 index 0000000..7ec0e4e --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/hdr_auto.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/hdr_auto/materialicons/black/res/drawable/baseline_hdr_auto_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12.04,8.04l-0.09,0l-1.6,4.55l3.29,0z" /> + <path + android:fillColor="#FF000000" + android:pathData="M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10s10,-4.48 10,-10S17.52,2 12,2zM15.21,17l-0.98,-2.81H9.78l-1,2.81h-1.9l4.13,-11h1.97l4.13,11H15.21z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/hdr_auto_select.xml b/qqq/android/mobileapp/src/main/res/drawable/hdr_auto_select.xml new file mode 100644 index 0000000..d376a51 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/hdr_auto_select.xml @@ -0,0 +1,34 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/hdr_auto_select/materialicons/black/res/drawable/baseline_hdr_auto_select_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M10,16H6.5v6H10c0.8,0 1.5,-0.7 1.5,-1.5v-3C11.5,16.7 10.8,16 10,16zM10,20.5H8v-3h2V20.5z" /> + <path + android:fillColor="#FF000000" + android:pathData="M16.5,16H13v6h1.5v-2h1.1l0.9,2H18l-0.9,-2.1c0.5,-0.3 0.9,-0.8 0.9,-1.4v-1C18,16.7 17.3,16 16.5,16zM16.5,18.5h-2v-1h2V18.5z" /> + <path + android:fillColor="#FF000000" + android:pathData="M3.5,18l-2,0l0,-2l-1.5,0l0,6l1.5,0l0,-2.5l2,0l0,2.5l1.5,0l0,-6l-1.5,0z" /> + <path + android:fillColor="#FF000000" + android:pathData="M22,18.5l0,-2l-1.5,0l0,2l-2,0l0,1.5l2,0l0,2l1.5,0l0,-2l2,0l0,-1.5z" /> + <path + android:fillColor="#FF000000" + android:pathData="M11.97,5.3l-1.02,2.89l2.1,0l-1.02,-2.89z" /> + <path + android:fillColor="#FF000000" + android:pathData="M12,2C8.69,2 6,4.69 6,8s2.69,6 6,6s6,-2.69 6,-6S15.31,2 12,2zM14.04,11l-0.63,-1.79h-2.83L9.96,11H8.74l2.63,-7h1.25l2.63,7H14.04z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/hdr_enhanced_select.xml b/qqq/android/mobileapp/src/main/res/drawable/hdr_enhanced_select.xml new file mode 100644 index 0000000..90043ab --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/hdr_enhanced_select.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/hdr_enhanced_select/materialicons/black/res/drawable/baseline_hdr_enhanced_select_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,2c3.31,0 6,2.69 6,6s-2.69,6 -6,6 -6,-2.69 -6,-6 2.69,-6 6,-6zM12,4C9.79,4 8,5.79 8,8s1.79,4 4,4 4,-1.79 4,-4 -1.79,-4 -4,-4zM13,11h-2L11,9L9,9L9,7h2L11,5h2v2h2v2h-2v2zM24,20h-2v2h-1.5v-2h-2v-1.5h2v-2L22,16.5v2h2L24,20zM18,18.5c0,0.6 -0.4,1.1 -0.9,1.4L18,22h-1.5l-0.9,-2h-1.1v2L13,22v-6h3.5c0.8,0 1.5,0.7 1.5,1.5v1zM16.5,18.5v-1h-2v1h2zM3.5,18v-2L5,16v6L3.5,22v-2.5h-2L1.5,22L0,22v-6h1.5v2h2zM10,16c0.8,0 1.5,0.7 1.5,1.5v3c0,0.8 -0.7,1.5 -1.5,1.5L6.5,22v-6L10,16zM10,20.5v-3L8,17.5v3h2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/hdr_off.xml b/qqq/android/mobileapp/src/main/res/drawable/hdr_off.xml new file mode 100644 index 0000000..789d174 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/hdr_off.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/hdr_off/materialicons/black/res/drawable/baseline_hdr_off_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M17.5,15v-2h1.1l0.9,2L21,15l-0.9,-2.1c0.5,-0.2 0.9,-0.8 0.9,-1.4v-1c0,-0.8 -0.7,-1.5 -1.5,-1.5L16,9v4.9l1.1,1.1h0.4zM17.5,10.5h2v1h-2v-1zM13,10.5v0.4l1.5,1.5v-1.9c0,-0.8 -0.7,-1.5 -1.5,-1.5h-1.9l1.5,1.5h0.4zM9.5,9.5l-7,-7 -1.1,1L6.9,9h-0.4v2h-2L4.5,9L3,9v6h1.5v-2.5h2L6.5,15L8,15v-4.9l1.5,1.5L9.5,15h3.4l7.6,7.6 1.1,-1.1 -12.1,-12z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/hdr_off_select.xml b/qqq/android/mobileapp/src/main/res/drawable/hdr_off_select.xml new file mode 100644 index 0000000..65e86d0 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/hdr_off_select.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/hdr_off_select/materialicons/black/res/drawable/baseline_hdr_off_select_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M18,18.5v-1c0,-0.8 -0.7,-1.5 -1.5,-1.5H13v6h1.5v-2h1.1l0.9,2H18l-0.9,-2.1C17.6,19.6 18,19.1 18,18.5zM16.5,18.5h-2v-1h2V18.5zM3.5,18h-2v-2H0v6h1.5v-2.5h2V22H5v-6H3.5V18zM10,16H6.5v6H10c0.8,0 1.5,-0.7 1.5,-1.5v-3C11.5,16.7 10.8,16 10,16zM10,20.5H8v-3h2V20.5zM24,20h-2v2h-1.5v-2h-2v-1.5h2v-2H22v2h2V20zM10.98,4.15L9.42,2.59c5.1,-2.42 10.41,2.89 7.99,7.99l-1.56,-1.56C16.66,6.06 13.94,3.34 10.98,4.15zM6.34,2.34L4.93,3.76l1.66,1.66c-2.42,5.1 2.89,10.41 7.99,7.99l1.66,1.66l1.41,-1.41L6.34,2.34zM8.15,6.98l4.87,4.87C10.06,12.66 7.34,9.94 8.15,6.98z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/hdr_on.xml b/qqq/android/mobileapp/src/main/res/drawable/hdr_on.xml new file mode 100644 index 0000000..c61b813 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/hdr_on.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/hdr_on/materialicons/black/res/drawable/baseline_hdr_on_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M21,11.5v-1c0,-0.8 -0.7,-1.5 -1.5,-1.5L16,9v6h1.5v-2h1.1l0.9,2L21,15l-0.9,-2.1c0.5,-0.3 0.9,-0.8 0.9,-1.4zM19.5,11.5h-2v-1h2v1zM6.5,11h-2L4.5,9L3,9v6h1.5v-2.5h2L6.5,15L8,15L8,9L6.5,9v2zM13,9L9.5,9v6L13,15c0.8,0 1.5,-0.7 1.5,-1.5v-3c0,-0.8 -0.7,-1.5 -1.5,-1.5zM13,13.5h-2v-3h2v3z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/hdr_on_select.xml b/qqq/android/mobileapp/src/main/res/drawable/hdr_on_select.xml new file mode 100644 index 0000000..9a616e1 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/hdr_on_select.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/hdr_on_select/materialicons/black/res/drawable/baseline_hdr_on_select_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M18,18.5v-1c0,-0.8 -0.7,-1.5 -1.5,-1.5H13v6h1.5v-2h1.1l0.9,2H18l-0.9,-2.1C17.6,19.6 18,19.1 18,18.5zM16.5,18.5h-2v-1h2V18.5zM3.5,18h-2v-2H0v6h1.5v-2.5h2V22H5v-6H3.5V18zM10,16H6.5v6H10c0.8,0 1.5,-0.7 1.5,-1.5v-3C11.5,16.7 10.8,16 10,16zM10,20.5H8v-3h2V20.5zM24,20h-2v2h-1.5v-2h-2v-1.5h2v-2H22v2h2V20zM12,4c2.21,0 4,1.79 4,4s-1.79,4 -4,4s-4,-1.79 -4,-4S9.79,4 12,4M12,2C8.69,2 6,4.69 6,8s2.69,6 6,6s6,-2.69 6,-6S15.31,2 12,2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/hdr_plus.xml b/qqq/android/mobileapp/src/main/res/drawable/hdr_plus.xml new file mode 100644 index 0000000..de9b047 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/hdr_plus.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/hdr_plus/materialicons/black/res/drawable/baseline_hdr_plus_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M8.5,14.5h2v1h-2z" /> + <path + android:fillColor="#FF000000" + android:pathData="M14.5,7.5h1.5v3h-1.5z" /> + <path + android:fillColor="#FF000000" + android:pathData="M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10s10,-4.48 10,-10S17.52,2 12,2zM12,15.5c0,0.6 -0.4,1.1 -0.9,1.4L12,19h-1.5l-0.9,-2H8.5v2H7v-6h3.5c0.8,0 1.5,0.7 1.5,1.5V15.5zM12,12h-1.5V9.5h-2V12H7V6h1.5v2h2V6H12V12zM17.5,16H16v1.5h-1.5V16H13v-1.5h1.5V13H16v1.49h1.5V16zM17.5,10.5c0,0.8 -0.7,1.5 -1.5,1.5h-3V6h3c0.8,0 1.5,0.7 1.5,1.5V10.5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/hdr_strong.xml b/qqq/android/mobileapp/src/main/res/drawable/hdr_strong.xml new file mode 100644 index 0000000..97c1090 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/hdr_strong.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/hdr_strong/materialicons/black/res/drawable/baseline_hdr_strong_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M17,6c-3.31,0 -6,2.69 -6,6s2.69,6 6,6 6,-2.69 6,-6 -2.69,-6 -6,-6zM5,8c-2.21,0 -4,1.79 -4,4s1.79,4 4,4 4,-1.79 4,-4 -1.79,-4 -4,-4zM5,14c-1.1,0 -2,-0.9 -2,-2s0.9,-2 2,-2 2,0.9 2,2 -0.9,2 -2,2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/hdr_weak.xml b/qqq/android/mobileapp/src/main/res/drawable/hdr_weak.xml new file mode 100644 index 0000000..af4e5c9 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/hdr_weak.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/hdr_weak/materialicons/black/res/drawable/baseline_hdr_weak_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M5,8c-2.21,0 -4,1.79 -4,4s1.79,4 4,4 4,-1.79 4,-4 -1.79,-4 -4,-4zM17,6c-3.31,0 -6,2.69 -6,6s2.69,6 6,6 6,-2.69 6,-6 -2.69,-6 -6,-6zM17,16c-2.21,0 -4,-1.79 -4,-4s1.79,-4 4,-4 4,1.79 4,4 -1.79,4 -4,4z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/headphones.xml b/qqq/android/mobileapp/src/main/res/drawable/headphones.xml new file mode 100644 index 0000000..2d89cbc --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/headphones.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/hardware/headphones/materialicons/black/res/drawable/baseline_headphones_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,3c-4.97,0 -9,4.03 -9,9v7c0,1.1 0.9,2 2,2h4v-8H5v-1c0,-3.87 3.13,-7 7,-7s7,3.13 7,7v1h-4v8h4c1.1,0 2,-0.9 2,-2v-7C21,7.03 16.97,3 12,3z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/headphones_battery.xml b/qqq/android/mobileapp/src/main/res/drawable/headphones_battery.xml new file mode 100644 index 0000000..0cc2523 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/headphones_battery.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/hardware/headphones_battery/materialicons/black/res/drawable/baseline_headphones_battery_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M21,7h-1V6h-2v1h-1c-0.55,0 -1,0.45 -1,1v9c0,0.55 0.45,1 1,1h4c0.55,0 1,-0.45 1,-1V8C22,7.45 21.55,7 21,7z" /> + <path + android:fillColor="#FF000000" + android:pathData="M8,6c-3.31,0 -6,2.69 -6,6v4c0,1.1 0.9,2 2,2h2v-5H3.5v-1c0,-2.48 2.02,-4.5 4.5,-4.5s4.5,2.02 4.5,4.5v1H10v5h2c1.1,0 2,-0.9 2,-2v-4C14,8.69 11.31,6 8,6z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/headset.xml b/qqq/android/mobileapp/src/main/res/drawable/headset.xml new file mode 100644 index 0000000..e6e6922 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/headset.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/hardware/headset/materialicons/black/res/drawable/baseline_headset_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,1c-4.97,0 -9,4.03 -9,9v7c0,1.66 1.34,3 3,3h3v-8H5v-2c0,-3.87 3.13,-7 7,-7s7,3.13 7,7v2h-4v8h3c1.66,0 3,-1.34 3,-3v-7c0,-4.97 -4.03,-9 -9,-9z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/headset_mic.xml b/qqq/android/mobileapp/src/main/res/drawable/headset_mic.xml new file mode 100644 index 0000000..068fe9c --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/headset_mic.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/hardware/headset_mic/materialicons/black/res/drawable/baseline_headset_mic_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,1c-4.97,0 -9,4.03 -9,9v7c0,1.66 1.34,3 3,3h3v-8H5v-2c0,-3.87 3.13,-7 7,-7s7,3.13 7,7v2h-4v8h4v1h-7v2h6c1.66,0 3,-1.34 3,-3V10c0,-4.97 -4.03,-9 -9,-9z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/headset_off.xml b/qqq/android/mobileapp/src/main/res/drawable/headset_off.xml new file mode 100644 index 0000000..a62e1d5 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/headset_off.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/hardware/headset_off/materialicons/black/res/drawable/baseline_headset_off_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,4c3.87,0 7,3.13 7,7v2h-2.92L21,17.92V11c0,-4.97 -4.03,-9 -9,-9 -1.95,0 -3.76,0.62 -5.23,1.68l1.44,1.44C9.3,4.41 10.6,4 12,4zM2.27,1.72L1,3l3.33,3.32C3.49,7.68 3,9.29 3,11v7c0,1.66 1.34,3 3,3h3v-8H5v-2c0,-1.17 0.29,-2.26 0.79,-3.22L15,17v4h3c0.3,0 0.59,-0.06 0.86,-0.14L21,23l1.27,-1.27 -20,-20.01z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/healing.xml b/qqq/android/mobileapp/src/main/res/drawable/healing.xml new file mode 100644 index 0000000..9c71f76 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/healing.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/healing/materialicons/black/res/drawable/baseline_healing_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M17.73,12.02l3.98,-3.98c0.39,-0.39 0.39,-1.02 0,-1.41l-4.34,-4.34c-0.39,-0.39 -1.02,-0.39 -1.41,0l-3.98,3.98L8,2.29C7.8,2.1 7.55,2 7.29,2c-0.25,0 -0.51,0.1 -0.7,0.29L2.25,6.63c-0.39,0.39 -0.39,1.02 0,1.41l3.98,3.98L2.25,16c-0.39,0.39 -0.39,1.02 0,1.41l4.34,4.34c0.39,0.39 1.02,0.39 1.41,0l3.98,-3.98 3.98,3.98c0.2,0.2 0.45,0.29 0.71,0.29 0.26,0 0.51,-0.1 0.71,-0.29l4.34,-4.34c0.39,-0.39 0.39,-1.02 0,-1.41l-3.99,-3.98zM12,9c0.55,0 1,0.45 1,1s-0.45,1 -1,1 -1,-0.45 -1,-1 0.45,-1 1,-1zM7.29,10.96L3.66,7.34l3.63,-3.63 3.62,3.62 -3.62,3.63zM10,13c-0.55,0 -1,-0.45 -1,-1s0.45,-1 1,-1 1,0.45 1,1 -0.45,1 -1,1zM12,15c-0.55,0 -1,-0.45 -1,-1s0.45,-1 1,-1 1,0.45 1,1 -0.45,1 -1,1zM14,11c0.55,0 1,0.45 1,1s-0.45,1 -1,1 -1,-0.45 -1,-1 0.45,-1 1,-1zM16.66,20.34l-3.63,-3.62 3.63,-3.63 3.62,3.62 -3.62,3.63z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/health_and_safety.xml b/qqq/android/mobileapp/src/main/res/drawable/health_and_safety.xml new file mode 100644 index 0000000..d6471a4 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/health_and_safety.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/health_and_safety/materialicons/black/res/drawable/baseline_health_and_safety_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M10.5,13H8v-3h2.5V7.5h3V10H16v3h-2.5v2.5h-3V13zM12,2L4,5v6.09c0,5.05 3.41,9.76 8,10.91c4.59,-1.15 8,-5.86 8,-10.91V5L12,2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/hearing.xml b/qqq/android/mobileapp/src/main/res/drawable/hearing.xml new file mode 100644 index 0000000..c3e4bed --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/hearing.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/av/hearing/materialicons/black/res/drawable/baseline_hearing_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M17,20c-0.29,0 -0.56,-0.06 -0.76,-0.15 -0.71,-0.37 -1.21,-0.88 -1.71,-2.38 -0.51,-1.56 -1.47,-2.29 -2.39,-3 -0.79,-0.61 -1.61,-1.24 -2.32,-2.53C9.29,10.98 9,9.93 9,9c0,-2.8 2.2,-5 5,-5s5,2.2 5,5h2c0,-3.93 -3.07,-7 -7,-7S7,5.07 7,9c0,1.26 0.38,2.65 1.07,3.9 0.91,1.65 1.98,2.48 2.85,3.15 0.81,0.62 1.39,1.07 1.71,2.05 0.6,1.82 1.37,2.84 2.73,3.55 0.51,0.23 1.07,0.35 1.64,0.35 2.21,0 4,-1.79 4,-4h-2c0,1.1 -0.9,2 -2,2zM7.64,2.64L6.22,1.22C4.23,3.21 3,5.96 3,9s1.23,5.79 3.22,7.78l1.41,-1.41C6.01,13.74 5,11.49 5,9s1.01,-4.74 2.64,-6.36zM11.5,9c0,1.38 1.12,2.5 2.5,2.5s2.5,-1.12 2.5,-2.5 -1.12,-2.5 -2.5,-2.5 -2.5,1.12 -2.5,2.5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/hearing_disabled.xml b/qqq/android/mobileapp/src/main/res/drawable/hearing_disabled.xml new file mode 100644 index 0000000..6257c58 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/hearing_disabled.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/av/hearing_disabled/materialicons/black/res/drawable/baseline_hearing_disabled_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M6.03,3.2C7.15,2.44 8.51,2 10,2c3.93,0 7,3.07 7,7c0,1.26 -0.38,2.65 -1.07,3.9c-0.02,0.04 -0.05,0.08 -0.08,0.13l-1.48,-1.48C14.77,10.69 15,9.8 15,9c0,-2.8 -2.2,-5 -5,-5C9.08,4 8.24,4.26 7.5,4.67L6.03,3.2zM17.21,14.38l1.43,1.43C20.11,13.93 21,11.57 21,9c0,-3.04 -1.23,-5.79 -3.22,-7.78l-1.42,1.42C17.99,4.26 19,6.51 19,9C19,11.02 18.33,12.88 17.21,14.38zM10,6.5c-0.21,0 -0.4,0.03 -0.59,0.08l3.01,3.01C12.47,9.4 12.5,9.21 12.5,9C12.5,7.62 11.38,6.5 10,6.5zM21.19,21.19L2.81,2.81L1.39,4.22l2.13,2.13C3.19,7.16 3,8.05 3,9h2c0,-0.36 0.05,-0.71 0.12,-1.05l6.61,6.61c-0.88,0.68 -1.78,1.41 -2.27,2.9c-0.5,1.5 -1,2.01 -1.71,2.38C7.56,19.94 7.29,20 7,20c-1.1,0 -2,-0.9 -2,-2H3c0,2.21 1.79,4 4,4c0.57,0 1.13,-0.12 1.64,-0.35c1.36,-0.71 2.13,-1.73 2.73,-3.55c0.32,-0.98 0.9,-1.43 1.71,-2.05c0.03,-0.02 0.05,-0.04 0.08,-0.06l6.62,6.62L21.19,21.19z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/heart_broken.xml b/qqq/android/mobileapp/src/main/res/drawable/heart_broken.xml new file mode 100644 index 0000000..c7574b1 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/heart_broken.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/heart_broken/materialicons/black/res/drawable/baseline_heart_broken_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M16.5,3c-0.96,0 -1.9,0.25 -2.73,0.69L12,9h3l-3,10l1,-9h-3l1.54,-5.39C10.47,3.61 9.01,3 7.5,3C4.42,3 2,5.42 2,8.5c0,4.13 4.16,7.18 10,12.5c5.47,-4.94 10,-8.26 10,-12.5C22,5.42 19.58,3 16.5,3z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/heat_pump.xml b/qqq/android/mobileapp/src/main/res/drawable/heat_pump.xml new file mode 100644 index 0000000..f4b3743 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/heat_pump.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/home/heat_pump/materialicons/black/res/drawable/baseline_heat_pump_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19,3H5C3.9,3 3,3.9 3,5v14c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2V5C21,3.9 20.1,3 19,3zM12.75,7.08c0.82,0.12 1.57,0.44 2.2,0.91l-2.2,2.2V7.08zM11.25,7.08v3.11l-2.2,-2.2C9.68,7.52 10.43,7.2 11.25,7.08zM7.99,9.05l2.2,2.2H7.08C7.2,10.43 7.52,9.68 7.99,9.05zM7.08,12.75h3.11l-2.2,2.2C7.52,14.32 7.2,13.57 7.08,12.75zM11.25,16.92c-0.82,-0.12 -1.57,-0.44 -2.2,-0.91l2.2,-2.2V16.92zM12,13c-0.55,0 -1,-0.45 -1,-1c0,-0.55 0.45,-1 1,-1s1,0.45 1,1C13,12.55 12.55,13 12,13zM12.75,16.92v-3.11l2.2,2.2C14.32,16.48 13.57,16.8 12.75,16.92zM16.01,14.95l-2.2,-2.2h3.11C16.8,13.57 16.48,14.32 16.01,14.95zM13.81,11.25l2.2,-2.2c0.47,0.64 0.79,1.39 0.91,2.2H13.81z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/height.xml b/qqq/android/mobileapp/src/main/res/drawable/height.xml new file mode 100644 index 0000000..f003c10 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/height.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/editor/height/materialicons/black/res/drawable/baseline_height_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M13,6.99l3,0l-4,-3.99l-4,3.99l3,0l0,10.02l-3,0l4,3.99l4,-3.99l-3,0z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/help.xml b/qqq/android/mobileapp/src/main/res/drawable/help.xml new file mode 100644 index 0000000..ae58fca --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/help.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/help/materialicons/black/res/drawable/baseline_help_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM13,19h-2v-2h2v2zM15.07,11.25l-0.9,0.92C13.45,12.9 13,13.5 13,15h-2v-0.5c0,-1.1 0.45,-2.1 1.17,-2.83l1.24,-1.26c0.37,-0.36 0.59,-0.86 0.59,-1.41 0,-1.1 -0.9,-2 -2,-2s-2,0.9 -2,2L8,9c0,-2.21 1.79,-4 4,-4s4,1.79 4,4c0,0.88 -0.36,1.68 -0.93,2.25z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/help_center.xml b/qqq/android/mobileapp/src/main/res/drawable/help_center.xml new file mode 100644 index 0000000..d6b057c --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/help_center.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/help_center/materialicons/black/res/drawable/baseline_help_center_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19,3H5C3.9,3 3,3.9 3,5v14c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2V5C21,3.9 20.1,3 19,3zM12.01,18c-0.7,0 -1.26,-0.56 -1.26,-1.26c0,-0.71 0.56,-1.25 1.26,-1.25c0.71,0 1.25,0.54 1.25,1.25C13.25,17.43 12.72,18 12.01,18zM15.02,10.6c-0.76,1.11 -1.48,1.46 -1.87,2.17c-0.16,0.29 -0.22,0.48 -0.22,1.41h-1.82c0,-0.49 -0.08,-1.29 0.31,-1.98c0.49,-0.87 1.42,-1.39 1.96,-2.16c0.57,-0.81 0.25,-2.33 -1.37,-2.33c-1.06,0 -1.58,0.8 -1.8,1.48L8.56,8.49C9.01,7.15 10.22,6 11.99,6c1.48,0 2.49,0.67 3.01,1.52C15.44,8.24 15.7,9.59 15.02,10.6z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/help_outline.xml b/qqq/android/mobileapp/src/main/res/drawable/help_outline.xml new file mode 100644 index 0000000..4b1303a --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/help_outline.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/help_outline/materialicons/black/res/drawable/baseline_help_outline_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M11,18h2v-2h-2v2zM12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM12,20c-4.41,0 -8,-3.59 -8,-8s3.59,-8 8,-8 8,3.59 8,8 -3.59,8 -8,8zM12,6c-2.21,0 -4,1.79 -4,4h2c0,-1.1 0.9,-2 2,-2s2,0.9 2,2c0,2 -3,1.75 -3,5h2c0,-2.25 3,-2.5 3,-5 0,-2.21 -1.79,-4 -4,-4z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/hevc.xml b/qqq/android/mobileapp/src/main/res/drawable/hevc.xml new file mode 100644 index 0000000..b7dd099 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/hevc.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/hevc/materialicons/black/res/drawable/baseline_hevc_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M5.5,11l-1,0l0,-2l-1.5,0l0,6l1.5,0l0,-2.5l1,0l0,2.5l1.5,0l0,-6l-1.5,0z" /> + <path + android:fillColor="#FF000000" + android:pathData="M21,11v-1c0,-0.55 -0.45,-1 -1,-1h-2c-0.55,0 -1,0.45 -1,1v4c0,0.55 0.45,1 1,1h2c0.55,0 1,-0.45 1,-1v-1h-1.5v0.5h-1v-3h1V11H21z" /> + <path + android:fillColor="#FF000000" + android:pathData="M14.25,13.5l-0.75,-4.5l-1.5,0l1,6l2.5,0l1,-6l-1.5,0z" /> + <path + android:fillColor="#FF000000" + android:pathData="M8,9l0,6l3.5,0l0,-1.5l-2,0l0,-1l2,0l0,-1.5l-2,0l0,-0.5l2,0l0,-1.5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/hexagon.xml b/qqq/android/mobileapp/src/main/res/drawable/hexagon.xml new file mode 100644 index 0000000..50c204a --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/hexagon.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/editor/hexagon/materialicons/black/res/drawable/baseline_hexagon_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M17.2,3l-10.4,0l-5.2,9l5.2,9l10.4,0l5.2,-9z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/hide_image.xml b/qqq/android/mobileapp/src/main/res/drawable/hide_image.xml new file mode 100644 index 0000000..642c98e --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/hide_image.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/hide_image/materialicons/black/res/drawable/baseline_hide_image_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M21,5c0,-1.1 -0.9,-2 -2,-2H5.83L21,18.17V5z" /> + <path + android:fillColor="#FF000000" + android:pathData="M2.81,2.81L1.39,4.22L3,5.83V19c0,1.1 0.9,2 2,2h13.17l1.61,1.61l1.41,-1.41L2.81,2.81zM6,17l3,-4l2.25,3l0.82,-1.1l2.1,2.1H6z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/hide_source.xml b/qqq/android/mobileapp/src/main/res/drawable/hide_source.xml new file mode 100644 index 0000000..ec1907b --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/hide_source.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/hide_source/materialicons/black/res/drawable/baseline_hide_source_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M2.81,2.81L1.39,4.22l2.27,2.27C2.61,8.07 2,9.96 2,12c0,5.52 4.48,10 10,10c2.04,0 3.93,-0.61 5.51,-1.66l2.27,2.27l1.41,-1.41L2.81,2.81zM12,20c-4.41,0 -8,-3.59 -8,-8c0,-1.48 0.41,-2.86 1.12,-4.06l10.94,10.94C14.86,19.59 13.48,20 12,20zM7.94,5.12L6.49,3.66C8.07,2.61 9.96,2 12,2c5.52,0 10,4.48 10,10c0,2.04 -0.61,3.93 -1.66,5.51l-1.46,-1.46C19.59,14.86 20,13.48 20,12c0,-4.41 -3.59,-8 -8,-8C10.52,4 9.14,4.41 7.94,5.12z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/high_quality.xml b/qqq/android/mobileapp/src/main/res/drawable/high_quality.xml new file mode 100644 index 0000000..b82535a --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/high_quality.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/av/high_quality/materialicons/black/res/drawable/baseline_high_quality_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19,4L5,4c-1.11,0 -2,0.9 -2,2v12c0,1.1 0.89,2 2,2h14c1.1,0 2,-0.9 2,-2L21,6c0,-1.1 -0.9,-2 -2,-2zM11,15L9.5,15v-2h-2v2L6,15L6,9h1.5v2.5h2L9.5,9L11,9v6zM18,14c0,0.55 -0.45,1 -1,1h-0.75v1.5h-1.5L14.75,15L14,15c-0.55,0 -1,-0.45 -1,-1v-4c0,-0.55 0.45,-1 1,-1h3c0.55,0 1,0.45 1,1v4zM14.5,13.5h2v-3h-2v3z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/highlight.xml b/qqq/android/mobileapp/src/main/res/drawable/highlight.xml new file mode 100644 index 0000000..9008ed9 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/highlight.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/editor/highlight/materialicons/black/res/drawable/baseline_highlight_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M6,14l3,3v5h6v-5l3,-3V9H6V14zM11,2h2v3h-2V2zM3.5,5.88l1.41,-1.41l2.12,2.12L5.62,8L3.5,5.88zM16.96,6.59l2.12,-2.12l1.41,1.41L18.38,8L16.96,6.59z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/highlight_alt.xml b/qqq/android/mobileapp/src/main/res/drawable/highlight_alt.xml new file mode 100644 index 0000000..2531ea9 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/highlight_alt.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/highlight_alt/materialicons/black/res/drawable/baseline_highlight_alt_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M17,5h-2L15,3h2v2zM15,21h2v-2.59L19.59,21 21,19.59 18.41,17L21,17v-2h-6v6zM19,9h2L21,7h-2v2zM19,13h2v-2h-2v2zM11,21h2v-2h-2v2zM7,5h2L9,3L7,3v2zM3,17h2v-2L3,15v2zM5,21v-2L3,19c0,1.1 0.9,2 2,2zM19,3v2h2c0,-1.1 -0.9,-2 -2,-2zM11,5h2L13,3h-2v2zM3,9h2L5,7L3,7v2zM7,21h2v-2L7,19v2zM3,13h2v-2L3,11v2zM3,5h2L5,3c-1.1,0 -2,0.9 -2,2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/highlight_off.xml b/qqq/android/mobileapp/src/main/res/drawable/highlight_off.xml new file mode 100644 index 0000000..a3c4eb0 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/highlight_off.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/highlight_off/materialicons/black/res/drawable/baseline_highlight_off_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M14.59,8L12,10.59 9.41,8 8,9.41 10.59,12 8,14.59 9.41,16 12,13.41 14.59,16 16,14.59 13.41,12 16,9.41 14.59,8zM12,2C6.47,2 2,6.47 2,12s4.47,10 10,10 10,-4.47 10,-10S17.53,2 12,2zM12,20c-4.41,0 -8,-3.59 -8,-8s3.59,-8 8,-8 8,3.59 8,8 -3.59,8 -8,8z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/hiking.xml b/qqq/android/mobileapp/src/main/res/drawable/hiking.xml new file mode 100644 index 0000000..5ed1b29 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/hiking.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/hiking/materialicons/black/res/drawable/baseline_hiking_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M13.5,5.5c1.1,0 2,-0.9 2,-2s-0.9,-2 -2,-2s-2,0.9 -2,2S12.4,5.5 13.5,5.5zM17.5,10.78c-1.23,-0.37 -2.22,-1.17 -2.8,-2.18l-1,-1.6c-0.41,-0.65 -1.11,-1 -1.84,-1c-0.78,0 -1.59,0.5 -1.78,1.44S7,23 7,23h2.1l1.8,-8l2.1,2v6h2v-7.5l-2.1,-2l0.6,-3c1,1.15 2.41,2.01 4,2.34V23H19V9h-1.5L17.5,10.78zM7.43,13.13l-2.12,-0.41c-0.54,-0.11 -0.9,-0.63 -0.79,-1.17l0.76,-3.93c0.21,-1.08 1.26,-1.79 2.34,-1.58l1.16,0.23L7.43,13.13z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/history.xml b/qqq/android/mobileapp/src/main/res/drawable/history.xml new file mode 100644 index 0000000..0ef4a5c --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/history.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/history/materialicons/black/res/drawable/baseline_history_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M13,3c-4.97,0 -9,4.03 -9,9L1,12l3.89,3.89 0.07,0.14L9,12L6,12c0,-3.87 3.13,-7 7,-7s7,3.13 7,7 -3.13,7 -7,7c-1.93,0 -3.68,-0.79 -4.94,-2.06l-1.42,1.42C8.27,19.99 10.51,21 13,21c4.97,0 9,-4.03 9,-9s-4.03,-9 -9,-9zM12,8v5l4.28,2.54 0.72,-1.21 -3.5,-2.08L13.5,8L12,8z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/history_edu.xml b/qqq/android/mobileapp/src/main/res/drawable/history_edu.xml new file mode 100644 index 0000000..52cae7d --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/history_edu.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/history_edu/materialicons/black/res/drawable/baseline_history_edu_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M9,4v1.38c-0.83,-0.33 -1.72,-0.5 -2.61,-0.5c-1.79,0 -3.58,0.68 -4.95,2.05l3.33,3.33h1.11v1.11c0.86,0.86 1.98,1.31 3.11,1.36V15H6v3c0,1.1 0.9,2 2,2h10c1.66,0 3,-1.34 3,-3V4H9zM7.89,10.41V8.26H5.61L4.57,7.22C5.14,7 5.76,6.88 6.39,6.88c1.34,0 2.59,0.52 3.54,1.46l1.41,1.41l-0.2,0.2c-0.51,0.51 -1.19,0.8 -1.92,0.8C8.75,10.75 8.29,10.63 7.89,10.41zM19,17c0,0.55 -0.45,1 -1,1s-1,-0.45 -1,-1v-2h-6v-2.59c0.57,-0.23 1.1,-0.57 1.56,-1.03l0.2,-0.2L15.59,14H17v-1.41l-6,-5.97V6h8V17z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/history_toggle_off.xml b/qqq/android/mobileapp/src/main/res/drawable/history_toggle_off.xml new file mode 100644 index 0000000..11608d9 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/history_toggle_off.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/history_toggle_off/materialicons/black/res/drawable/baseline_history_toggle_off_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M15.1,19.37l1,1.74c-0.96,0.44 -2.01,0.73 -3.1,0.84v-2.02C13.74,19.84 14.44,19.65 15.1,19.37zM4.07,13H2.05c0.11,1.1 0.4,2.14 0.84,3.1l1.74,-1C4.35,14.44 4.16,13.74 4.07,13zM15.1,4.63l1,-1.74C15.14,2.45 14.1,2.16 13,2.05v2.02C13.74,4.16 14.44,4.35 15.1,4.63zM19.93,11h2.02c-0.11,-1.1 -0.4,-2.14 -0.84,-3.1l-1.74,1C19.65,9.56 19.84,10.26 19.93,11zM8.9,19.37l-1,1.74c0.96,0.44 2.01,0.73 3.1,0.84v-2.02C10.26,19.84 9.56,19.65 8.9,19.37zM11,4.07V2.05c-1.1,0.11 -2.14,0.4 -3.1,0.84l1,1.74C9.56,4.35 10.26,4.16 11,4.07zM18.36,7.17l1.74,-1.01c-0.63,-0.87 -1.4,-1.64 -2.27,-2.27l-1.01,1.74C17.41,6.08 17.92,6.59 18.36,7.17zM4.63,8.9l-1.74,-1C2.45,8.86 2.16,9.9 2.05,11h2.02C4.16,10.26 4.35,9.56 4.63,8.9zM19.93,13c-0.09,0.74 -0.28,1.44 -0.56,2.1l1.74,1c0.44,-0.96 0.73,-2.01 0.84,-3.1H19.93zM16.83,18.36l1.01,1.74c0.87,-0.63 1.64,-1.4 2.27,-2.27l-1.74,-1.01C17.92,17.41 17.41,17.92 16.83,18.36zM7.17,5.64L6.17,3.89C5.29,4.53 4.53,5.29 3.9,6.17l1.74,1.01C6.08,6.59 6.59,6.08 7.17,5.64zM5.64,16.83L3.9,17.83c0.63,0.87 1.4,1.64 2.27,2.27l1.01,-1.74C6.59,17.92 6.08,17.41 5.64,16.83zM13,7h-2v5.41l4.29,4.29l1.41,-1.41L13,11.59V7z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/hive.xml b/qqq/android/mobileapp/src/main/res/drawable/hive.xml new file mode 100644 index 0000000..661523c --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/hive.xml @@ -0,0 +1,37 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/hive/materialicons/black/res/drawable/baseline_hive_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M13.79,8l1.8,-3l-1.8,-3l-3.58,0l-1.8,3l1.8,3z" /> + <path + android:fillColor="#FF000000" + android:pathData="M10.21,9l-1.8,3l1.8,3l3.58,0l1.8,-3l-1.8,-3z" /> + <path + android:fillColor="#FF000000" + android:pathData="M16.45,11.51l3.59,0l1.79,-3l-1.79,-3l-3.59,0l-1.8,3z" /> + <path + android:fillColor="#FF000000" + android:pathData="M20.04,12.51l-3.59,0l-1.8,3l1.8,3l3.59,0l1.79,-3z" /> + <path + android:fillColor="#FF000000" + android:pathData="M7.55,11.51l1.8,-3l-1.8,-3l-3.59,0l-1.79,3l1.79,3z" /> + <path + android:fillColor="#FF000000" + android:pathData="M7.55,12.51l-3.59,0l-1.79,3l1.79,3l3.59,0l1.8,-3z" /> + <path + android:fillColor="#FF000000" + android:pathData="M10.21,16l-1.8,3l1.8,3l3.58,0l1.8,-3l-1.8,-3z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/hls.xml b/qqq/android/mobileapp/src/main/res/drawable/hls.xml new file mode 100644 index 0000000..416943f --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/hls.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/hls/materialicons/black/res/drawable/baseline_hls_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M6.5,9H8v6H6.5v-2.5h-2V15H3V9h1.5v2h2V9zM16.5,15h3c0.55,0 1,-0.45 1,-1v-1.5c0,-0.55 -0.45,-1 -1,-1H17v-1h2V11h1.5v-1c0,-0.55 -0.45,-1 -1,-1h-3c-0.55,0 -1,0.45 -1,1v1.5c0,0.55 0.45,1 1,1H19v1h-2V13h-1.5v1C15.5,14.55 15.95,15 16.5,15zM14,15v-1.5h-2.5V9H10v6H14z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/hls_off.xml b/qqq/android/mobileapp/src/main/res/drawable/hls_off.xml new file mode 100644 index 0000000..4f2582e --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/hls_off.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/hls_off/materialicons/black/res/drawable/baseline_hls_off_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M17.83,15h1.67c0.55,0 1,-0.45 1,-1v-1.5c0,-0.55 -0.45,-1 -1,-1H17v-1h2V11h1.5v-1c0,-0.55 -0.45,-1 -1,-1h-3c-0.55,0 -1,0.45 -1,1v1.5c0,0.55 0.45,1 1,1H19v1h-2V13h-1.17L17.83,15zM8,10.83V15H6.5v-2.5h-2V15H3V9h1.5v2h2V9.33L1.39,4.22l1.41,-1.41l18.38,18.38l-1.41,1.41L12.17,15H10v-2.17L8,10.83z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/holiday_village.xml b/qqq/android/mobileapp/src/main/res/drawable/holiday_village.xml new file mode 100644 index 0000000..c63a303 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/holiday_village.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/places/holiday_village/materialicons/black/res/drawable/baseline_holiday_village_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M18,20V8.35L13.65,4h-2.83L16,9.18V20H18zM22,20V6.69L19.31,4h-2.83L20,7.52V20H22zM8,4l-6,6v10h5v-5h2v5h5V10L8,4zM9,13H7v-2h2V13z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/home.xml b/qqq/android/mobileapp/src/main/res/drawable/home.xml new file mode 100644 index 0000000..1d55b5b --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/home.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/home/materialicons/black/res/drawable/baseline_home_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M10,20v-6h4v6h5v-8h3L12,3 2,12h3v8z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/home_filled.xml b/qqq/android/mobileapp/src/main/res/drawable/home_filled.xml new file mode 100644 index 0000000..ad68eb7 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/home_filled.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/home_filled/materialicons/black/res/drawable/baseline_home_filled_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,3L4,9v12h5v-7h6v7h5V9z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/home_max.xml b/qqq/android/mobileapp/src/main/res/drawable/home_max.xml new file mode 100644 index 0000000..4da1a34 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/home_max.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/hardware/home_max/materialicons/black/res/drawable/baseline_home_max_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19,5H5C2.79,5 1,6.79 1,9v5c0,2.21 1.79,4 4,4h2v1h10v-1h2c2.21,0 4,-1.79 4,-4V9C23,6.79 21.21,5 19,5zM21,14c0,1.1 -0.9,2 -2,2H5c-1.1,0 -2,-0.9 -2,-2V9c0,-1.1 0.9,-2 2,-2h14c1.1,0 2,0.9 2,2V14z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/home_mini.xml b/qqq/android/mobileapp/src/main/res/drawable/home_mini.xml new file mode 100644 index 0000000..3bcd313 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/home_mini.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/hardware/home_mini/materialicons/black/res/drawable/baseline_home_mini_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,5C4.19,5 2,9.48 2,12c0,3.86 3.13,7 6.99,7h6.02c2.69,0 6.99,-2.08 6.99,-7C22,12 22,5 12,5zM12,7c7.64,0 7.99,4.51 8,5H4C4,11.8 4.09,7 12,7zM14.86,17H9.14c-2.1,0 -3.92,-1.24 -4.71,-3h15.15C18.78,15.76 16.96,17 14.86,17z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/home_repair_service.xml b/qqq/android/mobileapp/src/main/res/drawable/home_repair_service.xml new file mode 100644 index 0000000..ad2e6f1 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/home_repair_service.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/home_repair_service/materialicons/black/res/drawable/baseline_home_repair_service_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M18,16l-2,0l0,-1l-8,0l0,1l-2,0l0,-1l-4,0l0,5l20,0l0,-5l-4,0z" /> + <path + android:fillColor="#FF000000" + android:pathData="M20,8h-3V6c0,-1.1 -0.9,-2 -2,-2H9C7.9,4 7,4.9 7,6v2H4c-1.1,0 -2,0.9 -2,2v4h4v-2h2v2h8v-2h2v2h4v-4C22,8.9 21.1,8 20,8zM15,8H9V6h6V8z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/home_work.xml b/qqq/android/mobileapp/src/main/res/drawable/home_work.xml new file mode 100644 index 0000000..c594455 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/home_work.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/navigation/home_work/materialicons/black/res/drawable/baseline_home_work_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M1,11l0,10l5,0l0,-6l4,0l0,6l5,0l0,-10l-7,-5z" /> + <path + android:fillColor="#FF000000" + android:pathData="M10,3v1.97l7,5V11h2v2h-2v2h2v2h-2v4h6V3H10zM19,9h-2V7h2V9z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/horizontal_distribute.xml b/qqq/android/mobileapp/src/main/res/drawable/horizontal_distribute.xml new file mode 100644 index 0000000..c67a456 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/horizontal_distribute.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/editor/horizontal_distribute/materialicons/black/res/drawable/baseline_horizontal_distribute_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M4,22H2V2h2V22zM22,2h-2v20h2V2zM13.5,7h-3v10h3V7z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/horizontal_rule.xml b/qqq/android/mobileapp/src/main/res/drawable/horizontal_rule.xml new file mode 100644 index 0000000..0695cb6 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/horizontal_rule.xml @@ -0,0 +1,20 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/editor/horizontal_rule/materialicons/black/res/drawable/baseline_horizontal_rule_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M4,11h16v2h-16z" + android:fillType="evenOdd" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/horizontal_split.xml b/qqq/android/mobileapp/src/main/res/drawable/horizontal_split.xml new file mode 100644 index 0000000..d1034b1 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/horizontal_split.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/horizontal_split/materialicons/black/res/drawable/baseline_horizontal_split_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M3,19h18v-6L3,13v6zM3,11h18L21,9L3,9v2zM3,5v2h18L21,5L3,5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/hot_tub.xml b/qqq/android/mobileapp/src/main/res/drawable/hot_tub.xml new file mode 100644 index 0000000..a0cb031 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/hot_tub.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/places/hot_tub/materialicons/black/res/drawable/baseline_hot_tub_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M7,6m-2,0a2,2 0,1 1,4 0a2,2 0,1 1,-4 0" /> + <path + android:fillColor="#FF000000" + android:pathData="M11.15,12c-0.31,-0.22 -0.59,-0.46 -0.82,-0.72l-1.4,-1.55c-0.19,-0.21 -0.43,-0.38 -0.69,-0.5 -0.29,-0.14 -0.62,-0.23 -0.96,-0.23h-0.03C6.01,9 5,10.01 5,11.25L5,12L2,12v8c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2v-8L11.15,12zM7,20L5,20v-6h2v6zM11,20L9,20v-6h2v6zM15,20h-2v-6h2v6zM19,20h-2v-6h2v6zM18.65,5.86l-0.07,-0.07c-0.57,-0.62 -0.82,-1.41 -0.67,-2.2L18,3h-1.89l-0.06,0.43c-0.2,1.36 0.27,2.71 1.3,3.72l0.07,0.06c0.57,0.62 0.82,1.41 0.67,2.2l-0.11,0.59h1.91l0.06,-0.43c0.21,-1.36 -0.27,-2.71 -1.3,-3.71zM14.65,5.86l-0.07,-0.07c-0.57,-0.62 -0.82,-1.41 -0.67,-2.2L14,3h-1.89l-0.06,0.43c-0.2,1.36 0.27,2.71 1.3,3.72l0.07,0.06c0.57,0.62 0.82,1.41 0.67,2.2l-0.11,0.59h1.91l0.06,-0.43c0.21,-1.36 -0.27,-2.71 -1.3,-3.71z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/hotel.xml b/qqq/android/mobileapp/src/main/res/drawable/hotel.xml new file mode 100644 index 0000000..051cf7c --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/hotel.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/hotel/materialicons/black/res/drawable/baseline_hotel_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M7,13c1.66,0 3,-1.34 3,-3S8.66,7 7,7s-3,1.34 -3,3 1.34,3 3,3zM19,7h-8v7L3,14L3,5L1,5v15h2v-3h18v3h2v-9c0,-2.21 -1.79,-4 -4,-4z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/hotel_class.xml b/qqq/android/mobileapp/src/main/res/drawable/hotel_class.xml new file mode 100644 index 0000000..b2bd777 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/hotel_class.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/hotel_class/materialicons/black/res/drawable/baseline_hotel_class_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M8.58,10H1l6.17,4.41L4.83,22L11,17.31L17.18,22l-2.35,-7.59L21,10h-7.58L11,2L8.58,10zM21.36,22l-1.86,-6.01L23.68,13h-3.44l-3.08,2.2l1.46,4.72L21.36,22zM17,8l-1.82,-6l-1.04,3.45L14.91,8H17z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/hourglass_bottom.xml b/qqq/android/mobileapp/src/main/res/drawable/hourglass_bottom.xml new file mode 100644 index 0000000..47d8b0b --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/hourglass_bottom.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/communication/hourglass_bottom/materialicons/black/res/drawable/baseline_hourglass_bottom_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M18,22l-0.01,-6L14,12l3.99,-4.01L18,2H6v6l4,4l-4,3.99V22H18zM8,7.5V4h8v3.5l-4,4L8,7.5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/hourglass_disabled.xml b/qqq/android/mobileapp/src/main/res/drawable/hourglass_disabled.xml new file mode 100644 index 0000000..1c15b22 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/hourglass_disabled.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/hourglass_disabled/materialicons/black/res/drawable/baseline_hourglass_disabled_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M8,4l8,0l0,3.5l-2.84,2.84l1.25,1.25l3.59,-3.58l-0.01,-0.01l0.01,0l0,-6l-12,0l0,1.17l2,2z" /> + <path + android:fillColor="#FF000000" + android:pathData="M2.1,2.1L0.69,3.51l8.9,8.9L6,16l0.01,0.01H6V22h12v-1.17l2.49,2.49l1.41,-1.41L2.1,2.1zM16,20H8v-3.5l2.84,-2.84L16,18.83V20z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/hourglass_empty.xml b/qqq/android/mobileapp/src/main/res/drawable/hourglass_empty.xml new file mode 100644 index 0000000..3802cdf --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/hourglass_empty.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/hourglass_empty/materialicons/black/res/drawable/baseline_hourglass_empty_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M6,2v6h0.01L6,8.01 10,12l-4,4 0.01,0.01L6,16.01L6,22h12v-5.99h-0.01L18,16l-4,-4 4,-3.99 -0.01,-0.01L18,8L18,2L6,2zM16,16.5L16,20L8,20v-3.5l4,-4 4,4zM12,11.5l-4,-4L8,4h8v3.5l-4,4z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/hourglass_full.xml b/qqq/android/mobileapp/src/main/res/drawable/hourglass_full.xml new file mode 100644 index 0000000..c128a9d --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/hourglass_full.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/hourglass_full/materialicons/black/res/drawable/baseline_hourglass_full_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M6,2v6h0.01L6,8.01 10,12l-4,4 0.01,0.01H6V22h12v-5.99h-0.01L18,16l-4,-4 4,-3.99 -0.01,-0.01H18V2H6z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/hourglass_top.xml b/qqq/android/mobileapp/src/main/res/drawable/hourglass_top.xml new file mode 100644 index 0000000..dc5ce64 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/hourglass_top.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/communication/hourglass_top/materialicons/black/res/drawable/baseline_hourglass_top_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M6,2l0.01,6L10,12l-3.99,4.01L6,22h12v-6l-4,-4l4,-3.99V2H6zM16,16.5V20H8v-3.5l4,-4L16,16.5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/house.xml b/qqq/android/mobileapp/src/main/res/drawable/house.xml new file mode 100644 index 0000000..28b5a35 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/house.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/places/house/materialicons/black/res/drawable/baseline_house_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19,9.3V4h-3v2.6L12,3L2,12h3v8h5v-6h4v6h5v-8h3L19,9.3zM10,10c0,-1.1 0.9,-2 2,-2s2,0.9 2,2H10z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/house_siding.xml b/qqq/android/mobileapp/src/main/res/drawable/house_siding.xml new file mode 100644 index 0000000..96c59dc --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/house_siding.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/places/house_siding/materialicons/black/res/drawable/baseline_house_siding_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19,12h3L12,3L2,12h3v8h2v-2h10v2h2V12zM7.21,10h9.58L17,10.19V12H7v-1.81L7.21,10zM14.57,8H9.43L12,5.69L14.57,8zM7,16v-2h10v2H7z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/houseboat.xml b/qqq/android/mobileapp/src/main/res/drawable/houseboat.xml new file mode 100644 index 0000000..ac184b3 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/houseboat.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/places/houseboat/materialicons/black/res/drawable/baseline_houseboat_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,16c-1.95,0 -2.1,1 -3.34,1c-1.19,0 -1.42,-1 -3.33,-1C3.38,16 3.24,17 2,17v2c1.9,0 2.17,-1 3.35,-1c1.19,0 1.42,1 3.33,1c1.95,0 2.08,-1 3.32,-1s1.37,1 3.32,1c1.91,0 2.14,-1 3.33,-1c1.18,0 1.45,1 3.35,1v-2c-1.24,0 -1.38,-1 -3.33,-1c-1.91,0 -2.14,1 -3.33,1C14.1,17 13.95,16 12,16zM20.34,11.34l-1.37,1.37C18.78,12.89 18.52,13 18.26,13H17V9.65l1.32,0.97L19.5,9L12,3.5L4.5,9l1.18,1.61L7,9.65V13H5.74c-0.27,0 -0.52,-0.11 -0.71,-0.29l-1.37,-1.37l-1.41,1.41l1.37,1.37C4.18,14.68 4.95,15 5.74,15h12.51c0.8,0 1.56,-0.32 2.12,-0.88l1.37,-1.37L20.34,11.34zM13,13h-2v-2h2V13z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/how_to_reg.xml b/qqq/android/mobileapp/src/main/res/drawable/how_to_reg.xml new file mode 100644 index 0000000..148e638 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/how_to_reg.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/content/how_to_reg/materialicons/black/res/drawable/baseline_how_to_reg_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M9,17l3,-2.94c-0.39,-0.04 -0.68,-0.06 -1,-0.06 -2.67,0 -8,1.34 -8,4v2h9l-3,-3zM11,12c2.21,0 4,-1.79 4,-4s-1.79,-4 -4,-4 -4,1.79 -4,4 1.79,4 4,4" + android:fillType="evenOdd" /> + <path + android:fillColor="#FF000000" + android:pathData="M15.47,20.5L12,17l1.4,-1.41 2.07,2.08 5.13,-5.17 1.4,1.41z" + android:fillType="evenOdd" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/how_to_vote.xml b/qqq/android/mobileapp/src/main/res/drawable/how_to_vote.xml new file mode 100644 index 0000000..8599e7e --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/how_to_vote.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/content/how_to_vote/materialicons/black/res/drawable/baseline_how_to_vote_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M18,13h-0.68l-2,2h1.91L19,17L5,17l1.78,-2h2.05l-2,-2L6,13l-3,3v4c0,1.1 0.89,2 1.99,2L19,22c1.1,0 2,-0.89 2,-2v-4l-3,-3zM17,7.95l-4.95,4.95 -3.54,-3.54 4.95,-4.95L17,7.95zM12.76,2.29L6.39,8.66c-0.39,0.39 -0.39,1.02 0,1.41l4.95,4.95c0.39,0.39 1.02,0.39 1.41,0l6.36,-6.36c0.39,-0.39 0.39,-1.02 0,-1.41L14.16,2.3c-0.38,-0.4 -1.01,-0.4 -1.4,-0.01z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/html.xml b/qqq/android/mobileapp/src/main/res/drawable/html.xml new file mode 100644 index 0000000..b235dc7 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/html.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/html/materialicons/black/res/drawable/baseline_html_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M3.5,9H5v6H3.5v-2.5h-2V15H0V9h1.5v2h2V9zM17.5,9H13c-0.55,0 -1,0.45 -1,1v5h1.5v-4.5h1V14H16v-3.51h1V15h1.5v-5C18.5,9.45 18.05,9 17.5,9zM11,9H6v1.5h1.75V15h1.5v-4.5H11V9zM24,15v-1.5h-2.5V9H20v6H24z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/http.xml b/qqq/android/mobileapp/src/main/res/drawable/http.xml new file mode 100644 index 0000000..879e6a6 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/http.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/http/materialicons/black/res/drawable/baseline_http_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M4.5,11h-2L2.5,9L1,9v6h1.5v-2.5h2L4.5,15L6,15L6,9L4.5,9v2zM7,10.5h1.5L8.5,15L10,15v-4.5h1.5L11.5,9L7,9v1.5zM12.5,10.5L14,10.5L14,15h1.5v-4.5L17,10.5L17,9h-4.5v1.5zM21.5,9L18,9v6h1.5v-2h2c0.8,0 1.5,-0.7 1.5,-1.5v-1c0,-0.8 -0.7,-1.5 -1.5,-1.5zM21.5,11.5h-2v-1h2v1z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/https.xml b/qqq/android/mobileapp/src/main/res/drawable/https.xml new file mode 100644 index 0000000..73c2003 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/https.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/https/materialicons/black/res/drawable/baseline_https_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M18,8h-1L17,6c0,-2.76 -2.24,-5 -5,-5S7,3.24 7,6v2L6,8c-1.1,0 -2,0.9 -2,2v10c0,1.1 0.9,2 2,2h12c1.1,0 2,-0.9 2,-2L20,10c0,-1.1 -0.9,-2 -2,-2zM12,17c-1.1,0 -2,-0.9 -2,-2s0.9,-2 2,-2 2,0.9 2,2 -0.9,2 -2,2zM15.1,8L8.9,8L8.9,6c0,-1.71 1.39,-3.1 3.1,-3.1 1.71,0 3.1,1.39 3.1,3.1v2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/hub.xml b/qqq/android/mobileapp/src/main/res/drawable/hub.xml new file mode 100644 index 0000000..b358940 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/hub.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/communication/hub/materialicons/black/res/drawable/baseline_hub_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M8.4,18.2C8.78,18.7 9,19.32 9,20c0,1.66 -1.34,3 -3,3s-3,-1.34 -3,-3s1.34,-3 3,-3c0.44,0 0.85,0.09 1.23,0.26l1.41,-1.77c-0.92,-1.03 -1.29,-2.39 -1.09,-3.69l-2.03,-0.68C4.98,11.95 4.06,12.5 3,12.5c-1.66,0 -3,-1.34 -3,-3s1.34,-3 3,-3s3,1.34 3,3c0,0.07 0,0.14 -0.01,0.21l2.03,0.68c0.64,-1.21 1.82,-2.09 3.22,-2.32l0,-2.16C9.96,5.57 9,4.4 9,3c0,-1.66 1.34,-3 3,-3s3,1.34 3,3c0,1.4 -0.96,2.57 -2.25,2.91v2.16c1.4,0.23 2.58,1.11 3.22,2.32l2.03,-0.68C18,9.64 18,9.57 18,9.5c0,-1.66 1.34,-3 3,-3s3,1.34 3,3s-1.34,3 -3,3c-1.06,0 -1.98,-0.55 -2.52,-1.37l-2.03,0.68c0.2,1.29 -0.16,2.65 -1.09,3.69l1.41,1.77C17.15,17.09 17.56,17 18,17c1.66,0 3,1.34 3,3s-1.34,3 -3,3s-3,-1.34 -3,-3c0,-0.68 0.22,-1.3 0.6,-1.8l-1.41,-1.77c-1.35,0.75 -3.01,0.76 -4.37,0L8.4,18.2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/hvac.xml b/qqq/android/mobileapp/src/main/res/drawable/hvac.xml new file mode 100644 index 0000000..6a2ac77 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/hvac.xml @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/hvac/materialicons/black/res/drawable/baseline_hvac_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,16c1.01,0 1.91,-0.39 2.62,-1H9.38C10.09,15.61 10.99,16 12,16z" /> + <path + android:fillColor="#FF000000" + android:pathData="M8.56,14h6.89c0.26,-0.45 0.44,-0.96 0.51,-1.5h-7.9C8.12,13.04 8.29,13.55 8.56,14z" /> + <path + android:fillColor="#FF000000" + android:pathData="M12,8c-1.01,0 -1.91,0.39 -2.62,1h5.24C13.91,8.39 13.01,8 12,8z" /> + <path + android:fillColor="#FF000000" + android:pathData="M8.56,10c-0.26,0.45 -0.44,0.96 -0.51,1.5h7.9c-0.07,-0.54 -0.24,-1.05 -0.51,-1.5H8.56z" /> + <path + android:fillColor="#FF000000" + android:pathData="M19,3H5C3.9,3 3,3.9 3,5v14c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2V5C21,3.9 20.1,3 19,3zM12,18c-3.31,0 -6,-2.69 -6,-6s2.69,-6 6,-6s6,2.69 6,6S15.31,18 12,18z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/ic_broken_image.xml b/qqq/android/mobileapp/src/main/res/drawable/ic_broken_image.xml new file mode 100644 index 0000000..613d9c7 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/ic_broken_image.xml @@ -0,0 +1,20 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/broken_image/materialicons/black/res/drawable/baseline_broken_image_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:tint="#A9A9AC" + android:viewportWidth="24.0" + android:viewportHeight="24.0"> + <path + android:fillColor="#FF000000" + android:pathData="M21,5v6.59l-3,-3.01 -4,4.01 -4,-4 -4,4 -3,-3.01L3,5c0,-1.1 0.9,-2 2,-2h14c1.1,0 2,0.9 2,2zM18,11.42l3,3.01L21,19c0,1.1 -0.9,2 -2,2L5,21c-1.1,0 -2,-0.9 -2,-2v-6.58l3,2.99 4,-4 4,4 4,-3.99z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/ice_skating.xml b/qqq/android/mobileapp/src/main/res/drawable/ice_skating.xml new file mode 100644 index 0000000..3cedfcd --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/ice_skating.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/ice_skating/materialicons/black/res/drawable/baseline_ice_skating_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M8,8.5C8,8.22 8.22,8 8.5,8h2.52L11,7H8.5C8.22,7 8,6.78 8,6.5C8,6.22 8.22,6 8.5,6H11V3H3v15h3v2H2v2h16c2.76,0 5,-2.24 5,-5h-2c0,1.66 -1.34,3 -3,3h-2v-2h3l0,-2.88c0,-2.1 -1.55,-3.53 -3.03,-3.88l-2.7,-0.67C12.4,10.35 11.7,9.76 11.32,9H8.5C8.22,9 8,8.78 8,8.5zM14,20H8v-2h6V20z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/icecream.xml b/qqq/android/mobileapp/src/main/res/drawable/icecream.xml new file mode 100644 index 0000000..838fbdb --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/icecream.xml @@ -0,0 +1,20 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/icecream/materialicons/black/res/drawable/baseline_icecream_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M8.79,12.4l3.26,6.22l3.17,-6.21c-0.11,-0.08 -0.21,-0.16 -0.3,-0.25C14.08,12.69 13.07,13 12,13s-2.08,-0.31 -2.92,-0.84C8.99,12.25 8.89,12.33 8.79,12.4zM6.83,12.99C5.25,12.9 4,11.6 4,10c0,-1.49 1.09,-2.73 2.52,-2.96C6.75,4.22 9.12,2 12,2s5.25,2.22 5.48,5.04C18.91,7.27 20,8.51 20,10c0,1.59 -1.24,2.9 -2.81,2.99L12.07,23L6.83,12.99z" + android:fillType="evenOdd" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/image.xml b/qqq/android/mobileapp/src/main/res/drawable/image.xml new file mode 100644 index 0000000..f423e94 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/image.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/image/materialicons/black/res/drawable/baseline_image_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M21,19V5c0,-1.1 -0.9,-2 -2,-2H5c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2zM8.5,13.5l2.5,3.01L14.5,12l4.5,6H5l3.5,-4.5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/image_aspect_ratio.xml b/qqq/android/mobileapp/src/main/res/drawable/image_aspect_ratio.xml new file mode 100644 index 0000000..ebc6ffd --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/image_aspect_ratio.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/image_aspect_ratio/materialicons/black/res/drawable/baseline_image_aspect_ratio_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M16,10h-2v2h2v-2zM16,14h-2v2h2v-2zM8,10L6,10v2h2v-2zM12,10h-2v2h2v-2zM20,4L4,4c-1.1,0 -2,0.9 -2,2v12c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2L22,6c0,-1.1 -0.9,-2 -2,-2zM20,18L4,18L4,6h16v12z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/image_not_supported.xml b/qqq/android/mobileapp/src/main/res/drawable/image_not_supported.xml new file mode 100644 index 0000000..4fcf486 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/image_not_supported.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/image_not_supported/materialicons/black/res/drawable/baseline_image_not_supported_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M21.9,21.9l-8.49,-8.49l0,0L3.59,3.59l0,0L2.1,2.1L0.69,3.51L3,5.83V19c0,1.1 0.9,2 2,2h13.17l2.31,2.31L21.9,21.9zM5,18l3.5,-4.5l2.5,3.01L12.17,15l3,3H5zM21,18.17L5.83,3H19c1.1,0 2,0.9 2,2V18.17z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/image_search.xml b/qqq/android/mobileapp/src/main/res/drawable/image_search.xml new file mode 100644 index 0000000..bd2a000 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/image_search.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/image_search/materialicons/black/res/drawable/baseline_image_search_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M18,13v7L4,20L4,6h5.02c0.05,-0.71 0.22,-1.38 0.48,-2L4,4c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2v-5l-2,-2zM16.5,18h-11l2.75,-3.53 1.96,2.36 2.75,-3.54zM19.3,8.89c0.44,-0.7 0.7,-1.51 0.7,-2.39C20,4.01 17.99,2 15.5,2S11,4.01 11,6.5s2.01,4.5 4.49,4.5c0.88,0 1.7,-0.26 2.39,-0.7L21,13.42 22.42,12 19.3,8.89zM15.5,9C14.12,9 13,7.88 13,6.5S14.12,4 15.5,4 18,5.12 18,6.5 16.88,9 15.5,9z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/imagesearch_roller.xml b/qqq/android/mobileapp/src/main/res/drawable/imagesearch_roller.xml new file mode 100644 index 0000000..9496ae9 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/imagesearch_roller.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/notification/imagesearch_roller/materialicons/black/res/drawable/baseline_imagesearch_roller_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,2v6H6V6H4v4h10v5h2v8h-6v-8h2v-3H2V4h4V2" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/import_contacts.xml b/qqq/android/mobileapp/src/main/res/drawable/import_contacts.xml new file mode 100644 index 0000000..9410c79 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/import_contacts.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/communication/import_contacts/materialicons/black/res/drawable/baseline_import_contacts_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M17.5,4.5c-1.95,0 -4.05,0.4 -5.5,1.5c-1.45,-1.1 -3.55,-1.5 -5.5,-1.5S2.45,4.9 1,6v14.65c0,0.65 0.73,0.45 0.75,0.45C3.1,20.45 5.05,20 6.5,20c1.95,0 4.05,0.4 5.5,1.5c1.35,-0.85 3.8,-1.5 5.5,-1.5c1.65,0 3.35,0.3 4.75,1.05C22.66,21.26 23,20.86 23,20.6V6C21.51,4.88 19.37,4.5 17.5,4.5zM21,18.5c-1.1,-0.35 -2.3,-0.5 -3.5,-0.5c-1.7,0 -4.15,0.65 -5.5,1.5V8c1.35,-0.85 3.8,-1.5 5.5,-1.5c1.2,0 2.4,0.15 3.5,0.5V18.5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/import_export.xml b/qqq/android/mobileapp/src/main/res/drawable/import_export.xml new file mode 100644 index 0000000..144bfa0 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/import_export.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/communication/import_export/materialicons/black/res/drawable/baseline_import_export_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M9,3L5,6.99h3L8,14h2L10,6.99h3L9,3zM16,17.01L16,10h-2v7.01h-3L15,21l4,-3.99h-3z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/important_devices.xml b/qqq/android/mobileapp/src/main/res/drawable/important_devices.xml new file mode 100644 index 0000000..1f6e382 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/important_devices.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/important_devices/materialicons/black/res/drawable/baseline_important_devices_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M23,11.01L18,11c-0.55,0 -1,0.45 -1,1v9c0,0.55 0.45,1 1,1h5c0.55,0 1,-0.45 1,-1v-9c0,-0.55 -0.45,-0.99 -1,-0.99zM23,20h-5v-7h5v7zM20,2L2,2C0.89,2 0,2.89 0,4v12c0,1.1 0.89,2 2,2h7v2L7,20v2h8v-2h-2v-2h2v-2L2,16L2,4h18v5h2L22,4c0,-1.11 -0.9,-2 -2,-2zM11.97,9L11,6l-0.97,3L7,9l2.47,1.76 -0.94,2.91 2.47,-1.8 2.47,1.8 -0.94,-2.91L15,9h-3.03z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/inbox.xml b/qqq/android/mobileapp/src/main/res/drawable/inbox.xml new file mode 100644 index 0000000..522c914 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/inbox.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/content/inbox/materialicons/black/res/drawable/baseline_inbox_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19,3L4.99,3c-1.11,0 -1.98,0.89 -1.98,2L3,19c0,1.1 0.88,2 1.99,2L19,21c1.1,0 2,-0.9 2,-2L21,5c0,-1.11 -0.9,-2 -2,-2zM19,15h-4c0,1.66 -1.35,3 -3,3s-3,-1.34 -3,-3L4.99,15L4.99,5L19,5v10z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/incomplete_circle.xml b/qqq/android/mobileapp/src/main/res/drawable/incomplete_circle.xml new file mode 100644 index 0000000..6ce1c81 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/incomplete_circle.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/incomplete_circle/materialicons/black/res/drawable/baseline_incomplete_circle_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M22,12c0,5.52 -4.48,10 -10,10S2,17.52 2,12c0,-2.76 1.12,-5.26 2.93,-7.07L12,12V2C17.52,2 22,6.48 22,12z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/indeterminate_check_box.xml b/qqq/android/mobileapp/src/main/res/drawable/indeterminate_check_box.xml new file mode 100644 index 0000000..d2fe805 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/indeterminate_check_box.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/toggle/indeterminate_check_box/materialicons/black/res/drawable/baseline_indeterminate_check_box_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19,3H5C3.9,3 3,3.9 3,5v14c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2V5C21,3.9 20.1,3 19,3zM17,13H7v-2h10V13z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/info.xml b/qqq/android/mobileapp/src/main/res/drawable/info.xml new file mode 100644 index 0000000..26985f1 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/info.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/info/materialicons/black/res/drawable/baseline_info_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM13,17h-2v-6h2v6zM13,9h-2L11,7h2v2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/info_outline.xml b/qqq/android/mobileapp/src/main/res/drawable/info_outline.xml new file mode 100644 index 0000000..3600f92 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/info_outline.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/info_outline/materialicons/black/res/drawable/baseline_info_outline_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M11,7h2v2h-2V7zM11,11h2v6h-2V11zM12,2C6.48,2 2,6.48 2,12s4.48,10 10,10s10,-4.48 10,-10S17.52,2 12,2zM12,20c-4.41,0 -8,-3.59 -8,-8s3.59,-8 8,-8s8,3.59 8,8S16.41,20 12,20z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/input.xml b/qqq/android/mobileapp/src/main/res/drawable/input.xml new file mode 100644 index 0000000..129d8d8 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/input.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/input/materialicons/black/res/drawable/baseline_input_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M21,3.01H3c-1.1,0 -2,0.9 -2,2V9h2V4.99h18v14.03H3V15H1v4.01c0,1.1 0.9,1.98 2,1.98h18c1.1,0 2,-0.88 2,-1.98v-14c0,-1.11 -0.9,-2 -2,-2zM11,16l4,-4 -4,-4v3H1v2h10v3z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/insert_chart.xml b/qqq/android/mobileapp/src/main/res/drawable/insert_chart.xml new file mode 100644 index 0000000..8246dfb --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/insert_chart.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/editor/insert_chart/materialicons/black/res/drawable/baseline_insert_chart_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19,3L5,3c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2L21,5c0,-1.1 -0.9,-2 -2,-2zM9,17L7,17v-7h2v7zM13,17h-2L11,7h2v10zM17,17h-2v-4h2v4z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/insert_chart_outlined.xml b/qqq/android/mobileapp/src/main/res/drawable/insert_chart_outlined.xml new file mode 100644 index 0000000..cbd511c --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/insert_chart_outlined.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/editor/insert_chart_outlined/materialicons/black/res/drawable/baseline_insert_chart_outlined_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M9,17L7,17v-7h2v7zM13,17h-2L11,7h2v10zM17,17h-2v-4h2v4zM19.5,19.1h-15L4.5,5h15v14.1zM19.5,3h-15c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h15c1.1,0 2,-0.9 2,-2L21.5,5c0,-1.1 -0.9,-2 -2,-2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/insert_comment.xml b/qqq/android/mobileapp/src/main/res/drawable/insert_comment.xml new file mode 100644 index 0000000..fa1e758 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/insert_comment.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/editor/insert_comment/materialicons/black/res/drawable/baseline_insert_comment_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,2L4,2c-1.1,0 -2,0.9 -2,2v12c0,1.1 0.9,2 2,2h14l4,4L22,4c0,-1.1 -0.9,-2 -2,-2zM18,14L6,14v-2h12v2zM18,11L6,11L6,9h12v2zM18,8L6,8L6,6h12v2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/insert_drive_file.xml b/qqq/android/mobileapp/src/main/res/drawable/insert_drive_file.xml new file mode 100644 index 0000000..3134c1f --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/insert_drive_file.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/editor/insert_drive_file/materialicons/black/res/drawable/baseline_insert_drive_file_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M6,2c-1.1,0 -1.99,0.9 -1.99,2L4,20c0,1.1 0.89,2 1.99,2L18,22c1.1,0 2,-0.9 2,-2L20,8l-6,-6L6,2zM13,9L13,3.5L18.5,9L13,9z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/insert_emoticon.xml b/qqq/android/mobileapp/src/main/res/drawable/insert_emoticon.xml new file mode 100644 index 0000000..d48ab75 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/insert_emoticon.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/editor/insert_emoticon/materialicons/black/res/drawable/baseline_insert_emoticon_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M11.99,2C6.47,2 2,6.48 2,12s4.47,10 9.99,10C17.52,22 22,17.52 22,12S17.52,2 11.99,2zM12,20c-4.42,0 -8,-3.58 -8,-8s3.58,-8 8,-8 8,3.58 8,8 -3.58,8 -8,8zM15.5,11c0.83,0 1.5,-0.67 1.5,-1.5S16.33,8 15.5,8 14,8.67 14,9.5s0.67,1.5 1.5,1.5zM8.5,11c0.83,0 1.5,-0.67 1.5,-1.5S9.33,8 8.5,8 7,8.67 7,9.5 7.67,11 8.5,11zM12,17.5c2.33,0 4.31,-1.46 5.11,-3.5L6.89,14c0.8,2.04 2.78,3.5 5.11,3.5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/insert_invitation.xml b/qqq/android/mobileapp/src/main/res/drawable/insert_invitation.xml new file mode 100644 index 0000000..091708e --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/insert_invitation.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/editor/insert_invitation/materialicons/black/res/drawable/baseline_insert_invitation_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M17,12h-5v5h5v-5zM16,1v2L8,3L8,1L6,1v2L5,3c-1.11,0 -1.99,0.9 -1.99,2L3,19c0,1.1 0.89,2 2,2h14c1.1,0 2,-0.9 2,-2L21,5c0,-1.1 -0.9,-2 -2,-2h-1L18,1h-2zM19,19L5,19L5,8h14v11z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/insert_link.xml b/qqq/android/mobileapp/src/main/res/drawable/insert_link.xml new file mode 100644 index 0000000..f783cb9 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/insert_link.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/editor/insert_link/materialicons/black/res/drawable/baseline_insert_link_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M3.9,12c0,-1.71 1.39,-3.1 3.1,-3.1h4L11,7L7,7c-2.76,0 -5,2.24 -5,5s2.24,5 5,5h4v-1.9L7,15.1c-1.71,0 -3.1,-1.39 -3.1,-3.1zM8,13h8v-2L8,11v2zM17,7h-4v1.9h4c1.71,0 3.1,1.39 3.1,3.1s-1.39,3.1 -3.1,3.1h-4L13,17h4c2.76,0 5,-2.24 5,-5s-2.24,-5 -5,-5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/insert_page_break.xml b/qqq/android/mobileapp/src/main/res/drawable/insert_page_break.xml new file mode 100644 index 0000000..6f27513 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/insert_page_break.xml @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/editor/insert_page_break/materialicons/black/res/drawable/baseline_insert_page_break_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M4,20c0,1.1 0.89,2 1.99,2H18c1.1,0 2,-0.9 2,-2v-3H4L4,20z" /> + <path + android:fillColor="#FF000000" + android:pathData="M20,8l-6,-6H6C4.9,2 4.01,2.9 4.01,4l0,7H20V8zM13,9V3.5L18.5,9H13z" /> + <path + android:fillColor="#FF000000" + android:pathData="M9,13h6v2h-6z" /> + <path + android:fillColor="#FF000000" + android:pathData="M17,13h6v2h-6z" /> + <path + android:fillColor="#FF000000" + android:pathData="M1,13h6v2h-6z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/insert_photo.xml b/qqq/android/mobileapp/src/main/res/drawable/insert_photo.xml new file mode 100644 index 0000000..824aa13 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/insert_photo.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/editor/insert_photo/materialicons/black/res/drawable/baseline_insert_photo_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M21,19V5c0,-1.1 -0.9,-2 -2,-2H5c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2zM8.5,13.5l2.5,3.01L14.5,12l4.5,6H5l3.5,-4.5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/insights.xml b/qqq/android/mobileapp/src/main/res/drawable/insights.xml new file mode 100644 index 0000000..c9fd373 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/insights.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/content/insights/materialicons/black/res/drawable/baseline_insights_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M21,8c-1.45,0 -2.26,1.44 -1.93,2.51l-3.55,3.56c-0.3,-0.09 -0.74,-0.09 -1.04,0l-2.55,-2.55C12.27,10.45 11.46,9 10,9c-1.45,0 -2.27,1.44 -1.93,2.52l-4.56,4.55C2.44,15.74 1,16.55 1,18c0,1.1 0.9,2 2,2c1.45,0 2.26,-1.44 1.93,-2.51l4.55,-4.56c0.3,0.09 0.74,0.09 1.04,0l2.55,2.55C12.73,16.55 13.54,18 15,18c1.45,0 2.27,-1.44 1.93,-2.52l3.56,-3.55C21.56,12.26 23,11.45 23,10C23,8.9 22.1,8 21,8z" /> + <path + android:fillColor="#FF000000" + android:pathData="M15,9l0.94,-2.07l2.06,-0.93l-2.06,-0.93l-0.94,-2.07l-0.92,2.07l-2.08,0.93l2.08,0.93z" /> + <path + android:fillColor="#FF000000" + android:pathData="M3.5,11l0.5,-2l2,-0.5l-2,-0.5l-0.5,-2l-0.5,2l-2,0.5l2,0.5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/install_desktop.xml b/qqq/android/mobileapp/src/main/res/drawable/install_desktop.xml new file mode 100644 index 0000000..383daf1 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/install_desktop.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/install_desktop/materialicons/black/res/drawable/baseline_install_desktop_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,17H4V5h8V3H4C2.89,3 2,3.89 2,5v12c0,1.1 0.89,2 2,2h4v2h8v-2h4c1.1,0 2,-0.9 2,-2v-3h-2V17z" /> + <path + android:fillColor="#FF000000" + android:pathData="M17,14l5,-5l-1.41,-1.41l-2.59,2.58l0,-7.17l-2,0l0,7.17l-2.59,-2.58l-1.41,1.41z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/install_mobile.xml b/qqq/android/mobileapp/src/main/res/drawable/install_mobile.xml new file mode 100644 index 0000000..e0b56b3 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/install_mobile.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/install_mobile/materialicons/black/res/drawable/baseline_install_mobile_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M17,18H7V6h7V1H7C5.9,1 5,1.9 5,3v18c0,1.1 0.9,2 2,2h10c1.1,0 2,-0.9 2,-2v-5h-2V18z" /> + <path + android:fillColor="#FF000000" + android:pathData="M18,14l5,-5l-1.41,-1.41l-2.59,2.58l0,-7.17l-2,0l0,7.17l-2.59,-2.58l-1.41,1.41z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/integration_instructions.xml b/qqq/android/mobileapp/src/main/res/drawable/integration_instructions.xml new file mode 100644 index 0000000..4910039 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/integration_instructions.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/integration_instructions/materialicons/black/res/drawable/baseline_integration_instructions_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19,3h-4.18C14.4,1.84 13.3,1 12,1S9.6,1.84 9.18,3H5C4.86,3 4.73,3.01 4.6,3.04C4.21,3.12 3.86,3.32 3.59,3.59c-0.18,0.18 -0.33,0.4 -0.43,0.64C3.06,4.46 3,4.72 3,5v14c0,0.27 0.06,0.54 0.16,0.78c0.1,0.24 0.25,0.45 0.43,0.64c0.27,0.27 0.62,0.47 1.01,0.55C4.73,20.99 4.86,21 5,21h14c1.1,0 2,-0.9 2,-2V5C21,3.9 20.1,3 19,3zM11,14.17l-1.41,1.42L6,12l3.59,-3.59L11,9.83L8.83,12L11,14.17zM12,4.25c-0.41,0 -0.75,-0.34 -0.75,-0.75S11.59,2.75 12,2.75s0.75,0.34 0.75,0.75S12.41,4.25 12,4.25zM14.41,15.59L13,14.17L15.17,12L13,9.83l1.41,-1.42L18,12L14.41,15.59z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/interests.xml b/qqq/android/mobileapp/src/main/res/drawable/interests.xml new file mode 100644 index 0000000..87dabd0 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/interests.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/interests/materialicons/black/res/drawable/baseline_interests_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M7.02,13c-2.21,0 -4,1.79 -4,4s1.79,4 4,4s4,-1.79 4,-4S9.23,13 7.02,13zM13,13v8h8v-8H13zM7,2l-5,9h10L7,2zM19.25,2.5c-1.06,0 -1.81,0.56 -2.25,1.17c-0.44,-0.61 -1.19,-1.17 -2.25,-1.17C13.19,2.5 12,3.78 12,5.25c0,2 2.42,3.42 5,5.75c2.58,-2.33 5,-3.75 5,-5.75C22,3.78 20.81,2.5 19.25,2.5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/interpreter_mode.xml b/qqq/android/mobileapp/src/main/res/drawable/interpreter_mode.xml new file mode 100644 index 0000000..492b04a --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/interpreter_mode.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/av/interpreter_mode/materialicons/black/res/drawable/baseline_interpreter_mode_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20.5,16.5c-0.83,0 -1.5,-0.67 -1.5,-1.5v-2.5c0,-0.83 0.67,-1.5 1.5,-1.5s1.5,0.67 1.5,1.5V15C22,15.83 21.33,16.5 20.5,16.5zM20,20h1c0,0 0,-1.54 0,-1.54c1.69,-0.24 3,-1.7 3,-3.46h-1c0,1.38 -1.12,2.5 -2.5,2.5S18,16.38 18,15h-1c0,1.76 1.31,3.22 3,3.46C20,18.46 20,20 20,20zM9,12c-2.21,0 -4,-1.79 -4,-4c0,-2.21 1.79,-4 4,-4c0.47,0 0.92,0.08 1.34,0.23C9.5,5.26 9,6.57 9,8c0,1.43 0.5,2.74 1.34,3.77C9.92,11.92 9.47,12 9,12zM7.11,13.13C5.79,14.05 5,15.57 5,17.22V20H1v-2.78c0,-1.12 0.61,-2.15 1.61,-2.66C3.85,13.92 5.37,13.37 7.11,13.13zM11,8c0,-2.21 1.79,-4 4,-4s4,1.79 4,4c0,2.21 -1.79,4 -4,4S11,10.21 11,8zM18.32,20c-1.67,-0.81 -2.82,-2.52 -2.82,-4.5c0,-0.89 0.23,-1.73 0.64,-2.45C15.77,13.02 15.39,13 15,13c-2.53,0 -4.71,0.7 -6.39,1.56C7.61,15.07 7,16.1 7,17.22V20L18.32,20z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/inventory.xml b/qqq/android/mobileapp/src/main/res/drawable/inventory.xml new file mode 100644 index 0000000..10d0df1 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/inventory.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/content/inventory/materialicons/black/res/drawable/baseline_inventory_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,2L4,2c-1,0 -2,0.9 -2,2v3.01c0,0.72 0.43,1.34 1,1.69L3,20c0,1.1 1.1,2 2,2h14c0.9,0 2,-0.9 2,-2L21,8.7c0.57,-0.35 1,-0.97 1,-1.69L22,4c0,-1.1 -1,-2 -2,-2zM15,14L9,14v-2h6v2zM20,7L4,7L4,4l16,-0.02L20,7z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/inventory_2.xml b/qqq/android/mobileapp/src/main/res/drawable/inventory_2.xml new file mode 100644 index 0000000..e7dc7a2 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/inventory_2.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/content/inventory_2/materialicons/black/res/drawable/baseline_inventory_2_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,2H4C3,2 2,2.9 2,4v3.01C2,7.73 2.43,8.35 3,8.7V20c0,1.1 1.1,2 2,2h14c0.9,0 2,-0.9 2,-2V8.7c0.57,-0.35 1,-0.97 1,-1.69V4C22,2.9 21,2 20,2zM15,14H9v-2h6V14zM20,7H4V4h16V7z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/invert_colors.xml b/qqq/android/mobileapp/src/main/res/drawable/invert_colors.xml new file mode 100644 index 0000000..c4fe544 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/invert_colors.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/invert_colors/materialicons/black/res/drawable/baseline_invert_colors_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,4.81L12,19c-3.31,0 -6,-2.63 -6,-5.87c0,-1.56 0.62,-3.03 1.75,-4.14L12,4.81M6.35,7.56L6.35,7.56C4.9,8.99 4,10.96 4,13.13C4,17.48 7.58,21 12,21c4.42,0 8,-3.52 8,-7.87c0,-2.17 -0.9,-4.14 -2.35,-5.57l0,0L12,2L6.35,7.56z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/invert_colors_off.xml b/qqq/android/mobileapp/src/main/res/drawable/invert_colors_off.xml new file mode 100644 index 0000000..5649f96 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/invert_colors_off.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/communication/invert_colors_off/materialicons/black/res/drawable/baseline_invert_colors_off_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M21.19,21.19L2.81,2.81L1.39,4.22l4.2,4.2c-1,1.31 -1.6,2.94 -1.6,4.7C4,17.48 7.58,21 12,21c1.75,0 3.36,-0.56 4.67,-1.5l3.1,3.1L21.19,21.19zM12,19c-3.31,0 -6,-2.63 -6,-5.87c0,-1.19 0.36,-2.32 1.02,-3.28L12,14.83V19zM8.38,5.56L12,2l5.65,5.56l0,0C19.1,8.99 20,10.96 20,13.13c0,1.18 -0.27,2.29 -0.74,3.3L12,9.17V4.81L9.8,6.97L8.38,5.56z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/ios_share.xml b/qqq/android/mobileapp/src/main/res/drawable/ios_share.xml new file mode 100644 index 0000000..5cc010d --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/ios_share.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/ios_share/materialicons/black/res/drawable/baseline_ios_share_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M16,5l-1.42,1.42 -1.59,-1.59L12.99,16h-1.98L11.01,4.83L9.42,6.42 8,5l4,-4 4,4zM20,10v11c0,1.1 -0.9,2 -2,2L6,23c-1.11,0 -2,-0.9 -2,-2L4,10c0,-1.11 0.89,-2 2,-2h3v2L6,10v11h12L18,10h-3L15,8h3c1.1,0 2,0.89 2,2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/iron.xml b/qqq/android/mobileapp/src/main/res/drawable/iron.xml new file mode 100644 index 0000000..69c12de --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/iron.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/places/iron/materialicons/black/res/drawable/baseline_iron_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M21,6c-1.66,0 -3,1.34 -3,3v4c0,0.55 -0.45,1 -1,1v-4c0,-1.66 -1.34,-3 -3,-3h-4c-1.66,0 -3,1.34 -3,3h2c0,-0.55 0.45,-1 1,-1h4c0.55,0 1,0.45 1,1v1H6c-2.21,0 -4,1.79 -4,4v3h15v-2c1.66,0 3,-1.34 3,-3V9c0,-0.55 0.45,-1 1,-1h1V6H21z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/iso.xml b/qqq/android/mobileapp/src/main/res/drawable/iso.xml new file mode 100644 index 0000000..5375f5d --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/iso.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/iso/materialicons/black/res/drawable/baseline_iso_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19,3L5,3c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2L21,5c0,-1.1 -0.9,-2 -2,-2zM5.5,7.5h2v-2L9,5.5v2h2L11,9L9,9v2L7.5,11L7.5,9h-2L5.5,7.5zM19,19L5,19L19,5v14zM17,17v-1.5h-5L12,17h5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/javascript.xml b/qqq/android/mobileapp/src/main/res/drawable/javascript.xml new file mode 100644 index 0000000..f5e743d --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/javascript.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/javascript/materialicons/black/res/drawable/baseline_javascript_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,14v-1h1.5v0.5h2v-1H13c-0.55,0 -1,-0.45 -1,-1V10c0,-0.55 0.45,-1 1,-1h3c0.55,0 1,0.45 1,1v1h-1.5v-0.5h-2v1H16c0.55,0 1,0.45 1,1V14c0,0.55 -0.45,1 -1,1h-3C12.45,15 12,14.55 12,14zM9,9v4.5H7.5v-1H6v1C6,14.33 6.67,15 7.5,15H9c0.83,0 1.5,-0.67 1.5,-1.5V9C10.5,9 9.83,9 9,9z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/join_full.xml b/qqq/android/mobileapp/src/main/res/drawable/join_full.xml new file mode 100644 index 0000000..985a1d3 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/join_full.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/join_full/materialicons/black/res/drawable/baseline_join_full_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M9,12a3,5.74 0,1 0,6 0a3,5.74 0,1 0,-6 0z" /> + <path + android:fillColor="#FF000000" + android:pathData="M7.5,12c0,-0.97 0.23,-4.16 3.03,-6.5C9.75,5.19 8.9,5 8,5c-3.86,0 -7,3.14 -7,7s3.14,7 7,7c0.9,0 1.75,-0.19 2.53,-0.5C7.73,16.16 7.5,12.97 7.5,12z" /> + <path + android:fillColor="#FF000000" + android:pathData="M16,5c-0.9,0 -1.75,0.19 -2.53,0.5c2.8,2.34 3.03,5.53 3.03,6.5c0,0.97 -0.23,4.16 -3.03,6.5C14.25,18.81 15.1,19 16,19c3.86,0 7,-3.14 7,-7S19.86,5 16,5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/join_inner.xml b/qqq/android/mobileapp/src/main/res/drawable/join_inner.xml new file mode 100644 index 0000000..391bfe8 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/join_inner.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/join_inner/materialicons/black/res/drawable/baseline_join_inner_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M9,12a3,5.74 0,1 0,6 0a3,5.74 0,1 0,-6 0z" /> + <path + android:fillColor="#FF000000" + android:pathData="M9.04,16.87C8.71,16.95 8.36,17 8,17c-2.76,0 -5,-2.24 -5,-5s2.24,-5 5,-5c0.36,0 0.71,0.05 1.04,0.13c0.39,-0.56 0.88,-1.12 1.49,-1.63C9.75,5.19 8.9,5 8,5c-3.86,0 -7,3.14 -7,7s3.14,7 7,7c0.9,0 1.75,-0.19 2.53,-0.5C9.92,17.99 9.43,17.43 9.04,16.87z" /> + <path + android:fillColor="#FF000000" + android:pathData="M16,5c-0.9,0 -1.75,0.19 -2.53,0.5c0.61,0.51 1.1,1.07 1.49,1.63C15.29,7.05 15.64,7 16,7c2.76,0 5,2.24 5,5s-2.24,5 -5,5c-0.36,0 -0.71,-0.05 -1.04,-0.13c-0.39,0.56 -0.88,1.12 -1.49,1.63C14.25,18.81 15.1,19 16,19c3.86,0 7,-3.14 7,-7S19.86,5 16,5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/join_left.xml b/qqq/android/mobileapp/src/main/res/drawable/join_left.xml new file mode 100644 index 0000000..48efc87 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/join_left.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/join_left/materialicons/black/res/drawable/baseline_join_left_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M9,12a3,5.74 0,1 0,6 0a3,5.74 0,1 0,-6 0z" /> + <path + android:fillColor="#FF000000" + android:pathData="M7.5,12c0,-0.97 0.23,-4.16 3.03,-6.5C9.75,5.19 8.9,5 8,5c-3.86,0 -7,3.14 -7,7s3.14,7 7,7c0.9,0 1.75,-0.19 2.53,-0.5C7.73,16.16 7.5,12.97 7.5,12z" /> + <path + android:fillColor="#FF000000" + android:pathData="M16,5c-0.9,0 -1.75,0.19 -2.53,0.5c0.61,0.51 1.1,1.07 1.49,1.63C15.29,7.05 15.64,7 16,7c2.76,0 5,2.24 5,5s-2.24,5 -5,5c-0.36,0 -0.71,-0.05 -1.04,-0.13c-0.39,0.56 -0.88,1.12 -1.49,1.63C14.25,18.81 15.1,19 16,19c3.86,0 7,-3.14 7,-7S19.86,5 16,5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/join_right.xml b/qqq/android/mobileapp/src/main/res/drawable/join_right.xml new file mode 100644 index 0000000..09979cb --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/join_right.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/join_right/materialicons/black/res/drawable/baseline_join_right_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M9,12a3,5.74 0,1 0,6 0a3,5.74 0,1 0,-6 0z" /> + <path + android:fillColor="#FF000000" + android:pathData="M16.5,12c0,0.97 -0.23,4.16 -3.03,6.5C14.25,18.81 15.1,19 16,19c3.86,0 7,-3.14 7,-7s-3.14,-7 -7,-7c-0.9,0 -1.75,0.19 -2.53,0.5C16.27,7.84 16.5,11.03 16.5,12z" /> + <path + android:fillColor="#FF000000" + android:pathData="M8,19c0.9,0 1.75,-0.19 2.53,-0.5c-0.61,-0.51 -1.1,-1.07 -1.49,-1.63C8.71,16.95 8.36,17 8,17c-2.76,0 -5,-2.24 -5,-5s2.24,-5 5,-5c0.36,0 0.71,0.05 1.04,0.13c0.39,-0.56 0.88,-1.12 1.49,-1.63C9.75,5.19 8.9,5 8,5c-3.86,0 -7,3.14 -7,7S4.14,19 8,19z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/kayaking.xml b/qqq/android/mobileapp/src/main/res/drawable/kayaking.xml new file mode 100644 index 0000000..be62729 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/kayaking.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/kayaking/materialicons/black/res/drawable/baseline_kayaking_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M21,23c-1.03,0 -2.06,-0.25 -3,-0.75h0c-1.89,1 -4.11,1 -6,0c-1.89,1 -4.11,1 -6,0C5.05,22.75 4.03,23 3,23H2l0,-2h1c1.04,0 2.08,-0.35 3,-1c1.83,1.3 4.17,1.3 6,0c1.83,1.3 4.17,1.3 6,0c0.91,0.65 1.96,1 3,1h1v2H21zM12,5.5c-1.1,0 -2,0.9 -2,2s0.9,2 2,2s2,-0.9 2,-2S13.1,5.5 12,5.5zM24,17.5c0,0 -1.52,0.71 -3.93,1.37c-0.82,-0.23 -1.53,-0.75 -2.07,-1.37c-0.73,0.84 -1.8,1.5 -3,1.5s-2.27,-0.66 -3,-1.5c-0.73,0.84 -1.8,1.5 -3,1.5s-2.27,-0.66 -3,-1.5c-0.54,0.61 -1.25,1.13 -2.07,1.37C1.52,18.21 0,17.5 0,17.5s2.93,-1.36 7.13,-2.08l1.35,-4.17c0.31,-0.95 1.32,-1.47 2.27,-1.16c0.09,0.03 0.19,0.07 0.27,0.11l0,0l2.47,1.3l2.84,-1.5l1.65,-3.71l-0.51,-1.32L18.8,2L22,3.43L20.67,6.4l-1.31,0.5l-3.72,8.34C20.49,15.87 24,17.5 24,17.5zM15.02,12.96l-1.52,0.8l-1.75,-0.92l-0.71,2.17C11.36,15.01 11.68,15 12,15c0.71,0 1.4,0.03 2.07,0.08L15.02,12.96z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/kebab_dining.xml b/qqq/android/mobileapp/src/main/res/drawable/kebab_dining.xml new file mode 100644 index 0000000..cb12ce4 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/kebab_dining.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/kebab_dining/materialicons/black/res/drawable/baseline_kebab_dining_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M7.75,8H11v5H7.75v1H8.5c1.38,0 2.5,1.12 2.5,2.5c0,1.38 -1.12,2.5 -2.5,2.5H7.75v4h-1.5v-4H5.5C4.12,19 3,17.88 3,16.5C3,15.12 4.12,14 5.5,14h0.75v-1H3V8h3.25V7H5.5C4.12,7 3,5.88 3,4.5C3,3.12 4.12,2 5.5,2h0.75V1h1.5v1H8.5C9.88,2 11,3.12 11,4.5C11,5.88 9.88,7 8.5,7H7.75V8zM17.75,7h0.75C19.88,7 21,5.88 21,4.5C21,3.12 19.88,2 18.5,2h-0.75V1h-1.5v1H15.5C14.12,2 13,3.12 13,4.5C13,5.88 14.12,7 15.5,7h0.75v1H13v5h3.25v1H15.5c-1.38,0 -2.5,1.12 -2.5,2.5c0,1.38 1.12,2.5 2.5,2.5h0.75v4h1.5v-4h0.75c1.38,0 2.5,-1.12 2.5,-2.5c0,-1.38 -1.12,-2.5 -2.5,-2.5h-0.75v-1H21V8h-3.25V7z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/key.xml b/qqq/android/mobileapp/src/main/res/drawable/key.xml new file mode 100644 index 0000000..5fae697 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/key.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/communication/key/materialicons/black/res/drawable/baseline_key_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M21,10h-8.35C11.83,7.67 9.61,6 7,6c-3.31,0 -6,2.69 -6,6s2.69,6 6,6c2.61,0 4.83,-1.67 5.65,-4H13l2,2l2,-2l2,2l4,-4.04L21,10zM7,15c-1.65,0 -3,-1.35 -3,-3c0,-1.65 1.35,-3 3,-3s3,1.35 3,3C10,13.65 8.65,15 7,15z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/key_off.xml b/qqq/android/mobileapp/src/main/res/drawable/key_off.xml new file mode 100644 index 0000000..e8b000d --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/key_off.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/communication/key_off/materialicons/black/res/drawable/baseline_key_off_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M16.91,14.09L17,14l2,2l4,-4.04L21,10h-8.17L16.91,14.09zM3.98,6.81C2.2,7.85 1,9.79 1,12c0,3.31 2.69,6 6,6c2.21,0 4.15,-1.2 5.18,-2.99l7.59,7.59l1.41,-1.41L2.81,2.81L1.39,4.22L3.98,6.81zM9.91,12.74C9.58,14.03 8.4,15 7,15c-1.65,0 -3,-1.35 -3,-3c0,-1.4 0.97,-2.58 2.26,-2.91L9.91,12.74z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/keyboard.xml b/qqq/android/mobileapp/src/main/res/drawable/keyboard.xml new file mode 100644 index 0000000..06730ed --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/keyboard.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/hardware/keyboard/materialicons/black/res/drawable/baseline_keyboard_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,5L4,5c-1.1,0 -1.99,0.9 -1.99,2L2,17c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2L22,7c0,-1.1 -0.9,-2 -2,-2zM11,8h2v2h-2L11,8zM11,11h2v2h-2v-2zM8,8h2v2L8,10L8,8zM8,11h2v2L8,13v-2zM7,13L5,13v-2h2v2zM7,10L5,10L5,8h2v2zM16,17L8,17v-2h8v2zM16,13h-2v-2h2v2zM16,10h-2L14,8h2v2zM19,13h-2v-2h2v2zM19,10h-2L17,8h2v2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/keyboard_alt.xml b/qqq/android/mobileapp/src/main/res/drawable/keyboard_alt.xml new file mode 100644 index 0000000..173220d --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/keyboard_alt.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/hardware/keyboard_alt/materialicons/black/res/drawable/baseline_keyboard_alt_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M21,4H3C1.9,4 1,4.9 1,6v13c0,1.1 0.9,2 2,2h18c1.1,0 2,-0.9 2,-2V6C23,4.9 22.1,4 21,4zM7,12v2H5v-2H7zM5,10V8h2v2H5zM11,12v2H9v-2H11zM9,10V8h2v2H9zM16,16v1H8v-1H16zM15,12v2h-2v-2H15zM13,10V8h2v2H13zM17,14v-2h2v2H17zM19,10h-2V8h2V10z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/keyboard_arrow_down.xml b/qqq/android/mobileapp/src/main/res/drawable/keyboard_arrow_down.xml new file mode 100644 index 0000000..1a49f43 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/keyboard_arrow_down.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/hardware/keyboard_arrow_down/materialicons/black/res/drawable/baseline_keyboard_arrow_down_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M7.41,8.59L12,13.17l4.59,-4.58L18,10l-6,6 -6,-6 1.41,-1.41z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/keyboard_arrow_left.xml b/qqq/android/mobileapp/src/main/res/drawable/keyboard_arrow_left.xml new file mode 100644 index 0000000..deb6e74 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/keyboard_arrow_left.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/hardware/keyboard_arrow_left/materialicons/black/res/drawable/baseline_keyboard_arrow_left_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M15.41,16.59L10.83,12l4.58,-4.59L14,6l-6,6 6,6 1.41,-1.41z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/keyboard_arrow_right.xml b/qqq/android/mobileapp/src/main/res/drawable/keyboard_arrow_right.xml new file mode 100644 index 0000000..ee73ab7 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/keyboard_arrow_right.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/hardware/keyboard_arrow_right/materialicons/black/res/drawable/baseline_keyboard_arrow_right_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M8.59,16.59L13.17,12 8.59,7.41 10,6l6,6 -6,6 -1.41,-1.41z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/keyboard_arrow_up.xml b/qqq/android/mobileapp/src/main/res/drawable/keyboard_arrow_up.xml new file mode 100644 index 0000000..99e16a6 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/keyboard_arrow_up.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/hardware/keyboard_arrow_up/materialicons/black/res/drawable/baseline_keyboard_arrow_up_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M7.41,15.41L12,10.83l4.59,4.58L18,14l-6,-6 -6,6z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/keyboard_backspace.xml b/qqq/android/mobileapp/src/main/res/drawable/keyboard_backspace.xml new file mode 100644 index 0000000..f5ed083 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/keyboard_backspace.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/hardware/keyboard_backspace/materialicons/black/res/drawable/baseline_keyboard_backspace_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M21,11H6.83l3.58,-3.59L9,6l-6,6 6,6 1.41,-1.41L6.83,13H21z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/keyboard_capslock.xml b/qqq/android/mobileapp/src/main/res/drawable/keyboard_capslock.xml new file mode 100644 index 0000000..0a5574c --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/keyboard_capslock.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/hardware/keyboard_capslock/materialicons/black/res/drawable/baseline_keyboard_capslock_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,8.41L16.59,13 18,11.59l-6,-6 -6,6L7.41,13 12,8.41zM6,18h12v-2H6v2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/keyboard_command_key.xml b/qqq/android/mobileapp/src/main/res/drawable/keyboard_command_key.xml new file mode 100644 index 0000000..6094c6e --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/keyboard_command_key.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/hardware/keyboard_command_key/materialicons/black/res/drawable/baseline_keyboard_command_key_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M17.5,3C15.57,3 14,4.57 14,6.5V8h-4V6.5C10,4.57 8.43,3 6.5,3S3,4.57 3,6.5S4.57,10 6.5,10H8v4H6.5C4.57,14 3,15.57 3,17.5S4.57,21 6.5,21s3.5,-1.57 3.5,-3.5V16h4v1.5c0,1.93 1.57,3.5 3.5,3.5s3.5,-1.57 3.5,-3.5S19.43,14 17.5,14H16v-4h1.5c1.93,0 3.5,-1.57 3.5,-3.5S19.43,3 17.5,3L17.5,3zM16,8V6.5C16,5.67 16.67,5 17.5,5S19,5.67 19,6.5S18.33,8 17.5,8H16L16,8zM6.5,8C5.67,8 5,7.33 5,6.5S5.67,5 6.5,5S8,5.67 8,6.5V8H6.5L6.5,8zM10,14v-4h4v4H10L10,14zM17.5,19c-0.83,0 -1.5,-0.67 -1.5,-1.5V16h1.5c0.83,0 1.5,0.67 1.5,1.5S18.33,19 17.5,19L17.5,19zM6.5,19C5.67,19 5,18.33 5,17.5S5.67,16 6.5,16H8v1.5C8,18.33 7.33,19 6.5,19L6.5,19z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/keyboard_control_key.xml b/qqq/android/mobileapp/src/main/res/drawable/keyboard_control_key.xml new file mode 100644 index 0000000..7b2b89e --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/keyboard_control_key.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/hardware/keyboard_control_key/materialicons/black/res/drawable/baseline_keyboard_control_key_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M5,12l1.41,1.41l5.59,-5.58l5.59,5.58l1.41,-1.41l-7,-7z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/keyboard_double_arrow_down.xml b/qqq/android/mobileapp/src/main/res/drawable/keyboard_double_arrow_down.xml new file mode 100644 index 0000000..8157511 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/keyboard_double_arrow_down.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/hardware/keyboard_double_arrow_down/materialicons/black/res/drawable/baseline_keyboard_double_arrow_down_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M18,6.41l-1.41,-1.41l-4.59,4.58l-4.59,-4.58l-1.41,1.41l6,6z" /> + <path + android:fillColor="#FF000000" + android:pathData="M18,13l-1.41,-1.41l-4.59,4.58l-4.59,-4.58l-1.41,1.41l6,6z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/keyboard_double_arrow_left.xml b/qqq/android/mobileapp/src/main/res/drawable/keyboard_double_arrow_left.xml new file mode 100644 index 0000000..407dcf5 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/keyboard_double_arrow_left.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/hardware/keyboard_double_arrow_left/materialicons/black/res/drawable/baseline_keyboard_double_arrow_left_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M17.59,18l1.41,-1.41l-4.58,-4.59l4.58,-4.59l-1.41,-1.41l-6,6z" /> + <path + android:fillColor="#FF000000" + android:pathData="M11,18l1.41,-1.41l-4.58,-4.59l4.58,-4.59l-1.41,-1.41l-6,6z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/keyboard_double_arrow_right.xml b/qqq/android/mobileapp/src/main/res/drawable/keyboard_double_arrow_right.xml new file mode 100644 index 0000000..1d5aba8 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/keyboard_double_arrow_right.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/hardware/keyboard_double_arrow_right/materialicons/black/res/drawable/baseline_keyboard_double_arrow_right_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M6.41,6l-1.41,1.41l4.58,4.59l-4.58,4.59l1.41,1.41l6,-6z" /> + <path + android:fillColor="#FF000000" + android:pathData="M13,6l-1.41,1.41l4.58,4.59l-4.58,4.59l1.41,1.41l6,-6z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/keyboard_double_arrow_up.xml b/qqq/android/mobileapp/src/main/res/drawable/keyboard_double_arrow_up.xml new file mode 100644 index 0000000..c7478ff --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/keyboard_double_arrow_up.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/hardware/keyboard_double_arrow_up/materialicons/black/res/drawable/baseline_keyboard_double_arrow_up_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M6,17.59l1.41,1.41l4.59,-4.58l4.59,4.58l1.41,-1.41l-6,-6z" /> + <path + android:fillColor="#FF000000" + android:pathData="M6,11l1.41,1.41l4.59,-4.58l4.59,4.58l1.41,-1.41l-6,-6z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/keyboard_hide.xml b/qqq/android/mobileapp/src/main/res/drawable/keyboard_hide.xml new file mode 100644 index 0000000..45b164d --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/keyboard_hide.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/hardware/keyboard_hide/materialicons/black/res/drawable/baseline_keyboard_hide_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,3L4,3c-1.1,0 -1.99,0.9 -1.99,2L2,15c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2L22,5c0,-1.1 -0.9,-2 -2,-2zM11,6h2v2h-2L11,6zM11,9h2v2h-2L11,9zM8,6h2v2L8,8L8,6zM8,9h2v2L8,11L8,9zM7,11L5,11L5,9h2v2zM7,8L5,8L5,6h2v2zM16,15L8,15v-2h8v2zM16,11h-2L14,9h2v2zM16,8h-2L14,6h2v2zM19,11h-2L17,9h2v2zM19,8h-2L17,6h2v2zM12,23l4,-4L8,19l4,4z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/keyboard_option_key.xml b/qqq/android/mobileapp/src/main/res/drawable/keyboard_option_key.xml new file mode 100644 index 0000000..56e163a --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/keyboard_option_key.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/hardware/keyboard_option_key/materialicons/black/res/drawable/baseline_keyboard_option_key_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M15,5h6v2h-6z" /> + <path + android:fillColor="#FF000000" + android:pathData="M9,5l-6,0l0,2l4.85,0l6.92,12l6.23,0l0,-2l-5.07,0z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/keyboard_return.xml b/qqq/android/mobileapp/src/main/res/drawable/keyboard_return.xml new file mode 100644 index 0000000..585d7b1 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/keyboard_return.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/hardware/keyboard_return/materialicons/black/res/drawable/baseline_keyboard_return_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19,7v4H5.83l3.58,-3.59L8,6l-6,6 6,6 1.41,-1.41L5.83,13H21V7z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/keyboard_tab.xml b/qqq/android/mobileapp/src/main/res/drawable/keyboard_tab.xml new file mode 100644 index 0000000..e84a2a5 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/keyboard_tab.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/hardware/keyboard_tab/materialicons/black/res/drawable/baseline_keyboard_tab_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M11.59,7.41L15.17,11H1v2h14.17l-3.59,3.59L13,18l6,-6 -6,-6 -1.41,1.41zM20,6v12h2V6h-2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/keyboard_voice.xml b/qqq/android/mobileapp/src/main/res/drawable/keyboard_voice.xml new file mode 100644 index 0000000..6923bb8 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/keyboard_voice.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/hardware/keyboard_voice/materialicons/black/res/drawable/baseline_keyboard_voice_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,15c1.66,0 2.99,-1.34 2.99,-3L15,6c0,-1.66 -1.34,-3 -3,-3S9,4.34 9,6v6c0,1.66 1.34,3 3,3zM17.3,12c0,3 -2.54,5.1 -5.3,5.1S6.7,15 6.7,12L5,12c0,3.42 2.72,6.23 6,6.72L11,22h2v-3.28c3.28,-0.48 6,-3.3 6,-6.72h-1.7z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/king_bed.xml b/qqq/android/mobileapp/src/main/res/drawable/king_bed.xml new file mode 100644 index 0000000..4ed7f34 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/king_bed.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/king_bed/materialicons/black/res/drawable/baseline_king_bed_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,10V7c0,-1.1 -0.9,-2 -2,-2H6C4.9,5 4,5.9 4,7v3c-1.1,0 -2,0.9 -2,2v5h1.33L4,19h1l0.67,-2h12.67L19,19h1l0.67,-2H22v-5C22,10.9 21.1,10 20,10zM11,10H6V7h5V10zM18,10h-5V7h5V10z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/kitchen.xml b/qqq/android/mobileapp/src/main/res/drawable/kitchen.xml new file mode 100644 index 0000000..d6a4e5f --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/kitchen.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/places/kitchen/materialicons/black/res/drawable/baseline_kitchen_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,9V4c0,-1.1 -0.9,-2 -2,-2H6C4.9,2 4,2.9 4,4v5H20zM8,5h2v3H8V5z" /> + <path + android:fillColor="#FF000000" + android:pathData="M4,11v9c0,1.1 0.9,2 2,2h12c1.1,0 2,-0.9 2,-2v-9H4zM10,17H8v-5h2V17z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/kitesurfing.xml b/qqq/android/mobileapp/src/main/res/drawable/kitesurfing.xml new file mode 100644 index 0000000..2639385 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/kitesurfing.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/kitesurfing/materialicons/black/res/drawable/baseline_kitesurfing_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M6,3c0,-1.1 0.9,-2 2,-2s2,0.9 2,2c0,1.1 -0.9,2 -2,2S6,4.1 6,3zM20.06,1h-2.12L15.5,3.44l1.06,1.06L20.06,1zM22,23v-2h-1c-1.04,0 -2.08,-0.35 -3,-1c-1.83,1.3 -4.17,1.3 -6,0c-1.83,1.3 -4.17,1.3 -6,0c-0.91,0.65 -1.96,1 -3,1H2l0,2h1c1.03,0 2.05,-0.25 3,-0.75c1.89,1 4.11,1 6,0c1.89,1 4.11,1 6,0h0c0.95,0.5 1.97,0.75 3,0.75H22zM21,13.28c0,1.44 -2.19,3.62 -5.04,5.58C15.65,18.95 15.33,19 15,19c-1.2,0 -2.27,-0.66 -3,-1.5c-0.73,0.84 -1.8,1.5 -3,1.5c-0.94,0 -1.81,-0.41 -2.49,-0.99c0.46,-0.39 0.96,-0.78 1.49,-1.17l-1.55,-2.97C6.15,13.3 6,12.64 6,12V8c0,-1.1 0.9,-2 2,-2h3c1.38,0 2.63,-0.56 3.54,-1.46l1.41,1.41C14.68,7.21 12.93,8 11,8H9.6l0,3.5h2.8l1.69,1.88c1.95,-0.84 3.77,-1.38 5.06,-1.38C19.99,12 21,12.25 21,13.28zM12.2,14.27l-0.7,-0.77L9,13.6l0.83,2.01C10.42,15.23 11.64,14.55 12.2,14.27z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/label.xml b/qqq/android/mobileapp/src/main/res/drawable/label.xml new file mode 100644 index 0000000..3aae6b8 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/label.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/label/materialicons/black/res/drawable/baseline_label_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M17.63,5.84C17.27,5.33 16.67,5 16,5L5,5.01C3.9,5.01 3,5.9 3,7v10c0,1.1 0.9,1.99 2,1.99L16,19c0.67,0 1.27,-0.33 1.63,-0.84L22,12l-4.37,-6.16z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/label_important.xml b/qqq/android/mobileapp/src/main/res/drawable/label_important.xml new file mode 100644 index 0000000..a3d1674 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/label_important.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/label_important/materialicons/black/res/drawable/baseline_label_important_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M3.5,18.99l11,0.01c0.67,0 1.27,-0.33 1.63,-0.84L20.5,12l-4.37,-6.16c-0.36,-0.51 -0.96,-0.84 -1.63,-0.84l-11,0.01L8.34,12 3.5,18.99z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/label_important_outline.xml b/qqq/android/mobileapp/src/main/res/drawable/label_important_outline.xml new file mode 100644 index 0000000..817f735 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/label_important_outline.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/label_important_outline/materialicons/black/res/drawable/baseline_label_important_outline_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M15,19L3,19l4.5,-7L3,5h12c0.65,0 1.26,0.31 1.63,0.84L21,12l-4.37,6.16c-0.37,0.52 -0.98,0.84 -1.63,0.84zM6.5,17L15,17l3.5,-5L15,7L6.5,7l3.5,5 -3.5,5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/label_off.xml b/qqq/android/mobileapp/src/main/res/drawable/label_off.xml new file mode 100644 index 0000000..b43b5b0 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/label_off.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/label_off/materialicons/black/res/drawable/baseline_label_off_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M3.25,2.75l17,17L19,21l-2,-2H5c-1.1,0 -2,-0.9 -2,-2V7c0,-0.55 0.23,-1.05 0.59,-1.41L2,4l1.25,-1.25zM22,12l-4.37,-6.16C17.27,5.33 16.67,5 16,5H8l11,11 3,-4z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/label_outline.xml b/qqq/android/mobileapp/src/main/res/drawable/label_outline.xml new file mode 100644 index 0000000..a049193 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/label_outline.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/label_outline/materialicons/black/res/drawable/baseline_label_outline_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M17.63,5.84C17.27,5.33 16.67,5 16,5L5,5.01C3.9,5.01 3,5.9 3,7v10c0,1.1 0.9,1.99 2,1.99L16,19c0.67,0 1.27,-0.33 1.63,-0.84L22,12l-4.37,-6.16zM16,17H5V7h11l3.55,5L16,17z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/lan.xml b/qqq/android/mobileapp/src/main/res/drawable/lan.xml new file mode 100644 index 0000000..bb8e02e --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/lan.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/lan/materialicons/black/res/drawable/baseline_lan_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M13,22l8,0l0,-7l-3,0l0,-4l-5,0l0,-2l3,0l0,-7l-8,0l0,7l3,0l0,2l-5,0l0,4l-3,0l0,7l8,0l0,-7l-3,0l0,-2l8,0l0,2l-3,0z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/landscape.xml b/qqq/android/mobileapp/src/main/res/drawable/landscape.xml new file mode 100644 index 0000000..eb09f36 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/landscape.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/landscape/materialicons/black/res/drawable/baseline_landscape_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M14,6l-3.75,5 2.85,3.8 -1.6,1.2C9.81,13.75 7,10 7,10l-6,8h22L14,6z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/landslide.xml b/qqq/android/mobileapp/src/main/res/drawable/landslide.xml new file mode 100644 index 0000000..643a702 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/landslide.xml @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/landslide/materialicons/black/res/drawable/baseline_landslide_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M15.47,13.79l-2.58,-1.03l-6.89,2.29l-4,-1.54l0,2.1l4,1.34z" /> + <path + android:fillColor="#FF000000" + android:pathData="M10.57,11.42l-2.57,-3.42l-6,0l0,3.61l4,1.34z" /> + <path + android:fillColor="#FF000000" + android:pathData="M6,19.05l-4,-1.33l0,4.28l20,0l-4.97,-6.62z" /> + <path + android:fillColor="#FF000000" + android:pathData="M17,6l0,-5l-5,-1l-3,2l0,4l3,2z" /> + <path + android:fillColor="#FF000000" + android:pathData="M18.5,7l-2.5,2l0,3l2.5,2l4.5,-2l0,-4z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/language.xml b/qqq/android/mobileapp/src/main/res/drawable/language.xml new file mode 100644 index 0000000..3185412 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/language.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/language/materialicons/black/res/drawable/baseline_language_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M11.99,2C6.47,2 2,6.48 2,12s4.47,10 9.99,10C17.52,22 22,17.52 22,12S17.52,2 11.99,2zM18.92,8h-2.95c-0.32,-1.25 -0.78,-2.45 -1.38,-3.56 1.84,0.63 3.37,1.91 4.33,3.56zM12,4.04c0.83,1.2 1.48,2.53 1.91,3.96h-3.82c0.43,-1.43 1.08,-2.76 1.91,-3.96zM4.26,14C4.1,13.36 4,12.69 4,12s0.1,-1.36 0.26,-2h3.38c-0.08,0.66 -0.14,1.32 -0.14,2 0,0.68 0.06,1.34 0.14,2L4.26,14zM5.08,16h2.95c0.32,1.25 0.78,2.45 1.38,3.56 -1.84,-0.63 -3.37,-1.9 -4.33,-3.56zM8.03,8L5.08,8c0.96,-1.66 2.49,-2.93 4.33,-3.56C8.81,5.55 8.35,6.75 8.03,8zM12,19.96c-0.83,-1.2 -1.48,-2.53 -1.91,-3.96h3.82c-0.43,1.43 -1.08,2.76 -1.91,3.96zM14.34,14L9.66,14c-0.09,-0.66 -0.16,-1.32 -0.16,-2 0,-0.68 0.07,-1.35 0.16,-2h4.68c0.09,0.65 0.16,1.32 0.16,2 0,0.68 -0.07,1.34 -0.16,2zM14.59,19.56c0.6,-1.11 1.06,-2.31 1.38,-3.56h2.95c-0.96,1.65 -2.49,2.93 -4.33,3.56zM16.36,14c0.08,-0.66 0.14,-1.32 0.14,-2 0,-0.68 -0.06,-1.34 -0.14,-2h3.38c0.16,0.64 0.26,1.31 0.26,2s-0.1,1.36 -0.26,2h-3.38z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/laptop.xml b/qqq/android/mobileapp/src/main/res/drawable/laptop.xml new file mode 100644 index 0000000..73d056e --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/laptop.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/hardware/laptop/materialicons/black/res/drawable/baseline_laptop_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,18c1.1,0 2,-0.9 2,-2V6c0,-1.1 -0.9,-2 -2,-2H4C2.9,4 2,4.9 2,6v10c0,1.1 0.9,2 2,2H0v2h24v-2H20zM4,6h16v10H4V6z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/laptop_chromebook.xml b/qqq/android/mobileapp/src/main/res/drawable/laptop_chromebook.xml new file mode 100644 index 0000000..434a171 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/laptop_chromebook.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/hardware/laptop_chromebook/materialicons/black/res/drawable/baseline_laptop_chromebook_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M22,18L22,3L2,3v15L0,18v2h24v-2h-2zM14,18h-4v-1h4v1zM20,15L4,15L4,5h16v10z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/laptop_mac.xml b/qqq/android/mobileapp/src/main/res/drawable/laptop_mac.xml new file mode 100644 index 0000000..fa0dfb3 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/laptop_mac.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/hardware/laptop_mac/materialicons/black/res/drawable/baseline_laptop_mac_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,18c1.1,0 1.99,-0.9 1.99,-2L22,5c0,-1.1 -0.9,-2 -2,-2L4,3c-1.1,0 -2,0.9 -2,2v11c0,1.1 0.9,2 2,2L0,18c0,1.1 0.9,2 2,2h20c1.1,0 2,-0.9 2,-2h-4zM4,5h16v11L4,16L4,5zM12,19c-0.55,0 -1,-0.45 -1,-1s0.45,-1 1,-1 1,0.45 1,1 -0.45,1 -1,1z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/laptop_windows.xml b/qqq/android/mobileapp/src/main/res/drawable/laptop_windows.xml new file mode 100644 index 0000000..26ee71e --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/laptop_windows.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/hardware/laptop_windows/materialicons/black/res/drawable/baseline_laptop_windows_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,18v-1c1.1,0 1.99,-0.9 1.99,-2L22,5c0,-1.1 -0.9,-2 -2,-2H4c-1.1,0 -2,0.9 -2,2v10c0,1.1 0.9,2 2,2v1H0v2h24v-2h-4zM4,5h16v10H4V5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/last_page.xml b/qqq/android/mobileapp/src/main/res/drawable/last_page.xml new file mode 100644 index 0000000..9002ba7 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/last_page.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/navigation/last_page/materialicons/black/res/drawable/baseline_last_page_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M5.59,7.41L10.18,12l-4.59,4.59L7,18l6,-6 -6,-6zM16,6h2v12h-2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/launch.xml b/qqq/android/mobileapp/src/main/res/drawable/launch.xml new file mode 100644 index 0000000..7d88dc8 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/launch.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/launch/materialicons/black/res/drawable/baseline_launch_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19,19H5V5h7V3H5c-1.11,0 -2,0.9 -2,2v14c0,1.1 0.89,2 2,2h14c1.1,0 2,-0.9 2,-2v-7h-2v7zM14,3v2h3.59l-9.83,9.83 1.41,1.41L19,6.41V10h2V3h-7z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/layers.xml b/qqq/android/mobileapp/src/main/res/drawable/layers.xml new file mode 100644 index 0000000..41031b5 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/layers.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/layers/materialicons/black/res/drawable/baseline_layers_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M11.99,18.54l-7.37,-5.73L3,14.07l9,7 9,-7 -1.63,-1.27 -7.38,5.74zM12,16l7.36,-5.73L21,9l-9,-7 -9,7 1.63,1.27L12,16z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/layers_clear.xml b/qqq/android/mobileapp/src/main/res/drawable/layers_clear.xml new file mode 100644 index 0000000..055d113 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/layers_clear.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/layers_clear/materialicons/black/res/drawable/baseline_layers_clear_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19.81,14.99l1.19,-0.92 -1.43,-1.43 -1.19,0.92 1.43,1.43zM19.36,10.27L21,9l-9,-7 -2.91,2.27 7.87,7.88 2.4,-1.88zM3.27,1L2,2.27l4.22,4.22L3,9l1.63,1.27L12,16l2.1,-1.63 1.43,1.43L12,18.54l-7.37,-5.73L3,14.07l9,7 4.95,-3.85L20.73,21 22,19.73 3.27,1z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/leaderboard.xml b/qqq/android/mobileapp/src/main/res/drawable/leaderboard.xml new file mode 100644 index 0000000..14ee457 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/leaderboard.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/leaderboard/materialicons/black/res/drawable/baseline_leaderboard_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M7.5,21H2V9h5.5V21zM14.75,3h-5.5v18h5.5V3zM22,11h-5.5v10H22V11z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/leak_add.xml b/qqq/android/mobileapp/src/main/res/drawable/leak_add.xml new file mode 100644 index 0000000..885bcbf --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/leak_add.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/leak_add/materialicons/black/res/drawable/baseline_leak_add_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M6,3L3,3v3c1.66,0 3,-1.34 3,-3zM14,3h-2c0,4.97 -4.03,9 -9,9v2c6.08,0 11,-4.93 11,-11zM10,3L8,3c0,2.76 -2.24,5 -5,5v2c3.87,0 7,-3.13 7,-7zM10,21h2c0,-4.97 4.03,-9 9,-9v-2c-6.07,0 -11,4.93 -11,11zM18,21h3v-3c-1.66,0 -3,1.34 -3,3zM14,21h2c0,-2.76 2.24,-5 5,-5v-2c-3.87,0 -7,3.13 -7,7z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/leak_remove.xml b/qqq/android/mobileapp/src/main/res/drawable/leak_remove.xml new file mode 100644 index 0000000..1c0bd6b --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/leak_remove.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/leak_remove/materialicons/black/res/drawable/baseline_leak_remove_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M10,3L8,3c0,0.37 -0.04,0.72 -0.12,1.06l1.59,1.59C9.81,4.84 10,3.94 10,3zM3,4.27l2.84,2.84C5.03,7.67 4.06,8 3,8v2c1.61,0 3.09,-0.55 4.27,-1.46L8.7,9.97C7.14,11.24 5.16,12 3,12v2c2.71,0 5.19,-0.99 7.11,-2.62l2.5,2.5C10.99,15.81 10,18.29 10,21h2c0,-2.16 0.76,-4.14 2.03,-5.69l1.43,1.43C14.55,17.91 14,19.39 14,21h2c0,-1.06 0.33,-2.03 0.89,-2.84L19.73,21 21,19.73 4.27,3 3,4.27zM14,3h-2c0,1.5 -0.37,2.91 -1.02,4.16l1.46,1.46C13.42,6.98 14,5.06 14,3zM19.94,16.12c0.34,-0.08 0.69,-0.12 1.06,-0.12v-2c-0.94,0 -1.84,0.19 -2.66,0.52l1.6,1.6zM15.38,11.56l1.46,1.46C18.09,12.37 19.5,12 21,12v-2c-2.06,0 -3.98,0.58 -5.62,1.56z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/legend_toggle.xml b/qqq/android/mobileapp/src/main/res/drawable/legend_toggle.xml new file mode 100644 index 0000000..b13ec2a --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/legend_toggle.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/navigation/legend_toggle/materialicons/black/res/drawable/baseline_legend_toggle_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,15H4v-2h16V15zM20,17H4v2h16V17zM15,11l5,-3.55L20,5l-5,3.55L10,5L4,8.66L4,11l5.92,-3.61L15,11z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/lens.xml b/qqq/android/mobileapp/src/main/res/drawable/lens.xml new file mode 100644 index 0000000..3725657 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/lens.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/lens/materialicons/black/res/drawable/baseline_lens_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/lens_blur.xml b/qqq/android/mobileapp/src/main/res/drawable/lens_blur.xml new file mode 100644 index 0000000..9c4dbaf --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/lens_blur.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/lens_blur/materialicons/black/res/drawable/baseline_lens_blur_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M6,13c-0.55,0 -1,0.45 -1,1s0.45,1 1,1s1,-0.45 1,-1S6.55,13 6,13zM6,17c-0.55,0 -1,0.45 -1,1s0.45,1 1,1s1,-0.45 1,-1S6.55,17 6,17zM6,9c-0.55,0 -1,0.45 -1,1s0.45,1 1,1s1,-0.45 1,-1S6.55,9 6,9zM3,9.5c-0.28,0 -0.5,0.22 -0.5,0.5s0.22,0.5 0.5,0.5s0.5,-0.22 0.5,-0.5S3.28,9.5 3,9.5zM6,5C5.45,5 5,5.45 5,6s0.45,1 1,1s1,-0.45 1,-1S6.55,5 6,5zM21,10.5c0.28,0 0.5,-0.22 0.5,-0.5S21.28,9.5 21,9.5s-0.5,0.22 -0.5,0.5S20.72,10.5 21,10.5zM14,7c0.55,0 1,-0.45 1,-1s-0.45,-1 -1,-1s-1,0.45 -1,1S13.45,7 14,7zM14,3.5c0.28,0 0.5,-0.22 0.5,-0.5S14.28,2.5 14,2.5S13.5,2.72 13.5,3S13.72,3.5 14,3.5zM3,13.5c-0.28,0 -0.5,0.22 -0.5,0.5s0.22,0.5 0.5,0.5s0.5,-0.22 0.5,-0.5S3.28,13.5 3,13.5zM10,20.5c-0.28,0 -0.5,0.22 -0.5,0.5s0.22,0.5 0.5,0.5s0.5,-0.22 0.5,-0.5S10.28,20.5 10,20.5zM10,3.5c0.28,0 0.5,-0.22 0.5,-0.5S10.28,2.5 10,2.5S9.5,2.72 9.5,3S9.72,3.5 10,3.5zM10,7c0.55,0 1,-0.45 1,-1s-0.45,-1 -1,-1S9,5.45 9,6S9.45,7 10,7zM10,12.5c-0.83,0 -1.5,0.67 -1.5,1.5s0.67,1.5 1.5,1.5s1.5,-0.67 1.5,-1.5S10.83,12.5 10,12.5zM18,13c-0.55,0 -1,0.45 -1,1s0.45,1 1,1s1,-0.45 1,-1S18.55,13 18,13zM18,17c-0.55,0 -1,0.45 -1,1s0.45,1 1,1s1,-0.45 1,-1S18.55,17 18,17zM18,9c-0.55,0 -1,0.45 -1,1s0.45,1 1,1s1,-0.45 1,-1S18.55,9 18,9zM18,5c-0.55,0 -1,0.45 -1,1s0.45,1 1,1s1,-0.45 1,-1S18.55,5 18,5zM21,13.5c-0.28,0 -0.5,0.22 -0.5,0.5s0.22,0.5 0.5,0.5s0.5,-0.22 0.5,-0.5S21.28,13.5 21,13.5zM14,17c-0.55,0 -1,0.45 -1,1s0.45,1 1,1s1,-0.45 1,-1S14.55,17 14,17zM14,20.5c-0.28,0 -0.5,0.22 -0.5,0.5s0.22,0.5 0.5,0.5s0.5,-0.22 0.5,-0.5S14.28,20.5 14,20.5zM10,8.5c-0.83,0 -1.5,0.67 -1.5,1.5s0.67,1.5 1.5,1.5s1.5,-0.67 1.5,-1.5S10.83,8.5 10,8.5zM10,17c-0.55,0 -1,0.45 -1,1s0.45,1 1,1s1,-0.45 1,-1S10.55,17 10,17zM14,12.5c-0.83,0 -1.5,0.67 -1.5,1.5s0.67,1.5 1.5,1.5s1.5,-0.67 1.5,-1.5S14.83,12.5 14,12.5zM14,8.5c-0.83,0 -1.5,0.67 -1.5,1.5s0.67,1.5 1.5,1.5s1.5,-0.67 1.5,-1.5S14.83,8.5 14,8.5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/library_add.xml b/qqq/android/mobileapp/src/main/res/drawable/library_add.xml new file mode 100644 index 0000000..3ea4bc4 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/library_add.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/av/library_add/materialicons/black/res/drawable/baseline_library_add_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M4,6L2,6v14c0,1.1 0.9,2 2,2h14v-2L4,20L4,6zM20,2L8,2c-1.1,0 -2,0.9 -2,2v12c0,1.1 0.9,2 2,2h12c1.1,0 2,-0.9 2,-2L22,4c0,-1.1 -0.9,-2 -2,-2zM19,11h-4v4h-2v-4L9,11L9,9h4L13,5h2v4h4v2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/library_add_check.xml b/qqq/android/mobileapp/src/main/res/drawable/library_add_check.xml new file mode 100644 index 0000000..0a66e9d --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/library_add_check.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/av/library_add_check/materialicons/black/res/drawable/baseline_library_add_check_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,2L8,2c-1.1,0 -2,0.9 -2,2v12c0,1.1 0.9,2 2,2h12c1.1,0 2,-0.9 2,-2L22,4c0,-1.1 -0.9,-2 -2,-2zM12.47,14L9,10.5l1.4,-1.41 2.07,2.08L17.6,6 19,7.41 12.47,14zM4,6L2,6v14c0,1.1 0.9,2 2,2h14v-2L4,20L4,6z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/library_books.xml b/qqq/android/mobileapp/src/main/res/drawable/library_books.xml new file mode 100644 index 0000000..cacd980 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/library_books.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/av/library_books/materialicons/black/res/drawable/baseline_library_books_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M4,6L2,6v14c0,1.1 0.9,2 2,2h14v-2L4,20L4,6zM20,2L8,2c-1.1,0 -2,0.9 -2,2v12c0,1.1 0.9,2 2,2h12c1.1,0 2,-0.9 2,-2L22,4c0,-1.1 -0.9,-2 -2,-2zM19,11L9,11L9,9h10v2zM15,15L9,15v-2h6v2zM19,7L9,7L9,5h10v2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/library_music.xml b/qqq/android/mobileapp/src/main/res/drawable/library_music.xml new file mode 100644 index 0000000..fd0e33b --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/library_music.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/av/library_music/materialicons/black/res/drawable/baseline_library_music_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,2L8,2c-1.1,0 -2,0.9 -2,2v12c0,1.1 0.9,2 2,2h12c1.1,0 2,-0.9 2,-2L22,4c0,-1.1 -0.9,-2 -2,-2zM18,7h-3v5.5c0,1.38 -1.12,2.5 -2.5,2.5S10,13.88 10,12.5s1.12,-2.5 2.5,-2.5c0.57,0 1.08,0.19 1.5,0.51L14,5h4v2zM4,6L2,6v14c0,1.1 0.9,2 2,2h14v-2L4,20L4,6z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/light.xml b/qqq/android/mobileapp/src/main/res/drawable/light.xml new file mode 100644 index 0000000..7fe9bd1 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/light.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/search/light/materialicons/black/res/drawable/baseline_light_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M13,6.06V3h-2v3.06c-4.5,0.5 -8,4.31 -8,8.93C3,16.1 3.9,17 5.01,17H8c0,2.21 1.79,4 4,4s4,-1.79 4,-4h2.99C20.1,17 21,16.1 21,14.99C21,10.37 17.5,6.56 13,6.06zM12,15H5c0,-3.86 3.14,-7 7,-7s7,3.14 7,7H12z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/light_mode.xml b/qqq/android/mobileapp/src/main/res/drawable/light_mode.xml new file mode 100644 index 0000000..3483305 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/light_mode.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/light_mode/materialicons/black/res/drawable/baseline_light_mode_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,7c-2.76,0 -5,2.24 -5,5s2.24,5 5,5s5,-2.24 5,-5S14.76,7 12,7L12,7zM2,13l2,0c0.55,0 1,-0.45 1,-1s-0.45,-1 -1,-1l-2,0c-0.55,0 -1,0.45 -1,1S1.45,13 2,13zM20,13l2,0c0.55,0 1,-0.45 1,-1s-0.45,-1 -1,-1l-2,0c-0.55,0 -1,0.45 -1,1S19.45,13 20,13zM11,2v2c0,0.55 0.45,1 1,1s1,-0.45 1,-1V2c0,-0.55 -0.45,-1 -1,-1S11,1.45 11,2zM11,20v2c0,0.55 0.45,1 1,1s1,-0.45 1,-1v-2c0,-0.55 -0.45,-1 -1,-1C11.45,19 11,19.45 11,20zM5.99,4.58c-0.39,-0.39 -1.03,-0.39 -1.41,0c-0.39,0.39 -0.39,1.03 0,1.41l1.06,1.06c0.39,0.39 1.03,0.39 1.41,0s0.39,-1.03 0,-1.41L5.99,4.58zM18.36,16.95c-0.39,-0.39 -1.03,-0.39 -1.41,0c-0.39,0.39 -0.39,1.03 0,1.41l1.06,1.06c0.39,0.39 1.03,0.39 1.41,0c0.39,-0.39 0.39,-1.03 0,-1.41L18.36,16.95zM19.42,5.99c0.39,-0.39 0.39,-1.03 0,-1.41c-0.39,-0.39 -1.03,-0.39 -1.41,0l-1.06,1.06c-0.39,0.39 -0.39,1.03 0,1.41s1.03,0.39 1.41,0L19.42,5.99zM7.05,18.36c0.39,-0.39 0.39,-1.03 0,-1.41c-0.39,-0.39 -1.03,-0.39 -1.41,0l-1.06,1.06c-0.39,0.39 -0.39,1.03 0,1.41s1.03,0.39 1.41,0L7.05,18.36z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/lightbulb.xml b/qqq/android/mobileapp/src/main/res/drawable/lightbulb.xml new file mode 100644 index 0000000..5be85a3 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/lightbulb.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/lightbulb/materialicons/black/res/drawable/baseline_lightbulb_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M9,21c0,0.5 0.4,1 1,1h4c0.6,0 1,-0.5 1,-1v-1L9,20v1zM12,2C8.1,2 5,5.1 5,9c0,2.4 1.2,4.5 3,5.7L8,17c0,0.5 0.4,1 1,1h6c0.6,0 1,-0.5 1,-1v-2.3c1.8,-1.3 3,-3.4 3,-5.7 0,-3.9 -3.1,-7 -7,-7z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/lightbulb_circle.xml b/qqq/android/mobileapp/src/main/res/drawable/lightbulb_circle.xml new file mode 100644 index 0000000..0417822 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/lightbulb_circle.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/lightbulb_circle/materialicons/black/res/drawable/baseline_lightbulb_circle_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,2C6.48,2 2,6.48 2,12c0,5.52 4.48,10 10,10s10,-4.48 10,-10C22,6.48 17.52,2 12,2zM12,19c-0.83,0 -1.5,-0.67 -1.5,-1.5h3C13.5,18.33 12.83,19 12,19zM15,16.5H9V15h6V16.5zM14.97,14H9.03C7.8,13.09 7,11.64 7,10c0,-2.76 2.24,-5 5,-5s5,2.24 5,5C17,11.64 16.2,13.09 14.97,14z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/lightbulb_outline.xml b/qqq/android/mobileapp/src/main/res/drawable/lightbulb_outline.xml new file mode 100644 index 0000000..b2f1b43 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/lightbulb_outline.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/lightbulb_outline/materialicons/black/res/drawable/baseline_lightbulb_outline_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M9,21c0,0.55 0.45,1 1,1h4c0.55,0 1,-0.45 1,-1v-1H9V21zM12,2C8.14,2 5,5.14 5,9c0,2.38 1.19,4.47 3,5.74V17c0,0.55 0.45,1 1,1h6c0.55,0 1,-0.45 1,-1v-2.26c1.81,-1.27 3,-3.36 3,-5.74C19,5.14 15.86,2 12,2zM14,13.7V16h-4v-2.3C8.48,12.63 7,11.53 7,9c0,-2.76 2.24,-5 5,-5s5,2.24 5,5C17,11.49 15.49,12.65 14,13.7z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/line_axis.xml b/qqq/android/mobileapp/src/main/res/drawable/line_axis.xml new file mode 100644 index 0000000..104a9e7 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/line_axis.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/editor/line_axis/materialicons/black/res/drawable/baseline_line_axis_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M22,7.43l-1.41,-1.41l-4.03,4.53l-7.06,-6.55l-7.5,7.51l1.5,1.5l6.14,-6.15l5.59,5.18l-1.73,1.95l-4,-4l-7.5,7.51l1.5,1.5l6,-6.01l4,4l3.19,-3.59l3.9,3.61l1.41,-1.41l-3.98,-3.7z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/line_style.xml b/qqq/android/mobileapp/src/main/res/drawable/line_style.xml new file mode 100644 index 0000000..9c939b8 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/line_style.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/line_style/materialicons/black/res/drawable/baseline_line_style_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M3,16h5v-2H3V16zM9.5,16h5v-2h-5V16zM16,16h5v-2h-5V16zM3,20h2v-2H3V20zM7,20h2v-2H7V20zM11,20h2v-2h-2V20zM15,20h2v-2h-2V20zM19,20h2v-2h-2V20zM3,12h8v-2H3V12zM13,12h8v-2h-8V12zM3,4v4h18V4H3z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/line_weight.xml b/qqq/android/mobileapp/src/main/res/drawable/line_weight.xml new file mode 100644 index 0000000..53a164a --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/line_weight.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/line_weight/materialicons/black/res/drawable/baseline_line_weight_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M3,17h18v-2H3V17zM3,20h18v-1H3V20zM3,13h18v-3H3V13zM3,4v4h18V4H3z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/linear_scale.xml b/qqq/android/mobileapp/src/main/res/drawable/linear_scale.xml new file mode 100644 index 0000000..b48b1c6 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/linear_scale.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/editor/linear_scale/materialicons/black/res/drawable/baseline_linear_scale_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19.5,9.5c-1.03,0 -1.9,0.62 -2.29,1.5h-2.92C13.9,10.12 13.03,9.5 12,9.5s-1.9,0.62 -2.29,1.5H6.79C6.4,10.12 5.53,9.5 4.5,9.5C3.12,9.5 2,10.62 2,12s1.12,2.5 2.5,2.5c1.03,0 1.9,-0.62 2.29,-1.5h2.92c0.39,0.88 1.26,1.5 2.29,1.5s1.9,-0.62 2.29,-1.5h2.92c0.39,0.88 1.26,1.5 2.29,1.5c1.38,0 2.5,-1.12 2.5,-2.5S20.88,9.5 19.5,9.5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/link.xml b/qqq/android/mobileapp/src/main/res/drawable/link.xml new file mode 100644 index 0000000..8246ea8 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/link.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/content/link/materialicons/black/res/drawable/baseline_link_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M3.9,12c0,-1.71 1.39,-3.1 3.1,-3.1h4L11,7L7,7c-2.76,0 -5,2.24 -5,5s2.24,5 5,5h4v-1.9L7,15.1c-1.71,0 -3.1,-1.39 -3.1,-3.1zM8,13h8v-2L8,11v2zM17,7h-4v1.9h4c1.71,0 3.1,1.39 3.1,3.1s-1.39,3.1 -3.1,3.1h-4L13,17h4c2.76,0 5,-2.24 5,-5s-2.24,-5 -5,-5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/link_off.xml b/qqq/android/mobileapp/src/main/res/drawable/link_off.xml new file mode 100644 index 0000000..eca3c06 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/link_off.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/content/link_off/materialicons/black/res/drawable/baseline_link_off_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M17,7h-4v1.9h4c1.71,0 3.1,1.39 3.1,3.1 0,1.43 -0.98,2.63 -2.31,2.98l1.46,1.46C20.88,15.61 22,13.95 22,12c0,-2.76 -2.24,-5 -5,-5zM16,11h-2.19l2,2L16,13zM2,4.27l3.11,3.11C3.29,8.12 2,9.91 2,12c0,2.76 2.24,5 5,5h4v-1.9L7,15.1c-1.71,0 -3.1,-1.39 -3.1,-3.1 0,-1.59 1.21,-2.9 2.76,-3.07L8.73,11L8,11v2h2.73L13,15.27L13,17h1.73l4.01,4L20,19.74 3.27,3 2,4.27z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/linked_camera.xml b/qqq/android/mobileapp/src/main/res/drawable/linked_camera.xml new file mode 100644 index 0000000..c8426e1 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/linked_camera.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/linked_camera/materialicons/black/res/drawable/baseline_linked_camera_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,14m-3.2,0a3.2,3.2 0,1 1,6.4 0a3.2,3.2 0,1 1,-6.4 0" /> + <path + android:fillColor="#FF000000" + android:pathData="M16,3.33c2.58,0 4.67,2.09 4.67,4.67H22c0,-3.31 -2.69,-6 -6,-6v1.33M16,6c1.11,0 2,0.89 2,2h1.33c0,-1.84 -1.49,-3.33 -3.33,-3.33V6" /> + <path + android:fillColor="#FF000000" + android:pathData="M17,9c0,-1.11 -0.89,-2 -2,-2L15,4L9,4L7.17,6L4,6c-1.1,0 -2,0.9 -2,2v12c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2L22,9h-5zM12,19c-2.76,0 -5,-2.24 -5,-5s2.24,-5 5,-5 5,2.24 5,5 -2.24,5 -5,5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/liquor.xml b/qqq/android/mobileapp/src/main/res/drawable/liquor.xml new file mode 100644 index 0000000..e2bd09c --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/liquor.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/liquor/materialicons/black/res/drawable/baseline_liquor_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M3,14c0,1.3 0.84,2.4 2,2.82V20H3v2h6v-2H7v-3.18C8.16,16.4 9,15.3 9,14V6H3V14zM5,8h2v3H5V8z" /> + <path + android:fillColor="#FF000000" + android:pathData="M20.63,8.54l-0.95,-0.32C19.28,8.09 19,7.71 19,7.28V3c0,-0.55 -0.45,-1 -1,-1h-3c-0.55,0 -1,0.45 -1,1v4.28c0,0.43 -0.28,0.81 -0.68,0.95l-0.95,0.32C11.55,8.82 11,9.58 11,10.44V20c0,1.1 0.9,2 2,2h7c1.1,0 2,-0.9 2,-2v-9.56C22,9.58 21.45,8.82 20.63,8.54zM16,4h1v1h-1V4zM13,10.44l0.95,-0.32C15.18,9.72 16,8.57 16,7.28V7h1v0.28c0,1.29 0.82,2.44 2.05,2.85L20,10.44V12h-7V10.44zM20,20h-7v-2h7V20z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/list.xml b/qqq/android/mobileapp/src/main/res/drawable/list.xml new file mode 100644 index 0000000..7a1d636 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/list.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/list/materialicons/black/res/drawable/baseline_list_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M3,13h2v-2L3,11v2zM3,17h2v-2L3,15v2zM3,9h2L5,7L3,7v2zM7,13h14v-2L7,11v2zM7,17h14v-2L7,15v2zM7,7v2h14L21,7L7,7z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/list_alt.xml b/qqq/android/mobileapp/src/main/res/drawable/list_alt.xml new file mode 100644 index 0000000..e502db9 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/list_alt.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/communication/list_alt/materialicons/black/res/drawable/baseline_list_alt_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19,5v14L5,19L5,5h14m1.1,-2L3.9,3c-0.5,0 -0.9,0.4 -0.9,0.9v16.2c0,0.4 0.4,0.9 0.9,0.9h16.2c0.4,0 0.9,-0.5 0.9,-0.9L21,3.9c0,-0.5 -0.5,-0.9 -0.9,-0.9zM11,7h6v2h-6L11,7zM11,11h6v2h-6v-2zM11,15h6v2h-6zM7,7h2v2L7,9zM7,11h2v2L7,13zM7,15h2v2L7,17z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/live_help.xml b/qqq/android/mobileapp/src/main/res/drawable/live_help.xml new file mode 100644 index 0000000..96c3fc0 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/live_help.xml @@ -0,0 +1,20 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/communication/live_help/materialicons/black/res/drawable/baseline_live_help_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24" + android:autoMirrored="true"> + <path + android:fillColor="#FF000000" + android:pathData="M19,2L5,2c-1.11,0 -2,0.9 -2,2v14c0,1.1 0.89,2 2,2h4l3,3 3,-3h4c1.1,0 2,-0.9 2,-2L21,4c0,-1.1 -0.9,-2 -2,-2zM13,18h-2v-2h2v2zM15.07,10.25l-0.9,0.92C13.45,11.9 13,12.5 13,14h-2v-0.5c0,-1.1 0.45,-2.1 1.17,-2.83l1.24,-1.26c0.37,-0.36 0.59,-0.86 0.59,-1.41 0,-1.1 -0.9,-2 -2,-2s-2,0.9 -2,2L8,8c0,-2.21 1.79,-4 4,-4s4,1.79 4,4c0,0.88 -0.36,1.68 -0.93,2.25z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/live_tv.xml b/qqq/android/mobileapp/src/main/res/drawable/live_tv.xml new file mode 100644 index 0000000..9826f0f --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/live_tv.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/notification/live_tv/materialicons/black/res/drawable/baseline_live_tv_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M21,6h-7.59l3.29,-3.29L16,2l-4,4 -4,-4 -0.71,0.71L10.59,6L3,6c-1.1,0 -2,0.89 -2,2v12c0,1.1 0.9,2 2,2h18c1.1,0 2,-0.9 2,-2L23,8c0,-1.11 -0.9,-2 -2,-2zM21,20L3,20L3,8h18v12zM9,10v8l7,-4z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/living.xml b/qqq/android/mobileapp/src/main/res/drawable/living.xml new file mode 100644 index 0000000..43f9954 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/living.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/search/living/materialicons/black/res/drawable/baseline_living_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M16.5,11.5c-0.55,0 -1,0.45 -1,1v2h-7v-2c0,-0.55 -0.45,-1 -1,-1s-1,0.45 -1,1V16c0,0.28 0.22,0.5 0.5,0.5h10c0.28,0 0.5,-0.22 0.5,-0.5v-3.5C17.5,11.95 17.05,11.5 16.5,11.5z" /> + <path + android:fillColor="#FF000000" + android:pathData="M10,12.5V13h4v-0.5c0,-1.3 0.99,-2.35 2.25,-2.47V9c0,-0.83 -0.67,-1.5 -1.5,-1.5h-5.5c-0.83,0 -1.5,0.67 -1.5,1.5v1.03C9.01,10.15 10,11.2 10,12.5z" /> + <path + android:fillColor="#FF000000" + android:pathData="M20,2H4C2.9,2 2,2.9 2,4v16c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2V4C22,2.9 21.1,2 20,2zM19,16c0,1.1 -0.9,2 -2,2H7c-1.1,0 -2,-0.9 -2,-2v-3.5c0,-0.92 0.51,-1.72 1.25,-2.15V9c0,-1.66 1.34,-3 3,-3h5.5c1.66,0 3,1.34 3,3v1.35C18.49,10.78 19,11.58 19,12.5V16z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/loading_img.xml b/qqq/android/mobileapp/src/main/res/drawable/loading_img.xml new file mode 100644 index 0000000..3802cdf --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/loading_img.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/hourglass_empty/materialicons/black/res/drawable/baseline_hourglass_empty_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M6,2v6h0.01L6,8.01 10,12l-4,4 0.01,0.01L6,16.01L6,22h12v-5.99h-0.01L18,16l-4,-4 4,-3.99 -0.01,-0.01L18,8L18,2L6,2zM16,16.5L16,20L8,20v-3.5l4,-4 4,4zM12,11.5l-4,-4L8,4h8v3.5l-4,4z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/local_activity.xml b/qqq/android/mobileapp/src/main/res/drawable/local_activity.xml new file mode 100644 index 0000000..e2e83b4 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/local_activity.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/local_activity/materialicons/black/res/drawable/baseline_local_activity_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,12c0,-1.1 0.9,-2 2,-2L22,6c0,-1.1 -0.9,-2 -2,-2L4,4c-1.1,0 -1.99,0.9 -1.99,2v4c1.1,0 1.99,0.9 1.99,2s-0.89,2 -2,2v4c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2v-4c-1.1,0 -2,-0.9 -2,-2zM15.58,16.8L12,14.5l-3.58,2.3 1.08,-4.12 -3.29,-2.69 4.24,-0.25L12,5.8l1.54,3.95 4.24,0.25 -3.29,2.69 1.09,4.11z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/local_airport.xml b/qqq/android/mobileapp/src/main/res/drawable/local_airport.xml new file mode 100644 index 0000000..ee4cd54 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/local_airport.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/local_airport/materialicons/black/res/drawable/baseline_local_airport_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M22,16v-2l-8.5,-5V3.5C13.5,2.67 12.83,2 12,2s-1.5,0.67 -1.5,1.5V9L2,14v2l8.5,-2.5V19L8,20.5L8,22l4,-1l4,1l0,-1.5L13.5,19v-5.5L22,16z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/local_atm.xml b/qqq/android/mobileapp/src/main/res/drawable/local_atm.xml new file mode 100644 index 0000000..401cccf --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/local_atm.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/local_atm/materialicons/black/res/drawable/baseline_local_atm_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M11,17h2v-1h1c0.55,0 1,-0.45 1,-1v-3c0,-0.55 -0.45,-1 -1,-1h-3v-1h4L15,8h-2L13,7h-2v1h-1c-0.55,0 -1,0.45 -1,1v3c0,0.55 0.45,1 1,1h3v1L9,14v2h2v1zM20,4L4,4c-1.11,0 -1.99,0.89 -1.99,2L2,18c0,1.11 0.89,2 2,2h16c1.11,0 2,-0.89 2,-2L22,6c0,-1.11 -0.89,-2 -2,-2zM20,18L4,18L4,6h16v12z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/local_bar.xml b/qqq/android/mobileapp/src/main/res/drawable/local_bar.xml new file mode 100644 index 0000000..5a0b04a --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/local_bar.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/local_bar/materialicons/black/res/drawable/baseline_local_bar_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M21,5V3H3v2l8,9v5H6v2h12v-2h-5v-5l8,-9zM7.43,7L5.66,5h12.69l-1.78,2H7.43z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/local_cafe.xml b/qqq/android/mobileapp/src/main/res/drawable/local_cafe.xml new file mode 100644 index 0000000..774b015 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/local_cafe.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/local_cafe/materialicons/black/res/drawable/baseline_local_cafe_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,3L4,3v10c0,2.21 1.79,4 4,4h6c2.21,0 4,-1.79 4,-4v-3h2c1.11,0 2,-0.9 2,-2L22,5c0,-1.11 -0.89,-2 -2,-2zM20,8h-2L18,5h2v3zM4,19h16v2L4,21z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/local_car_wash.xml b/qqq/android/mobileapp/src/main/res/drawable/local_car_wash.xml new file mode 100644 index 0000000..75fea3b --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/local_car_wash.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/local_car_wash/materialicons/black/res/drawable/baseline_local_car_wash_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M17,5c0.83,0 1.5,-0.67 1.5,-1.5 0,-1 -1.5,-2.7 -1.5,-2.7s-1.5,1.7 -1.5,2.7c0,0.83 0.67,1.5 1.5,1.5zM12,5c0.83,0 1.5,-0.67 1.5,-1.5 0,-1 -1.5,-2.7 -1.5,-2.7s-1.5,1.7 -1.5,2.7c0,0.83 0.67,1.5 1.5,1.5zM7,5c0.83,0 1.5,-0.67 1.5,-1.5C8.5,2.5 7,0.8 7,0.8S5.5,2.5 5.5,3.5C5.5,4.33 6.17,5 7,5zM18.92,8.01C18.72,7.42 18.16,7 17.5,7h-11c-0.66,0 -1.21,0.42 -1.42,1.01L3,14v8c0,0.55 0.45,1 1,1h1c0.55,0 1,-0.45 1,-1v-1h12v1c0,0.55 0.45,1 1,1h1c0.55,0 1,-0.45 1,-1v-8l-2.08,-5.99zM6.5,18c-0.83,0 -1.5,-0.67 -1.5,-1.5S5.67,15 6.5,15s1.5,0.67 1.5,1.5S7.33,18 6.5,18zM17.5,18c-0.83,0 -1.5,-0.67 -1.5,-1.5s0.67,-1.5 1.5,-1.5 1.5,0.67 1.5,1.5 -0.67,1.5 -1.5,1.5zM5,13l1.5,-4.5h11L19,13L5,13z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/local_convenience_store.xml b/qqq/android/mobileapp/src/main/res/drawable/local_convenience_store.xml new file mode 100644 index 0000000..d0f3422 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/local_convenience_store.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/local_convenience_store/materialicons/black/res/drawable/baseline_local_convenience_store_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19,7L19,4L5,4v3L2,7v13h8v-4h4v4h8L22,7h-3zM11,10L9,10v1h2v1L8,12L8,9h2L10,8L8,8L8,7h3v3zM16,12h-1v-2h-2L13,7h1v2h1L15,7h1v5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/local_dining.xml b/qqq/android/mobileapp/src/main/res/drawable/local_dining.xml new file mode 100644 index 0000000..774e4b9 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/local_dining.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/local_dining/materialicons/black/res/drawable/baseline_local_dining_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M8.1,13.34l2.83,-2.83L3.91,3.5c-1.56,1.56 -1.56,4.09 0,5.66l4.19,4.18zM14.88,11.53c1.53,0.71 3.68,0.21 5.27,-1.38 1.91,-1.91 2.28,-4.65 0.81,-6.12 -1.46,-1.46 -4.2,-1.1 -6.12,0.81 -1.59,1.59 -2.09,3.74 -1.38,5.27L3.7,19.87l1.41,1.41L12,14.41l6.88,6.88 1.41,-1.41L13.41,13l1.47,-1.47z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/local_drink.xml b/qqq/android/mobileapp/src/main/res/drawable/local_drink.xml new file mode 100644 index 0000000..0ecd027 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/local_drink.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/local_drink/materialicons/black/res/drawable/baseline_local_drink_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M3,2l2.01,18.23C5.13,21.23 5.97,22 7,22h10c1.03,0 1.87,-0.77 1.99,-1.77L21,2L3,2zM12,19c-1.66,0 -3,-1.34 -3,-3 0,-2 3,-5.4 3,-5.4s3,3.4 3,5.4c0,1.66 -1.34,3 -3,3zM18.33,8L5.67,8l-0.44,-4h13.53l-0.43,4z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/local_fire_department.xml b/qqq/android/mobileapp/src/main/res/drawable/local_fire_department.xml new file mode 100644 index 0000000..322fac7 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/local_fire_department.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/local_fire_department/materialicons/black/res/drawable/baseline_local_fire_department_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,12.9l-2.13,2.09C9.31,15.55 9,16.28 9,17.06C9,18.68 10.35,20 12,20s3,-1.32 3,-2.94c0,-0.78 -0.31,-1.52 -0.87,-2.07L12,12.9z" /> + <path + android:fillColor="#FF000000" + android:pathData="M16,6l-0.44,0.55C14.38,8.02 12,7.19 12,5.3V2c0,0 -8,4 -8,11c0,2.92 1.56,5.47 3.89,6.86C7.33,19.07 7,18.1 7,17.06c0,-1.32 0.52,-2.56 1.47,-3.5L12,10.1l3.53,3.47c0.95,0.93 1.47,2.17 1.47,3.5c0,1.02 -0.31,1.96 -0.85,2.75c1.89,-1.15 3.29,-3.06 3.71,-5.3C20.52,10.97 18.79,7.62 16,6z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/local_florist.xml b/qqq/android/mobileapp/src/main/res/drawable/local_florist.xml new file mode 100644 index 0000000..ffc2b54 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/local_florist.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/local_florist/materialicons/black/res/drawable/baseline_local_florist_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,22c4.97,0 9,-4.03 9,-9 -4.97,0 -9,4.03 -9,9zM5.6,10.25c0,1.38 1.12,2.5 2.5,2.5 0.53,0 1.01,-0.16 1.42,-0.44l-0.02,0.19c0,1.38 1.12,2.5 2.5,2.5s2.5,-1.12 2.5,-2.5l-0.02,-0.19c0.4,0.28 0.89,0.44 1.42,0.44 1.38,0 2.5,-1.12 2.5,-2.5 0,-1 -0.59,-1.85 -1.43,-2.25 0.84,-0.4 1.43,-1.25 1.43,-2.25 0,-1.38 -1.12,-2.5 -2.5,-2.5 -0.53,0 -1.01,0.16 -1.42,0.44l0.02,-0.19C14.5,2.12 13.38,1 12,1S9.5,2.12 9.5,3.5l0.02,0.19c-0.4,-0.28 -0.89,-0.44 -1.42,-0.44 -1.38,0 -2.5,1.12 -2.5,2.5 0,1 0.59,1.85 1.43,2.25 -0.84,0.4 -1.43,1.25 -1.43,2.25zM12,5.5c1.38,0 2.5,1.12 2.5,2.5s-1.12,2.5 -2.5,2.5S9.5,9.38 9.5,8s1.12,-2.5 2.5,-2.5zM3,13c0,4.97 4.03,9 9,9 0,-4.97 -4.03,-9 -9,-9z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/local_gas_station.xml b/qqq/android/mobileapp/src/main/res/drawable/local_gas_station.xml new file mode 100644 index 0000000..f9bba46 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/local_gas_station.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/local_gas_station/materialicons/black/res/drawable/baseline_local_gas_station_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19.77,7.23l0.01,-0.01 -3.72,-3.72L15,4.56l2.11,2.11c-0.94,0.36 -1.61,1.26 -1.61,2.33 0,1.38 1.12,2.5 2.5,2.5 0.36,0 0.69,-0.08 1,-0.21v7.21c0,0.55 -0.45,1 -1,1s-1,-0.45 -1,-1L17,14c0,-1.1 -0.9,-2 -2,-2h-1L14,5c0,-1.1 -0.9,-2 -2,-2L6,3c-1.1,0 -2,0.9 -2,2v16h10v-7.5h1.5v5c0,1.38 1.12,2.5 2.5,2.5s2.5,-1.12 2.5,-2.5L20.5,9c0,-0.69 -0.28,-1.32 -0.73,-1.77zM12,10L6,10L6,5h6v5zM18,10c-0.55,0 -1,-0.45 -1,-1s0.45,-1 1,-1 1,0.45 1,1 -0.45,1 -1,1z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/local_grocery_store.xml b/qqq/android/mobileapp/src/main/res/drawable/local_grocery_store.xml new file mode 100644 index 0000000..60943b7 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/local_grocery_store.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/local_grocery_store/materialicons/black/res/drawable/baseline_local_grocery_store_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M7,18c-1.1,0 -1.99,0.9 -1.99,2S5.9,22 7,22s2,-0.9 2,-2 -0.9,-2 -2,-2zM1,2v2h2l3.6,7.59 -1.35,2.45c-0.16,0.28 -0.25,0.61 -0.25,0.96 0,1.1 0.9,2 2,2h12v-2L7.42,15c-0.14,0 -0.25,-0.11 -0.25,-0.25l0.03,-0.12 0.9,-1.63h7.45c0.75,0 1.41,-0.41 1.75,-1.03l3.58,-6.49c0.08,-0.14 0.12,-0.31 0.12,-0.48 0,-0.55 -0.45,-1 -1,-1L5.21,4l-0.94,-2L1,2zM17,18c-1.1,0 -1.99,0.9 -1.99,2s0.89,2 1.99,2 2,-0.9 2,-2 -0.9,-2 -2,-2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/local_hospital.xml b/qqq/android/mobileapp/src/main/res/drawable/local_hospital.xml new file mode 100644 index 0000000..d0307a3 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/local_hospital.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/local_hospital/materialicons/black/res/drawable/baseline_local_hospital_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19,3L5,3c-1.1,0 -1.99,0.9 -1.99,2L3,19c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2L21,5c0,-1.1 -0.9,-2 -2,-2zM18,14h-4v4h-4v-4L6,14v-4h4L10,6h4v4h4v4z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/local_hotel.xml b/qqq/android/mobileapp/src/main/res/drawable/local_hotel.xml new file mode 100644 index 0000000..9662ce3 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/local_hotel.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/local_hotel/materialicons/black/res/drawable/baseline_local_hotel_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M7,13c1.66,0 3,-1.34 3,-3S8.66,7 7,7s-3,1.34 -3,3 1.34,3 3,3zM19,7h-8v7L3,14L3,5L1,5v15h2v-3h18v3h2v-9c0,-2.21 -1.79,-4 -4,-4z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/local_laundry_service.xml b/qqq/android/mobileapp/src/main/res/drawable/local_laundry_service.xml new file mode 100644 index 0000000..7f484c5 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/local_laundry_service.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/local_laundry_service/materialicons/black/res/drawable/baseline_local_laundry_service_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M9.17,16.83c1.56,1.56 4.1,1.56 5.66,0 1.56,-1.56 1.56,-4.1 0,-5.66l-5.66,5.66zM18,2.01L6,2c-1.11,0 -2,0.89 -2,2v16c0,1.11 0.89,2 2,2h12c1.11,0 2,-0.89 2,-2L20,4c0,-1.11 -0.89,-1.99 -2,-1.99zM10,4c0.55,0 1,0.45 1,1s-0.45,1 -1,1 -1,-0.45 -1,-1 0.45,-1 1,-1zM7,4c0.55,0 1,0.45 1,1s-0.45,1 -1,1 -1,-0.45 -1,-1 0.45,-1 1,-1zM12,20c-3.31,0 -6,-2.69 -6,-6s2.69,-6 6,-6 6,2.69 6,6 -2.69,6 -6,6z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/local_library.xml b/qqq/android/mobileapp/src/main/res/drawable/local_library.xml new file mode 100644 index 0000000..327247d --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/local_library.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/local_library/materialicons/black/res/drawable/baseline_local_library_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,11.55C9.64,9.35 6.48,8 3,8v11c3.48,0 6.64,1.35 9,3.55 2.36,-2.19 5.52,-3.55 9,-3.55V8c-3.48,0 -6.64,1.35 -9,3.55zM12,8c1.66,0 3,-1.34 3,-3s-1.34,-3 -3,-3 -3,1.34 -3,3 1.34,3 3,3z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/local_mall.xml b/qqq/android/mobileapp/src/main/res/drawable/local_mall.xml new file mode 100644 index 0000000..8856c46 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/local_mall.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/local_mall/materialicons/black/res/drawable/baseline_local_mall_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19,6h-2c0,-2.76 -2.24,-5 -5,-5S7,3.24 7,6L5,6c-1.1,0 -1.99,0.9 -1.99,2L3,20c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2L21,8c0,-1.1 -0.9,-2 -2,-2zM12,3c1.66,0 3,1.34 3,3L9,6c0,-1.66 1.34,-3 3,-3zM12,13c-2.76,0 -5,-2.24 -5,-5h2c0,1.66 1.34,3 3,3s3,-1.34 3,-3h2c0,2.76 -2.24,5 -5,5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/local_movies.xml b/qqq/android/mobileapp/src/main/res/drawable/local_movies.xml new file mode 100644 index 0000000..dd308dd --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/local_movies.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/local_movies/materialicons/black/res/drawable/baseline_local_movies_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M18,3v2h-2L16,3L8,3v2L6,5L6,3L4,3v18h2v-2h2v2h8v-2h2v2h2L20,3h-2zM8,17L6,17v-2h2v2zM8,13L6,13v-2h2v2zM8,9L6,9L6,7h2v2zM18,17h-2v-2h2v2zM18,13h-2v-2h2v2zM18,9h-2L16,7h2v2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/local_offer.xml b/qqq/android/mobileapp/src/main/res/drawable/local_offer.xml new file mode 100644 index 0000000..d74e1d6 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/local_offer.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/local_offer/materialicons/black/res/drawable/baseline_local_offer_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M21.41,11.58l-9,-9C12.05,2.22 11.55,2 11,2H4c-1.1,0 -2,0.9 -2,2v7c0,0.55 0.22,1.05 0.59,1.42l9,9c0.36,0.36 0.86,0.58 1.41,0.58 0.55,0 1.05,-0.22 1.41,-0.59l7,-7c0.37,-0.36 0.59,-0.86 0.59,-1.41 0,-0.55 -0.23,-1.06 -0.59,-1.42zM5.5,7C4.67,7 4,6.33 4,5.5S4.67,4 5.5,4 7,4.67 7,5.5 6.33,7 5.5,7z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/local_parking.xml b/qqq/android/mobileapp/src/main/res/drawable/local_parking.xml new file mode 100644 index 0000000..165442f --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/local_parking.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/local_parking/materialicons/black/res/drawable/baseline_local_parking_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M13,3L6,3v18h4v-6h3c3.31,0 6,-2.69 6,-6s-2.69,-6 -6,-6zM13.2,11L10,11L10,7h3.2c1.1,0 2,0.9 2,2s-0.9,2 -2,2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/local_pharmacy.xml b/qqq/android/mobileapp/src/main/res/drawable/local_pharmacy.xml new file mode 100644 index 0000000..ac257f3 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/local_pharmacy.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/local_pharmacy/materialicons/black/res/drawable/baseline_local_pharmacy_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M21,5h-2.64l1.14,-3.14L17.15,1l-1.46,4L3,5v2l2,6 -2,6v2h18v-2l-2,-6 2,-6L21,5zM16,14h-3v3h-2v-3L8,14v-2h3L11,9h2v3h3v2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/local_phone.xml b/qqq/android/mobileapp/src/main/res/drawable/local_phone.xml new file mode 100644 index 0000000..0468ff2 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/local_phone.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/local_phone/materialicons/black/res/drawable/baseline_local_phone_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M6.62,10.79c1.44,2.83 3.76,5.14 6.59,6.59l2.2,-2.2c0.27,-0.27 0.67,-0.36 1.02,-0.24 1.12,0.37 2.33,0.57 3.57,0.57 0.55,0 1,0.45 1,1V20c0,0.55 -0.45,1 -1,1 -9.39,0 -17,-7.61 -17,-17 0,-0.55 0.45,-1 1,-1h3.5c0.55,0 1,0.45 1,1 0,1.25 0.2,2.45 0.57,3.57 0.11,0.35 0.03,0.74 -0.25,1.02l-2.2,2.2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/local_pizza.xml b/qqq/android/mobileapp/src/main/res/drawable/local_pizza.xml new file mode 100644 index 0000000..5b0db65 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/local_pizza.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/local_pizza/materialicons/black/res/drawable/baseline_local_pizza_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,2C8.43,2 5.23,3.54 3.01,6L12,22l8.99,-16C18.78,3.55 15.57,2 12,2zM7,7c0,-1.1 0.9,-2 2,-2s2,0.9 2,2 -0.9,2 -2,2 -2,-0.9 -2,-2zM12,15c-1.1,0 -2,-0.9 -2,-2s0.9,-2 2,-2 2,0.9 2,2 -0.9,2 -2,2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/local_play.xml b/qqq/android/mobileapp/src/main/res/drawable/local_play.xml new file mode 100644 index 0000000..852d354 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/local_play.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/local_play/materialicons/black/res/drawable/baseline_local_play_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,12c0,-1.1 0.9,-2 2,-2L22,6c0,-1.1 -0.9,-2 -2,-2L4,4c-1.1,0 -1.99,0.9 -1.99,2v4c1.1,0 1.99,0.9 1.99,2s-0.89,2 -2,2v4c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2v-4c-1.1,0 -2,-0.9 -2,-2zM15.58,16.8L12,14.5l-3.58,2.3 1.08,-4.12 -3.29,-2.69 4.24,-0.25L12,5.8l1.54,3.95 4.24,0.25 -3.29,2.69 1.09,4.11z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/local_police.xml b/qqq/android/mobileapp/src/main/res/drawable/local_police.xml new file mode 100644 index 0000000..1d9dafd --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/local_police.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/local_police/materialicons/black/res/drawable/baseline_local_police_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,1L3,5v6c0,5.55 3.84,10.74 9,12c5.16,-1.26 9,-6.45 9,-12V5L12,1zM14.5,12.59l0.9,3.88L12,14.42l-3.4,2.05l0.9,-3.87l-3,-2.59l3.96,-0.34L12,6.02l1.54,3.64L17.5,10L14.5,12.59z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/local_post_office.xml b/qqq/android/mobileapp/src/main/res/drawable/local_post_office.xml new file mode 100644 index 0000000..57bbe4e --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/local_post_office.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/local_post_office/materialicons/black/res/drawable/baseline_local_post_office_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,4L4,4c-1.1,0 -1.99,0.9 -1.99,2L2,18c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2L22,6c0,-1.1 -0.9,-2 -2,-2zM20,8l-8,5 -8,-5L4,6l8,5 8,-5v2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/local_printshop.xml b/qqq/android/mobileapp/src/main/res/drawable/local_printshop.xml new file mode 100644 index 0000000..ab2d3e2 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/local_printshop.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/local_printshop/materialicons/black/res/drawable/baseline_local_printshop_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19,8L5,8c-1.66,0 -3,1.34 -3,3v6h4v4h12v-4h4v-6c0,-1.66 -1.34,-3 -3,-3zM16,19L8,19v-5h8v5zM19,12c-0.55,0 -1,-0.45 -1,-1s0.45,-1 1,-1 1,0.45 1,1 -0.45,1 -1,1zM18,3L6,3v4h12L18,3z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/local_see.xml b/qqq/android/mobileapp/src/main/res/drawable/local_see.xml new file mode 100644 index 0000000..f57f0d1 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/local_see.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/local_see/materialicons/black/res/drawable/baseline_local_see_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,12m-3.2,0a3.2,3.2 0,1 1,6.4 0a3.2,3.2 0,1 1,-6.4 0" /> + <path + android:fillColor="#FF000000" + android:pathData="M9,2L7.17,4L4,4c-1.1,0 -2,0.9 -2,2v12c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2L22,6c0,-1.1 -0.9,-2 -2,-2h-3.17L15,2L9,2zM12,17c-2.76,0 -5,-2.24 -5,-5s2.24,-5 5,-5 5,2.24 5,5 -2.24,5 -5,5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/local_shipping.xml b/qqq/android/mobileapp/src/main/res/drawable/local_shipping.xml new file mode 100644 index 0000000..bdb0e35 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/local_shipping.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/local_shipping/materialicons/black/res/drawable/baseline_local_shipping_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,8h-3L17,4L3,4c-1.1,0 -2,0.9 -2,2v11h2c0,1.66 1.34,3 3,3s3,-1.34 3,-3h6c0,1.66 1.34,3 3,3s3,-1.34 3,-3h2v-5l-3,-4zM6,18.5c-0.83,0 -1.5,-0.67 -1.5,-1.5s0.67,-1.5 1.5,-1.5 1.5,0.67 1.5,1.5 -0.67,1.5 -1.5,1.5zM19.5,9.5l1.96,2.5L17,12L17,9.5h2.5zM18,18.5c-0.83,0 -1.5,-0.67 -1.5,-1.5s0.67,-1.5 1.5,-1.5 1.5,0.67 1.5,1.5 -0.67,1.5 -1.5,1.5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/local_taxi.xml b/qqq/android/mobileapp/src/main/res/drawable/local_taxi.xml new file mode 100644 index 0000000..044e9ec --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/local_taxi.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/local_taxi/materialicons/black/res/drawable/baseline_local_taxi_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M18.92,6.01C18.72,5.42 18.16,5 17.5,5L15,5L15,3L9,3v2L6.5,5c-0.66,0 -1.21,0.42 -1.42,1.01L3,12v8c0,0.55 0.45,1 1,1h1c0.55,0 1,-0.45 1,-1v-1h12v1c0,0.55 0.45,1 1,1h1c0.55,0 1,-0.45 1,-1v-8l-2.08,-5.99zM6.5,16c-0.83,0 -1.5,-0.67 -1.5,-1.5S5.67,13 6.5,13s1.5,0.67 1.5,1.5S7.33,16 6.5,16zM17.5,16c-0.83,0 -1.5,-0.67 -1.5,-1.5s0.67,-1.5 1.5,-1.5 1.5,0.67 1.5,1.5 -0.67,1.5 -1.5,1.5zM5,11l1.5,-4.5h11L19,11L5,11z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/location_city.xml b/qqq/android/mobileapp/src/main/res/drawable/location_city.xml new file mode 100644 index 0000000..0c35afa --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/location_city.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/location_city/materialicons/black/res/drawable/baseline_location_city_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M15,11L15,5l-3,-3 -3,3v2L3,7v14h18L21,11h-6zM7,19L5,19v-2h2v2zM7,15L5,15v-2h2v2zM7,11L5,11L5,9h2v2zM13,19h-2v-2h2v2zM13,15h-2v-2h2v2zM13,11h-2L11,9h2v2zM13,7h-2L11,5h2v2zM19,19h-2v-2h2v2zM19,15h-2v-2h2v2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/location_disabled.xml b/qqq/android/mobileapp/src/main/res/drawable/location_disabled.xml new file mode 100644 index 0000000..f7a7aca --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/location_disabled.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/location_disabled/materialicons/black/res/drawable/baseline_location_disabled_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20.94,11c-0.46,-4.17 -3.77,-7.48 -7.94,-7.94L13,1h-2v2.06c-1.13,0.12 -2.19,0.46 -3.16,0.97l1.5,1.5C10.16,5.19 11.06,5 12,5c3.87,0 7,3.13 7,7 0,0.94 -0.19,1.84 -0.52,2.65l1.5,1.5c0.5,-0.96 0.84,-2.02 0.97,-3.15L23,13v-2h-2.06zM3,4.27l2.04,2.04C3.97,7.62 3.25,9.23 3.06,11L1,11v2h2.06c0.46,4.17 3.77,7.48 7.94,7.94L11,23h2v-2.06c1.77,-0.2 3.38,-0.91 4.69,-1.98L19.73,21 21,19.73 4.27,3 3,4.27zM16.27,17.54C15.09,18.45 13.61,19 12,19c-3.87,0 -7,-3.13 -7,-7 0,-1.61 0.55,-3.09 1.46,-4.27l9.81,9.81z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/location_off.xml b/qqq/android/mobileapp/src/main/res/drawable/location_off.xml new file mode 100644 index 0000000..067df68 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/location_off.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/communication/location_off/materialicons/black/res/drawable/baseline_location_off_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,6.5c1.38,0 2.5,1.12 2.5,2.5 0,0.74 -0.33,1.39 -0.83,1.85l3.63,3.63c0.98,-1.86 1.7,-3.8 1.7,-5.48 0,-3.87 -3.13,-7 -7,-7 -1.98,0 -3.76,0.83 -5.04,2.15l3.19,3.19c0.46,-0.52 1.11,-0.84 1.85,-0.84zM16.37,16.1l-4.63,-4.63 -0.11,-0.11L3.27,3 2,4.27l3.18,3.18C5.07,7.95 5,8.47 5,9c0,5.25 7,13 7,13s1.67,-1.85 3.38,-4.35L18.73,21 20,19.73l-3.63,-3.63z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/location_on.xml b/qqq/android/mobileapp/src/main/res/drawable/location_on.xml new file mode 100644 index 0000000..6307e78 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/location_on.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/communication/location_on/materialicons/black/res/drawable/baseline_location_on_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,2C8.13,2 5,5.13 5,9c0,5.25 7,13 7,13s7,-7.75 7,-13c0,-3.87 -3.13,-7 -7,-7zM12,11.5c-1.38,0 -2.5,-1.12 -2.5,-2.5s1.12,-2.5 2.5,-2.5 2.5,1.12 2.5,2.5 -1.12,2.5 -2.5,2.5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/location_pin.xml b/qqq/android/mobileapp/src/main/res/drawable/location_pin.xml new file mode 100644 index 0000000..814911f --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/location_pin.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/location_pin/materialicons/black/res/drawable/baseline_location_pin_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,2L12,2C8.13,2 5,5.13 5,9c0,1.74 0.5,3.37 1.41,4.84c0.95,1.54 2.2,2.86 3.16,4.4c0.47,0.75 0.81,1.45 1.17,2.26C11,21.05 11.21,22 12,22h0c0.79,0 1,-0.95 1.25,-1.5c0.37,-0.81 0.7,-1.51 1.17,-2.26c0.96,-1.53 2.21,-2.85 3.16,-4.4C18.5,12.37 19,10.74 19,9C19,5.13 15.87,2 12,2zM12,11.75c-1.38,0 -2.5,-1.12 -2.5,-2.5s1.12,-2.5 2.5,-2.5s2.5,1.12 2.5,2.5S13.38,11.75 12,11.75z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/location_searching.xml b/qqq/android/mobileapp/src/main/res/drawable/location_searching.xml new file mode 100644 index 0000000..38b89d5 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/location_searching.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/location_searching/materialicons/black/res/drawable/baseline_location_searching_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20.94,11c-0.46,-4.17 -3.77,-7.48 -7.94,-7.94V1h-2v2.06C6.83,3.52 3.52,6.83 3.06,11H1v2h2.06c0.46,4.17 3.77,7.48 7.94,7.94V23h2v-2.06c4.17,-0.46 7.48,-3.77 7.94,-7.94H23v-2h-2.06zM12,19c-3.87,0 -7,-3.13 -7,-7s3.13,-7 7,-7 7,3.13 7,7 -3.13,7 -7,7z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/lock.xml b/qqq/android/mobileapp/src/main/res/drawable/lock.xml new file mode 100644 index 0000000..68c8160 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/lock.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/lock/materialicons/black/res/drawable/baseline_lock_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M18,8h-1L17,6c0,-2.76 -2.24,-5 -5,-5S7,3.24 7,6v2L6,8c-1.1,0 -2,0.9 -2,2v10c0,1.1 0.9,2 2,2h12c1.1,0 2,-0.9 2,-2L20,10c0,-1.1 -0.9,-2 -2,-2zM12,17c-1.1,0 -2,-0.9 -2,-2s0.9,-2 2,-2 2,0.9 2,2 -0.9,2 -2,2zM15.1,8L8.9,8L8.9,6c0,-1.71 1.39,-3.1 3.1,-3.1 1.71,0 3.1,1.39 3.1,3.1v2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/lock_clock.xml b/qqq/android/mobileapp/src/main/res/drawable/lock_clock.xml new file mode 100644 index 0000000..4079c81 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/lock_clock.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/lock_clock/materialicons/black/res/drawable/baseline_lock_clock_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M14.5,14.2l2.9,1.7 -0.8,1.3L13,15v-5h1.5v4.2zM22,14c0,4.41 -3.59,8 -8,8 -2.02,0 -3.86,-0.76 -5.27,-2L4,20c-1.15,0 -2,-0.85 -2,-2L2,9c0,-1.12 0.89,-1.96 2,-2v-0.5C4,4.01 6.01,2 8.5,2c2.34,0 4.24,1.79 4.46,4.08 0.34,-0.05 0.69,-0.08 1.04,-0.08 4.41,0 8,3.59 8,8zM6,7h5v-0.74C10.88,4.99 9.8,4 8.5,4 7.12,4 6,5.12 6,6.5L6,7zM20,14c0,-3.31 -2.69,-6 -6,-6s-6,2.69 -6,6 2.69,6 6,6 6,-2.69 6,-6z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/lock_open.xml b/qqq/android/mobileapp/src/main/res/drawable/lock_open.xml new file mode 100644 index 0000000..2d37469 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/lock_open.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/lock_open/materialicons/black/res/drawable/baseline_lock_open_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,17c1.1,0 2,-0.9 2,-2s-0.9,-2 -2,-2 -2,0.9 -2,2 0.9,2 2,2zM18,8h-1L17,6c0,-2.76 -2.24,-5 -5,-5S7,3.24 7,6h1.9c0,-1.71 1.39,-3.1 3.1,-3.1 1.71,0 3.1,1.39 3.1,3.1v2L6,8c-1.1,0 -2,0.9 -2,2v10c0,1.1 0.9,2 2,2h12c1.1,0 2,-0.9 2,-2L20,10c0,-1.1 -0.9,-2 -2,-2zM18,20L6,20L6,10h12v10z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/lock_outline.xml b/qqq/android/mobileapp/src/main/res/drawable/lock_outline.xml new file mode 100644 index 0000000..19bfdcf --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/lock_outline.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/lock_outline/materialicons/black/res/drawable/baseline_lock_outline_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,17c1.1,0 2,-0.9 2,-2s-0.9,-2 -2,-2s-2,0.9 -2,2S10.9,17 12,17zM18,8h-1V6c0,-2.76 -2.24,-5 -5,-5S7,3.24 7,6v2H6c-1.1,0 -2,0.9 -2,2v10c0,1.1 0.9,2 2,2h12c1.1,0 2,-0.9 2,-2V10C20,8.9 19.1,8 18,8zM8.9,6c0,-1.71 1.39,-3.1 3.1,-3.1s3.1,1.39 3.1,3.1v2H8.9V6zM18,20H6V10h12V20z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/lock_person.xml b/qqq/android/mobileapp/src/main/res/drawable/lock_person.xml new file mode 100644 index 0000000..fff5922 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/lock_person.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/lock_person/materialicons/black/res/drawable/baseline_lock_person_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M18,11c0.7,0 1.37,0.1 2,0.29V10c0,-1.1 -0.9,-2 -2,-2h-1V6c0,-2.76 -2.24,-5 -5,-5S7,3.24 7,6v2H6c-1.1,0 -2,0.9 -2,2v10c0,1.1 0.9,2 2,2h6.26C11.47,20.87 11,19.49 11,18C11,14.13 14.13,11 18,11zM8.9,6c0,-1.71 1.39,-3.1 3.1,-3.1s3.1,1.39 3.1,3.1v2H8.9V6z" /> + <path + android:fillColor="#FF000000" + android:pathData="M18,13c-2.76,0 -5,2.24 -5,5s2.24,5 5,5s5,-2.24 5,-5S20.76,13 18,13zM18,15c0.83,0 1.5,0.67 1.5,1.5S18.83,18 18,18s-1.5,-0.67 -1.5,-1.5S17.17,15 18,15zM18,21c-1.03,0 -1.94,-0.52 -2.48,-1.32C16.25,19.26 17.09,19 18,19s1.75,0.26 2.48,0.68C19.94,20.48 19.03,21 18,21z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/lock_reset.xml b/qqq/android/mobileapp/src/main/res/drawable/lock_reset.xml new file mode 100644 index 0000000..000a3c6 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/lock_reset.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/lock_reset/materialicons/black/res/drawable/baseline_lock_reset_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M13,3c-4.97,0 -9,4.03 -9,9H1l4,4l4,-4H6c0,-3.86 3.14,-7 7,-7s7,3.14 7,7s-3.14,7 -7,7c-1.9,0 -3.62,-0.76 -4.88,-1.99L6.7,18.42C8.32,20.01 10.55,21 13,21c4.97,0 9,-4.03 9,-9S17.97,3 13,3zM15,11v-1c0,-1.1 -0.9,-2 -2,-2s-2,0.9 -2,2v1c-0.55,0 -1,0.45 -1,1v3c0,0.55 0.45,1 1,1h4c0.55,0 1,-0.45 1,-1v-3C16,11.45 15.55,11 15,11zM14,11h-2v-1c0,-0.55 0.45,-1 1,-1s1,0.45 1,1V11z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/login.xml b/qqq/android/mobileapp/src/main/res/drawable/login.xml new file mode 100644 index 0000000..38adc75 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/login.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/login/materialicons/black/res/drawable/baseline_login_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M11,7L9.6,8.4l2.6,2.6H2v2h10.2l-2.6,2.6L11,17l5,-5L11,7zM20,19h-8v2h8c1.1,0 2,-0.9 2,-2V5c0,-1.1 -0.9,-2 -2,-2h-8v2h8V19z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/logo_dev.xml b/qqq/android/mobileapp/src/main/res/drawable/logo_dev.xml new file mode 100644 index 0000000..f445d81 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/logo_dev.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/logo_dev/materialicons/black/res/drawable/baseline_logo_dev_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19,3H5C3.9,3 3,3.9 3,5v14c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2V5C21,3.9 20.1,3 19,3zM7.68,14.98H6V9h1.71c1.28,0 1.71,1.03 1.71,1.71l0,2.56C9.42,13.95 9,14.98 7.68,14.98zM12.38,11.46v1.07h-1.18v1.39h1.93v1.07h-2.25c-0.4,0.01 -0.74,-0.31 -0.75,-0.71V9.75c-0.01,-0.4 0.31,-0.74 0.71,-0.75h2.28l0,1.07h-1.92v1.39H12.38zM16.88,14.23c-0.48,1.11 -1.33,0.89 -1.71,0L13.77,9h1.18l1.07,4.11L17.09,9h1.18L16.88,14.23z" /> + <path + android:fillColor="#FF000000" + android:pathData="M7.77,10.12H7.14v3.77h0.63c0.14,0 0.28,-0.05 0.42,-0.16c0.14,-0.1 0.21,-0.26 0.21,-0.47v-2.52c0,-0.21 -0.07,-0.37 -0.21,-0.47C8.05,10.17 7.91,10.12 7.77,10.12z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/logout.xml b/qqq/android/mobileapp/src/main/res/drawable/logout.xml new file mode 100644 index 0000000..f6b214c --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/logout.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/logout/materialicons/black/res/drawable/baseline_logout_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M17,7l-1.41,1.41L18.17,11H8v2h10.17l-2.58,2.58L17,17l5,-5zM4,5h8V3H4c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h8v-2H4V5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/looks.xml b/qqq/android/mobileapp/src/main/res/drawable/looks.xml new file mode 100644 index 0000000..a1daa33 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/looks.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/looks/materialicons/black/res/drawable/baseline_looks_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,10c-3.86,0 -7,3.14 -7,7h2c0,-2.76 2.24,-5 5,-5s5,2.24 5,5h2c0,-3.86 -3.14,-7 -7,-7zM12,6C5.93,6 1,10.93 1,17h2c0,-4.96 4.04,-9 9,-9s9,4.04 9,9h2c0,-6.07 -4.93,-11 -11,-11z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/looks_3.xml b/qqq/android/mobileapp/src/main/res/drawable/looks_3.xml new file mode 100644 index 0000000..8b623be --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/looks_3.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/looks_3/materialicons/black/res/drawable/baseline_looks_3_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19.01,3h-14c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2L21.01,5c0,-1.1 -0.9,-2 -2,-2zM15.01,10.5c0,0.83 -0.67,1.5 -1.5,1.5 0.83,0 1.5,0.67 1.5,1.5L15.01,15c0,1.11 -0.9,2 -2,2h-4v-2h4v-2h-2v-2h2L13.01,9h-4L9.01,7h4c1.1,0 2,0.89 2,2v1.5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/looks_4.xml b/qqq/android/mobileapp/src/main/res/drawable/looks_4.xml new file mode 100644 index 0000000..0cb45de --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/looks_4.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/looks_4/materialicons/black/res/drawable/baseline_looks_4_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19,3L5,3c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2L21,5c0,-1.1 -0.9,-2 -2,-2zM15,17h-2v-4L9,13L9,7h2v4h2L13,7h2v10z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/looks_5.xml b/qqq/android/mobileapp/src/main/res/drawable/looks_5.xml new file mode 100644 index 0000000..783a76a --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/looks_5.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/looks_5/materialicons/black/res/drawable/baseline_looks_5_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19,3L5,3c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2L21,5c0,-1.1 -0.9,-2 -2,-2zM15,9h-4v2h2c1.1,0 2,0.89 2,2v2c0,1.11 -0.9,2 -2,2L9,17v-2h4v-2L9,13L9,7h6v2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/looks_6.xml b/qqq/android/mobileapp/src/main/res/drawable/looks_6.xml new file mode 100644 index 0000000..98eb9ca --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/looks_6.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/looks_6/materialicons/black/res/drawable/baseline_looks_6_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M11,15h2v-2h-2v2zM19,3L5,3c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2L21,5c0,-1.1 -0.9,-2 -2,-2zM15,9h-4v2h2c1.1,0 2,0.89 2,2v2c0,1.11 -0.9,2 -2,2h-2c-1.1,0 -2,-0.89 -2,-2L9,9c0,-1.11 0.9,-2 2,-2h4v2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/looks_one.xml b/qqq/android/mobileapp/src/main/res/drawable/looks_one.xml new file mode 100644 index 0000000..c11f4c7 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/looks_one.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/looks_one/materialicons/black/res/drawable/baseline_looks_one_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19,3L5,3c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2L21,5c0,-1.1 -0.9,-2 -2,-2zM14,17h-2L12,9h-2L10,7h4v10z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/looks_two.xml b/qqq/android/mobileapp/src/main/res/drawable/looks_two.xml new file mode 100644 index 0000000..fac0053 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/looks_two.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/looks_two/materialicons/black/res/drawable/baseline_looks_two_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19,3L5,3c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2L21,5c0,-1.1 -0.9,-2 -2,-2zM15,11c0,1.11 -0.9,2 -2,2h-2v2h4v2L9,17v-4c0,-1.11 0.9,-2 2,-2h2L13,9L9,9L9,7h4c1.1,0 2,0.89 2,2v2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/loop.xml b/qqq/android/mobileapp/src/main/res/drawable/loop.xml new file mode 100644 index 0000000..cea0ed3 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/loop.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/av/loop/materialicons/black/res/drawable/baseline_loop_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,4L12,1L8,5l4,4L12,6c3.31,0 6,2.69 6,6 0,1.01 -0.25,1.97 -0.7,2.8l1.46,1.46C19.54,15.03 20,13.57 20,12c0,-4.42 -3.58,-8 -8,-8zM12,18c-3.31,0 -6,-2.69 -6,-6 0,-1.01 0.25,-1.97 0.7,-2.8L5.24,7.74C4.46,8.97 4,10.43 4,12c0,4.42 3.58,8 8,8v3l4,-4 -4,-4v3z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/loupe.xml b/qqq/android/mobileapp/src/main/res/drawable/loupe.xml new file mode 100644 index 0000000..c7e3be8 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/loupe.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/loupe/materialicons/black/res/drawable/baseline_loupe_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M13,7h-2v4L7,11v2h4v4h2v-4h4v-2h-4L13,7zM12,2C6.49,2 2,6.49 2,12s4.49,10 10,10h8c1.1,0 2,-0.9 2,-2v-8c0,-5.51 -4.49,-10 -10,-10zM12,20c-4.41,0 -8,-3.59 -8,-8s3.59,-8 8,-8 8,3.59 8,8 -3.59,8 -8,8z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/low_priority.xml b/qqq/android/mobileapp/src/main/res/drawable/low_priority.xml new file mode 100644 index 0000000..8e9bd2c --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/low_priority.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/content/low_priority/materialicons/black/res/drawable/baseline_low_priority_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M14,5h8v2h-8zM14,10.5h8v2h-8zM14,16h8v2h-8zM2,11.5C2,15.08 4.92,18 8.5,18L9,18v2l3,-3 -3,-3v2h-0.5C6.02,16 4,13.98 4,11.5S6.02,7 8.5,7L12,7L12,5L8.5,5C4.92,5 2,7.92 2,11.5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/loyalty.xml b/qqq/android/mobileapp/src/main/res/drawable/loyalty.xml new file mode 100644 index 0000000..e2c0072 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/loyalty.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/loyalty/materialicons/black/res/drawable/baseline_loyalty_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M21.41,11.58l-9,-9C12.05,2.22 11.55,2 11,2L4,2c-1.1,0 -2,0.9 -2,2v7c0,0.55 0.22,1.05 0.59,1.42l9,9c0.36,0.36 0.86,0.58 1.41,0.58 0.55,0 1.05,-0.22 1.41,-0.59l7,-7c0.37,-0.36 0.59,-0.86 0.59,-1.41 0,-0.55 -0.23,-1.06 -0.59,-1.42zM5.5,7C4.67,7 4,6.33 4,5.5S4.67,4 5.5,4 7,4.67 7,5.5 6.33,7 5.5,7zM17.27,15.27L13,19.54l-4.27,-4.27C8.28,14.81 8,14.19 8,13.5c0,-1.38 1.12,-2.5 2.5,-2.5 0.69,0 1.32,0.28 1.77,0.74l0.73,0.72 0.73,-0.73c0.45,-0.45 1.08,-0.73 1.77,-0.73 1.38,0 2.5,1.12 2.5,2.5 0,0.69 -0.28,1.32 -0.73,1.77z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/lte_mobiledata.xml b/qqq/android/mobileapp/src/main/res/drawable/lte_mobiledata.xml new file mode 100644 index 0000000..50624cb --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/lte_mobiledata.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/lte_mobiledata/materialicons/black/res/drawable/baseline_lte_mobiledata_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M6,14h3v2H4V8h2V14zM9,10h2v6h2v-6h2V8H9V10zM21,10V8h-5v8h5v-2h-3v-1h3v-2h-3v-1H21z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/lte_plus_mobiledata.xml b/qqq/android/mobileapp/src/main/res/drawable/lte_plus_mobiledata.xml new file mode 100644 index 0000000..b3f6647 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/lte_plus_mobiledata.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/lte_plus_mobiledata/materialicons/black/res/drawable/baseline_lte_plus_mobiledata_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M3,14h3v2H1V8h2V14zM5,10h2v6h2v-6h2V8H5V10zM12,16h5v-2h-3v-1h3v-2h-3v-1h3V8h-5V16zM24,11h-2V9h-2v2h-2v2h2v2h2v-2h2V11z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/luggage.xml b/qqq/android/mobileapp/src/main/res/drawable/luggage.xml new file mode 100644 index 0000000..ca3e873 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/luggage.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/luggage/materialicons/black/res/drawable/baseline_luggage_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M17,6h-2V3c0,-0.55 -0.45,-1 -1,-1h-4C9.45,2 9,2.45 9,3v3H7C5.9,6 5,6.9 5,8v11c0,1.1 0.9,2 2,2c0,0.55 0.45,1 1,1c0.55,0 1,-0.45 1,-1h6c0,0.55 0.45,1 1,1c0.55,0 1,-0.45 1,-1c1.1,0 2,-0.9 2,-2V8C19,6.9 18.1,6 17,6zM9.5,18H8V9h1.5V18zM12.75,18h-1.5V9h1.5V18zM13.5,6h-3V3.5h3V6zM16,18h-1.5V9H16V18z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/lunch_dining.xml b/qqq/android/mobileapp/src/main/res/drawable/lunch_dining.xml new file mode 100644 index 0000000..416b731 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/lunch_dining.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/lunch_dining/materialicons/black/res/drawable/baseline_lunch_dining_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M22,10c0.32,-3.28 -4.28,-6 -9.99,-6C6.3,4 1.7,6.72 2.02,10H22z" + android:fillType="evenOdd" /> + <path + android:fillColor="#FF000000" + android:pathData="M5.35,13.5c0.55,0 0.78,0.14 1.15,0.36c0.45,0.27 1.07,0.64 2.18,0.64s1.73,-0.37 2.18,-0.64c0.37,-0.23 0.59,-0.36 1.15,-0.36c0.55,0 0.78,0.14 1.15,0.36c0.45,0.27 1.07,0.64 2.18,0.64c1.11,0 1.73,-0.37 2.18,-0.64c0.37,-0.23 0.59,-0.36 1.15,-0.36c0.55,0 0.78,0.14 1.15,0.36c0.45,0.27 1.07,0.63 2.17,0.64v-1.98c0,0 -0.79,-0.16 -1.16,-0.38c-0.45,-0.27 -1.07,-0.64 -2.18,-0.64c-1.11,0 -1.73,0.37 -2.18,0.64c-0.37,0.23 -0.6,0.36 -1.15,0.36s-0.78,-0.14 -1.15,-0.36c-0.45,-0.27 -1.07,-0.64 -2.18,-0.64s-1.73,0.37 -2.18,0.64c-0.37,0.23 -0.59,0.36 -1.15,0.36c-0.55,0 -0.78,-0.14 -1.15,-0.36c-0.45,-0.27 -1.07,-0.64 -2.18,-0.64c-1.11,0 -1.73,0.37 -2.18,0.64C2.78,12.37 2.56,12.5 2,12.5v2c1.11,0 1.73,-0.37 2.21,-0.64C4.58,13.63 4.8,13.5 5.35,13.5z" + android:fillType="evenOdd" /> + <path + android:fillColor="#FF000000" + android:pathData="M2,16v2c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2v-2H2z" + android:fillType="evenOdd" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/lyrics.xml b/qqq/android/mobileapp/src/main/res/drawable/lyrics.xml new file mode 100644 index 0000000..0b7efa7 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/lyrics.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/av/lyrics/materialicons/black/res/drawable/baseline_lyrics_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M14,9c0,-2.04 1.24,-3.79 3,-4.57V4c0,-1.1 -0.9,-2 -2,-2H4C2.9,2 2.01,2.9 2.01,4L2,22l4,-4h9c1.1,0 2,-0.9 2,-2v-2.42C15.24,12.8 14,11.05 14,9zM10,14H6v-2h4V14zM13,11H6V9h7V11zM13,8H6V6h7V8z" /> + <path + android:fillColor="#FF000000" + android:pathData="M20,6.18C19.69,6.07 19.35,6 19,6c-1.66,0 -3,1.34 -3,3c0,1.66 1.34,3 3,3s3,-1.34 3,-3V3h2V1h-4V6.18z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/macro_off.xml b/qqq/android/mobileapp/src/main/res/drawable/macro_off.xml new file mode 100644 index 0000000..cb8d896 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/macro_off.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/macro_off/materialicons/black/res/drawable/baseline_macro_off_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19.98,17.15C20.63,15.91 21,14.5 21,13c-1.5,0 -2.91,0.37 -4.15,1.02L19.98,17.15z" /> + <path + android:fillColor="#FF000000" + android:pathData="M3,13c0,4.97 4.03,9 9,9C12,17.03 7.97,13 3,13z" /> + <path + android:fillColor="#FF000000" + android:pathData="M12,5.5c1.38,0 2.5,1.12 2.5,2.5c0,0.99 -0.58,1.84 -1.42,2.25l2.48,2.48c0.11,0.02 0.23,0.03 0.35,0.03c1.38,0 2.5,-1.12 2.5,-2.5c0,-1 -0.59,-1.85 -1.43,-2.25c0.84,-0.4 1.43,-1.25 1.43,-2.25c0,-1.38 -1.12,-2.5 -2.5,-2.5c-0.53,0 -1.01,0.16 -1.42,0.44L14.5,3.5C14.5,2.12 13.38,1 12,1S9.5,2.12 9.5,3.5l0.02,0.19C9.12,3.41 8.63,3.25 8.1,3.25c-0.57,0 -1.09,0.2 -1.51,0.52l3.16,3.16C10.16,6.08 11.01,5.5 12,5.5z" /> + <path + android:fillColor="#FF000000" + android:pathData="M2.81,2.81L1.39,4.22l4.64,4.64C5.76,9.26 5.6,9.73 5.6,10.25c0,1.38 1.12,2.5 2.5,2.5c0.52,0 0.99,-0.16 1.4,-0.43l0.02,0.02L9.5,12.5c0,1.38 1.12,2.5 2.5,2.5c0.05,0 0.1,-0.01 0.16,-0.02l1.64,1.64C12.67,18.12 12,19.98 12,22c2.02,0 3.88,-0.67 5.38,-1.8l2.4,2.4l1.41,-1.41L2.81,2.81z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/mail.xml b/qqq/android/mobileapp/src/main/res/drawable/mail.xml new file mode 100644 index 0000000..c4377e8 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/mail.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/content/mail/materialicons/black/res/drawable/baseline_mail_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,4L4,4c-1.1,0 -1.99,0.9 -1.99,2L2,18c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2L22,6c0,-1.1 -0.9,-2 -2,-2zM20,8l-8,5 -8,-5L4,6l8,5 8,-5v2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/mail_lock.xml b/qqq/android/mobileapp/src/main/res/drawable/mail_lock.xml new file mode 100644 index 0000000..00a7df8 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/mail_lock.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/communication/mail_lock/materialicons/black/res/drawable/baseline_mail_lock_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M22,9.97V6c0,-1.1 -0.9,-2 -2,-2H4C2.9,4 2.01,4.9 2.01,6L2,18c0,1.1 0.9,2 2,2h12v-5.03c0,-2.76 2.24,-5 5,-5H22zM20,8l-8,5L4,8V6l8,5l8,-5V8z" /> + <path + android:fillColor="#FF000000" + android:pathData="M23,15v-1c0,-1.1 -0.9,-2 -2,-2s-2,0.9 -2,2v1c-0.55,0 -1,0.45 -1,1v3c0,0.55 0.45,1 1,1h4c0.55,0 1,-0.45 1,-1v-3C24,15.45 23.55,15 23,15zM22,15h-2v-1c0,-0.55 0.45,-1 1,-1s1,0.45 1,1V15z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/mail_outline.xml b/qqq/android/mobileapp/src/main/res/drawable/mail_outline.xml new file mode 100644 index 0000000..074abe1 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/mail_outline.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/communication/mail_outline/materialicons/black/res/drawable/baseline_mail_outline_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,4L4,4c-1.1,0 -1.99,0.9 -1.99,2L2,18c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2L22,6c0,-1.1 -0.9,-2 -2,-2zM20,18L4,18L4,8l8,5 8,-5v10zM12,11L4,6h16l-8,5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/male.xml b/qqq/android/mobileapp/src/main/res/drawable/male.xml new file mode 100644 index 0000000..7ca058e --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/male.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/male/materialicons/black/res/drawable/baseline_male_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M9.5,11c1.93,0 3.5,1.57 3.5,3.5S11.43,18 9.5,18S6,16.43 6,14.5S7.57,11 9.5,11zM9.5,9C6.46,9 4,11.46 4,14.5S6.46,20 9.5,20s5.5,-2.46 5.5,-5.5c0,-1.16 -0.36,-2.23 -0.97,-3.12L18,7.42V10h2V4h-6v2h2.58l-3.97,3.97C11.73,9.36 10.66,9 9.5,9z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/man.xml b/qqq/android/mobileapp/src/main/res/drawable/man.xml new file mode 100644 index 0000000..d71dc59 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/man.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/man/materialicons/black/res/drawable/baseline_man_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M14,7h-4C8.9,7 8,7.9 8,9v6h2v7h4v-7h2V9C16,7.9 15.1,7 14,7z" /> + <path + android:fillColor="#FF000000" + android:pathData="M12,4m-2,0a2,2 0,1 1,4 0a2,2 0,1 1,-4 0" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/man_2.xml b/qqq/android/mobileapp/src/main/res/drawable/man_2.xml new file mode 100644 index 0000000..6e61f98 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/man_2.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/man_2/materialicons/black/res/drawable/baseline_man_2_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M14,7h-4C8.9,7 8,7.9 8,9v6h2.5v7h3v-7H16V9C16,7.9 15.1,7 14,7z" /> + <path + android:fillColor="#FF000000" + android:pathData="M12,4m-2,0a2,2 0,1 1,4 0a2,2 0,1 1,-4 0" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/man_3.xml b/qqq/android/mobileapp/src/main/res/drawable/man_3.xml new file mode 100644 index 0000000..476bafa --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/man_3.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/man_3/materialicons/black/res/drawable/baseline_man_3_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M14,7h-4C8.9,7 8,7.9 8,9v6h2v7h4v-7h2V9C16,7.9 15.1,7 14,7z" /> + <path + android:fillColor="#FF000000" + android:pathData="M12,1.751l2.249,2.249l-2.249,2.249l-2.249,-2.249z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/man_4.xml b/qqq/android/mobileapp/src/main/res/drawable/man_4.xml new file mode 100644 index 0000000..fa8e59b --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/man_4.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/man_4/materialicons/black/res/drawable/baseline_man_4_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M13.75,7h-3.5C9.04,7 8.11,8.07 8.27,9.26L10,22h4l1.73,-12.74C15.89,8.07 14.96,7 13.75,7z" /> + <path + android:fillColor="#FF000000" + android:pathData="M12,4m-2,0a2,2 0,1 1,4 0a2,2 0,1 1,-4 0" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/manage_accounts.xml b/qqq/android/mobileapp/src/main/res/drawable/manage_accounts.xml new file mode 100644 index 0000000..2e168b8 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/manage_accounts.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/manage_accounts/materialicons/black/res/drawable/baseline_manage_accounts_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M10,8m-4,0a4,4 0,1 1,8 0a4,4 0,1 1,-8 0" /> + <path + android:fillColor="#FF000000" + android:pathData="M10.67,13.02C10.45,13.01 10.23,13 10,13c-2.42,0 -4.68,0.67 -6.61,1.82C2.51,15.34 2,16.32 2,17.35V20h9.26C10.47,18.87 10,17.49 10,16C10,14.93 10.25,13.93 10.67,13.02z" /> + <path + android:fillColor="#FF000000" + android:pathData="M20.75,16c0,-0.22 -0.03,-0.42 -0.06,-0.63l1.14,-1.01l-1,-1.73l-1.45,0.49c-0.32,-0.27 -0.68,-0.48 -1.08,-0.63L18,11h-2l-0.3,1.49c-0.4,0.15 -0.76,0.36 -1.08,0.63l-1.45,-0.49l-1,1.73l1.14,1.01c-0.03,0.21 -0.06,0.41 -0.06,0.63s0.03,0.42 0.06,0.63l-1.14,1.01l1,1.73l1.45,-0.49c0.32,0.27 0.68,0.48 1.08,0.63L16,21h2l0.3,-1.49c0.4,-0.15 0.76,-0.36 1.08,-0.63l1.45,0.49l1,-1.73l-1.14,-1.01C20.72,16.42 20.75,16.22 20.75,16zM17,18c-1.1,0 -2,-0.9 -2,-2s0.9,-2 2,-2s2,0.9 2,2S18.1,18 17,18z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/manage_history.xml b/qqq/android/mobileapp/src/main/res/drawable/manage_history.xml new file mode 100644 index 0000000..27b3ec8 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/manage_history.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/manage_history/materialicons/black/res/drawable/baseline_manage_history_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M22.69,18.37l1.14,-1l-1,-1.73l-1.45,0.49c-0.32,-0.27 -0.68,-0.48 -1.08,-0.63L20,14h-2l-0.3,1.49c-0.4,0.15 -0.76,0.36 -1.08,0.63l-1.45,-0.49l-1,1.73l1.14,1c-0.08,0.5 -0.08,0.76 0,1.26l-1.14,1l1,1.73l1.45,-0.49c0.32,0.27 0.68,0.48 1.08,0.63L18,24h2l0.3,-1.49c0.4,-0.15 0.76,-0.36 1.08,-0.63l1.45,0.49l1,-1.73l-1.14,-1C22.77,19.13 22.77,18.87 22.69,18.37zM19,21c-1.1,0 -2,-0.9 -2,-2s0.9,-2 2,-2s2,0.9 2,2S20.1,21 19,21zM11,7v5.41l2.36,2.36l1.04,-1.79L13,11.59V7H11zM21,12c0,-4.97 -4.03,-9 -9,-9C9.17,3 6.65,4.32 5,6.36V4H3v6h6V8H6.26C7.53,6.19 9.63,5 12,5c3.86,0 7,3.14 7,7H21zM10.86,18.91C7.87,18.42 5.51,16.01 5.08,13H3.06c0.5,4.5 4.31,8 8.94,8c0.02,0 0.05,0 0.07,0L10.86,18.91z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/manage_search.xml b/qqq/android/mobileapp/src/main/res/drawable/manage_search.xml new file mode 100644 index 0000000..ae114b1 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/manage_search.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/search/manage_search/materialicons/black/res/drawable/baseline_manage_search_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M7,9H2V7h5V9zM7,12H2v2h5V12zM20.59,19l-3.83,-3.83C15.96,15.69 15.02,16 14,16c-2.76,0 -5,-2.24 -5,-5s2.24,-5 5,-5s5,2.24 5,5c0,1.02 -0.31,1.96 -0.83,2.75L22,17.59L20.59,19zM17,11c0,-1.65 -1.35,-3 -3,-3s-3,1.35 -3,3s1.35,3 3,3S17,12.65 17,11zM2,19h10v-2H2V19z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/map.xml b/qqq/android/mobileapp/src/main/res/drawable/map.xml new file mode 100644 index 0000000..5ab10fb --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/map.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/map/materialicons/black/res/drawable/baseline_map_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20.5,3l-0.16,0.03L15,5.1 9,3 3.36,4.9c-0.21,0.07 -0.36,0.25 -0.36,0.48V20.5c0,0.28 0.22,0.5 0.5,0.5l0.16,-0.03L9,18.9l6,2.1 5.64,-1.9c0.21,-0.07 0.36,-0.25 0.36,-0.48V3.5c0,-0.28 -0.22,-0.5 -0.5,-0.5zM15,19l-6,-2.11V5l6,2.11V19z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/maps_home_work.xml b/qqq/android/mobileapp/src/main/res/drawable/maps_home_work.xml new file mode 100644 index 0000000..f125605 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/maps_home_work.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/navigation/maps_home_work/materialicons/black/res/drawable/baseline_maps_home_work_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M1,11l0,10l5,0l0,-6l4,0l0,6l5,0l0,-10l-7,-5z" /> + <path + android:fillColor="#FF000000" + android:pathData="M10,3v1.97l7,5V11h2v2h-2v2h2v2h-2v4h6V3H10zM19,9h-2V7h2V9z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/maps_ugc.xml b/qqq/android/mobileapp/src/main/res/drawable/maps_ugc.xml new file mode 100644 index 0000000..02651d9 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/maps_ugc.xml @@ -0,0 +1,20 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/maps_ugc/materialicons/black/res/drawable/baseline_maps_ugc_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,2C6.48,2 2,6.48 2,12c0,1.54 0.36,2.98 0.97,4.29L1,23l6.71,-1.97C9.02,21.64 10.46,22 12,22c5.52,0 10,-4.48 10,-10C22,6.48 17.52,2 12,2zM16,13h-3v3h-2v-3H8v-2h3V8h2v3h3V13z" + android:fillType="evenOdd" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/margin.xml b/qqq/android/mobileapp/src/main/res/drawable/margin.xml new file mode 100644 index 0000000..7a761b2 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/margin.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/editor/margin/materialicons/black/res/drawable/baseline_margin_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M3,3v18h18L21,3L3,3zM19,19L5,19L5,5h14v14zM11,7h2v2h-2zM7,7h2v2L7,9zM15,7h2v2h-2zM7,11h2v2L7,13zM11,11h2v2h-2zM15,11h2v2h-2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/mark_as_unread.xml b/qqq/android/mobileapp/src/main/res/drawable/mark_as_unread.xml new file mode 100644 index 0000000..5d8099c --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/mark_as_unread.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/mark_as_unread/materialicons/black/res/drawable/baseline_mark_as_unread_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M18.83,7h-2.6L10.5,4 4,7.4L4,17c-1.1,0 -2,-0.9 -2,-2L2,7.17c0,-0.53 0.32,-1.09 0.8,-1.34L10.5,2l7.54,3.83c0.43,0.23 0.73,0.7 0.79,1.17zM20,8L7,8c-1.1,0 -2,0.9 -2,2v9c0,1.1 0.9,2 2,2h13c1.1,0 2,-0.9 2,-2v-9c0,-1.1 -0.9,-2 -2,-2zM20,11.67L13.5,15 7,11.67L7,10l6.5,3.33L20,10v1.67z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/mark_chat_read.xml b/qqq/android/mobileapp/src/main/res/drawable/mark_chat_read.xml new file mode 100644 index 0000000..991c00d --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/mark_chat_read.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/communication/mark_chat_read/materialicons/black/res/drawable/baseline_mark_chat_read_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M17.34,20l-3.54,-3.54l1.41,-1.41l2.12,2.12l4.24,-4.24L23,14.34L17.34,20zM12,17c0,-3.87 3.13,-7 7,-7c1.08,0 2.09,0.25 3,0.68V4c0,-1.1 -0.9,-2 -2,-2H4C2.9,2 2,2.9 2,4v18l4,-4h6v0c0,-0.17 0.01,-0.33 0.03,-0.5C12.01,17.34 12,17.17 12,17z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/mark_chat_unread.xml b/qqq/android/mobileapp/src/main/res/drawable/mark_chat_unread.xml new file mode 100644 index 0000000..da8cfa8 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/mark_chat_unread.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/communication/mark_chat_unread/materialicons/black/res/drawable/baseline_mark_chat_unread_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M22,6.98V16c0,1.1 -0.9,2 -2,2H6l-4,4V4c0,-1.1 0.9,-2 2,-2h10.1C14.04,2.32 14,2.66 14,3c0,2.76 2.24,5 5,5C20.13,8 21.16,7.61 22,6.98zM16,3c0,1.66 1.34,3 3,3s3,-1.34 3,-3s-1.34,-3 -3,-3S16,1.34 16,3z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/mark_email_read.xml b/qqq/android/mobileapp/src/main/res/drawable/mark_email_read.xml new file mode 100644 index 0000000..eb55cdf --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/mark_email_read.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/communication/mark_email_read/materialicons/black/res/drawable/baseline_mark_email_read_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,19c0,-3.87 3.13,-7 7,-7c1.08,0 2.09,0.25 3,0.68V6c0,-1.1 -0.9,-2 -2,-2H4C2.9,4 2,4.9 2,6v12c0,1.1 0.9,2 2,2h8.08C12.03,19.67 12,19.34 12,19zM4,6l8,5l8,-5v2l-8,5L4,8V6zM17.34,22l-3.54,-3.54l1.41,-1.41l2.12,2.12l4.24,-4.24L23,16.34L17.34,22z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/mark_email_unread.xml b/qqq/android/mobileapp/src/main/res/drawable/mark_email_unread.xml new file mode 100644 index 0000000..cdbb6e7 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/mark_email_unread.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/communication/mark_email_unread/materialicons/black/res/drawable/baseline_mark_email_unread_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M22,8.98V18c0,1.1 -0.9,2 -2,2H4c-1.1,0 -2,-0.9 -2,-2V6c0,-1.1 0.9,-2 2,-2h10.1C14.04,4.32 14,4.66 14,5c0,1.48 0.65,2.79 1.67,3.71L12,11L4,6v2l8,5l5.3,-3.32C17.84,9.88 18.4,10 19,10C20.13,10 21.16,9.61 22,8.98zM16,5c0,1.66 1.34,3 3,3s3,-1.34 3,-3s-1.34,-3 -3,-3S16,3.34 16,5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/mark_unread_chat_alt.xml b/qqq/android/mobileapp/src/main/res/drawable/mark_unread_chat_alt.xml new file mode 100644 index 0000000..615227b --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/mark_unread_chat_alt.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/communication/mark_unread_chat_alt/materialicons/black/res/drawable/baseline_mark_unread_chat_alt_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19,3m-3,0a3,3 0,1 1,6 0a3,3 0,1 1,-6 0" /> + <path + android:fillColor="#FF000000" + android:pathData="M6,8V6h9.03c-1.21,-1.6 -1.08,-3.21 -0.92,-4H4.01c-1.1,0 -2,0.89 -2,2L2,22l4,-4h14c1.1,0 2,-0.9 2,-2V6.97C21.16,7.61 20.13,8 19,8H6zM14,14H6v-2h8V14zM18,11H6V9h12V11z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/markunread.xml b/qqq/android/mobileapp/src/main/res/drawable/markunread.xml new file mode 100644 index 0000000..f45f8e6 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/markunread.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/content/markunread/materialicons/black/res/drawable/baseline_markunread_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,4L4,4c-1.1,0 -1.99,0.9 -1.99,2L2,18c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2L22,6c0,-1.1 -0.9,-2 -2,-2zM20,8l-8,5 -8,-5L4,6l8,5 8,-5v2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/markunread_mailbox.xml b/qqq/android/mobileapp/src/main/res/drawable/markunread_mailbox.xml new file mode 100644 index 0000000..a9caea5 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/markunread_mailbox.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/markunread_mailbox/materialicons/black/res/drawable/baseline_markunread_mailbox_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,6H10v6H8V4h6V0H6v6H4c-1.1,0 -2,0.9 -2,2v12c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2V8c0,-1.1 -0.9,-2 -2,-2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/masks.xml b/qqq/android/mobileapp/src/main/res/drawable/masks.xml new file mode 100644 index 0000000..f3778b0 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/masks.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/masks/materialicons/black/res/drawable/baseline_masks_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19.5,6c-1.31,0 -2.37,1.01 -2.48,2.3C15.14,7.8 14.18,6.5 12,6.5c-2.19,0 -3.14,1.3 -5.02,1.8C6.87,7.02 5.81,6 4.5,6C3.12,6 2,7.12 2,8.5V9c0,6 3.6,7.81 6.52,7.98C9.53,17.62 10.72,18 12,18s2.47,-0.38 3.48,-1.02C18.4,16.81 22,15 22,9V8.5C22,7.12 20.88,6 19.5,6zM3.5,9V8.5c0,-0.55 0.45,-1 1,-1s1,0.45 1,1v3c0,1.28 0.38,2.47 1.01,3.48C4.99,14.27 3.5,12.65 3.5,9zM20.5,9c0,3.65 -1.49,5.27 -3.01,5.98c0.64,-1.01 1.01,-2.2 1.01,-3.48v-3c0,-0.55 0.45,-1 1,-1s1,0.45 1,1V9zM10.69,10.48c-0.44,0.26 -0.96,0.56 -1.69,0.76V10.2c0.48,-0.17 0.84,-0.38 1.18,-0.58C10.72,9.3 11.23,9 12,9s1.27,0.3 1.8,0.62c0.34,0.2 0.71,0.42 1.2,0.59v1.04c-0.75,-0.21 -1.26,-0.51 -1.71,-0.78C12.83,10.2 12.49,10 12,10C11.51,10 11.16,10.2 10.69,10.48z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/maximize.xml b/qqq/android/mobileapp/src/main/res/drawable/maximize.xml new file mode 100644 index 0000000..814c404 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/maximize.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/maximize/materialicons/black/res/drawable/baseline_maximize_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M3,3h18v2H3z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/media_bluetooth_off.xml b/qqq/android/mobileapp/src/main/res/drawable/media_bluetooth_off.xml new file mode 100644 index 0000000..50c8361 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/media_bluetooth_off.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/media_bluetooth_off/materialicons/black/res/drawable/baseline_media_bluetooth_off_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M9,6.17V3h6v4h-4v1.17L9,6.17zM19.42,15L22,17.57l-0.8,0.8l-6.78,-6.78l0.8,-0.8l2.75,2.75V9h0.6L22,12.43L19.42,15zM19.17,13.55l1.13,-1.13l-1.13,-1.13V13.55zM21.19,21.19l-1.41,1.41l-3.98,-3.98l-0.58,0.58l-0.85,-0.85l0.58,-0.58L11,13.83V17c0,2.21 -1.78,4 -3.99,4S3,19.21 3,17s1.79,-4 4.01,-4c0.73,0 1.41,0.21 2,0.55v-1.72L1.39,4.22L2.8,2.81L21.19,21.19z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/media_bluetooth_on.xml b/qqq/android/mobileapp/src/main/res/drawable/media_bluetooth_on.xml new file mode 100644 index 0000000..434ce93 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/media_bluetooth_on.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/media_bluetooth_on/materialicons/black/res/drawable/baseline_media_bluetooth_on_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M9,3l0.01,10.55c-0.6,-0.34 -1.28,-0.55 -2,-0.55C4.79,13 3,14.79 3,17s1.79,4 4.01,4S11,19.21 11,17V7h4V3H9zM21,12.43L17.57,9h-0.6v4.55l-2.75,-2.75l-0.85,0.85L16.73,15l-3.35,3.35l0.85,0.85l2.75,-2.75V21h0.6L21,17.57L18.42,15L21,12.43zM18.17,11.3l1.13,1.13l-1.13,1.13V11.3zM19.3,17.57l-1.13,1.13v-2.26L19.3,17.57z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/mediation.xml b/qqq/android/mobileapp/src/main/res/drawable/mediation.xml new file mode 100644 index 0000000..e8b3e96 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/mediation.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/mediation/materialicons/black/res/drawable/baseline_mediation_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M22,12l-4,4 -1.41,-1.41L18.17,13h-5.23c-0.34,3.1 -2.26,5.72 -4.94,7.05C7.96,21.69 6.64,23 5,23c-1.66,0 -3,-1.34 -3,-3s1.34,-3 3,-3c0.95,0 1.78,0.45 2.33,1.14 1.9,-1.03 3.26,-2.91 3.58,-5.14h-3.1C7.4,14.16 6.3,15 5,15c-1.66,0 -3,-1.34 -3,-3s1.34,-3 3,-3c1.3,0 2.4,0.84 2.82,2h3.1c-0.32,-2.23 -1.69,-4.1 -3.59,-5.14C6.78,6.55 5.95,7 5,7 3.34,7 2,5.66 2,4s1.34,-3 3,-3c1.64,0 2.96,1.31 2.99,2.95 2.68,1.33 4.6,3.95 4.94,7.05h5.23l-1.58,-1.59L18,8l4,4z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/medical_information.xml b/qqq/android/mobileapp/src/main/res/drawable/medical_information.xml new file mode 100644 index 0000000..c294302 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/medical_information.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/medical_information/materialicons/black/res/drawable/baseline_medical_information_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,7h-5V4c0,-1.1 -0.9,-2 -2,-2h-2C9.9,2 9,2.9 9,4v3H4C2.9,7 2,7.9 2,9v11c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2V9C22,7.9 21.1,7 20,7zM11,4h2v5h-2V4zM11,16H9v2H7v-2H5v-2h2v-2h2v2h2V16zM13,14.5V13h6v1.5H13zM13,17.5V16h4v1.5H13z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/medical_services.xml b/qqq/android/mobileapp/src/main/res/drawable/medical_services.xml new file mode 100644 index 0000000..054f55b --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/medical_services.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/medical_services/materialicons/black/res/drawable/baseline_medical_services_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,6h-4V4c0,-1.1 -0.9,-2 -2,-2h-4C8.9,2 8,2.9 8,4v2H4C2.9,6 2,6.9 2,8v12c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2V8C22,6.9 21.1,6 20,6zM10,4h4v2h-4V4zM16,15h-3v3h-2v-3H8v-2h3v-3h2v3h3V15z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/medication.xml b/qqq/android/mobileapp/src/main/res/drawable/medication.xml new file mode 100644 index 0000000..08c54ea --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/medication.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/medication/materialicons/black/res/drawable/baseline_medication_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M6,3h12v2h-12z" /> + <path + android:fillColor="#FF000000" + android:pathData="M17,6H7C5.9,6 5,6.9 5,8v11c0,1.1 0.9,2 2,2h10c1.1,0 2,-0.9 2,-2V8C19,6.9 18.1,6 17,6zM16,15h-2.5v2.5h-3V15H8v-3h2.5V9.5h3V12H16V15z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/medication_liquid.xml b/qqq/android/mobileapp/src/main/res/drawable/medication_liquid.xml new file mode 100644 index 0000000..88879e0 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/medication_liquid.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/medication_liquid/materialicons/black/res/drawable/baseline_medication_liquid_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M3,3h12v2h-12z" /> + <path + android:fillColor="#FF000000" + android:pathData="M14,6H4C2.9,6 2,6.9 2,8v11c0,1.1 0.9,2 2,2h10c1.1,0 2,-0.9 2,-2V8C16,6.9 15.1,6 14,6zM13,15h-2.5v2.5h-3V15H5v-3h2.5V9.5h3V12H13V15z" /> + <path + android:fillColor="#FF000000" + android:pathData="M20,6c-1.68,0 -3,1.76 -3,4c0,1.77 0.83,3.22 2,3.76V20c0,0.55 0.45,1 1,1s1,-0.45 1,-1v-6.24c1.17,-0.54 2,-1.99 2,-3.76C23,7.76 21.68,6 20,6z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/meeting_room.xml b/qqq/android/mobileapp/src/main/res/drawable/meeting_room.xml new file mode 100644 index 0000000..5791525 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/meeting_room.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/places/meeting_room/materialicons/black/res/drawable/baseline_meeting_room_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M14,6v15L3,21v-2h2L5,3h9v1h5v15h2v2h-4L17,6h-3zM10,11v2h2v-2h-2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/memory.xml b/qqq/android/mobileapp/src/main/res/drawable/memory.xml new file mode 100644 index 0000000..ffc0616 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/memory.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/hardware/memory/materialicons/black/res/drawable/baseline_memory_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M15,9L9,9v6h6L15,9zM13,13h-2v-2h2v2zM21,11L21,9h-2L19,7c0,-1.1 -0.9,-2 -2,-2h-2L15,3h-2v2h-2L11,3L9,3v2L7,5c-1.1,0 -2,0.9 -2,2v2L3,9v2h2v2L3,13v2h2v2c0,1.1 0.9,2 2,2h2v2h2v-2h2v2h2v-2h2c1.1,0 2,-0.9 2,-2v-2h2v-2h-2v-2h2zM17,17L7,17L7,7h10v10z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/menu.xml b/qqq/android/mobileapp/src/main/res/drawable/menu.xml new file mode 100644 index 0000000..3c8addb --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/menu.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/navigation/menu/materialicons/black/res/drawable/baseline_menu_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M3,18h18v-2L3,16v2zM3,13h18v-2L3,11v2zM3,6v2h18L21,6L3,6z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/menu_book.xml b/qqq/android/mobileapp/src/main/res/drawable/menu_book.xml new file mode 100644 index 0000000..aca188a --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/menu_book.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/menu_book/materialicons/black/res/drawable/baseline_menu_book_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M21,5c-1.11,-0.35 -2.33,-0.5 -3.5,-0.5c-1.95,0 -4.05,0.4 -5.5,1.5c-1.45,-1.1 -3.55,-1.5 -5.5,-1.5S2.45,4.9 1,6v14.65c0,0.25 0.25,0.5 0.5,0.5c0.1,0 0.15,-0.05 0.25,-0.05C3.1,20.45 5.05,20 6.5,20c1.95,0 4.05,0.4 5.5,1.5c1.35,-0.85 3.8,-1.5 5.5,-1.5c1.65,0 3.35,0.3 4.75,1.05c0.1,0.05 0.15,0.05 0.25,0.05c0.25,0 0.5,-0.25 0.5,-0.5V6C22.4,5.55 21.75,5.25 21,5zM21,18.5c-1.1,-0.35 -2.3,-0.5 -3.5,-0.5c-1.7,0 -4.15,0.65 -5.5,1.5V8c1.35,-0.85 3.8,-1.5 5.5,-1.5c1.2,0 2.4,0.15 3.5,0.5V18.5z" /> + <path + android:fillColor="#FF000000" + android:pathData="M17.5,10.5c0.88,0 1.73,0.09 2.5,0.26V9.24C19.21,9.09 18.36,9 17.5,9c-1.7,0 -3.24,0.29 -4.5,0.83v1.66C14.13,10.85 15.7,10.5 17.5,10.5z" /> + <path + android:fillColor="#FF000000" + android:pathData="M13,12.49v1.66c1.13,-0.64 2.7,-0.99 4.5,-0.99c0.88,0 1.73,0.09 2.5,0.26V11.9c-0.79,-0.15 -1.64,-0.24 -2.5,-0.24C15.8,11.66 14.26,11.96 13,12.49z" /> + <path + android:fillColor="#FF000000" + android:pathData="M17.5,14.33c-1.7,0 -3.24,0.29 -4.5,0.83v1.66c1.13,-0.64 2.7,-0.99 4.5,-0.99c0.88,0 1.73,0.09 2.5,0.26v-1.52C19.21,14.41 18.36,14.33 17.5,14.33z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/menu_open.xml b/qqq/android/mobileapp/src/main/res/drawable/menu_open.xml new file mode 100644 index 0000000..f671b73 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/menu_open.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/navigation/menu_open/materialicons/black/res/drawable/baseline_menu_open_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M3,18h13v-2L3,16v2zM3,13h10v-2L3,11v2zM3,6v2h13L16,6L3,6zM21,15.59L17.42,12 21,8.41 19.59,7l-5,5 5,5L21,15.59z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/merge.xml b/qqq/android/mobileapp/src/main/res/drawable/merge.xml new file mode 100644 index 0000000..1fe4771 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/merge.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/merge/materialicons/black/res/drawable/baseline_merge_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M6.41,21L5,19.59l4.83,-4.83c0.75,-0.75 1.17,-1.77 1.17,-2.83v-5.1L9.41,8.41L8,7l4,-4l4,4l-1.41,1.41L13,6.83v5.1c0,1.06 0.42,2.08 1.17,2.83L19,19.59L17.59,21L12,15.41L6.41,21z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/merge_type.xml b/qqq/android/mobileapp/src/main/res/drawable/merge_type.xml new file mode 100644 index 0000000..08d8995 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/merge_type.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/editor/merge_type/materialicons/black/res/drawable/baseline_merge_type_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M17,20.41L18.41,19 15,15.59 13.59,17 17,20.41zM7.5,8H11v5.59L5.59,19 7,20.41l6,-6V8h3.5L12,3.5 7.5,8z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/message.xml b/qqq/android/mobileapp/src/main/res/drawable/message.xml new file mode 100644 index 0000000..f15bb1b --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/message.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/communication/message/materialicons/black/res/drawable/baseline_message_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,2L4,2c-1.1,0 -1.99,0.9 -1.99,2L2,22l4,-4h14c1.1,0 2,-0.9 2,-2L22,4c0,-1.1 -0.9,-2 -2,-2zM18,14L6,14v-2h12v2zM18,11L6,11L6,9h12v2zM18,8L6,8L6,6h12v2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/mic.xml b/qqq/android/mobileapp/src/main/res/drawable/mic.xml new file mode 100644 index 0000000..008bcd7 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/mic.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/av/mic/materialicons/black/res/drawable/baseline_mic_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,14c1.66,0 2.99,-1.34 2.99,-3L15,5c0,-1.66 -1.34,-3 -3,-3S9,3.34 9,5v6c0,1.66 1.34,3 3,3zM17.3,11c0,3 -2.54,5.1 -5.3,5.1S6.7,14 6.7,11L5,11c0,3.41 2.72,6.23 6,6.72L11,21h2v-3.28c3.28,-0.48 6,-3.3 6,-6.72h-1.7z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/mic_external_off.xml b/qqq/android/mobileapp/src/main/res/drawable/mic_external_off.xml new file mode 100644 index 0000000..a227607 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/mic_external_off.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/mic_external_off/materialicons/black/res/drawable/baseline_mic_external_off_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M21.19,21.19L2.81,2.81 1.39,4.22 5.17,8L4,8l1,10h1c0,2.21 1.79,4 4,4s4,-1.79 4,-4v-1.17l5.78,5.78 1.41,-1.42zM12,18c0,1.1 -0.9,2 -2,2s-2,-0.9 -2,-2h1l0.56,-5.61L12,14.83L12,18zM14,6v5.17l-2,-2L12,6c0,-2.21 1.79,-4 4,-4s4,1.79 4,4v11.17l-2,-2L18,6c0,-1.1 -0.9,-2 -2,-2s-2,0.9 -2,2zM10,5c0,0.62 -0.2,1.18 -0.52,1.66L5.33,2.51C5.81,2.19 6.38,2 7,2c1.66,0 3,1.34 3,3z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/mic_external_on.xml b/qqq/android/mobileapp/src/main/res/drawable/mic_external_on.xml new file mode 100644 index 0000000..b11c875 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/mic_external_on.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/mic_external_on/materialicons/black/res/drawable/baseline_mic_external_on_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M9.22,7H4.78C4.3,6.47 4,5.77 4,5c0,-1.66 1.34,-3 3,-3s3,1.34 3,3c0,0.77 -0.3,1.47 -0.78,2zM16,2c2.21,0 4,1.79 4,4v16h-2V6c0,-1.1 -0.9,-2 -2,-2s-2,0.9 -2,2v12c0,2.21 -1.79,4 -4,4s-4,-1.79 -4,-4H5L4,8h6L9,18H8c0,1.1 0.9,2 2,2s2,-0.9 2,-2V6c0,-2.21 1.79,-4 4,-4z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/mic_none.xml b/qqq/android/mobileapp/src/main/res/drawable/mic_none.xml new file mode 100644 index 0000000..43cc288 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/mic_none.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/av/mic_none/materialicons/black/res/drawable/baseline_mic_none_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,14c1.66,0 2.99,-1.34 2.99,-3L15,5c0,-1.66 -1.34,-3 -3,-3S9,3.34 9,5v6c0,1.66 1.34,3 3,3zM10.8,4.9c0,-0.66 0.54,-1.2 1.2,-1.2 0.66,0 1.2,0.54 1.2,1.2l-0.01,6.2c0,0.66 -0.53,1.2 -1.19,1.2 -0.66,0 -1.2,-0.54 -1.2,-1.2L10.8,4.9zM17.3,11c0,3 -2.54,5.1 -5.3,5.1S6.7,14 6.7,11L5,11c0,3.41 2.72,6.23 6,6.72L11,21h2v-3.28c3.28,-0.48 6,-3.3 6,-6.72h-1.7z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/mic_off.xml b/qqq/android/mobileapp/src/main/res/drawable/mic_off.xml new file mode 100644 index 0000000..fffd32c --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/mic_off.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/av/mic_off/materialicons/black/res/drawable/baseline_mic_off_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19,11h-1.7c0,0.74 -0.16,1.43 -0.43,2.05l1.23,1.23c0.56,-0.98 0.9,-2.09 0.9,-3.28zM14.98,11.17c0,-0.06 0.02,-0.11 0.02,-0.17L15,5c0,-1.66 -1.34,-3 -3,-3S9,3.34 9,5v0.18l5.98,5.99zM4.27,3L3,4.27l6.01,6.01L9.01,11c0,1.66 1.33,3 2.99,3 0.22,0 0.44,-0.03 0.65,-0.08l1.66,1.66c-0.71,0.33 -1.5,0.52 -2.31,0.52 -2.76,0 -5.3,-2.1 -5.3,-5.1L5,11c0,3.41 2.72,6.23 6,6.72L11,21h2v-3.28c0.91,-0.13 1.77,-0.45 2.54,-0.9L19.73,21 21,19.73 4.27,3z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/microwave.xml b/qqq/android/mobileapp/src/main/res/drawable/microwave.xml new file mode 100644 index 0000000..6194ffe --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/microwave.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/places/microwave/materialicons/black/res/drawable/baseline_microwave_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M6.8,10.61L5.37,9.19C5.73,8.79 6.59,8 7.75,8c0.8,0 1.39,0.39 1.81,0.67C9.87,8.88 10.07,9 10.25,9c0.37,0 0.8,-0.41 0.95,-0.61l1.42,1.42c-0.36,0.4 -1.22,1.19 -2.37,1.19c-0.79,0 -1.37,-0.38 -1.79,-0.66C8.13,10.12 7.94,10 7.75,10C7.38,10 6.95,10.41 6.8,10.61zM7.75,15c0.19,0 0.38,0.12 0.71,0.34c0.42,0.28 1,0.66 1.79,0.66c1.16,0 2.01,-0.79 2.37,-1.19l-1.42,-1.42c-0.15,0.2 -0.59,0.61 -0.95,0.61c-0.18,0 -0.38,-0.12 -0.69,-0.33C9.14,13.39 8.55,13 7.75,13c-1.16,0 -2.02,0.79 -2.38,1.19l1.42,1.42C6.95,15.41 7.38,15 7.75,15zM22,6v12c0,1.1 -0.9,2 -2,2H4c-1.1,0 -2,-0.9 -2,-2V6c0,-1.1 0.9,-2 2,-2h16C21.1,4 22,4.9 22,6zM14,6H4v12h10V6zM19,16c0,-0.55 -0.45,-1 -1,-1c-0.55,0 -1,0.45 -1,1c0,0.55 0.45,1 1,1C18.55,17 19,16.55 19,16zM19,12c0,-0.55 -0.45,-1 -1,-1c-0.55,0 -1,0.45 -1,1c0,0.55 0.45,1 1,1C18.55,13 19,12.55 19,12zM19,7h-2v2h2V7z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/military_tech.xml b/qqq/android/mobileapp/src/main/res/drawable/military_tech.xml new file mode 100644 index 0000000..3184b8d --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/military_tech.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/military_tech/materialicons/black/res/drawable/baseline_military_tech_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M17,10.43V2H7v8.43c0,0.35 0.18,0.68 0.49,0.86l4.18,2.51l-0.99,2.34l-3.41,0.29l2.59,2.24L9.07,22L12,20.23L14.93,22l-0.78,-3.33l2.59,-2.24l-3.41,-0.29l-0.99,-2.34l4.18,-2.51C16.82,11.11 17,10.79 17,10.43zM13,12.23l-1,0.6l-1,-0.6V3h2V12.23z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/minimize.xml b/qqq/android/mobileapp/src/main/res/drawable/minimize.xml new file mode 100644 index 0000000..69503a3 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/minimize.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/minimize/materialicons/black/res/drawable/baseline_minimize_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M6,19h12v2H6z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/minor_crash.xml b/qqq/android/mobileapp/src/main/res/drawable/minor_crash.xml new file mode 100644 index 0000000..4079dec --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/minor_crash.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/minor_crash/materialicons/black/res/drawable/baseline_minor_crash_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M18.92,9.01C18.72,8.42 18.16,8 17.5,8h-11C5.84,8 5.29,8.42 5.08,9.01L3,15v8c0,0.55 0.45,1 1,1h1c0.55,0 1,-0.45 1,-1v-1h12v1c0,0.55 0.45,1 1,1h1c0.55,0 1,-0.45 1,-1v-8L18.92,9.01zM6.85,10h10.29l1.04,3H5.81L6.85,10zM6,17.5C6,16.67 6.67,16 7.5,16S9,16.67 9,17.5S8.33,19 7.5,19S6,18.33 6,17.5zM15,17.5c0,-0.83 0.67,-1.5 1.5,-1.5s1.5,0.67 1.5,1.5S17.33,19 16.5,19S15,18.33 15,17.5zM9.41,5L8,6.41l-3,-3L6.41,2L9.41,5zM16,6.41L14.59,5l3,-3L19,3.41L16,6.41zM13,5h-2V0h2V5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/miscellaneous_services.xml b/qqq/android/mobileapp/src/main/res/drawable/miscellaneous_services.xml new file mode 100644 index 0000000..4579330 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/miscellaneous_services.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/miscellaneous_services/materialicons/black/res/drawable/baseline_miscellaneous_services_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M14.17,13.71l1.4,-2.42c0.09,-0.15 0.05,-0.34 -0.08,-0.45l-1.48,-1.16c0.03,-0.22 0.05,-0.45 0.05,-0.68s-0.02,-0.46 -0.05,-0.69l1.48,-1.16c0.13,-0.11 0.17,-0.3 0.08,-0.45l-1.4,-2.42c-0.09,-0.15 -0.27,-0.21 -0.43,-0.15L12,4.83c-0.36,-0.28 -0.75,-0.51 -1.18,-0.69l-0.26,-1.85C10.53,2.13 10.38,2 10.21,2h-2.8C7.24,2 7.09,2.13 7.06,2.3L6.8,4.15C6.38,4.33 5.98,4.56 5.62,4.84l-1.74,-0.7c-0.16,-0.06 -0.34,0 -0.43,0.15l-1.4,2.42C1.96,6.86 2,7.05 2.13,7.16l1.48,1.16C3.58,8.54 3.56,8.77 3.56,9s0.02,0.46 0.05,0.69l-1.48,1.16C2,10.96 1.96,11.15 2.05,11.3l1.4,2.42c0.09,0.15 0.27,0.21 0.43,0.15l1.74,-0.7c0.36,0.28 0.75,0.51 1.18,0.69l0.26,1.85C7.09,15.87 7.24,16 7.41,16h2.8c0.17,0 0.32,-0.13 0.35,-0.3l0.26,-1.85c0.42,-0.18 0.82,-0.41 1.18,-0.69l1.74,0.7C13.9,13.92 14.08,13.86 14.17,13.71zM8.81,11c-1.1,0 -2,-0.9 -2,-2c0,-1.1 0.9,-2 2,-2s2,0.9 2,2C10.81,10.1 9.91,11 8.81,11z" /> + <path + android:fillColor="#FF000000" + android:pathData="M21.92,18.67l-0.96,-0.74c0.02,-0.14 0.04,-0.29 0.04,-0.44c0,-0.15 -0.01,-0.3 -0.04,-0.44l0.95,-0.74c0.08,-0.07 0.11,-0.19 0.05,-0.29l-0.9,-1.55c-0.05,-0.1 -0.17,-0.13 -0.28,-0.1l-1.11,0.45c-0.23,-0.18 -0.48,-0.33 -0.76,-0.44l-0.17,-1.18C18.73,13.08 18.63,13 18.53,13h-1.79c-0.11,0 -0.21,0.08 -0.22,0.19l-0.17,1.18c-0.27,0.12 -0.53,0.26 -0.76,0.44l-1.11,-0.45c-0.1,-0.04 -0.22,0 -0.28,0.1l-0.9,1.55c-0.05,0.1 -0.04,0.22 0.05,0.29l0.95,0.74c-0.02,0.14 -0.03,0.29 -0.03,0.44c0,0.15 0.01,0.3 0.03,0.44l-0.95,0.74c-0.08,0.07 -0.11,0.19 -0.05,0.29l0.9,1.55c0.05,0.1 0.17,0.13 0.28,0.1l1.11,-0.45c0.23,0.18 0.48,0.33 0.76,0.44l0.17,1.18c0.02,0.11 0.11,0.19 0.22,0.19h1.79c0.11,0 0.21,-0.08 0.22,-0.19l0.17,-1.18c0.27,-0.12 0.53,-0.26 0.75,-0.44l1.12,0.45c0.1,0.04 0.22,0 0.28,-0.1l0.9,-1.55C22.03,18.86 22,18.74 21.92,18.67zM17.63,18.83c-0.74,0 -1.35,-0.6 -1.35,-1.35s0.6,-1.35 1.35,-1.35s1.35,0.6 1.35,1.35S18.37,18.83 17.63,18.83z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/missed_video_call.xml b/qqq/android/mobileapp/src/main/res/drawable/missed_video_call.xml new file mode 100644 index 0000000..04a45f7 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/missed_video_call.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/av/missed_video_call/materialicons/black/res/drawable/baseline_missed_video_call_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M17,10.5V7c0,-0.55 -0.45,-1 -1,-1H4c-0.55,0 -1,0.45 -1,1v10c0,0.55 0.45,1 1,1h12c0.55,0 1,-0.45 1,-1v-3.5l4,4v-11l-4,4zM10,15l-3.89,-3.89v2.55H5V9.22h4.44v1.11H6.89l3.11,3.1 4.22,-4.22 0.78,0.79 -5,5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/mms.xml b/qqq/android/mobileapp/src/main/res/drawable/mms.xml new file mode 100644 index 0000000..a0a72a2 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/mms.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/notification/mms/materialicons/black/res/drawable/baseline_mms_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,2H4c-1.1,0 -1.99,0.9 -1.99,2L2,22l4,-4h14c1.1,0 2,-0.9 2,-2V4c0,-1.1 -0.9,-2 -2,-2zM5,14l3.5,-4.5 2.5,3.01L14.5,8l4.5,6H5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/mobile_friendly.xml b/qqq/android/mobileapp/src/main/res/drawable/mobile_friendly.xml new file mode 100644 index 0000000..abe3f64 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/mobile_friendly.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/mobile_friendly/materialicons/black/res/drawable/baseline_mobile_friendly_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19,1H9c-1.1,0 -2,0.9 -2,2v3h2V4h10v16H9v-2H7v3c0,1.1 0.9,2 2,2h10c1.1,0 2,-0.9 2,-2V3c0,-1.1 -0.9,-2 -2,-2zM7.01,13.47l-2.55,-2.55 -1.27,1.27L7,16l7.19,-7.19 -1.27,-1.27z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/mobile_off.xml b/qqq/android/mobileapp/src/main/res/drawable/mobile_off.xml new file mode 100644 index 0000000..52b7025 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/mobile_off.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/mobile_off/materialicons/black/res/drawable/baseline_mobile_off_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M2.76,2.49L1.49,3.76 5,7.27V21c0,1.1 0.9,2 2,2h10c1.02,0 1.85,-0.77 1.98,-1.75l1.72,1.72 1.27,-1.27L2.76,2.49zM7,19V9.27L16.73,19H7zM17,5v9.17l2,2V3c0,-1.1 -0.9,-2 -2,-2H7c-0.85,0 -1.58,0.54 -1.87,1.3L7.83,5H17z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/mobile_screen_share.xml b/qqq/android/mobileapp/src/main/res/drawable/mobile_screen_share.xml new file mode 100644 index 0000000..8b3adb9 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/mobile_screen_share.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/communication/mobile_screen_share/materialicons/black/res/drawable/baseline_mobile_screen_share_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M17,1.01L7,1c-1.1,0 -1.99,0.9 -1.99,2v18c0,1.1 0.89,2 1.99,2h10c1.1,0 2,-0.9 2,-2L19,3c0,-1.1 -0.9,-1.99 -2,-1.99zM17,19L7,19L7,5h10v14zM12.8,13.22v1.75l3.2,-2.99L12.8,9v1.7c-3.11,0.43 -4.35,2.56 -4.8,4.7 1.11,-1.5 2.58,-2.18 4.8,-2.18z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/mobiledata_off.xml b/qqq/android/mobileapp/src/main/res/drawable/mobiledata_off.xml new file mode 100644 index 0000000..5b802dc --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/mobiledata_off.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/mobiledata_off/materialicons/black/res/drawable/baseline_mobiledata_off_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M16,7l3,0l-4,-4l-4,4l3,0l0,4.17l2,2z" /> + <path + android:fillColor="#FF000000" + android:pathData="M2.81,2.81l-1.42,1.41l6.61,6.61l0,6.18l-3,0.01l4,3.98l4,-4l-3,0.01l0,-4.18l9.78,9.78l1.41,-1.42z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/mode.xml b/qqq/android/mobileapp/src/main/res/drawable/mode.xml new file mode 100644 index 0000000..a5bbf9a --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/mode.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/editor/mode/materialicons/black/res/drawable/baseline_mode_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M3,17.25l0,3.75l3.75,0l11.06,-11.06l-3.75,-3.75z" /> + <path + android:fillColor="#FF000000" + android:pathData="M20.71,5.63l-2.34,-2.34c-0.39,-0.39 -1.02,-0.39 -1.41,0l-1.83,1.83l3.75,3.75l1.83,-1.83C21.1,6.65 21.1,6.02 20.71,5.63z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/mode_comment.xml b/qqq/android/mobileapp/src/main/res/drawable/mode_comment.xml new file mode 100644 index 0000000..0bf1f04 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/mode_comment.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/editor/mode_comment/materialicons/black/res/drawable/baseline_mode_comment_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M21.99,4c0,-1.1 -0.89,-2 -1.99,-2H4c-1.1,0 -2,0.9 -2,2v12c0,1.1 0.9,2 2,2h14l4,4 -0.01,-18z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/mode_edit.xml b/qqq/android/mobileapp/src/main/res/drawable/mode_edit.xml new file mode 100644 index 0000000..b89baa9 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/mode_edit.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/editor/mode_edit/materialicons/black/res/drawable/baseline_mode_edit_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M3,17.25V21h3.75L17.81,9.94l-3.75,-3.75L3,17.25zM20.71,7.04c0.39,-0.39 0.39,-1.02 0,-1.41l-2.34,-2.34c-0.39,-0.39 -1.02,-0.39 -1.41,0l-1.83,1.83 3.75,3.75 1.83,-1.83z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/mode_edit_outline.xml b/qqq/android/mobileapp/src/main/res/drawable/mode_edit_outline.xml new file mode 100644 index 0000000..0c3003e --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/mode_edit_outline.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/editor/mode_edit_outline/materialicons/black/res/drawable/baseline_mode_edit_outline_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M3,17.25l0,3.75l3.75,0l11.06,-11.06l-3.75,-3.75z" /> + <path + android:fillColor="#FF000000" + android:pathData="M20.71,5.63l-2.34,-2.34c-0.39,-0.39 -1.02,-0.39 -1.41,0l-1.83,1.83l3.75,3.75l1.83,-1.83C21.1,6.65 21.1,6.02 20.71,5.63z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/mode_fan_off.xml b/qqq/android/mobileapp/src/main/res/drawable/mode_fan_off.xml new file mode 100644 index 0000000..d03c4b3 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/mode_fan_off.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/home/mode_fan_off/materialicons/black/res/drawable/baseline_mode_fan_off_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M16.34,8.36l-2.29,0.82c-0.18,-0.13 -0.38,-0.25 -0.58,-0.34c0.17,-0.83 0.63,-1.58 1.36,-2.06C16.85,5.44 16.18,2 13.39,2c-3.08,0 -4.9,1.47 -5.3,3.26L18.73,15.9c1.5,0.39 3.27,-0.51 3.27,-2.51C22,9 18.99,7.16 16.34,8.36z" /> + <path + android:fillColor="#FF000000" + android:pathData="M2.81,2.81L1.39,4.22L5.27,8.1C3.77,7.7 2,8.61 2,10.61c0,4.4 3.01,6.24 5.66,5.03l2.29,-0.82c0.18,0.13 0.38,0.25 0.58,0.34c-0.17,0.83 -0.63,1.58 -1.36,2.06C7.15,18.56 7.82,22 10.61,22c3.08,0 4.9,-1.47 5.3,-3.26l3.87,3.87l1.41,-1.41L2.81,2.81z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/mode_night.xml b/qqq/android/mobileapp/src/main/res/drawable/mode_night.xml new file mode 100644 index 0000000..0b51adf --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/mode_night.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/mode_night/materialicons/black/res/drawable/baseline_mode_night_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M9.5,2c-1.82,0 -3.53,0.5 -5,1.35c2.99,1.73 5,4.95 5,8.65s-2.01,6.92 -5,8.65C5.97,21.5 7.68,22 9.5,22c5.52,0 10,-4.48 10,-10S15.02,2 9.5,2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/mode_of_travel.xml b/qqq/android/mobileapp/src/main/res/drawable/mode_of_travel.xml new file mode 100644 index 0000000..b141b1d --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/mode_of_travel.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/mode_of_travel/materialicons/black/res/drawable/baseline_mode_of_travel_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M15.31,18.9c-0.96,1 -2.06,2.03 -3.31,3.1c-5.33,-4.55 -8,-8.48 -8,-11.8C4,5.22 7.8,2 12,2c4,0 7.64,2.92 7.97,7.5l3.53,0L19,14l-4.5,-4.5l3.47,0C17.65,6.24 15.13,4 12,4c-3.35,0 -6,2.57 -6,6.2c0,2.34 1.95,5.44 6,9.14c0.64,-0.59 1.23,-1.16 1.77,-1.71c-0.17,-0.34 -0.27,-0.72 -0.27,-1.12c0,-1.38 1.12,-2.5 2.5,-2.5s2.5,1.12 2.5,2.5S17.38,19 16,19C15.76,19 15.53,18.97 15.31,18.9z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/mode_standby.xml b/qqq/android/mobileapp/src/main/res/drawable/mode_standby.xml new file mode 100644 index 0000000..b507917 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/mode_standby.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/mode_standby/materialicons/black/res/drawable/baseline_mode_standby_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,2C6.49,2 2,6.49 2,12s4.49,10 10,10s10,-4.49 10,-10S17.51,2 12,2zM12,20c-4.41,0 -8,-3.59 -8,-8s3.59,-8 8,-8s8,3.59 8,8S16.41,20 12,20zM15,12c0,1.66 -1.34,3 -3,3s-3,-1.34 -3,-3s1.34,-3 3,-3S15,10.34 15,12z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/model_training.xml b/qqq/android/mobileapp/src/main/res/drawable/model_training.xml new file mode 100644 index 0000000..33e0bdb --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/model_training.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/model_training/materialicons/black/res/drawable/baseline_model_training_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M15.5,13.5c0,2 -2.5,3.5 -2.5,5h-2c0,-1.5 -2.5,-3 -2.5,-5c0,-1.93 1.57,-3.5 3.5,-3.5h0C13.93,10 15.5,11.57 15.5,13.5zM13,19.5h-2V21h2V19.5zM19,13c0,1.68 -0.59,3.21 -1.58,4.42l1.42,1.42C20.18,17.27 21,15.23 21,13c0,-2.74 -1.23,-5.19 -3.16,-6.84l-1.42,1.42C17.99,8.86 19,10.82 19,13zM16,5l-4,-4v3c0,0 0,0 0,0c-4.97,0 -9,4.03 -9,9c0,2.23 0.82,4.27 2.16,5.84l1.42,-1.42C5.59,16.21 5,14.68 5,13c0,-3.86 3.14,-7 7,-7c0,0 0,0 0,0v3L16,5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/monetization_on.xml b/qqq/android/mobileapp/src/main/res/drawable/monetization_on.xml new file mode 100644 index 0000000..93507d5 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/monetization_on.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/editor/monetization_on/materialicons/black/res/drawable/baseline_monetization_on_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM13.41,18.09L13.41,20h-2.67v-1.93c-1.71,-0.36 -3.16,-1.46 -3.27,-3.4h1.96c0.1,1.05 0.82,1.87 2.65,1.87 1.96,0 2.4,-0.98 2.4,-1.59 0,-0.83 -0.44,-1.61 -2.67,-2.14 -2.48,-0.6 -4.18,-1.62 -4.18,-3.67 0,-1.72 1.39,-2.84 3.11,-3.21L10.74,4h2.67v1.95c1.86,0.45 2.79,1.86 2.85,3.39L14.3,9.34c-0.05,-1.11 -0.64,-1.87 -2.22,-1.87 -1.5,0 -2.4,0.68 -2.4,1.64 0,0.84 0.65,1.39 2.67,1.91s4.18,1.39 4.18,3.91c-0.01,1.83 -1.38,2.83 -3.12,3.16z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/money.xml b/qqq/android/mobileapp/src/main/res/drawable/money.xml new file mode 100644 index 0000000..80bf0c8 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/money.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/money/materialicons/black/res/drawable/baseline_money_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M5,8h2v8L5,16zM12,8L9,8c-0.55,0 -1,0.45 -1,1v6c0,0.55 0.45,1 1,1h3c0.55,0 1,-0.45 1,-1L13,9c0,-0.55 -0.45,-1 -1,-1zM11,14h-1v-4h1v4zM18,8h-3c-0.55,0 -1,0.45 -1,1v6c0,0.55 0.45,1 1,1h3c0.55,0 1,-0.45 1,-1L19,9c0,-0.55 -0.45,-1 -1,-1zM17,14h-1v-4h1v4z" /> + <path + android:fillColor="#FF000000" + android:pathData="M2,4v16h20L22,4L2,4zM4,18L4,6h16v12L4,18z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/money_off.xml b/qqq/android/mobileapp/src/main/res/drawable/money_off.xml new file mode 100644 index 0000000..d25ce3e --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/money_off.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/editor/money_off/materialicons/black/res/drawable/baseline_money_off_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12.5,6.9c1.78,0 2.44,0.85 2.5,2.1h2.21c-0.07,-1.72 -1.12,-3.3 -3.21,-3.81V3h-3v2.16c-0.53,0.12 -1.03,0.3 -1.48,0.54l1.47,1.47c0.41,-0.17 0.91,-0.27 1.51,-0.27zM5.33,4.06L4.06,5.33 7.5,8.77c0,2.08 1.56,3.21 3.91,3.91l3.51,3.51c-0.34,0.48 -1.05,0.91 -2.42,0.91 -2.06,0 -2.87,-0.92 -2.98,-2.1h-2.2c0.12,2.19 1.76,3.42 3.68,3.83V21h3v-2.15c0.96,-0.18 1.82,-0.55 2.45,-1.12l2.22,2.22 1.27,-1.27L5.33,4.06z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/money_off_csred.xml b/qqq/android/mobileapp/src/main/res/drawable/money_off_csred.xml new file mode 100644 index 0000000..a24904d --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/money_off_csred.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/editor/money_off_csred/materialicons/black/res/drawable/baseline_money_off_csred_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M10.53,7.43c0.42,-0.31 0.93,-0.47 1.54,-0.47s1.11,0.16 1.5,0.49c0.39,0.32 0.65,0.7 0.79,1.12l1.89,-0.8c-0.24,-0.71 -0.71,-1.35 -1.4,-1.92c-0.5,-0.4 -1.12,-0.65 -1.85,-0.77V3h-2v2.11c-0.41,0.08 -0.79,0.21 -1.14,0.39c-0.35,0.18 -0.64,0.39 -0.9,0.63l1.43,1.43C10.43,7.52 10.48,7.47 10.53,7.43zM2.81,2.81L1.39,4.22l12.35,12.35C13.31,16.85 12.79,17 12.19,17c-0.71,0 -1.32,-0.23 -1.83,-0.7c-0.5,-0.47 -0.86,-1.07 -1.06,-1.81l-1.98,0.8c0.34,1.17 0.95,2.08 1.83,2.73c0.57,0.42 1.19,0.68 1.85,0.83V21h2v-2.08c0.44,-0.07 0.87,-0.17 1.29,-0.35c0.34,-0.14 0.64,-0.32 0.92,-0.53l4.57,4.57l1.41,-1.41L2.81,2.81z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/monitor.xml b/qqq/android/mobileapp/src/main/res/drawable/monitor.xml new file mode 100644 index 0000000..af10797 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/monitor.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/hardware/monitor/materialicons/black/res/drawable/baseline_monitor_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,3L4,3c-1.1,0 -2,0.9 -2,2v11c0,1.1 0.9,2 2,2h3l-1,1v2h12v-2l-1,-1h3c1.1,0 2,-0.9 2,-2L22,5c0,-1.1 -0.9,-2 -2,-2zM20,16L4,16L4,5h16v11z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/monitor_heart.xml b/qqq/android/mobileapp/src/main/res/drawable/monitor_heart.xml new file mode 100644 index 0000000..52da842 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/monitor_heart.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/monitor_heart/materialicons/black/res/drawable/baseline_monitor_heart_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M15.11,12.45L14,10.24l-3.11,6.21C10.73,16.79 10.38,17 10,17s-0.73,-0.21 -0.89,-0.55L7.38,13H2v5c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2v-5h-6C15.62,13 15.27,12.79 15.11,12.45z" /> + <path + android:fillColor="#FF000000" + android:pathData="M20,4H4C2.9,4 2,4.9 2,6v5h6c0.38,0 0.73,0.21 0.89,0.55L10,13.76l3.11,-6.21c0.34,-0.68 1.45,-0.68 1.79,0L16.62,11H22V6C22,4.9 21.1,4 20,4z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/monitor_weight.xml b/qqq/android/mobileapp/src/main/res/drawable/monitor_weight.xml new file mode 100644 index 0000000..9445c9c --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/monitor_weight.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/monitor_weight/materialicons/black/res/drawable/baseline_monitor_weight_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19,3H5C3.9,3 3,3.9 3,5v14c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2V5C21,3.9 20.1,3 19,3zM12,12c-1.66,0 -3,-1.34 -3,-3s1.34,-3 3,-3s3,1.34 3,3S13.66,12 12,12z" /> + <path + android:fillColor="#FF000000" + android:pathData="M10,8.5h1v1h-1z" /> + <path + android:fillColor="#FF000000" + android:pathData="M11.5,8.5h1v1h-1z" /> + <path + android:fillColor="#FF000000" + android:pathData="M13,8.5h1v1h-1z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/monochrome_photos.xml b/qqq/android/mobileapp/src/main/res/drawable/monochrome_photos.xml new file mode 100644 index 0000000..7038758 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/monochrome_photos.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/monochrome_photos/materialicons/black/res/drawable/baseline_monochrome_photos_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,5h-3.2L15,3L9,3L7.2,5L4,5c-1.1,0 -2,0.9 -2,2v12c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2L22,7c0,-1.1 -0.9,-2 -2,-2zM20,19h-8v-1c-2.8,0 -5,-2.2 -5,-5s2.2,-5 5,-5L12,7h8v12zM17,13c0,-2.8 -2.2,-5 -5,-5v1.8c1.8,0 3.2,1.4 3.2,3.2s-1.4,3.2 -3.2,3.2L12,18c2.8,0 5,-2.2 5,-5zM8.8,13c0,1.8 1.4,3.2 3.2,3.2L12,9.8c-1.8,0 -3.2,1.4 -3.2,3.2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/mood.xml b/qqq/android/mobileapp/src/main/res/drawable/mood.xml new file mode 100644 index 0000000..e2f3638 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/mood.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/mood/materialicons/black/res/drawable/baseline_mood_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M11.99,2C6.47,2 2,6.48 2,12s4.47,10 9.99,10C17.52,22 22,17.52 22,12S17.52,2 11.99,2zM12,20c-4.42,0 -8,-3.58 -8,-8s3.58,-8 8,-8 8,3.58 8,8 -3.58,8 -8,8zM15.5,11c0.83,0 1.5,-0.67 1.5,-1.5S16.33,8 15.5,8 14,8.67 14,9.5s0.67,1.5 1.5,1.5zM8.5,11c0.83,0 1.5,-0.67 1.5,-1.5S9.33,8 8.5,8 7,8.67 7,9.5 7.67,11 8.5,11zM12,17.5c2.33,0 4.31,-1.46 5.11,-3.5L6.89,14c0.8,2.04 2.78,3.5 5.11,3.5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/mood_bad.xml b/qqq/android/mobileapp/src/main/res/drawable/mood_bad.xml new file mode 100644 index 0000000..7fda088 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/mood_bad.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/mood_bad/materialicons/black/res/drawable/baseline_mood_bad_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M11.99,2C6.47,2 2,6.48 2,12s4.47,10 9.99,10C17.52,22 22,17.52 22,12S17.52,2 11.99,2zM12,20c-4.42,0 -8,-3.58 -8,-8s3.58,-8 8,-8 8,3.58 8,8 -3.58,8 -8,8zM15.5,11c0.83,0 1.5,-0.67 1.5,-1.5S16.33,8 15.5,8 14,8.67 14,9.5s0.67,1.5 1.5,1.5zM8.5,11c0.83,0 1.5,-0.67 1.5,-1.5S9.33,8 8.5,8 7,8.67 7,9.5 7.67,11 8.5,11zM12,14c-2.33,0 -4.31,1.46 -5.11,3.5h10.22c-0.8,-2.04 -2.78,-3.5 -5.11,-3.5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/moped.xml b/qqq/android/mobileapp/src/main/res/drawable/moped.xml new file mode 100644 index 0000000..361bac6 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/moped.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/moped/materialicons/black/res/drawable/baseline_moped_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19,7c0,-1.1 -0.9,-2 -2,-2h-3v2h3v2.65L13.52,14H10V9H6c-2.21,0 -4,1.79 -4,4v3h2c0,1.66 1.34,3 3,3s3,-1.34 3,-3h4.48L19,10.35V7zM7,17c-0.55,0 -1,-0.45 -1,-1h2C8,16.55 7.55,17 7,17z" /> + <path + android:fillColor="#FF000000" + android:pathData="M5,6h5v2h-5z" /> + <path + android:fillColor="#FF000000" + android:pathData="M19,13c-1.66,0 -3,1.34 -3,3s1.34,3 3,3s3,-1.34 3,-3S20.66,13 19,13zM19,17c-0.55,0 -1,-0.45 -1,-1s0.45,-1 1,-1s1,0.45 1,1S19.55,17 19,17z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/more.xml b/qqq/android/mobileapp/src/main/res/drawable/more.xml new file mode 100644 index 0000000..ad02a15 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/more.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/notification/more/materialicons/black/res/drawable/baseline_more_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M22,3L7,3c-0.69,0 -1.23,0.35 -1.59,0.88L0,12l5.41,8.11c0.36,0.53 0.97,0.89 1.66,0.89L22,21c1.1,0 2,-0.9 2,-2L24,5c0,-1.1 -0.9,-2 -2,-2zM9,13.5c-0.83,0 -1.5,-0.67 -1.5,-1.5s0.67,-1.5 1.5,-1.5 1.5,0.67 1.5,1.5 -0.67,1.5 -1.5,1.5zM14,13.5c-0.83,0 -1.5,-0.67 -1.5,-1.5s0.67,-1.5 1.5,-1.5 1.5,0.67 1.5,1.5 -0.67,1.5 -1.5,1.5zM19,13.5c-0.83,0 -1.5,-0.67 -1.5,-1.5s0.67,-1.5 1.5,-1.5 1.5,0.67 1.5,1.5 -0.67,1.5 -1.5,1.5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/more_horiz.xml b/qqq/android/mobileapp/src/main/res/drawable/more_horiz.xml new file mode 100644 index 0000000..9d84d48 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/more_horiz.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/navigation/more_horiz/materialicons/black/res/drawable/baseline_more_horiz_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M6,10c-1.1,0 -2,0.9 -2,2s0.9,2 2,2 2,-0.9 2,-2 -0.9,-2 -2,-2zM18,10c-1.1,0 -2,0.9 -2,2s0.9,2 2,2 2,-0.9 2,-2 -0.9,-2 -2,-2zM12,10c-1.1,0 -2,0.9 -2,2s0.9,2 2,2 2,-0.9 2,-2 -0.9,-2 -2,-2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/more_time.xml b/qqq/android/mobileapp/src/main/res/drawable/more_time.xml new file mode 100644 index 0000000..02f65b8 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/more_time.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/communication/more_time/materialicons/black/res/drawable/baseline_more_time_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M10,8l0,6l4.7,2.9l0.8,-1.2l-4,-2.4l0,-5.3z" /> + <path + android:fillColor="#FF000000" + android:pathData="M17.92,12c0.05,0.33 0.08,0.66 0.08,1c0,3.9 -3.1,7 -7,7s-7,-3.1 -7,-7c0,-3.9 3.1,-7 7,-7c0.7,0 1.37,0.1 2,0.29V4.23C12.36,4.08 11.69,4 11,4c-5,0 -9,4 -9,9s4,9 9,9s9,-4 9,-9c0,-0.34 -0.02,-0.67 -0.06,-1H17.92z" /> + <path + android:fillColor="#FF000000" + android:pathData="M20,5l0,-3l-2,0l0,3l-3,0l0,2l3,0l0,3l2,0l0,-3l3,0l0,-2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/more_vert.xml b/qqq/android/mobileapp/src/main/res/drawable/more_vert.xml new file mode 100644 index 0000000..bb04b07 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/more_vert.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/navigation/more_vert/materialicons/black/res/drawable/baseline_more_vert_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,8c1.1,0 2,-0.9 2,-2s-0.9,-2 -2,-2 -2,0.9 -2,2 0.9,2 2,2zM12,10c-1.1,0 -2,0.9 -2,2s0.9,2 2,2 2,-0.9 2,-2 -0.9,-2 -2,-2zM12,16c-1.1,0 -2,0.9 -2,2s0.9,2 2,2 2,-0.9 2,-2 -0.9,-2 -2,-2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/mosque.xml b/qqq/android/mobileapp/src/main/res/drawable/mosque.xml new file mode 100644 index 0000000..4f9ff5d --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/mosque.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/mosque/materialicons/black/res/drawable/baseline_mosque_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M7,8h10c0.29,0 0.57,0.06 0.84,0.13C17.93,7.8 18,7.46 18,7.09c0,-1.31 -0.65,-2.53 -1.74,-3.25L12,1L7.74,3.84C6.65,4.56 6,5.78 6,7.09C6,7.46 6.07,7.8 6.16,8.13C6.43,8.06 6.71,8 7,8z" /> + <path + android:fillColor="#FF000000" + android:pathData="M24,7c0,-1.1 -2,-3 -2,-3s-2,1.9 -2,3c0,0.74 0.4,1.38 1,1.72V13h-2v-2c0,-1.1 -0.9,-2 -2,-2H7c-1.1,0 -2,0.9 -2,2v2H3V8.72C3.6,8.38 4,7.74 4,7c0,-1.1 -2,-3 -2,-3S0,5.9 0,7c0,0.74 0.4,1.38 1,1.72V21h9v-4c0,-1.1 0.9,-2 2,-2s2,0.9 2,2v4h9V8.72C23.6,8.38 24,7.74 24,7z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/motion_photos_auto.xml b/qqq/android/mobileapp/src/main/res/drawable/motion_photos_auto.xml new file mode 100644 index 0000000..88b1a81 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/motion_photos_auto.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/motion_photos_auto/materialicons/black/res/drawable/baseline_motion_photos_auto_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M2.88,7.88l1.54,1.54C4.15,10.23 4,11.1 4,12c0,4.41 3.59,8 8,8s8,-3.59 8,-8s-3.59,-8 -8,-8c-0.9,0 -1.77,0.15 -2.58,0.42L7.89,2.89C9.15,2.32 10.54,2 12,2c5.52,0 10,4.48 10,10s-4.48,10 -10,10S2,17.52 2,12C2,10.53 2.32,9.14 2.88,7.88zM7,5.5C7,6.33 6.33,7 5.5,7S4,6.33 4,5.5S4.67,4 5.5,4S7,4.67 7,5.5zM12.03,8.99h-0.07l-1.16,3.31h2.39L12.03,8.99zM12,18c3.31,0 6,-2.69 6,-6s-2.69,-6 -6,-6s-6,2.69 -6,6S8.69,18 12,18zM11.29,7.5h1.43l3.01,8h-1.39l-0.72,-2.04h-3.23L9.66,15.5H8.28L11.29,7.5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/motion_photos_off.xml b/qqq/android/mobileapp/src/main/res/drawable/motion_photos_off.xml new file mode 100644 index 0000000..51b80c4 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/motion_photos_off.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/motion_photos_off/materialicons/black/res/drawable/baseline_motion_photos_off_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20.84,20.84L3.16,3.16 1.89,4.43l1.89,1.89C2.66,7.93 2,9.89 2,12c0,5.52 4.48,10 10,10 2.11,0 4.07,-0.66 5.68,-1.77l1.89,1.89 1.27,-1.28zM12,20c-4.41,0 -8,-3.59 -8,-8 0,-1.55 0.45,-3 1.22,-4.23l1.46,1.46C6.25,10.06 6,11 6,12c0,3.31 2.69,6 6,6 1,0 1.94,-0.25 2.77,-0.68l1.46,1.46C15,19.55 13.55,20 12,20zM6.32,3.77C7.93,2.66 9.89,2 12,2c5.52,0 10,4.48 10,10 0,2.11 -0.66,4.07 -1.77,5.68l-1.45,-1.45C19.55,15 20,13.55 20,12c0,-4.41 -3.59,-8 -8,-8 -1.55,0 -3,0.45 -4.23,1.22L6.32,3.77zM18,12c0,1 -0.25,1.94 -0.68,2.77L9.23,6.68C10.06,6.25 11,6 12,6c3.31,0 6,2.69 6,6z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/motion_photos_on.xml b/qqq/android/mobileapp/src/main/res/drawable/motion_photos_on.xml new file mode 100644 index 0000000..4d1e37c --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/motion_photos_on.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/motion_photos_on/materialicons/black/res/drawable/baseline_motion_photos_on_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M2.88,7.88l1.54,1.54C4.15,10.23 4,11.1 4,12c0,4.41 3.59,8 8,8s8,-3.59 8,-8s-3.59,-8 -8,-8c-0.9,0 -1.77,0.15 -2.58,0.42L7.89,2.89C9.15,2.32 10.54,2 12,2c5.52,0 10,4.48 10,10s-4.48,10 -10,10S2,17.52 2,12C2,10.53 2.32,9.14 2.88,7.88zM6,12c0,-3.31 2.69,-6 6,-6s6,2.69 6,6s-2.69,6 -6,6S6,15.31 6,12zM7,5.5C7,6.33 6.33,7 5.5,7S4,6.33 4,5.5S4.67,4 5.5,4S7,4.67 7,5.5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/motion_photos_pause.xml b/qqq/android/mobileapp/src/main/res/drawable/motion_photos_pause.xml new file mode 100644 index 0000000..90dc19a --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/motion_photos_pause.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/motion_photos_pause/materialicons/black/res/drawable/baseline_motion_photos_pause_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M2.88,7.88l1.54,1.54C4.15,10.23 4,11.1 4,12c0,4.41 3.59,8 8,8s8,-3.59 8,-8s-3.59,-8 -8,-8c-0.9,0 -1.77,0.15 -2.58,0.42L7.89,2.89C9.15,2.32 10.54,2 12,2c5.52,0 10,4.48 10,10s-4.48,10 -10,10S2,17.52 2,12C2,10.53 2.32,9.14 2.88,7.88zM7,5.5C7,6.33 6.33,7 5.5,7S4,6.33 4,5.5S4.67,4 5.5,4S7,4.67 7,5.5zM12,6c-3.31,0 -6,2.69 -6,6s2.69,6 6,6s6,-2.69 6,-6S15.31,6 12,6zM11,15H9V9h2V15zM15,15h-2V9h2V15z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/motion_photos_paused.xml b/qqq/android/mobileapp/src/main/res/drawable/motion_photos_paused.xml new file mode 100644 index 0000000..49c0b04 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/motion_photos_paused.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/motion_photos_paused/materialicons/black/res/drawable/baseline_motion_photos_paused_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M22,12c0,5.52 -4.48,10 -10,10S2,17.52 2,12c0,-1.19 0.22,-2.32 0.6,-3.38L4.48,9.3C4.17,10.14 4,11.05 4,12c0,4.41 3.59,8 8,8s8,-3.59 8,-8s-3.59,-8 -8,-8c-0.95,0 -1.85,0.17 -2.69,0.48L8.63,2.59C9.69,2.22 10.82,2 12,2C17.52,2 22,6.48 22,12zM5.5,4C4.67,4 4,4.67 4,5.5S4.67,7 5.5,7S7,6.33 7,5.5S6.33,4 5.5,4zM11,16V8H9v8H11zM15,16V8h-2v8H15z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/mouse.xml b/qqq/android/mobileapp/src/main/res/drawable/mouse.xml new file mode 100644 index 0000000..167da5f --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/mouse.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/hardware/mouse/materialicons/black/res/drawable/baseline_mouse_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M13,1.07L13,9h7c0,-4.08 -3.05,-7.44 -7,-7.93zM4,15c0,4.42 3.58,8 8,8s8,-3.58 8,-8v-4L4,11v4zM11,1.07C7.05,1.56 4,4.92 4,9h7L11,1.07z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/move_down.xml b/qqq/android/mobileapp/src/main/res/drawable/move_down.xml new file mode 100644 index 0000000..d9b6cf7 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/move_down.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/editor/move_down/materialicons/black/res/drawable/baseline_move_down_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M3,11c0,2.45 1.76,4.47 4.08,4.91l-1.49,-1.49L7,13l4,4.01L7,21l-1.41,-1.41l1.58,-1.58l0,-0.06C3.7,17.54 1,14.58 1,11c0,-3.87 3.13,-7 7,-7h3v2H8C5.24,6 3,8.24 3,11z" /> + <path + android:fillColor="#FF000000" + android:pathData="M22,11V4h-9v7H22zM20,9h-5V6h5V9z" /> + <path + android:fillColor="#FF000000" + android:pathData="M13,13h9v7h-9z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/move_to_inbox.xml b/qqq/android/mobileapp/src/main/res/drawable/move_to_inbox.xml new file mode 100644 index 0000000..d974fa8 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/move_to_inbox.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/content/move_to_inbox/materialicons/black/res/drawable/baseline_move_to_inbox_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19,3L4.99,3c-1.11,0 -1.98,0.9 -1.98,2L3,19c0,1.1 0.88,2 1.99,2L19,21c1.1,0 2,-0.9 2,-2L21,5c0,-1.1 -0.9,-2 -2,-2zM19,15h-4c0,1.66 -1.35,3 -3,3s-3,-1.34 -3,-3L4.99,15L4.99,5L19,5v10zM16,10h-2L14,7h-4v3L8,10l4,4 4,-4z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/move_up.xml b/qqq/android/mobileapp/src/main/res/drawable/move_up.xml new file mode 100644 index 0000000..9124ab0 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/move_up.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/editor/move_up/materialicons/black/res/drawable/baseline_move_up_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M3,13c0,-2.45 1.76,-4.47 4.08,-4.91L5.59,9.59L7,11l4,-4.01L7,3L5.59,4.41l1.58,1.58l0,0.06C3.7,6.46 1,9.42 1,13c0,3.87 3.13,7 7,7h3v-2H8C5.24,18 3,15.76 3,13z" /> + <path + android:fillColor="#FF000000" + android:pathData="M13,13v7h9v-7H13zM20,18h-5v-3h5V18z" /> + <path + android:fillColor="#FF000000" + android:pathData="M13,4h9v7h-9z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/movie.xml b/qqq/android/mobileapp/src/main/res/drawable/movie.xml new file mode 100644 index 0000000..07b520c --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/movie.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/av/movie/materialicons/black/res/drawable/baseline_movie_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M18,4l2,4h-3l-2,-4h-2l2,4h-3l-2,-4H8l2,4H7L5,4H4c-1.1,0 -1.99,0.9 -1.99,2L2,18c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2V4h-4z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/movie_creation.xml b/qqq/android/mobileapp/src/main/res/drawable/movie_creation.xml new file mode 100644 index 0000000..5e4ff20 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/movie_creation.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/movie_creation/materialicons/black/res/drawable/baseline_movie_creation_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M18,4l2,4h-3l-2,-4h-2l2,4h-3l-2,-4H8l2,4H7L5,4H4c-1.1,0 -1.99,0.9 -1.99,2L2,18c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2V4h-4z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/movie_edit.xml b/qqq/android/mobileapp/src/main/res/drawable/movie_edit.xml new file mode 100644 index 0000000..f8bd0a1 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/movie_edit.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/av/movie_edit/materialicons/black/res/drawable/baseline_movie_edit_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M4,10h18V6c0,-1.1 -0.9,-2 -2,-2h-3l2,4h-3l-2,-4h-2l2,4h-3L9,4H7l2,4H6L4,4C2.9,4 2.01,4.9 2.01,6L2,18c0,1.1 0.9,2 2,2h8v-2H4V10z" /> + <path + android:fillColor="#FF000000" + android:pathData="M14,18.88l0,2.12l2.12,0l5.17,-5.17l-2.12,-2.12z" /> + <path + android:fillColor="#FF000000" + android:pathData="M22.71,13L22,12.29c-0.39,-0.39 -1.02,-0.39 -1.41,0L19.88,13L22,15.12l0.71,-0.71C23.1,14.02 23.1,13.39 22.71,13z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/movie_filter.xml b/qqq/android/mobileapp/src/main/res/drawable/movie_filter.xml new file mode 100644 index 0000000..f25a46d --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/movie_filter.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/movie_filter/materialicons/black/res/drawable/baseline_movie_filter_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M18,4l2,3h-3l-2,-3h-2l2,3h-3l-2,-3L8,4l2,3L7,7L5,4L4,4c-1.1,0 -1.99,0.9 -1.99,2L2,18c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2L22,4h-4zM11.25,15.25L10,18l-1.25,-2.75L6,14l2.75,-1.25L10,10l1.25,2.75L14,14l-2.75,1.25zM16.94,11.94L16,14l-0.94,-2.06L13,11l2.06,-0.94L16,8l0.94,2.06L19,11l-2.06,0.94z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/moving.xml b/qqq/android/mobileapp/src/main/res/drawable/moving.xml new file mode 100644 index 0000000..88b5353 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/moving.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/moving/materialicons/black/res/drawable/baseline_moving_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19.71,9.71L22,12V6h-6l2.29,2.29l-4.17,4.17c-0.39,0.39 -1.02,0.39 -1.41,0l-1.17,-1.17c-1.17,-1.17 -3.07,-1.17 -4.24,0L2,16.59L3.41,18l5.29,-5.29c0.39,-0.39 1.02,-0.39 1.41,0l1.17,1.17c1.17,1.17 3.07,1.17 4.24,0L19.71,9.71z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/mp.xml b/qqq/android/mobileapp/src/main/res/drawable/mp.xml new file mode 100644 index 0000000..9895816 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/mp.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/mp/materialicons/black/res/drawable/baseline_mp_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19,3L5,3c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2L21,5c0,-1.1 -0.9,-2 -2,-2zM6.5,9L11,9c0.55,0 1,0.45 1,1v5h-1.5v-4.5h-1v3L8,13.5v-3L7,10.5L7,15L5.5,15v-5c0,-0.55 0.45,-1 1,-1zM15.5,15L14,15L14,9h3.5c0.55,0 1,0.45 1,1v2.5c0,0.55 -0.45,1 -1,1h-2L15.5,15zM15.5,12L17,12v-1.5h-1.5L15.5,12z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/multiline_chart.xml b/qqq/android/mobileapp/src/main/res/drawable/multiline_chart.xml new file mode 100644 index 0000000..048bba6 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/multiline_chart.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/editor/multiline_chart/materialicons/black/res/drawable/baseline_multiline_chart_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M22,6.92l-1.41,-1.41 -2.85,3.21C15.68,6.4 12.83,5 9.61,5 6.72,5 4.07,6.16 2,8l1.42,1.42C5.12,7.93 7.27,7 9.61,7c2.74,0 5.09,1.26 6.77,3.24l-2.88,3.24 -4,-4L2,16.99l1.5,1.5 6,-6.01 4,4 4.05,-4.55c0.75,1.35 1.25,2.9 1.44,4.55H21c-0.22,-2.3 -0.95,-4.39 -2.04,-6.14L22,6.92z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/multiple_stop.xml b/qqq/android/mobileapp/src/main/res/drawable/multiple_stop.xml new file mode 100644 index 0000000..20d362e --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/multiple_stop.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/multiple_stop/materialicons/black/res/drawable/baseline_multiple_stop_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M17,4l4,4l-4,4V9h-4V7h4V4zM10,7C9.45,7 9,7.45 9,8s0.45,1 1,1s1,-0.45 1,-1S10.55,7 10,7zM6,7C5.45,7 5,7.45 5,8s0.45,1 1,1s1,-0.45 1,-1S6.55,7 6,7zM7,17h4v-2H7v-3l-4,4l4,4V17zM14,17c0.55,0 1,-0.45 1,-1c0,-0.55 -0.45,-1 -1,-1s-1,0.45 -1,1C13,16.55 13.45,17 14,17zM18,17c0.55,0 1,-0.45 1,-1c0,-0.55 -0.45,-1 -1,-1s-1,0.45 -1,1C17,16.55 17.45,17 18,17z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/museum.xml b/qqq/android/mobileapp/src/main/res/drawable/museum.xml new file mode 100644 index 0000000..3247606 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/museum.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/museum/materialicons/black/res/drawable/baseline_museum_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M22,11V9L12,2L2,9v2h2v9H2v2h20v-2h-2v-9H22zM16,18h-2v-4l-2,3l-2,-3v4H8v-7h2l2,3l2,-3h2V18z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/music_note.xml b/qqq/android/mobileapp/src/main/res/drawable/music_note.xml new file mode 100644 index 0000000..6b6203d --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/music_note.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/music_note/materialicons/black/res/drawable/baseline_music_note_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,3v10.55c-0.59,-0.34 -1.27,-0.55 -2,-0.55 -2.21,0 -4,1.79 -4,4s1.79,4 4,4 4,-1.79 4,-4V7h4V3h-6z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/music_off.xml b/qqq/android/mobileapp/src/main/res/drawable/music_off.xml new file mode 100644 index 0000000..0a3c3df --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/music_off.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/music_off/materialicons/black/res/drawable/baseline_music_off_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M4.27,3L3,4.27l9,9v0.28c-0.59,-0.34 -1.27,-0.55 -2,-0.55 -2.21,0 -4,1.79 -4,4s1.79,4 4,4 4,-1.79 4,-4v-1.73L19.73,21 21,19.73 4.27,3zM14,7h4V3h-6v5.18l2,2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/music_video.xml b/qqq/android/mobileapp/src/main/res/drawable/music_video.xml new file mode 100644 index 0000000..836a3ea --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/music_video.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/av/music_video/materialicons/black/res/drawable/baseline_music_video_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M21,3L3,3c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h18c1.1,0 2,-0.9 2,-2L23,5c0,-1.1 -0.9,-2 -2,-2zM21,19L3,19L3,5h18v14zM8,15c0,-1.66 1.34,-3 3,-3 0.35,0 0.69,0.07 1,0.18L12,6h5v2h-3v7.03c-0.02,1.64 -1.35,2.97 -3,2.97 -1.66,0 -3,-1.34 -3,-3z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/my_location.xml b/qqq/android/mobileapp/src/main/res/drawable/my_location.xml new file mode 100644 index 0000000..38047b4 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/my_location.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/my_location/materialicons/black/res/drawable/baseline_my_location_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,8c-2.21,0 -4,1.79 -4,4s1.79,4 4,4 4,-1.79 4,-4 -1.79,-4 -4,-4zM20.94,11c-0.46,-4.17 -3.77,-7.48 -7.94,-7.94L13,1h-2v2.06C6.83,3.52 3.52,6.83 3.06,11L1,11v2h2.06c0.46,4.17 3.77,7.48 7.94,7.94L11,23h2v-2.06c4.17,-0.46 7.48,-3.77 7.94,-7.94L23,13v-2h-2.06zM12,19c-3.87,0 -7,-3.13 -7,-7s3.13,-7 7,-7 7,3.13 7,7 -3.13,7 -7,7z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/nat.xml b/qqq/android/mobileapp/src/main/res/drawable/nat.xml new file mode 100644 index 0000000..efac032 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/nat.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/communication/nat/materialicons/black/res/drawable/baseline_nat_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M6.82,13H11v-2H6.82C6.4,9.84 5.3,9 4,9c-1.66,0 -3,1.34 -3,3s1.34,3 3,3C5.3,15 6.4,14.16 6.82,13zM4,13c-0.55,0 -1,-0.45 -1,-1c0,-0.55 0.45,-1 1,-1s1,0.45 1,1C5,12.55 4.55,13 4,13z" /> + <path + android:fillColor="#FF000000" + android:pathData="M23,12l-4,-3v2h-4.05C14.45,5.95 10.19,2 5,2v2c4.42,0 8,3.58 8,8s-3.58,8 -8,8v2c5.19,0 9.45,-3.95 9.95,-9H19v2L23,12z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/nature.xml b/qqq/android/mobileapp/src/main/res/drawable/nature.xml new file mode 100644 index 0000000..445d8af --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/nature.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/nature/materialicons/black/res/drawable/baseline_nature_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M13,16.12c3.47,-0.41 6.17,-3.36 6.17,-6.95 0,-3.87 -3.13,-7 -7,-7s-7,3.13 -7,7c0,3.47 2.52,6.34 5.83,6.89V20H5v2h14v-2h-6v-3.88z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/nature_people.xml b/qqq/android/mobileapp/src/main/res/drawable/nature_people.xml new file mode 100644 index 0000000..870b320 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/nature_people.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/nature_people/materialicons/black/res/drawable/baseline_nature_people_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M22.17,9.17c0,-3.87 -3.13,-7 -7,-7s-7,3.13 -7,7c0,3.47 2.52,6.34 5.83,6.89V20H6v-3h1v-4c0,-0.55 -0.45,-1 -1,-1H3c-0.55,0 -1,0.45 -1,1v4h1v5h16v-2h-3v-3.88c3.47,-0.41 6.17,-3.36 6.17,-6.95zM4.5,11c0.83,0 1.5,-0.67 1.5,-1.5S5.33,8 4.5,8 3,8.67 3,9.5 3.67,11 4.5,11z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/navigate_before.xml b/qqq/android/mobileapp/src/main/res/drawable/navigate_before.xml new file mode 100644 index 0000000..6109521 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/navigate_before.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/navigate_before/materialicons/black/res/drawable/baseline_navigate_before_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M15.41,7.41L14,6l-6,6 6,6 1.41,-1.41L10.83,12z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/navigate_next.xml b/qqq/android/mobileapp/src/main/res/drawable/navigate_next.xml new file mode 100644 index 0000000..cec5797 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/navigate_next.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/navigate_next/materialicons/black/res/drawable/baseline_navigate_next_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M10,6L8.59,7.41 13.17,12l-4.58,4.59L10,18l6,-6z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/navigation.xml b/qqq/android/mobileapp/src/main/res/drawable/navigation.xml new file mode 100644 index 0000000..4a7b13e --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/navigation.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/navigation/materialicons/black/res/drawable/baseline_navigation_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,2L4.5,20.29l0.71,0.71L12,18l6.79,3 0.71,-0.71z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/near_me.xml b/qqq/android/mobileapp/src/main/res/drawable/near_me.xml new file mode 100644 index 0000000..79d7fc2 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/near_me.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/near_me/materialicons/black/res/drawable/baseline_near_me_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M21,3L3,10.53v0.98l6.84,2.65L12.48,21h0.98L21,3z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/near_me_disabled.xml b/qqq/android/mobileapp/src/main/res/drawable/near_me_disabled.xml new file mode 100644 index 0000000..63640df --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/near_me_disabled.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/near_me_disabled/materialicons/black/res/drawable/baseline_near_me_disabled_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,6.34L21,3l-3.34,9L12,6.34zM22.61,19.78L4.22,1.39L2.81,2.81l5.07,5.07L3,9.69v1.41l7.07,2.83L12.9,21h1.41l1.81,-4.88l5.07,5.07L22.61,19.78z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/nearby_error.xml b/qqq/android/mobileapp/src/main/res/drawable/nearby_error.xml new file mode 100644 index 0000000..178517a --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/nearby_error.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/nearby_error/materialicons/black/res/drawable/baseline_nearby_error_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,7.57l4.42,4.42L12,16.41l-4.42,-4.42L12,7.57zM12,19.19l-7.2,-7.2l7.2,-7.2l6,6V7.16l-4.58,-4.58c-0.78,-0.78 -2.05,-0.78 -2.83,0l-8.01,8c-0.78,0.78 -0.78,2.05 0,2.83l8.01,8c0.78,0.78 2.05,0.78 2.83,0L18,16.82v-3.63L12,19.19zM20,20h2v2h-2V20zM22,10h-2v8h2V10" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/nearby_off.xml b/qqq/android/mobileapp/src/main/res/drawable/nearby_off.xml new file mode 100644 index 0000000..ff70384 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/nearby_off.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/nearby_off/materialicons/black/res/drawable/baseline_nearby_off_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M21.41,13.42L18.83,16l-1.81,-1.81L19.2,12L12,4.8L9.81,6.99L8,5.17l2.58,-2.58c0.78,-0.78 2.05,-0.78 2.83,0l8,8C22.2,11.37 22.2,12.63 21.41,13.42zM21.19,21.19l-1.41,1.41L16,18.83l-2.58,2.58c-0.78,0.78 -2.05,0.78 -2.83,0l-8,-8c-0.78,-0.78 -0.78,-2.05 0,-2.83L5.17,8L1.39,4.22L2.8,2.81L21.19,21.19zM14.19,17.02l-1.39,-1.39l-0.8,0.8L7.58,12l0.8,-0.8l-1.4,-1.39L4.8,12l7.2,7.2L14.19,17.02zM16.42,12L12,7.58l-0.8,0.8l4.42,4.42L16.42,12z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/nest_cam_wired_stand.xml b/qqq/android/mobileapp/src/main/res/drawable/nest_cam_wired_stand.xml new file mode 100644 index 0000000..b7d2a9c --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/nest_cam_wired_stand.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/home/nest_cam_wired_stand/materialicons/black/res/drawable/baseline_nest_cam_wired_stand_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M15.83,1.01l-4.11,0.42C8.47,1.75 6,4.48 6,7.75s2.47,6 5.72,6.33l1.9,0.19l-0.56,0.85C12.71,15.04 12.36,15 12,15c-2.76,0 -5,2.24 -5,5v2c0,0.55 0.45,1 1,1h8c0.55,0 1,-0.45 1,-1v-2c0,-1.67 -0.83,-3.15 -2.09,-4.06l0.97,-1.45C17.02,14.56 18,13.66 18,12.5V3C18,1.83 17,0.91 15.83,1.01z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/network_cell.xml b/qqq/android/mobileapp/src/main/res/drawable/network_cell.xml new file mode 100644 index 0000000..da74e92 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/network_cell.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/network_cell/materialicons/black/res/drawable/baseline_network_cell_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M2,22h20V2L2,22zM20,20h-3V9.83l3,-3V20z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/network_check.xml b/qqq/android/mobileapp/src/main/res/drawable/network_check.xml new file mode 100644 index 0000000..da109e1 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/network_check.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/notification/network_check/materialicons/black/res/drawable/baseline_network_check_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M15.9,5c-0.17,0 -0.32,0.09 -0.41,0.23l-0.07,0.15 -5.18,11.65c-0.16,0.29 -0.26,0.61 -0.26,0.96 0,1.11 0.9,2.01 2.01,2.01 0.96,0 1.77,-0.68 1.96,-1.59l0.01,-0.03L16.4,5.5c0,-0.28 -0.22,-0.5 -0.5,-0.5zM1,9l2,2c2.88,-2.88 6.79,-4.08 10.53,-3.62l1.19,-2.68C9.89,3.84 4.74,5.27 1,9zM21,11l2,-2c-1.64,-1.64 -3.55,-2.82 -5.59,-3.57l-0.53,2.82c1.5,0.62 2.9,1.53 4.12,2.75zM17,15l2,-2c-0.8,-0.8 -1.7,-1.42 -2.66,-1.89l-0.55,2.92c0.42,0.27 0.83,0.59 1.21,0.97zM5,13l2,2c1.13,-1.13 2.56,-1.79 4.03,-2l1.28,-2.88c-2.63,-0.08 -5.3,0.87 -7.31,2.88z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/network_locked.xml b/qqq/android/mobileapp/src/main/res/drawable/network_locked.xml new file mode 100644 index 0000000..48f8591 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/network_locked.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/notification/network_locked/materialicons/black/res/drawable/baseline_network_locked_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19.5,10c0.17,0 0.33,0.03 0.5,0.05L20,1L1,20h13v-3c0,-0.89 0.39,-1.68 1,-2.23v-0.27c0,-2.48 2.02,-4.5 4.5,-4.5zM22,16v-1.5c0,-1.38 -1.12,-2.5 -2.5,-2.5S17,13.12 17,14.5L17,16c-0.55,0 -1,0.45 -1,1v4c0,0.55 0.45,1 1,1h5c0.55,0 1,-0.45 1,-1v-4c0,-0.55 -0.45,-1 -1,-1zM21,16h-3v-1.5c0,-0.83 0.67,-1.5 1.5,-1.5s1.5,0.67 1.5,1.5L21,16z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/network_ping.xml b/qqq/android/mobileapp/src/main/res/drawable/network_ping.xml new file mode 100644 index 0000000..3f74900 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/network_ping.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/network_ping/materialicons/black/res/drawable/baseline_network_ping_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,14.67L3.41,6.09L2,7.5l8.5,8.5H4v2h16v-2h-6.5l5.15,-5.15C18.91,10.95 19.2,11 19.5,11c1.38,0 2.5,-1.12 2.5,-2.5S20.88,6 19.5,6S17,7.12 17,8.5c0,0.35 0.07,0.67 0.2,0.97L12,14.67z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/network_wifi.xml b/qqq/android/mobileapp/src/main/res/drawable/network_wifi.xml new file mode 100644 index 0000000..5aa458c --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/network_wifi.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/network_wifi/materialicons/black/res/drawable/baseline_network_wifi_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M24,8.98C20.93,5.9 16.69,4 12,4C7.31,4 3.07,5.9 0,8.98L12,21v0l0,0L24,8.98zM2.92,9.07C5.51,7.08 8.67,6 12,6s6.49,1.08 9.08,3.07l-1.43,1.43C17.5,8.94 14.86,8 12,8s-5.5,0.94 -7.65,2.51L2.92,9.07z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/network_wifi_1_bar.xml b/qqq/android/mobileapp/src/main/res/drawable/network_wifi_1_bar.xml new file mode 100644 index 0000000..88e2b46 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/network_wifi_1_bar.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/network_wifi_1_bar/materialicons/black/res/drawable/baseline_network_wifi_1_bar_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,4C7.31,4 3.07,5.9 0,8.98L12,21L24,8.98C20.93,5.9 16.69,4 12,4zM15.32,14.84C14.34,14.3 13.2,14 12,14c-1.2,0 -2.34,0.3 -3.32,0.84L2.92,9.07C5.51,7.08 8.67,6 12,6s6.49,1.08 9.08,3.07L15.32,14.84z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/network_wifi_2_bar.xml b/qqq/android/mobileapp/src/main/res/drawable/network_wifi_2_bar.xml new file mode 100644 index 0000000..36db8ae --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/network_wifi_2_bar.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/network_wifi_2_bar/materialicons/black/res/drawable/baseline_network_wifi_2_bar_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,4C7.31,4 3.07,5.9 0,8.98L12,21L24,8.98C20.93,5.9 16.69,4 12,4zM16.78,13.38C15.4,12.5 13.76,12 12,12c-1.76,0 -3.4,0.5 -4.78,1.38l-4.3,-4.3C5.51,7.08 8.67,6 12,6s6.49,1.08 9.08,3.07L16.78,13.38z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/network_wifi_3_bar.xml b/qqq/android/mobileapp/src/main/res/drawable/network_wifi_3_bar.xml new file mode 100644 index 0000000..bd7af1e --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/network_wifi_3_bar.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/network_wifi_3_bar/materialicons/black/res/drawable/baseline_network_wifi_3_bar_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,4C7.31,4 3.07,5.9 0,8.98L12,21L24,8.98C20.93,5.9 16.69,4 12,4zM2.92,9.07C5.51,7.08 8.67,6 12,6s6.49,1.08 9.08,3.07l-2.85,2.86C16.46,10.71 14.31,10 12,10c-2.31,0 -4.46,0.71 -6.23,1.93L2.92,9.07z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/new_label.xml b/qqq/android/mobileapp/src/main/res/drawable/new_label.xml new file mode 100644 index 0000000..c9e06e4 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/new_label.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/new_label/materialicons/black/res/drawable/baseline_new_label_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M21,12l-4.37,6.16C16.26,18.68 15.65,19 15,19h-3l0,-6H9v-3H3V7c0,-1.1 0.9,-2 2,-2h10c0.65,0 1.26,0.31 1.63,0.84L21,12zM10,15H7v-3H5v3H2v2h3v3h2v-3h3V15z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/new_releases.xml b/qqq/android/mobileapp/src/main/res/drawable/new_releases.xml new file mode 100644 index 0000000..99ad02a --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/new_releases.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/av/new_releases/materialicons/black/res/drawable/baseline_new_releases_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M23,12l-2.44,-2.78 0.34,-3.68 -3.61,-0.82 -1.89,-3.18L12,3 8.6,1.54 6.71,4.72l-3.61,0.81 0.34,3.68L1,12l2.44,2.78 -0.34,3.69 3.61,0.82 1.89,3.18L12,21l3.4,1.46 1.89,-3.18 3.61,-0.82 -0.34,-3.68L23,12zM13,17h-2v-2h2v2zM13,13h-2L11,7h2v6z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/newspaper.xml b/qqq/android/mobileapp/src/main/res/drawable/newspaper.xml new file mode 100644 index 0000000..252bb62 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/newspaper.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/file/newspaper/materialicons/black/res/drawable/baseline_newspaper_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M22,3l-1.67,1.67L18.67,3L17,4.67L15.33,3l-1.66,1.67L12,3l-1.67,1.67L8.67,3L7,4.67L5.33,3L3.67,4.67L2,3v16c0,1.1 0.9,2 2,2l16,0c1.1,0 2,-0.9 2,-2V3zM11,19H4v-6h7V19zM20,19h-7v-2h7V19zM20,15h-7v-2h7V15zM20,11H4V8h16V11z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/next_plan.xml b/qqq/android/mobileapp/src/main/res/drawable/next_plan.xml new file mode 100644 index 0000000..d45d705 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/next_plan.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/next_plan/materialicons/black/res/drawable/baseline_next_plan_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,2C6.48,2 2,6.48 2,12c0,5.52 4.48,10 10,10s10,-4.48 10,-10C22,6.48 17.52,2 12,2zM18,13.97h-5l2.26,-2.26c-0.91,-1.06 -2.25,-1.74 -3.76,-1.74c-2.37,0 -4.35,1.66 -4.86,3.88l-0.96,-0.32c0.64,-2.62 3,-4.56 5.82,-4.56c1.78,0 3.37,0.79 4.47,2.03L18,8.97V13.97z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/next_week.xml b/qqq/android/mobileapp/src/main/res/drawable/next_week.xml new file mode 100644 index 0000000..6bfb6f4 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/next_week.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/content/next_week/materialicons/black/res/drawable/baseline_next_week_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,7h-4V5c0,-0.55 -0.22,-1.05 -0.59,-1.41C15.05,3.22 14.55,3 14,3h-4C8.9,3 8,3.9 8,5v2H4C2.9,7 2,7.9 2,9v11c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2V9C22,7.9 21.1,7 20,7zM10,5h4v2h-4V5zM11,18.5l-1,-1l3,-3l-3,-3l1,-1l4,4L11,18.5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/nfc.xml b/qqq/android/mobileapp/src/main/res/drawable/nfc.xml new file mode 100644 index 0000000..9d19d38 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/nfc.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/nfc/materialicons/black/res/drawable/baseline_nfc_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,2L4,2c-1.1,0 -2,0.9 -2,2v16c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2L22,4c0,-1.1 -0.9,-2 -2,-2zM20,20L4,20L4,4h16v16zM18,6h-5c-1.1,0 -2,0.9 -2,2v2.28c-0.6,0.35 -1,0.98 -1,1.72 0,1.1 0.9,2 2,2s2,-0.9 2,-2c0,-0.74 -0.4,-1.38 -1,-1.72L13,8h3v8L8,16L8,8h2L10,6L6,6v12h12L18,6z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/night_shelter.xml b/qqq/android/mobileapp/src/main/res/drawable/night_shelter.xml new file mode 100644 index 0000000..e509acb --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/night_shelter.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/places/night_shelter/materialicons/black/res/drawable/baseline_night_shelter_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,3L4,9v12h16V9L12,3zM9.75,12.5c0.69,0 1.25,0.56 1.25,1.25S10.44,15 9.75,15S8.5,14.44 8.5,13.75S9.06,12.5 9.75,12.5zM17,18h-1v-1.5H8V18H7v-7h1v4.5h3.5V12H15c1.1,0 2,0.9 2,2V18z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/nightlife.xml b/qqq/android/mobileapp/src/main/res/drawable/nightlife.xml new file mode 100644 index 0000000..f1d7ce7 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/nightlife.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/nightlife/materialicons/black/res/drawable/baseline_nightlife_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M1,5h14l-6,9v4h2v2H5v-2h2v-4L1,5zM10.1,9l1.4,-2H4.49l1.4,2H10.1zM17,5h5v3h-3v9h0c0,1.66 -1.34,3 -3,3s-3,-1.34 -3,-3s1.34,-3 3,-3c0.35,0 0.69,0.06 1,0.17L17,5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/nightlight.xml b/qqq/android/mobileapp/src/main/res/drawable/nightlight.xml new file mode 100644 index 0000000..0397e86 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/nightlight.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/nightlight/materialicons/black/res/drawable/baseline_nightlight_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M14,2c1.82,0 3.53,0.5 5,1.35C16.01,5.08 14,8.3 14,12s2.01,6.92 5,8.65C17.53,21.5 15.82,22 14,22C8.48,22 4,17.52 4,12S8.48,2 14,2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/nightlight_round.xml b/qqq/android/mobileapp/src/main/res/drawable/nightlight_round.xml new file mode 100644 index 0000000..ebcff11 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/nightlight_round.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/nightlight_round/materialicons/black/res/drawable/baseline_nightlight_round_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12.01,12c0,-3.57 2.2,-6.62 5.31,-7.87 0.89,-0.36 0.75,-1.69 -0.19,-1.9 -1.1,-0.24 -2.27,-0.3 -3.48,-0.14 -4.51,0.6 -8.12,4.31 -8.59,8.83C4.44,16.93 9.13,22 15.01,22c0.73,0 1.43,-0.08 2.12,-0.23 0.95,-0.21 1.1,-1.53 0.2,-1.9 -3.22,-1.29 -5.33,-4.41 -5.32,-7.87z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/nights_stay.xml b/qqq/android/mobileapp/src/main/res/drawable/nights_stay.xml new file mode 100644 index 0000000..88305dc --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/nights_stay.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/nights_stay/materialicons/black/res/drawable/baseline_nights_stay_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M11.1,12.08C8.77,7.57 10.6,3.6 11.63,2.01C6.27,2.2 1.98,6.59 1.98,12c0,0.14 0.02,0.28 0.02,0.42C2.62,12.15 3.29,12 4,12c1.66,0 3.18,0.83 4.1,2.15C9.77,14.63 11,16.17 11,18c0,1.52 -0.87,2.83 -2.12,3.51c0.98,0.32 2.03,0.5 3.11,0.5c3.5,0 6.58,-1.8 8.37,-4.52C18,17.72 13.38,16.52 11.1,12.08z" /> + <path + android:fillColor="#FF000000" + android:pathData="M7,16l-0.18,0C6.4,14.84 5.3,14 4,14c-1.66,0 -3,1.34 -3,3s1.34,3 3,3c0.62,0 2.49,0 3,0c1.1,0 2,-0.9 2,-2C9,16.9 8.1,16 7,16z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/no_accounts.xml b/qqq/android/mobileapp/src/main/res/drawable/no_accounts.xml new file mode 100644 index 0000000..5fc0abe --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/no_accounts.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/no_accounts/materialicons/black/res/drawable/baseline_no_accounts_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M15.18,10.94c0.2,-0.44 0.32,-0.92 0.32,-1.44C15.5,7.57 13.93,6 12,6c-0.52,0 -1,0.12 -1.44,0.32L15.18,10.94z" /> + <path + android:fillColor="#FF000000" + android:pathData="M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10s10,-4.48 10,-10S17.52,2 12,2zM12,15c-2.32,0 -4.45,0.8 -6.14,2.12C4.7,15.73 4,13.95 4,12c0,-1.85 0.63,-3.55 1.69,-4.9l2.86,2.86c0.21,1.56 1.43,2.79 2.99,2.99l2.2,2.2C13.17,15.05 12.59,15 12,15zM18.31,16.9L7.1,5.69C8.45,4.63 10.15,4 12,4c4.42,0 8,3.58 8,8C20,13.85 19.37,15.54 18.31,16.9z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/no_adult_content.xml b/qqq/android/mobileapp/src/main/res/drawable/no_adult_content.xml new file mode 100644 index 0000000..826740b --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/no_adult_content.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/no_adult_content/materialicons/black/res/drawable/baseline_no_adult_content_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10s10,-4.48 10,-10S17.52,2 12,2zM4,12c0,-1.85 0.63,-3.54 1.69,-4.9L7.59,9h2.83L7.1,5.69C8.46,4.63 10.15,4 12,4c4.41,0 8,3.59 8,8c0,1.85 -0.63,3.54 -1.69,4.9l-1.9,-1.9h-2.83l3.31,3.31C15.54,19.37 13.85,20 12,20C7.59,20 4,16.41 4,12z" /> + <path + android:fillColor="#FF000000" + android:pathData="M14.25,14l-1.5,-2l1.5,-2l-1.5,0l-0.75,1l-0.75,-1l-1.5,0l1.5,2l-1.5,2l1.5,0l0.75,-1l0.75,1z" /> + <path + android:fillColor="#FF000000" + android:pathData="M8,10l-0.75,1l-0.75,-1l-1.5,0l1.5,2l-1.5,2l1.5,0l0.75,-1l0.75,1l1.5,0l-1.5,-2l1.5,-2z" /> + <path + android:fillColor="#FF000000" + android:pathData="M16,14l0.75,-1l0.75,1l1.5,0l-1.5,-2l1.5,-2l-1.5,0l-0.75,1l-0.75,-1l-1.5,0l1.5,2l-1.5,2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/no_backpack.xml b/qqq/android/mobileapp/src/main/res/drawable/no_backpack.xml new file mode 100644 index 0000000..f3d4969 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/no_backpack.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/places/no_backpack/materialicons/black/res/drawable/baseline_no_backpack_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M21.19,21.19L2.81,2.81L1.39,4.22l2.76,2.76C4.06,7.31 4,7.64 4,8v12c0,1.1 0.9,2 2,2h12c0.34,0 0.65,-0.09 0.93,-0.24l0.85,0.85L21.19,21.19zM6,14v-2h3.17l2,2H6zM14.83,12L6.98,4.15c0.01,0 0.01,-0.01 0.02,-0.01V2h3v2h4V2h3v2.14c1.72,0.45 3,2 3,3.86v9.17l-2,-2V12H14.83z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/no_cell.xml b/qqq/android/mobileapp/src/main/res/drawable/no_cell.xml new file mode 100644 index 0000000..56fa0f8 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/no_cell.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/places/no_cell/materialicons/black/res/drawable/baseline_no_cell_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M8.83,6l-3.7,-3.7C5.42,1.55 6.15,1 7,1l10,0.01c1.1,0 2,0.89 2,1.99v13.17l-2,-2V6H8.83zM19.78,22.61l-0.91,-0.91C18.58,22.45 17.85,23 17,23H7c-1.1,0 -2,-0.9 -2,-2V7.83L1.39,4.22l1.41,-1.41l18.38,18.38L19.78,22.61zM15.17,18L7,9.83V18H15.17z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/no_crash.xml b/qqq/android/mobileapp/src/main/res/drawable/no_crash.xml new file mode 100644 index 0000000..c9a82f7 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/no_crash.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/no_crash/materialicons/black/res/drawable/baseline_no_crash_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M18.92,9.01C18.72,8.42 18.16,8 17.5,8h-11C5.84,8 5.29,8.42 5.08,9.01L3,15v8c0,0.55 0.45,1 1,1h1c0.55,0 1,-0.45 1,-1v-1h12v1c0,0.55 0.45,1 1,1h1c0.55,0 1,-0.45 1,-1v-8L18.92,9.01zM6.85,10h10.29l1.04,3H5.81L6.85,10zM6,17.5C6,16.67 6.67,16 7.5,16S9,16.67 9,17.5S8.33,19 7.5,19S6,18.33 6,17.5zM15,17.5c0,-0.83 0.67,-1.5 1.5,-1.5s1.5,0.67 1.5,1.5S17.33,19 16.5,19S15,18.33 15,17.5zM12,6.36L9.17,3.54l1.41,-1.41L12,3.54L15.54,0l1.41,1.41L12,6.36z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/no_drinks.xml b/qqq/android/mobileapp/src/main/res/drawable/no_drinks.xml new file mode 100644 index 0000000..44b0a3b --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/no_drinks.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/places/no_drinks/materialicons/black/res/drawable/baseline_no_drinks_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M5.83,3H21v2l-6.2,6.97L9.83,7h6.74l1.78,-2H7.83L5.83,3zM19.78,22.61L18,20.83V21H6v-2h5v-5l-1.37,-1.54L1.39,4.22l1.41,-1.41L3,3l18.19,18.19L19.78,22.61zM16.17,19L13,15.83V19H16.17z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/no_encryption.xml b/qqq/android/mobileapp/src/main/res/drawable/no_encryption.xml new file mode 100644 index 0000000..e1f7d37 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/no_encryption.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/notification/no_encryption/materialicons/black/res/drawable/baseline_no_encryption_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M21,21.78L4.22,5 3,6.22l2.04,2.04C4.42,8.6 4,9.25 4,10v10c0,1.1 0.9,2 2,2h12c0.23,0 0.45,-0.05 0.66,-0.12L19.78,23 21,21.78zM8.9,6c0,-1.71 1.39,-3.1 3.1,-3.1s3.1,1.39 3.1,3.1v2H9.66L20,18.34V10c0,-1.1 -0.9,-2 -2,-2h-1V6c0,-2.76 -2.24,-5 -5,-5 -2.56,0 -4.64,1.93 -4.94,4.4L8.9,7.24V6z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/no_encryption_gmailerrorred.xml b/qqq/android/mobileapp/src/main/res/drawable/no_encryption_gmailerrorred.xml new file mode 100644 index 0000000..23ca086 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/no_encryption_gmailerrorred.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/notification/no_encryption_gmailerrorred/materialicons/black/res/drawable/baseline_no_encryption_gmailerrorred_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M8.9,6c0,-1.71 1.39,-3.1 3.1,-3.1s3.1,1.39 3.1,3.1v2h-4.27L20,17.17V10c0,-1.1 -0.9,-2 -2,-2h-1V6c0,-2.76 -2.24,-5 -5,-5C9.79,1 7.93,2.45 7.27,4.44L8.9,6.07V6zM2.1,2.1L0.69,3.51L5.3,8.13C4.55,8.42 4,9.15 4,10v10c0,1.1 0.9,2 2,2h12c0.34,0 0.65,-0.09 0.93,-0.24l1.56,1.56l1.41,-1.41L2.1,2.1zM12,17c-1.1,0 -2,-0.9 -2,-2c0,-0.59 0.27,-1.12 0.68,-1.49l2.81,2.81C13.12,16.73 12.59,17 12,17z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/no_flash.xml b/qqq/android/mobileapp/src/main/res/drawable/no_flash.xml new file mode 100644 index 0000000..6bf9901 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/no_flash.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/places/no_flash/materialicons/black/res/drawable/baseline_no_flash_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M13.93,13.93L2.45,2.45L1.04,3.87l5.3,5.3L6.14,9.4H3.6C2.72,9.4 2,10.12 2,11v9.4C2,21.28 2.72,22 3.6,22h12.8c0.75,0 1.38,-0.52 1.55,-1.22l2.18,2.18l1.41,-1.41L18,18L13.93,13.93zM10,20c-2.21,0 -4,-1.79 -4,-4c0,-1.95 1.4,-3.57 3.25,-3.92l1.57,1.57c-0.26,-0.09 -0.53,-0.15 -0.82,-0.15c-1.38,0 -2.5,1.12 -2.5,2.5c0,1.38 1.12,2.5 2.5,2.5c1.38,0 2.5,-1.12 2.5,-2.5c0,-0.29 -0.06,-0.56 -0.15,-0.82l1.57,1.57C13.57,18.6 11.95,20 10,20zM18,15.17L10.83,8h1.75l1.28,1.4h2.54c0.88,0 1.6,0.72 1.6,1.6V15.17zM20.4,5.6H22L19,11V7h-1V2h4L20.4,5.6z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/no_food.xml b/qqq/android/mobileapp/src/main/res/drawable/no_food.xml new file mode 100644 index 0000000..a1c294a --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/no_food.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/places/no_food/materialicons/black/res/drawable/baseline_no_food_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M11.35,8.52L11,5h5V1h2v4h5l-1.38,13.79L11.35,8.52zM1,21v1c0,0.55 0.45,1 1,1h13c0.55,0 1,-0.45 1,-1v-1H1zM21.9,21.9L2.1,2.1L0.69,3.51l5.7,5.7C3.28,9.87 1,11.99 1,15h11.17l2,2H1v2h15v-0.17l4.49,4.49L21.9,21.9z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/no_luggage.xml b/qqq/android/mobileapp/src/main/res/drawable/no_luggage.xml new file mode 100644 index 0000000..a9c4955 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/no_luggage.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/no_luggage/materialicons/black/res/drawable/baseline_no_luggage_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12.75,9v0.92l1.75,1.75V9H16v4.17l3,3V8c0,-1.1 -0.9,-2 -2,-2h-2V3c0,-0.55 -0.45,-1 -1,-1h-4C9.45,2 9,2.45 9,3v3H8.83l3,3H12.75zM10.5,3.5h3V6h-3V3.5zM21.19,21.19L2.81,2.81L1.39,4.22l3.63,3.63C5.02,7.9 5,7.95 5,8v11c0,1.1 0.9,2 2,2c0,0.55 0.45,1 1,1c0.55,0 1,-0.45 1,-1h6c0,0.55 0.45,1 1,1s1,-0.45 1,-1c0.34,0 0.65,-0.09 0.93,-0.24l1.85,1.85L21.19,21.19zM8,18v-7.17l1.5,1.5V18H8zM12.75,18h-1.5v-3.92l1.5,1.5V18z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/no_meals.xml b/qqq/android/mobileapp/src/main/res/drawable/no_meals.xml new file mode 100644 index 0000000..0a086cf --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/no_meals.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/no_meals/materialicons/black/res/drawable/baseline_no_meals_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M16,14V6c0,-1.76 2.24,-4 5,-4v16.17l-2,-2V14H16zM20.49,23.31L10.02,12.85C9.69,12.94 9.36,13 9,13v9H7v-9c-2.21,0 -4,-1.79 -4,-4V5.83L0.69,3.51L2.1,2.1l19.8,19.8L20.49,23.31zM6.17,9L5,7.83V9H6.17zM9,2H7v2.17l2,2V2zM13,9V2h-2v6.17l1.85,1.85C12.94,9.69 13,9.36 13,9z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/no_meals_ouline.xml b/qqq/android/mobileapp/src/main/res/drawable/no_meals_ouline.xml new file mode 100644 index 0000000..e39388a --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/no_meals_ouline.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/no_meals_ouline/materialicons/black/res/drawable/baseline_no_meals_ouline_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M16,14V6c0,-1.76 2.24,-4 5,-4v16.17l-2,-2V14H16zM20.49,23.31L10.02,12.85C9.69,12.94 9.36,13 9,13v9H7v-9c-2.21,0 -4,-1.79 -4,-4V5.83L0.69,3.51L2.1,2.1l19.8,19.8L20.49,23.31zM6.17,9L5,7.83V9H6.17zM9,2H7v2.17l2,2V2zM13,9V2h-2v6.17l1.85,1.85C12.94,9.69 13,9.36 13,9z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/no_meeting_room.xml b/qqq/android/mobileapp/src/main/res/drawable/no_meeting_room.xml new file mode 100644 index 0000000..e4bcf8e --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/no_meeting_room.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/places/no_meeting_room/materialicons/black/res/drawable/baseline_no_meeting_room_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M11,11h-1v2h2v-1l9.73,9.73L20.46,23 14,16.54L14,21L3,21v-2h2L5,7.54l-4,-4 1.27,-1.27L11,11zM14,11.49L5.51,3L14,3v1h5v12.49l-2,-2L17,6h-3v5.49z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/no_photography.xml b/qqq/android/mobileapp/src/main/res/drawable/no_photography.xml new file mode 100644 index 0000000..871721c --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/no_photography.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/places/no_photography/materialicons/black/res/drawable/baseline_no_photography_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M10.94,8.12L7.48,4.66L9,3h6l1.83,2H20c1.1,0 2,0.9 2,2v12c0,0.05 -0.01,0.1 -0.02,0.16l-5.1,-5.1C16.96,13.71 17,13.36 17,13c0,-2.76 -2.24,-5 -5,-5C11.64,8 11.29,8.04 10.94,8.12zM20.49,23.31L18.17,21H4c-1.1,0 -2,-0.9 -2,-2V7c0,-0.59 0.27,-1.12 0.68,-1.49l-2,-2L2.1,2.1l19.8,19.8L20.49,23.31zM14.49,17.32l-1.5,-1.5C12.67,15.92 12.35,16 12,16c-1.66,0 -3,-1.34 -3,-3c0,-0.35 0.08,-0.67 0.19,-0.98l-1.5,-1.5C7.25,11.24 7,12.09 7,13c0,2.76 2.24,5 5,5C12.91,18 13.76,17.75 14.49,17.32z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/no_sim.xml b/qqq/android/mobileapp/src/main/res/drawable/no_sim.xml new file mode 100644 index 0000000..469f240 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/no_sim.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/communication/no_sim/materialicons/black/res/drawable/baseline_no_sim_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M18.99,5c0,-1.1 -0.89,-2 -1.99,-2h-7L7.66,5.34 19,16.68 18.99,5zM3.65,3.88L2.38,5.15 5,7.77V19c0,1.1 0.9,2 2,2h10.01c0.35,0 0.67,-0.1 0.96,-0.26l1.88,1.88 1.27,-1.27L3.65,3.88z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/no_stroller.xml b/qqq/android/mobileapp/src/main/res/drawable/no_stroller.xml new file mode 100644 index 0000000..4a2b40f --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/no_stroller.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/places/no_stroller/materialicons/black/res/drawable/baseline_no_stroller_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M6,18c1.1,0 2,0.9 2,2s-0.9,2 -2,2s-2,-0.9 -2,-2S4.9,18 6,18zM18.65,3c-1.66,0 -2.54,1.27 -3.18,2.03l-3.5,4.11L17,14.17v-7.9C17.58,5.59 17.97,5 18.65,5C19.42,5 20,5.66 20,6.48V7h2V6.48C22,4.56 20.52,3 18.65,3zM10.67,10.67L2.81,2.81L1.39,4.22l7.97,7.97L6.7,15.31c-0.55,0.65 -0.09,1.65 0.76,1.65h6.66l1.17,1.17C14.54,18.42 14,19.14 14,20c0,1.1 0.9,2 2,2c0.86,0 1.58,-0.54 1.87,-1.3l1.91,1.91l1.41,-1.41l-4.8,-4.8L10.67,10.67zM13.47,5.03c0.27,-0.32 0.58,-0.72 0.98,-1.09c-2.46,-1.19 -5.32,-1.22 -7.81,-0.13l4.25,4.25L13.47,5.03z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/no_transfer.xml b/qqq/android/mobileapp/src/main/res/drawable/no_transfer.xml new file mode 100644 index 0000000..336ed88 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/no_transfer.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/no_transfer/materialicons/black/res/drawable/baseline_no_transfer_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M21.19,21.19L2.81,2.81L1.39,4.22L4,6.83V16c0,0.88 0.39,1.67 1,2.22V20c0,0.55 0.45,1 1,1h1c0.55,0 1,-0.45 1,-1v-1h8v1c0,0.55 0.45,1 1,1h1c0.05,0 0.09,-0.02 0.14,-0.03l1.64,1.64L21.19,21.19zM7.5,17C6.67,17 6,16.33 6,15.5C6,14.67 6.67,14 7.5,14S9,14.67 9,15.5C9,16.33 8.33,17 7.5,17zM6,11V8.83L8.17,11H6zM8.83,6L5.78,2.95C7.24,2.16 9.48,2 12,2c4.42,0 8,0.5 8,4v10c0,0.35 -0.08,0.67 -0.19,0.98L13.83,11H18V6H8.83z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/noise_aware.xml b/qqq/android/mobileapp/src/main/res/drawable/noise_aware.xml new file mode 100644 index 0000000..b033448 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/noise_aware.xml @@ -0,0 +1,64 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/noise_aware/materialicons/black/res/drawable/baseline_noise_aware_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M16,15h-2c0,0.55 -0.45,1 -1,1c-0.43,0 -0.81,-0.27 -0.95,-0.68c-0.15,-0.44 -0.4,-1.08 -0.93,-1.61l-1.36,-1.36C9.28,11.87 9,11.19 9,10.5C9,9.12 10.12,8 11.5,8c1.21,0 2.22,0.86 2.45,2h2.02c-0.25,-2.25 -2.16,-4 -4.47,-4C9.02,6 7,8.02 7,10.5c0,1.22 0.49,2.41 1.35,3.27l1.36,1.36c0.17,0.17 0.31,0.44 0.44,0.82C10.56,17.17 11.71,18 13,18C14.65,18 16,16.65 16,15z" /> + <path + android:fillColor="#FF000000" + android:pathData="M13.5,12.5m-1.5,0a1.5,1.5 0,1 1,3 0a1.5,1.5 0,1 1,-3 0" /> + <path + android:fillColor="#FF000000" + android:pathData="M3.6,6.58l1.58,1.26c0.35,-0.57 0.77,-1.1 1.24,-1.57L4.85,5.02C4.38,5.49 3.97,6.02 3.6,6.58z" /> + <path + android:fillColor="#FF000000" + android:pathData="M9.46,4.42L8.59,2.61c-0.63,0.23 -1.24,0.52 -1.8,0.87l0.87,1.81C8.22,4.93 8.82,4.64 9.46,4.42z" /> + <path + android:fillColor="#FF000000" + android:pathData="M4.49,9.26L2.53,8.81c-0.21,0.63 -0.36,1.28 -0.44,1.95l1.96,0.45C4.11,10.53 4.27,9.88 4.49,9.26z" /> + <path + android:fillColor="#FF000000" + android:pathData="M20.4,6.58c-0.36,-0.56 -0.78,-1.09 -1.25,-1.56l-1.58,1.26c0.48,0.47 0.89,0.99 1.24,1.57L20.4,6.58z" /> + <path + android:fillColor="#FF000000" + android:pathData="M4.04,12.79l-1.96,0.45c0.08,0.67 0.23,1.33 0.44,1.95l1.97,-0.45C4.27,14.12 4.11,13.47 4.04,12.79z" /> + <path + android:fillColor="#FF000000" + android:pathData="M17.21,3.48c-0.57,-0.35 -1.17,-0.64 -1.8,-0.87l-0.87,1.81c0.64,0.22 1.24,0.51 1.8,0.87L17.21,3.48z" /> + <path + android:fillColor="#FF000000" + android:pathData="M13,4.07V2.05C12.67,2.02 12.34,2 12,2s-0.67,0.02 -1,0.05v2.02C11.33,4.03 11.66,4 12,4S12.67,4.03 13,4.07z" /> + <path + android:fillColor="#FF000000" + android:pathData="M11,19.93v2.02c0.33,0.03 0.66,0.05 1,0.05s0.67,-0.02 1,-0.05v-2.02C12.67,19.97 12.34,20 12,20S11.33,19.97 11,19.93z" /> + <path + android:fillColor="#FF000000" + android:pathData="M19.51,14.74l1.97,0.45c0.21,-0.63 0.36,-1.28 0.44,-1.95l-1.96,-0.45C19.89,13.47 19.73,14.12 19.51,14.74z" /> + <path + android:fillColor="#FF000000" + android:pathData="M19.96,11.21l1.96,-0.45c-0.08,-0.67 -0.23,-1.33 -0.44,-1.95l-1.97,0.45C19.73,9.88 19.89,10.53 19.96,11.21z" /> + <path + android:fillColor="#FF000000" + android:pathData="M17.58,17.73l1.58,1.26c0.47,-0.48 0.88,-1 1.25,-1.56l-1.58,-1.26C18.47,16.73 18.05,17.26 17.58,17.73z" /> + <path + android:fillColor="#FF000000" + android:pathData="M6.79,20.52c0.57,0.35 1.17,0.64 1.8,0.87l0.87,-1.81c-0.64,-0.22 -1.24,-0.51 -1.8,-0.87L6.79,20.52z" /> + <path + android:fillColor="#FF000000" + android:pathData="M14.54,19.58l0.87,1.81c0.63,-0.23 1.24,-0.52 1.8,-0.87l-0.87,-1.81C15.78,19.07 15.18,19.36 14.54,19.58z" /> + <path + android:fillColor="#FF000000" + android:pathData="M3.6,17.42c0.36,0.56 0.78,1.09 1.25,1.56l1.58,-1.26c-0.48,-0.47 -0.89,-0.99 -1.24,-1.57L3.6,17.42z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/noise_control_off.xml b/qqq/android/mobileapp/src/main/res/drawable/noise_control_off.xml new file mode 100644 index 0000000..af161dd --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/noise_control_off.xml @@ -0,0 +1,34 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/noise_control_off/materialicons/black/res/drawable/baseline_noise_control_off_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,4c1.44,0 2.79,0.38 3.95,1.05l1.45,-1.45C15.85,2.59 13.99,2 12,2S8.15,2.59 6.59,3.59l1.45,1.45C9.21,4.38 10.56,4 12,4z" /> + <path + android:fillColor="#FF000000" + android:pathData="M20,12c0,1.44 -0.38,2.79 -1.05,3.95l1.45,1.45C21.41,15.85 22,13.99 22,12s-0.59,-3.85 -1.59,-5.41l-1.45,1.45C19.62,9.21 20,10.56 20,12z" /> + <path + android:fillColor="#FF000000" + android:pathData="M12,20c-1.44,0 -2.79,-0.38 -3.95,-1.05l-1.45,1.45C8.15,21.41 10.01,22 12,22s3.85,-0.59 5.41,-1.59l-1.45,-1.45C14.79,19.62 13.44,20 12,20z" /> + <path + android:fillColor="#FF000000" + android:pathData="M4,12c0,-1.44 0.38,-2.79 1.05,-3.95L3.59,6.59C2.59,8.15 2,10.01 2,12s0.59,3.85 1.59,5.41l1.45,-1.45C4.38,14.79 4,13.44 4,12z" /> + <path + android:fillColor="#FF000000" + android:pathData="M11.5,6C9.02,6 7,8.02 7,10.5c0,1.22 0.49,2.41 1.35,3.27l1.36,1.36c0.17,0.17 0.31,0.44 0.44,0.82C10.56,17.17 11.71,18 13,18c1.65,0 3,-1.35 3,-3h-2c0,0.55 -0.45,1 -1,1c-0.43,0 -0.81,-0.27 -0.95,-0.68c-0.15,-0.44 -0.4,-1.08 -0.93,-1.61l-1.36,-1.36C9.28,11.87 9,11.19 9,10.5C9,9.12 10.12,8 11.5,8c1.21,0 2.22,0.86 2.45,2h2.02C15.72,7.75 13.81,6 11.5,6z" /> + <path + android:fillColor="#FF000000" + android:pathData="M13.5,12.5m-1.5,0a1.5,1.5 0,1 1,3 0a1.5,1.5 0,1 1,-3 0" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/nordic_walking.xml b/qqq/android/mobileapp/src/main/res/drawable/nordic_walking.xml new file mode 100644 index 0000000..fd635a2 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/nordic_walking.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/nordic_walking/materialicons/black/res/drawable/baseline_nordic_walking_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19,23h-1.5v-9H19V23zM7.53,14H6l-2,9h1.53L7.53,14zM13.5,5.5c1.1,0 2,-0.9 2,-2s-0.9,-2 -2,-2s-2,0.9 -2,2S12.4,5.5 13.5,5.5zM9.8,8.9L7,23h2.1l1.8,-8l2.1,2v6h2v-7.5l-2.1,-2l0.6,-3C14.8,12 16.8,13 19,13v-2c-1.9,0 -3.5,-1 -4.3,-2.4l-1,-1.6c-0.56,-0.89 -1.68,-1.25 -2.65,-0.84L6,8.3V13h2V9.6L9.8,8.9z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/north.xml b/qqq/android/mobileapp/src/main/res/drawable/north.xml new file mode 100644 index 0000000..586f544 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/north.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/navigation/north/materialicons/black/res/drawable/baseline_north_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M5,9l1.41,1.41L11,5.83V22H13V5.83l4.59,4.59L19,9l-7,-7L5,9z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/north_east.xml b/qqq/android/mobileapp/src/main/res/drawable/north_east.xml new file mode 100644 index 0000000..3a7e2b7 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/north_east.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/navigation/north_east/materialicons/black/res/drawable/baseline_north_east_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M9,5v2h6.59L4,18.59L5.41,20L17,8.41V15h2V5H9z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/north_west.xml b/qqq/android/mobileapp/src/main/res/drawable/north_west.xml new file mode 100644 index 0000000..67b390c --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/north_west.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/navigation/north_west/materialicons/black/res/drawable/baseline_north_west_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M5,15h2V8.41L18.59,20L20,18.59L8.41,7H15V5H5V15z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/not_accessible.xml b/qqq/android/mobileapp/src/main/res/drawable/not_accessible.xml new file mode 100644 index 0000000..8277101 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/not_accessible.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/not_accessible/materialicons/black/res/drawable/baseline_not_accessible_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M14,11.05l-3.42,-3.42c0.32,-0.34 0.74,-0.57 1.23,-0.61c0.48,-0.04 0.84,0.07 1.2,0.26c0.19,0.1 0.39,0.22 0.63,0.46l1.29,1.43c0.98,1.08 2.53,1.85 4.07,1.83v2C17.25,12.99 15.29,12.12 14,11.05zM12,6c1.1,0 2,-0.9 2,-2s-0.9,-2 -2,-2c-1.1,0 -2,0.9 -2,2S10.9,6 12,6zM2.81,2.81L1.39,4.22L10,12.83V15c0,1.1 0.9,2 2,2h2.17l5.61,5.61l1.41,-1.41L2.81,2.81zM10,20c-1.66,0 -3,-1.34 -3,-3c0,-1.31 0.84,-2.41 2,-2.83V12.1c-2.28,0.46 -4,2.48 -4,4.9c0,2.76 2.24,5 5,5c2.42,0 4.44,-1.72 4.9,-4h-2.07C12.42,19.16 11.31,20 10,20z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/not_interested.xml b/qqq/android/mobileapp/src/main/res/drawable/not_interested.xml new file mode 100644 index 0000000..6340730 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/not_interested.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/av/not_interested/materialicons/black/res/drawable/baseline_not_interested_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM12,20c-4.42,0 -8,-3.58 -8,-8 0,-1.85 0.63,-3.55 1.69,-4.9L16.9,18.31C15.55,19.37 13.85,20 12,20zM18.31,16.9L7.1,5.69C8.45,4.63 10.15,4 12,4c4.42,0 8,3.58 8,8 0,1.85 -0.63,3.55 -1.69,4.9z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/not_listed_location.xml b/qqq/android/mobileapp/src/main/res/drawable/not_listed_location.xml new file mode 100644 index 0000000..f0e2c0e --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/not_listed_location.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/not_listed_location/materialicons/black/res/drawable/baseline_not_listed_location_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,2C8.14,2 5,5.14 5,9c0,5.25 7,13 7,13s7,-7.75 7,-13c0,-3.86 -3.14,-7 -7,-7zM12.88,15.75h-1.75L11.13,14h1.75v1.75zM12.88,12.88h-1.75c0,-2.84 2.62,-2.62 2.62,-4.38 0,-0.96 -0.79,-1.75 -1.75,-1.75s-1.75,0.79 -1.75,1.75L8.5,8.5C8.5,6.57 10.07,5 12,5s3.5,1.57 3.5,3.5c0,2.19 -2.62,2.41 -2.62,4.38z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/not_started.xml b/qqq/android/mobileapp/src/main/res/drawable/not_started.xml new file mode 100644 index 0000000..ba19ef3 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/not_started.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/not_started/materialicons/black/res/drawable/baseline_not_started_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,2C6.48,2 2,6.48 2,12c0,5.52 4.48,10 10,10s10,-4.48 10,-10C22,6.48 17.52,2 12,2zM11,16H9V8h2V16zM12,16V8l5,4L12,16z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/note.xml b/qqq/android/mobileapp/src/main/res/drawable/note.xml new file mode 100644 index 0000000..a206c0c --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/note.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/av/note/materialicons/black/res/drawable/baseline_note_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M22,10l-6,-6L4,4c-1.1,0 -2,0.9 -2,2v12.01c0,1.1 0.9,1.99 2,1.99l16,-0.01c1.1,0 2,-0.89 2,-1.99v-8zM15,5.5l5.5,5.5L15,11L15,5.5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/note_add.xml b/qqq/android/mobileapp/src/main/res/drawable/note_add.xml new file mode 100644 index 0000000..6e45c4e --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/note_add.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/note_add/materialicons/black/res/drawable/baseline_note_add_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M14,2L6,2c-1.1,0 -1.99,0.9 -1.99,2L4,20c0,1.1 0.89,2 1.99,2L18,22c1.1,0 2,-0.9 2,-2L20,8l-6,-6zM16,16h-3v3h-2v-3L8,16v-2h3v-3h2v3h3v2zM13,9L13,3.5L18.5,9L13,9z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/note_alt.xml b/qqq/android/mobileapp/src/main/res/drawable/note_alt.xml new file mode 100644 index 0000000..587aef5 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/note_alt.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/note_alt/materialicons/black/res/drawable/baseline_note_alt_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19,3h-4.18C14.4,1.84 13.3,1 12,1S9.6,1.84 9.18,3H5C3.9,3 3,3.9 3,5v14c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2V5C21,3.9 20.1,3 19,3zM12,2.75c0.41,0 0.75,0.34 0.75,0.75S12.41,4.25 12,4.25s-0.75,-0.34 -0.75,-0.75S11.59,2.75 12,2.75zM9.1,17H7v-2.14l5.96,-5.96l2.12,2.12L9.1,17zM16.85,9.27l-1.06,1.06l-2.12,-2.12l1.06,-1.06c0.2,-0.2 0.51,-0.2 0.71,0l1.41,1.41C17.05,8.76 17.05,9.07 16.85,9.27z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/notes.xml b/qqq/android/mobileapp/src/main/res/drawable/notes.xml new file mode 100644 index 0000000..7b3e83e --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/notes.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/editor/notes/materialicons/black/res/drawable/baseline_notes_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M3,18h12v-2L3,16v2zM3,6v2h18L21,6L3,6zM3,13h18v-2L3,11v2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/notification_add.xml b/qqq/android/mobileapp/src/main/res/drawable/notification_add.xml new file mode 100644 index 0000000..43c8abe --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/notification_add.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/notification_add/materialicons/black/res/drawable/baseline_notification_add_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M10,20h4c0,1.1 -0.9,2 -2,2S10,21.1 10,20zM14,9c0,2.61 1.67,4.83 4,5.66L18,17h2v2H4v-2h2v-7c0,-2.79 1.91,-5.14 4.5,-5.8V3.5C10.5,2.67 11.17,2 12,2s1.5,0.67 1.5,1.5v0.7c0.71,0.18 1.36,0.49 1.95,0.9C14.54,6.14 14,7.51 14,9zM24,8h-3V5h-2v3h-3v2h3v3h2v-3h3V8z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/notification_important.xml b/qqq/android/mobileapp/src/main/res/drawable/notification_important.xml new file mode 100644 index 0000000..1830f07 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/notification_important.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/alert/notification_important/materialicons/black/res/drawable/baseline_notification_important_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M18,16v-5c0,-3.07 -1.64,-5.64 -4.5,-6.32L13.5,4c0,-0.83 -0.67,-1.5 -1.5,-1.5s-1.5,0.67 -1.5,1.5v0.68C7.63,5.36 6,7.92 6,11v5l-2,2v1h16v-1l-2,-2zM13,16h-2v-2h2v2zM13,12h-2L11,8h2v4zM12,22c1.1,0 2,-0.9 2,-2h-4c0,1.1 0.89,2 2,2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/notifications.xml b/qqq/android/mobileapp/src/main/res/drawable/notifications.xml new file mode 100644 index 0000000..ae3073e --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/notifications.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/notifications/materialicons/black/res/drawable/baseline_notifications_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,22c1.1,0 2,-0.9 2,-2h-4c0,1.1 0.89,2 2,2zM18,16v-5c0,-3.07 -1.64,-5.64 -4.5,-6.32L13.5,4c0,-0.83 -0.67,-1.5 -1.5,-1.5s-1.5,0.67 -1.5,1.5v0.68C7.63,5.36 6,7.92 6,11v5l-2,2v1h16v-1l-2,-2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/notifications_active.xml b/qqq/android/mobileapp/src/main/res/drawable/notifications_active.xml new file mode 100644 index 0000000..4a63d91 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/notifications_active.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/notifications_active/materialicons/black/res/drawable/baseline_notifications_active_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M7.58,4.08L6.15,2.65C3.75,4.48 2.17,7.3 2.03,10.5h2c0.15,-2.65 1.51,-4.97 3.55,-6.42zM19.97,10.5h2c-0.15,-3.2 -1.73,-6.02 -4.12,-7.85l-1.42,1.43c2.02,1.45 3.39,3.77 3.54,6.42zM18,11c0,-3.07 -1.64,-5.64 -4.5,-6.32L13.5,4c0,-0.83 -0.67,-1.5 -1.5,-1.5s-1.5,0.67 -1.5,1.5v0.68C7.63,5.36 6,7.92 6,11v5l-2,2v1h16v-1l-2,-2v-5zM12,22c0.14,0 0.27,-0.01 0.4,-0.04 0.65,-0.14 1.18,-0.58 1.44,-1.18 0.1,-0.24 0.15,-0.5 0.15,-0.78h-4c0.01,1.1 0.9,2 2.01,2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/notifications_none.xml b/qqq/android/mobileapp/src/main/res/drawable/notifications_none.xml new file mode 100644 index 0000000..984e05d --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/notifications_none.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/notifications_none/materialicons/black/res/drawable/baseline_notifications_none_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,22c1.1,0 2,-0.9 2,-2h-4c0,1.1 0.9,2 2,2zM18,16v-5c0,-3.07 -1.63,-5.64 -4.5,-6.32L13.5,4c0,-0.83 -0.67,-1.5 -1.5,-1.5s-1.5,0.67 -1.5,1.5v0.68C7.64,5.36 6,7.92 6,11v5l-2,2v1h16v-1l-2,-2zM16,17L8,17v-6c0,-2.48 1.51,-4.5 4,-4.5s4,2.02 4,4.5v6z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/notifications_off.xml b/qqq/android/mobileapp/src/main/res/drawable/notifications_off.xml new file mode 100644 index 0000000..472bdb6 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/notifications_off.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/notifications_off/materialicons/black/res/drawable/baseline_notifications_off_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,18.69L7.84,6.14 5.27,3.49 4,4.76l2.8,2.8v0.01c-0.52,0.99 -0.8,2.16 -0.8,3.42v5l-2,2v1h13.73l2,2L21,19.72l-1,-1.03zM12,22c1.11,0 2,-0.89 2,-2h-4c0,1.11 0.89,2 2,2zM18,14.68L18,11c0,-3.08 -1.64,-5.64 -4.5,-6.32L13.5,4c0,-0.83 -0.67,-1.5 -1.5,-1.5s-1.5,0.67 -1.5,1.5v0.68c-0.15,0.03 -0.29,0.08 -0.42,0.12 -0.1,0.03 -0.2,0.07 -0.3,0.11h-0.01c-0.01,0 -0.01,0 -0.02,0.01 -0.23,0.09 -0.46,0.2 -0.68,0.31 0,0 -0.01,0 -0.01,0.01L18,14.68z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/notifications_paused.xml b/qqq/android/mobileapp/src/main/res/drawable/notifications_paused.xml new file mode 100644 index 0000000..6600ada --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/notifications_paused.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/notifications_paused/materialicons/black/res/drawable/baseline_notifications_paused_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,22c1.1,0 2,-0.9 2,-2h-4c0,1.1 0.89,2 2,2zM18,16v-5c0,-3.07 -1.64,-5.64 -4.5,-6.32L13.5,4c0,-0.83 -0.67,-1.5 -1.5,-1.5s-1.5,0.67 -1.5,1.5v0.68C7.63,5.36 6,7.93 6,11v5l-2,2v1h16v-1l-2,-2zM14.5,9.8l-2.8,3.4h2.8L14.5,15h-5v-1.8l2.8,-3.4L9.5,9.8L9.5,8h5v1.8z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/numbers.xml b/qqq/android/mobileapp/src/main/res/drawable/numbers.xml new file mode 100644 index 0000000..99ec26a --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/numbers.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/editor/numbers/materialicons/black/res/drawable/baseline_numbers_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20.5,10L21,8h-4l1,-4h-2l-1,4h-4l1,-4h-2L9,8H5l-0.5,2h4l-1,4h-4L3,16h4l-1,4h2l1,-4h4l-1,4h2l1,-4h4l0.5,-2h-4l1,-4H20.5zM13.5,14h-4l1,-4h4L13.5,14z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/offline_bolt.xml b/qqq/android/mobileapp/src/main/res/drawable/offline_bolt.xml new file mode 100644 index 0000000..cac5339 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/offline_bolt.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/offline_bolt/materialicons/black/res/drawable/baseline_offline_bolt_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,2.02c-5.51,0 -9.98,4.47 -9.98,9.98s4.47,9.98 9.98,9.98 9.98,-4.47 9.98,-9.98S17.51,2.02 12,2.02zM11.48,20v-6.26H8L13,4v6.26h3.35L11.48,20z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/offline_pin.xml b/qqq/android/mobileapp/src/main/res/drawable/offline_pin.xml new file mode 100644 index 0000000..c86b451 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/offline_pin.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/offline_pin/materialicons/black/res/drawable/baseline_offline_pin_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,2C6.5,2 2,6.5 2,12s4.5,10 10,10s10,-4.5 10,-10S17.5,2 12,2zM17,18H7v-2h10V18zM10.3,14L7,10.7l1.4,-1.4l1.9,1.9l5.3,-5.3L17,7.3L10.3,14z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/offline_share.xml b/qqq/android/mobileapp/src/main/res/drawable/offline_share.xml new file mode 100644 index 0000000..6d548df --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/offline_share.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/navigation/offline_share/materialicons/black/res/drawable/baseline_offline_share_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M14.6,10.26v1.31L17,9.33 14.6,7.1v1.28c-2.33,0.32 -3.26,1.92 -3.6,3.52 0.83,-1.13 1.93,-1.64 3.6,-1.64zM16,23L6,23c-1.1,0 -2,-0.9 -2,-2L4,5h2v16h10v2zM18,1h-8c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h8c1.1,0 2,-0.9 2,-2L20,3c0,-1.1 -0.9,-2 -2,-2zM18,16h-8L10,4h8v12z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/oil_barrel.xml b/qqq/android/mobileapp/src/main/res/drawable/oil_barrel.xml new file mode 100644 index 0000000..10028de --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/oil_barrel.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/home/oil_barrel/materialicons/black/res/drawable/baseline_oil_barrel_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,13c0.55,0 1,-0.45 1,-1s-0.45,-1 -1,-1h-1V5h1c0.55,0 1,-0.45 1,-1s-0.45,-1 -1,-1H4C3.45,3 3,3.45 3,4s0.45,1 1,1h1v6H4c-0.55,0 -1,0.45 -1,1s0.45,1 1,1h1v6H4c-0.55,0 -1,0.45 -1,1s0.45,1 1,1h16c0.55,0 1,-0.45 1,-1s-0.45,-1 -1,-1h-1v-6H20zM12,16c-1.66,0 -3,-1.32 -3,-2.95c0,-1.3 0.52,-1.67 3,-4.55c2.47,2.86 3,3.24 3,4.55C15,14.68 13.66,16 12,16z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/on_device_training.xml b/qqq/android/mobileapp/src/main/res/drawable/on_device_training.xml new file mode 100644 index 0000000..4f68ae7 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/on_device_training.xml @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/on_device_training/materialicons/black/res/drawable/baseline_on_device_training_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M11,16h2v1h-2z" /> + <path + android:fillColor="#FF000000" + android:pathData="M12,11c-1.1,0 -2,0.9 -2,2c0,0.74 0.4,1.38 1,1.72v0.78h2v-0.78c0.6,-0.35 1,-0.98 1,-1.72C14,11.9 13.1,11 12,11z" /> + <path + android:fillColor="#FF000000" + android:pathData="M18,1.01L6,1C4.9,1 4,1.9 4,3v18c0,1.1 0.9,2 2,2h12c1.1,0 2,-0.9 2,-2V3C20,1.9 19.1,1.01 18,1.01zM18,18H6V6h12V18z" /> + <path + android:fillColor="#FF000000" + android:pathData="M16.01,15.95C16.63,15.12 17,14.11 17,13s-0.37,-2.12 -0.99,-2.95l-1.07,1.07c0.35,0.54 0.56,1.19 0.56,1.88s-0.21,1.34 -0.56,1.88L16.01,15.95z" /> + <path + android:fillColor="#FF000000" + android:pathData="M9.06,14.88C8.71,14.34 8.5,13.69 8.5,13c0,-1.93 1.57,-3.5 3.5,-3.5v1.25l2.25,-2l-2.25,-2V8c-2.76,0 -5,2.24 -5,5c0,1.11 0.37,2.12 0.99,2.95L9.06,14.88z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/ondemand_video.xml b/qqq/android/mobileapp/src/main/res/drawable/ondemand_video.xml new file mode 100644 index 0000000..492ace3 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/ondemand_video.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/notification/ondemand_video/materialicons/black/res/drawable/baseline_ondemand_video_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M21,3L3,3c-1.11,0 -2,0.89 -2,2v12c0,1.1 0.89,2 2,2h5v2h8v-2h5c1.1,0 1.99,-0.9 1.99,-2L23,5c0,-1.11 -0.9,-2 -2,-2zM21,17L3,17L3,5h18v12zM16,11l-7,4L9,7z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/online_prediction.xml b/qqq/android/mobileapp/src/main/res/drawable/online_prediction.xml new file mode 100644 index 0000000..79594d7 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/online_prediction.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/online_prediction/materialicons/black/res/drawable/baseline_online_prediction_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M15.5,11.5c0,2 -2.5,3.5 -2.5,5h-2c0,-1.5 -2.5,-3 -2.5,-5C8.5,9.57 10.07,8 12,8S15.5,9.57 15.5,11.5zM13,17.5h-2V19h2V17.5zM22,12c0,-2.76 -1.12,-5.26 -2.93,-7.07l-1.06,1.06C19.55,7.53 20.5,9.66 20.5,12c0,2.34 -0.95,4.47 -2.49,6.01l1.06,1.06C20.88,17.26 22,14.76 22,12zM3.5,12c0,-2.34 0.95,-4.47 2.49,-6.01L4.93,4.93C3.12,6.74 2,9.24 2,12c0,2.76 1.12,5.26 2.93,7.07l1.06,-1.06C4.45,16.47 3.5,14.34 3.5,12zM17.5,12c0,1.52 -0.62,2.89 -1.61,3.89l1.06,1.06C18.22,15.68 19,13.93 19,12c0,-1.93 -0.78,-3.68 -2.05,-4.95l-1.06,1.06C16.88,9.11 17.5,10.48 17.5,12zM7.05,16.95l1.06,-1.06c-1,-1 -1.61,-2.37 -1.61,-3.89c0,-1.52 0.62,-2.89 1.61,-3.89L7.05,7.05C5.78,8.32 5,10.07 5,12C5,13.93 5.78,15.68 7.05,16.95z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/opacity.xml b/qqq/android/mobileapp/src/main/res/drawable/opacity.xml new file mode 100644 index 0000000..05a4c69 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/opacity.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/opacity/materialicons/black/res/drawable/baseline_opacity_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M17.66,8L12,2.35 6.34,8C4.78,9.56 4,11.64 4,13.64s0.78,4.11 2.34,5.67 3.61,2.35 5.66,2.35 4.1,-0.79 5.66,-2.35S20,15.64 20,13.64 19.22,9.56 17.66,8zM6,14c0.01,-2 0.62,-3.27 1.76,-4.4L12,5.27l4.24,4.38C17.38,10.77 17.99,12 18,14H6z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/open_in_browser.xml b/qqq/android/mobileapp/src/main/res/drawable/open_in_browser.xml new file mode 100644 index 0000000..4f1a809 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/open_in_browser.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/open_in_browser/materialicons/black/res/drawable/baseline_open_in_browser_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19,4L5,4c-1.11,0 -2,0.9 -2,2v12c0,1.1 0.89,2 2,2h4v-2L5,18L5,8h14v10h-4v2h4c1.1,0 2,-0.9 2,-2L21,6c0,-1.1 -0.89,-2 -2,-2zM12,10l-4,4h3v6h2v-6h3l-4,-4z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/open_in_full.xml b/qqq/android/mobileapp/src/main/res/drawable/open_in_full.xml new file mode 100644 index 0000000..9075acf --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/open_in_full.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/open_in_full/materialicons/black/res/drawable/baseline_open_in_full_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M21,11l0,-8l-8,0l3.29,3.29l-10,10l-3.29,-3.29l0,8l8,0l-3.29,-3.29l10,-10z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/open_in_new.xml b/qqq/android/mobileapp/src/main/res/drawable/open_in_new.xml new file mode 100644 index 0000000..a303921 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/open_in_new.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/open_in_new/materialicons/black/res/drawable/baseline_open_in_new_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19,19H5V5h7V3H5c-1.11,0 -2,0.9 -2,2v14c0,1.1 0.89,2 2,2h14c1.1,0 2,-0.9 2,-2v-7h-2v7zM14,3v2h3.59l-9.83,9.83 1.41,1.41L19,6.41V10h2V3h-7z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/open_in_new_off.xml b/qqq/android/mobileapp/src/main/res/drawable/open_in_new_off.xml new file mode 100644 index 0000000..58d5bbc --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/open_in_new_off.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/open_in_new_off/materialicons/black/res/drawable/baseline_open_in_new_off_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M16.79,5.8L14,3h7v7l-2.79,-2.8l-4.09,4.09l-1.41,-1.41L16.79,5.8zM19,12v4.17l2,2V12H19zM19.78,22.61L18.17,21H5c-1.11,0 -2,-0.9 -2,-2V5.83L1.39,4.22l1.41,-1.41l18.38,18.38L19.78,22.61zM16.17,19l-4.88,-4.88L9.7,15.71L8.29,14.3l1.59,-1.59L5,7.83V19H16.17zM7.83,5H12V3H5.83L7.83,5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/open_with.xml b/qqq/android/mobileapp/src/main/res/drawable/open_with.xml new file mode 100644 index 0000000..43b5882 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/open_with.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/open_with/materialicons/black/res/drawable/baseline_open_with_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M10,9h4L14,6h3l-5,-5 -5,5h3v3zM9,10L6,10L6,7l-5,5 5,5v-3h3v-4zM23,12l-5,-5v3h-3v4h3v3l5,-5zM14,15h-4v3L7,18l5,5 5,-5h-3v-3z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/other_houses.xml b/qqq/android/mobileapp/src/main/res/drawable/other_houses.xml new file mode 100644 index 0000000..6181100 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/other_houses.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/places/other_houses/materialicons/black/res/drawable/baseline_other_houses_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,3L1,11.4l1.21,1.59L4,11.62V21h16v-9.38l1.79,1.36L23,11.4L12,3zM8,15c-0.55,0 -1,-0.45 -1,-1c0,-0.55 0.45,-1 1,-1s1,0.45 1,1C9,14.55 8.55,15 8,15zM12,15c-0.55,0 -1,-0.45 -1,-1c0,-0.55 0.45,-1 1,-1s1,0.45 1,1C13,14.55 12.55,15 12,15zM16,15c-0.55,0 -1,-0.45 -1,-1c0,-0.55 0.45,-1 1,-1s1,0.45 1,1C17,14.55 16.55,15 16,15z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/outbond.xml b/qqq/android/mobileapp/src/main/res/drawable/outbond.xml new file mode 100644 index 0000000..6c29bec --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/outbond.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/outbond/materialicons/black/res/drawable/baseline_outbond_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,2C6.48,2 2,6.48 2,12c0,5.52 4.48,10 10,10s10,-4.48 10,-10C22,6.48 17.52,2 12,2zM13.88,11.54l-4.96,4.96l-1.41,-1.41l4.96,-4.96L10.34,8l5.65,0.01L16,13.66L13.88,11.54z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/outbound.xml b/qqq/android/mobileapp/src/main/res/drawable/outbound.xml new file mode 100644 index 0000000..d466d17 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/outbound.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/outbound/materialicons/black/res/drawable/baseline_outbound_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,2C6.48,2 2,6.48 2,12c0,5.52 4.48,10 10,10s10,-4.48 10,-10C22,6.48 17.52,2 12,2zM13.88,11.54l-4.96,4.96l-1.41,-1.41l4.96,-4.96L10.34,8l5.65,0.01L16,13.66L13.88,11.54z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/outbox.xml b/qqq/android/mobileapp/src/main/res/drawable/outbox.xml new file mode 100644 index 0000000..f22b7e4 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/outbox.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/outbox/materialicons/black/res/drawable/baseline_outbox_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19,3L4.99,3c-1.11,0 -1.98,0.9 -1.98,2L3,19c0,1.1 0.88,2 1.99,2L19,21c1.1,0 2,-0.9 2,-2L21,5c0,-1.1 -0.9,-2 -2,-2zM19,15h-4c0,1.66 -1.35,3 -3,3s-3,-1.34 -3,-3L4.99,15L4.99,5L19,5v10zM8,11h2v3h4v-3h2l-4,-4 -4,4z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/outdoor_grill.xml b/qqq/android/mobileapp/src/main/res/drawable/outdoor_grill.xml new file mode 100644 index 0000000..b38dedd --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/outdoor_grill.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/outdoor_grill/materialicons/black/res/drawable/baseline_outdoor_grill_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M17,22c1.66,0 3,-1.34 3,-3s-1.34,-3 -3,-3c-1.3,0 -2.4,0.84 -2.82,2H9.14l1.99,-3.06C11.42,14.98 11.71,15 12,15s0.58,-0.02 0.87,-0.06l1.02,1.57c0.42,-0.53 0.96,-0.95 1.6,-1.21l-0.6,-0.93C17.31,13.27 19,10.84 19,8H5c0,2.84 1.69,5.27 4.12,6.37l-3.95,6.08c-0.3,0.46 -0.17,1.08 0.29,1.38h0c0.46,0.3 1.08,0.17 1.38,-0.29l1,-1.55h6.34C14.6,21.16 15.7,22 17,22zM17,18c0.55,0 1,0.45 1,1c0,0.55 -0.45,1 -1,1s-1,-0.45 -1,-1C16,18.45 16.45,18 17,18z" /> + <path + android:fillColor="#FF000000" + android:pathData="M9.41,7h1c0.15,-1.15 0.23,-1.64 -0.89,-2.96C9.1,3.54 8.84,3.27 9.06,2H8.07C7.86,3.11 8.1,4.05 8.96,4.96C9.18,5.2 9.75,5.63 9.41,7z" /> + <path + android:fillColor="#FF000000" + android:pathData="M11.89,7h1c0.15,-1.15 0.23,-1.64 -0.89,-2.96c-0.42,-0.5 -0.68,-0.78 -0.46,-2.04h-0.99c-0.21,1.11 0.03,2.05 0.89,2.96C11.67,5.2 12.24,5.63 11.89,7z" /> + <path + android:fillColor="#FF000000" + android:pathData="M14.41,7h1c0.15,-1.15 0.23,-1.64 -0.89,-2.96C14.1,3.54 13.84,3.27 14.06,2h-0.99c-0.21,1.11 0.03,2.05 0.89,2.96C14.18,5.2 14.75,5.63 14.41,7z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/outgoing_mail.xml b/qqq/android/mobileapp/src/main/res/drawable/outgoing_mail.xml new file mode 100644 index 0000000..e7438d7 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/outgoing_mail.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/outgoing_mail/materialicons/black/res/drawable/baseline_outgoing_mail_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M18.5,11c0.17,0 0.34,0.01 0.5,0.03V6.87C19,5.84 18.16,5 17.13,5H3.87C2.84,5 2,5.84 2,6.87v10.26C2,18.16 2.84,19 3.87,19h9.73C13.22,18.25 13,17.4 13,16.5C13,13.46 15.46,11 18.5,11zM10.4,13L4,9.19V7h0.23l6.18,3.68L16.74,7H17v2.16L10.4,13z" /> + <path + android:fillColor="#FF000000" + android:pathData="M19,13l-1.41,1.41l1.58,1.59l-4.17,0l0,2l4.17,0l-1.58,1.59l1.41,1.41l4,-4z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/outlet.xml b/qqq/android/mobileapp/src/main/res/drawable/outlet.xml new file mode 100644 index 0000000..9095007 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/outlet.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/outlet/materialicons/black/res/drawable/baseline_outlet_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,2C6.48,2 2,6.48 2,12c0,5.52 4.48,10 10,10s10,-4.48 10,-10C22,6.48 17.52,2 12,2zM9,12c-0.55,0 -1,-0.45 -1,-1V8c0,-0.55 0.45,-1 1,-1s1,0.45 1,1v3C10,11.55 9.55,12 9,12zM14,18h-4v-2c0,-1.1 0.9,-2 2,-2c1.1,0 2,0.9 2,2V18zM16,11c0,0.55 -0.45,1 -1,1c-0.55,0 -1,-0.45 -1,-1V8c0,-0.55 0.45,-1 1,-1c0.55,0 1,0.45 1,1V11z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/outlined_flag.xml b/qqq/android/mobileapp/src/main/res/drawable/outlined_flag.xml new file mode 100644 index 0000000..49556d5 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/outlined_flag.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/content/outlined_flag/materialicons/black/res/drawable/baseline_outlined_flag_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M14,6l-1,-2L5,4v17h2v-7h5l1,2h7L20,6h-6zM18,14h-4l-1,-2L7,12L7,6h5l1,2h5v6z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/output.xml b/qqq/android/mobileapp/src/main/res/drawable/output.xml new file mode 100644 index 0000000..3bb7715 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/output.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/output/materialicons/black/res/drawable/baseline_output_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M17,17l5,-5l-5,-5l-1.41,1.41l2.58,2.59l-9.17,0l0,2l9.17,0l-2.58,2.59z" /> + <path + android:fillColor="#FF000000" + android:pathData="M19,19H5V5h14v2h2V5c0,-1.1 -0.89,-2 -2,-2H5C3.9,3 3,3.9 3,5v14c0,1.1 0.9,2 2,2h14c1.11,0 2,-0.9 2,-2v-2h-2V19z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/padding.xml b/qqq/android/mobileapp/src/main/res/drawable/padding.xml new file mode 100644 index 0000000..2b43bee --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/padding.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/editor/padding/materialicons/black/res/drawable/baseline_padding_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M3,3v18h18L21,3L3,3zM19,19L5,19L5,5h14v14zM11,7h2v2h-2zM7,7h2v2L7,9zM15,7h2v2h-2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/pages.xml b/qqq/android/mobileapp/src/main/res/drawable/pages.xml new file mode 100644 index 0000000..47ad1e1 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/pages.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/pages/materialicons/black/res/drawable/baseline_pages_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M3,5v6h5L7,7l4,1L11,3L5,3c-1.1,0 -2,0.9 -2,2zM8,13L3,13v6c0,1.1 0.9,2 2,2h6v-5l-4,1 1,-4zM17,17l-4,-1v5h6c1.1,0 2,-0.9 2,-2v-6h-5l1,4zM19,3h-6v5l4,-1 -1,4h5L21,5c0,-1.1 -0.9,-2 -2,-2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/pageview.xml b/qqq/android/mobileapp/src/main/res/drawable/pageview.xml new file mode 100644 index 0000000..d86ae42 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/pageview.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/pageview/materialicons/black/res/drawable/baseline_pageview_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M11.5,9C10.12,9 9,10.12 9,11.5s1.12,2.5 2.5,2.5 2.5,-1.12 2.5,-2.5S12.88,9 11.5,9zM20,4L4,4c-1.1,0 -2,0.9 -2,2v12c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2L22,6c0,-1.1 -0.9,-2 -2,-2zM16.79,18.21l-2.91,-2.91c-0.69,0.44 -1.51,0.7 -2.39,0.7C9.01,16 7,13.99 7,11.5S9.01,7 11.5,7 16,9.01 16,11.5c0,0.88 -0.26,1.69 -0.7,2.39l2.91,2.9 -1.42,1.42z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/paid.xml b/qqq/android/mobileapp/src/main/res/drawable/paid.xml new file mode 100644 index 0000000..95405f3 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/paid.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/paid/materialicons/black/res/drawable/baseline_paid_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10s10,-4.48 10,-10S17.52,2 12,2zM12.88,17.76V19h-1.75v-1.29c-0.74,-0.18 -2.39,-0.77 -3.02,-2.96l1.65,-0.67c0.06,0.22 0.58,2.09 2.4,2.09c0.93,0 1.98,-0.48 1.98,-1.61c0,-0.96 -0.7,-1.46 -2.28,-2.03c-1.1,-0.39 -3.35,-1.03 -3.35,-3.31c0,-0.1 0.01,-2.4 2.62,-2.96V5h1.75v1.24c1.84,0.32 2.51,1.79 2.66,2.23l-1.58,0.67c-0.11,-0.35 -0.59,-1.34 -1.9,-1.34c-0.7,0 -1.81,0.37 -1.81,1.39c0,0.95 0.86,1.31 2.64,1.9c2.4,0.83 3.01,2.05 3.01,3.45C15.9,17.17 13.4,17.67 12.88,17.76z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/palette.xml b/qqq/android/mobileapp/src/main/res/drawable/palette.xml new file mode 100644 index 0000000..ce8c9dd --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/palette.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/palette/materialicons/black/res/drawable/baseline_palette_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,2C6.49,2 2,6.49 2,12s4.49,10 10,10c1.38,0 2.5,-1.12 2.5,-2.5c0,-0.61 -0.23,-1.2 -0.64,-1.67c-0.08,-0.1 -0.13,-0.21 -0.13,-0.33c0,-0.28 0.22,-0.5 0.5,-0.5H16c3.31,0 6,-2.69 6,-6C22,6.04 17.51,2 12,2zM17.5,13c-0.83,0 -1.5,-0.67 -1.5,-1.5c0,-0.83 0.67,-1.5 1.5,-1.5s1.5,0.67 1.5,1.5C19,12.33 18.33,13 17.5,13zM14.5,9C13.67,9 13,8.33 13,7.5C13,6.67 13.67,6 14.5,6S16,6.67 16,7.5C16,8.33 15.33,9 14.5,9zM5,11.5C5,10.67 5.67,10 6.5,10S8,10.67 8,11.5C8,12.33 7.33,13 6.5,13S5,12.33 5,11.5zM11,7.5C11,8.33 10.33,9 9.5,9S8,8.33 8,7.5C8,6.67 8.67,6 9.5,6S11,6.67 11,7.5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/pallet.xml b/qqq/android/mobileapp/src/main/res/drawable/pallet.xml new file mode 100644 index 0000000..2b26519 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/pallet.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/hardware/pallet/materialicons/black/res/drawable/baseline_pallet_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M2,18l0,4l3,0l0,-2l5.5,0l0,2l3,0l0,-2l5.5,0l0,2l3,0l0,-4z" /> + <path + android:fillColor="#FF000000" + android:pathData="M18,2H6C5.45,2 5,2.45 5,3v12c0,0.55 0.45,1 1,1h12c0.55,0 1,-0.45 1,-1V3C19,2.45 18.55,2 18,2zM15,8H9V6h6V8z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/pan_tool.xml b/qqq/android/mobileapp/src/main/res/drawable/pan_tool.xml new file mode 100644 index 0000000..ab683a9 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/pan_tool.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/pan_tool/materialicons/black/res/drawable/baseline_pan_tool_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M23,5.5V20c0,2.2 -1.8,4 -4,4h-7.3c-1.08,0 -2.1,-0.43 -2.85,-1.19L1,14.83c0,0 1.26,-1.23 1.3,-1.25c0.22,-0.19 0.49,-0.29 0.79,-0.29c0.22,0 0.42,0.06 0.6,0.16C3.73,13.46 8,15.91 8,15.91V4c0,-0.83 0.67,-1.5 1.5,-1.5S11,3.17 11,4v7h1V1.5C12,0.67 12.67,0 13.5,0S15,0.67 15,1.5V11h1V2.5C16,1.67 16.67,1 17.5,1S19,1.67 19,2.5V11h1V5.5C20,4.67 20.67,4 21.5,4S23,4.67 23,5.5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/pan_tool_alt.xml b/qqq/android/mobileapp/src/main/res/drawable/pan_tool_alt.xml new file mode 100644 index 0000000..d23340a --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/pan_tool_alt.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/pan_tool_alt/materialicons/black/res/drawable/baseline_pan_tool_alt_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19.98,14.82l-0.63,4.46C19.21,20.27 18.36,21 17.37,21h-6.16c-0.53,0 -1.29,-0.21 -1.66,-0.59L5,15.62l0.83,-0.84c0.24,-0.24 0.58,-0.35 0.92,-0.28L10,15.24V4.5C10,3.67 10.67,3 11.5,3S13,3.67 13,4.5v6h0.91c0.31,0 0.62,0.07 0.89,0.21l4.09,2.04C19.66,13.14 20.1,13.97 19.98,14.82z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/panorama.xml b/qqq/android/mobileapp/src/main/res/drawable/panorama.xml new file mode 100644 index 0000000..f46802d --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/panorama.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/panorama/materialicons/black/res/drawable/baseline_panorama_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M23,18V6c0,-1.1 -0.9,-2 -2,-2H3c-1.1,0 -2,0.9 -2,2v12c0,1.1 0.9,2 2,2h18c1.1,0 2,-0.9 2,-2zM8.5,12.5l2.5,3.01L14.5,11l4.5,6H5l3.5,-4.5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/panorama_fish_eye.xml b/qqq/android/mobileapp/src/main/res/drawable/panorama_fish_eye.xml new file mode 100644 index 0000000..c8d927d --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/panorama_fish_eye.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/panorama_fish_eye/materialicons/black/res/drawable/baseline_panorama_fish_eye_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,2C6.47,2 2,6.47 2,12s4.47,10 10,10 10,-4.47 10,-10S17.53,2 12,2zM12,20c-4.41,0 -8,-3.59 -8,-8s3.59,-8 8,-8 8,3.59 8,8 -3.59,8 -8,8z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/panorama_horizontal.xml b/qqq/android/mobileapp/src/main/res/drawable/panorama_horizontal.xml new file mode 100644 index 0000000..51d2b57 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/panorama_horizontal.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/panorama_horizontal/materialicons/black/res/drawable/baseline_panorama_horizontal_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,6.54v10.91c-2.6,-0.77 -5.28,-1.16 -8,-1.16 -2.72,0 -5.4,0.39 -8,1.16V6.54c2.6,0.77 5.28,1.16 8,1.16 2.72,0.01 5.4,-0.38 8,-1.16M21.43,4c-0.1,0 -0.2,0.02 -0.31,0.06C18.18,5.16 15.09,5.7 12,5.7c-3.09,0 -6.18,-0.55 -9.12,-1.64 -0.11,-0.04 -0.22,-0.06 -0.31,-0.06 -0.34,0 -0.57,0.23 -0.57,0.63v14.75c0,0.39 0.23,0.62 0.57,0.62 0.1,0 0.2,-0.02 0.31,-0.06 2.94,-1.1 6.03,-1.64 9.12,-1.64 3.09,0 6.18,0.55 9.12,1.64 0.11,0.04 0.21,0.06 0.31,0.06 0.33,0 0.57,-0.23 0.57,-0.63V4.63c0,-0.4 -0.24,-0.63 -0.57,-0.63z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/panorama_horizontal_select.xml b/qqq/android/mobileapp/src/main/res/drawable/panorama_horizontal_select.xml new file mode 100644 index 0000000..f4256e9 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/panorama_horizontal_select.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/panorama_horizontal_select/materialicons/black/res/drawable/baseline_panorama_horizontal_select_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M21.43,4c-0.1,0 -0.2,0.02 -0.31,0.06C18.18,5.16 15.09,5.7 12,5.7s-6.18,-0.55 -9.12,-1.64C2.77,4.02 2.66,4 2.57,4c-0.34,0 -0.57,0.23 -0.57,0.63v14.75c0,0.39 0.23,0.62 0.57,0.62 0.1,0 0.2,-0.02 0.31,-0.06 2.94,-1.1 6.03,-1.64 9.12,-1.64s6.18,0.55 9.12,1.64c0.11,0.04 0.21,0.06 0.31,0.06 0.33,0 0.57,-0.23 0.57,-0.63V4.63c0,-0.4 -0.24,-0.63 -0.57,-0.63z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/panorama_photosphere.xml b/qqq/android/mobileapp/src/main/res/drawable/panorama_photosphere.xml new file mode 100644 index 0000000..f623443 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/panorama_photosphere.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/panorama_photosphere/materialicons/black/res/drawable/baseline_panorama_photosphere_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M21.4,11.32v2.93c-0.1,0.05 -2.17,0.85 -3.33,1.17 -0.94,0.26 -3.84,0.73 -6.07,0.73 -3.7,0 -7,-0.7 -9.16,-1.8 -0.08,-0.04 -0.16,-0.06 -0.24,-0.1L2.6,9.76c6.02,-2.84 12.6,-2.92 18.8,0v1.56zM12.01,20.2c-2.5,0 -4.87,-1.15 -6.41,-3.12 4.19,1.22 8.57,1.23 12.82,-0.01 -1.54,1.97 -3.9,3.13 -6.41,3.13zM12,3.8c2.6,0 4.91,1.23 6.41,3.12 -4.1,-1.19 -8.48,-1.26 -12.83,0.01C7.08,5.03 9.4,3.8 12,3.8zM22.49,8.51c-0.47,-0.23 -0.93,-0.44 -1.4,-0.64C19.52,4.41 16.05,2 12,2S4.47,4.41 2.9,7.88c-0.47,0.2 -0.93,0.41 -1.4,0.63 -0.31,0.15 -0.5,0.48 -0.5,0.83v5.32c0,0.35 0.19,0.68 0.51,0.83 0.47,0.23 0.93,0.44 1.39,0.64 3.55,7.83 14.65,7.82 18.2,0 0.47,-0.2 0.93,-0.41 1.39,-0.63 0.31,-0.17 0.51,-0.49 0.51,-0.84L23,9.34c0,-0.35 -0.19,-0.68 -0.51,-0.83z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/panorama_photosphere_select.xml b/qqq/android/mobileapp/src/main/res/drawable/panorama_photosphere_select.xml new file mode 100644 index 0000000..978f3a9 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/panorama_photosphere_select.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/panorama_photosphere_select/materialicons/black/res/drawable/baseline_panorama_photosphere_select_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M22.49,8.51c-0.47,-0.23 -0.93,-0.44 -1.4,-0.64C19.52,4.41 16.05,2 12,2S4.47,4.41 2.9,7.88c-0.47,0.2 -0.93,0.41 -1.4,0.63 -0.31,0.15 -0.5,0.48 -0.5,0.83v5.32c0,0.35 0.19,0.68 0.51,0.83 0.47,0.23 0.93,0.44 1.39,0.64 3.55,7.83 14.65,7.82 18.2,0 0.47,-0.2 0.93,-0.41 1.39,-0.63 0.31,-0.17 0.51,-0.49 0.51,-0.84V9.34c0,-0.35 -0.19,-0.68 -0.51,-0.83zM12,3.8c2.6,0 4.91,1.23 6.41,3.12 -4.1,-1.19 -8.48,-1.26 -12.83,0.01C7.08,5.03 9.4,3.8 12,3.8zM5.6,17.08c4.19,1.22 8.57,1.23 12.82,-0.01 -1.54,1.97 -3.9,3.13 -6.41,3.13 -2.5,0 -4.87,-1.15 -6.41,-3.12z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/panorama_vertical.xml b/qqq/android/mobileapp/src/main/res/drawable/panorama_vertical.xml new file mode 100644 index 0000000..2e8490d --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/panorama_vertical.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/panorama_vertical/materialicons/black/res/drawable/baseline_panorama_vertical_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19.94,21.12c-1.1,-2.94 -1.64,-6.03 -1.64,-9.12 0,-3.09 0.55,-6.18 1.64,-9.12 0.04,-0.11 0.06,-0.22 0.06,-0.31 0,-0.34 -0.23,-0.57 -0.63,-0.57H4.63c-0.4,0 -0.63,0.23 -0.63,0.57 0,0.1 0.02,0.2 0.06,0.31C5.16,5.82 5.71,8.91 5.71,12c0,3.09 -0.55,6.18 -1.64,9.12 -0.05,0.11 -0.07,0.22 -0.07,0.31 0,0.33 0.23,0.57 0.63,0.57h14.75c0.39,0 0.63,-0.24 0.63,-0.57 -0.01,-0.1 -0.03,-0.2 -0.07,-0.31zM6.54,20c0.77,-2.6 1.16,-5.28 1.16,-8 0,-2.72 -0.39,-5.4 -1.16,-8h10.91c-0.77,2.6 -1.16,5.28 -1.16,8 0,2.72 0.39,5.4 1.16,8H6.54z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/panorama_vertical_select.xml b/qqq/android/mobileapp/src/main/res/drawable/panorama_vertical_select.xml new file mode 100644 index 0000000..50b1755 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/panorama_vertical_select.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/panorama_vertical_select/materialicons/black/res/drawable/baseline_panorama_vertical_select_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19.93,21.12c-1.1,-2.94 -1.64,-6.03 -1.64,-9.12s0.55,-6.18 1.64,-9.12c0.05,-0.11 0.07,-0.22 0.07,-0.31 0,-0.34 -0.24,-0.57 -0.64,-0.57H4.62c-0.4,0 -0.63,0.23 -0.63,0.57 0,0.1 0.02,0.2 0.06,0.31C5.16,5.82 5.7,8.91 5.7,12s-0.55,6.18 -1.64,9.12c-0.05,0.11 -0.07,0.22 -0.07,0.31 0,0.33 0.23,0.57 0.63,0.57h14.75c0.39,0 0.63,-0.24 0.63,-0.57 0,-0.1 -0.02,-0.2 -0.07,-0.31z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/panorama_wide_angle.xml b/qqq/android/mobileapp/src/main/res/drawable/panorama_wide_angle.xml new file mode 100644 index 0000000..082f972 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/panorama_wide_angle.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/panorama_wide_angle/materialicons/black/res/drawable/baseline_panorama_wide_angle_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,6c2.45,0 4.71,0.2 7.29,0.64 0.47,1.78 0.71,3.58 0.71,5.36 0,1.78 -0.24,3.58 -0.71,5.36 -2.58,0.44 -4.84,0.64 -7.29,0.64s-4.71,-0.2 -7.29,-0.64C4.24,15.58 4,13.78 4,12c0,-1.78 0.24,-3.58 0.71,-5.36C7.29,6.2 9.55,6 12,6m0,-2c-2.73,0 -5.22,0.24 -7.95,0.72l-0.93,0.16 -0.25,0.9C2.29,7.85 2,9.93 2,12s0.29,4.15 0.87,6.22l0.25,0.89 0.93,0.16c2.73,0.49 5.22,0.73 7.95,0.73s5.22,-0.24 7.95,-0.72l0.93,-0.16 0.25,-0.89c0.58,-2.08 0.87,-4.16 0.87,-6.23s-0.29,-4.15 -0.87,-6.22l-0.25,-0.89 -0.93,-0.16C17.22,4.24 14.73,4 12,4z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/panorama_wide_angle_select.xml b/qqq/android/mobileapp/src/main/res/drawable/panorama_wide_angle_select.xml new file mode 100644 index 0000000..eb11cb3 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/panorama_wide_angle_select.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/panorama_wide_angle_select/materialicons/black/res/drawable/baseline_panorama_wide_angle_select_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,4c-2.73,0 -5.22,0.24 -7.95,0.72l-0.93,0.16 -0.25,0.9C2.29,7.85 2,9.93 2,12s0.29,4.15 0.87,6.22l0.25,0.89 0.93,0.16c2.73,0.49 5.22,0.73 7.95,0.73s5.22,-0.24 7.95,-0.72l0.93,-0.16 0.25,-0.89c0.58,-2.08 0.87,-4.16 0.87,-6.23s-0.29,-4.15 -0.87,-6.22l-0.25,-0.89 -0.93,-0.16C17.22,4.24 14.73,4 12,4z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/paragliding.xml b/qqq/android/mobileapp/src/main/res/drawable/paragliding.xml new file mode 100644 index 0000000..07e13b1 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/paragliding.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/paragliding/materialicons/black/res/drawable/baseline_paragliding_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,17c-1.1,0 -2,-0.9 -2,-2s0.9,-2 2,-2s2,0.9 2,2S13.1,17 12,17zM8.52,17.94C8.04,17.55 7,16.76 7,14H5c0,2.7 0.93,4.41 2.3,5.5c0.5,0.4 1.1,0.7 1.7,0.9L9,24h6v-3.6c0.6,-0.2 1.2,-0.5 1.7,-0.9c1.37,-1.09 2.3,-2.8 2.3,-5.5h-2c0,2.76 -1.04,3.55 -1.52,3.94C14.68,18.54 14,19 12,19S9.32,18.54 8.52,17.94zM12,0C5.92,0 1,1.9 1,4.25v3.49C1,8.55 1.88,9 2.56,8.57C2.7,8.48 2.84,8.39 3,8.31L5,13h2l1.5,-6.28C9.6,6.58 10.78,6.5 12,6.5s2.4,0.08 3.5,0.22L17,13h2l2,-4.69c0.16,0.09 0.3,0.17 0.44,0.26C22.12,9 23,8.55 23,7.74V4.25C23,1.9 18.08,0 12,0zM5.88,11.24L4.37,7.69c0.75,-0.28 1.6,-0.52 2.53,-0.71L5.88,11.24zM18.12,11.24L17.1,6.98c0.93,0.19 1.78,0.43 2.53,0.71L18.12,11.24z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/park.xml b/qqq/android/mobileapp/src/main/res/drawable/park.xml new file mode 100644 index 0000000..8f5bb2d --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/park.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/park/materialicons/black/res/drawable/baseline_park_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M17,12l2,0l-7,-10l-6.95,10l1.95,0l-3.9,6l6.92,0l0,4l3.96,0l0,-4l7.02,0z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/party_mode.xml b/qqq/android/mobileapp/src/main/res/drawable/party_mode.xml new file mode 100644 index 0000000..7ea88fd --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/party_mode.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/party_mode/materialicons/black/res/drawable/baseline_party_mode_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,4h-3.17L15,2L9,2L7.17,4L4,4c-1.1,0 -2,0.9 -2,2v12c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2L22,6c0,-1.1 -0.9,-2 -2,-2zM12,7c1.63,0 3.06,0.79 3.98,2L12,9c-1.66,0 -3,1.34 -3,3 0,0.35 0.07,0.69 0.18,1L7.1,13c-0.06,-0.32 -0.1,-0.66 -0.1,-1 0,-2.76 2.24,-5 5,-5zM12,17c-1.63,0 -3.06,-0.79 -3.98,-2L12,15c1.66,0 3,-1.34 3,-3 0,-0.35 -0.07,-0.69 -0.18,-1h2.08c0.07,0.32 0.1,0.66 0.1,1 0,2.76 -2.24,5 -5,5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/password.xml b/qqq/android/mobileapp/src/main/res/drawable/password.xml new file mode 100644 index 0000000..645d2c2 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/password.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/password/materialicons/black/res/drawable/baseline_password_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M2,17h20v2H2V17zM3.15,12.95L4,11.47l0.85,1.48l1.3,-0.75L5.3,10.72H7v-1.5H5.3l0.85,-1.47L4.85,7L4,8.47L3.15,7l-1.3,0.75L2.7,9.22H1v1.5h1.7L1.85,12.2L3.15,12.95zM9.85,12.2l1.3,0.75L12,11.47l0.85,1.48l1.3,-0.75l-0.85,-1.48H15v-1.5h-1.7l0.85,-1.47L12.85,7L12,8.47L11.15,7l-1.3,0.75l0.85,1.47H9v1.5h1.7L9.85,12.2zM23,9.22h-1.7l0.85,-1.47L20.85,7L20,8.47L19.15,7l-1.3,0.75l0.85,1.47H17v1.5h1.7l-0.85,1.48l1.3,0.75L20,11.47l0.85,1.48l1.3,-0.75l-0.85,-1.48H23V9.22z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/pattern.xml b/qqq/android/mobileapp/src/main/res/drawable/pattern.xml new file mode 100644 index 0000000..813236b --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/pattern.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/pattern/materialicons/black/res/drawable/baseline_pattern_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M4,6c0,-1.1 0.9,-2 2,-2s2,0.9 2,2S7.1,8 6,8S4,7.1 4,6zM6,14c1.1,0 2,-0.9 2,-2s-0.9,-2 -2,-2s-2,0.9 -2,2S4.9,14 6,14zM12,8c1.1,0 2,-0.9 2,-2s-0.9,-2 -2,-2s-2,0.9 -2,2S10.9,8 12,8zM18,10c-1.1,0 -2,0.9 -2,2s0.9,2 2,2s2,-0.9 2,-2S19.1,10 18,10zM17.98,16c-0.74,0 -1.37,0.4 -1.72,1h-2.54c-0.34,-0.6 -0.98,-1 -1.72,-1s-1.37,0.4 -1.72,1H8.41l3.07,-3.07C11.65,13.97 11.82,14 12,14c1.1,0 2,-0.9 2,-2c0,-0.18 -0.03,-0.35 -0.07,-0.51l3.56,-3.56C17.65,7.97 17.82,8 18,8c1.1,0 2,-0.9 2,-2s-0.9,-2 -2,-2s-2,0.9 -2,2c0,0.18 0.03,0.35 0.07,0.51l-3.56,3.56C12.35,10.03 12.18,10 12,10c-1.1,0 -2,0.9 -2,2c0,0.18 0.03,0.35 0.07,0.51l-3.56,3.56C6.35,16.03 6.18,16 6,16c-1.1,0 -2,0.9 -2,2s0.9,2 2,2c0.74,0 1.37,-0.4 1.72,-1h2.57c0.34,0.6 0.98,1 1.72,1s1.37,-0.4 1.72,-1h2.55c0.34,0.6 0.98,1 1.72,1c1.1,0 2,-0.9 2,-2C19.98,16.9 19.08,16 17.98,16z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/pause.xml b/qqq/android/mobileapp/src/main/res/drawable/pause.xml new file mode 100644 index 0000000..0a6c0ae --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/pause.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/av/pause/materialicons/black/res/drawable/baseline_pause_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M6,19h4L10,5L6,5v14zM14,5v14h4L18,5h-4z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/pause_circle.xml b/qqq/android/mobileapp/src/main/res/drawable/pause_circle.xml new file mode 100644 index 0000000..70de05c --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/pause_circle.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/av/pause_circle/materialicons/black/res/drawable/baseline_pause_circle_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10s10,-4.48 10,-10S17.52,2 12,2zM11,16H9V8h2V16zM15,16h-2V8h2V16z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/pause_circle_filled.xml b/qqq/android/mobileapp/src/main/res/drawable/pause_circle_filled.xml new file mode 100644 index 0000000..bcd3b2b --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/pause_circle_filled.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/av/pause_circle_filled/materialicons/black/res/drawable/baseline_pause_circle_filled_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM11,16L9,16L9,8h2v8zM15,16h-2L13,8h2v8z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/pause_circle_outline.xml b/qqq/android/mobileapp/src/main/res/drawable/pause_circle_outline.xml new file mode 100644 index 0000000..64cb319 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/pause_circle_outline.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/av/pause_circle_outline/materialicons/black/res/drawable/baseline_pause_circle_outline_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M9,16h2L11,8L9,8v8zM12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM12,20c-4.41,0 -8,-3.59 -8,-8s3.59,-8 8,-8 8,3.59 8,8 -3.59,8 -8,8zM13,16h2L15,8h-2v8z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/pause_presentation.xml b/qqq/android/mobileapp/src/main/res/drawable/pause_presentation.xml new file mode 100644 index 0000000..32f59a4 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/pause_presentation.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/communication/pause_presentation/materialicons/black/res/drawable/baseline_pause_presentation_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M21,19.1H3V5h18v14.1zM21,3H3c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h18c1.1,0 2,-0.9 2,-2V5c0,-1.1 -0.9,-2 -2,-2z" /> + <path + android:fillColor="#FF000000" + android:pathData="M9,8h2v8L9,16zM13,8h2v8h-2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/payment.xml b/qqq/android/mobileapp/src/main/res/drawable/payment.xml new file mode 100644 index 0000000..207cd68 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/payment.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/payment/materialicons/black/res/drawable/baseline_payment_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,4L4,4c-1.11,0 -1.99,0.89 -1.99,2L2,18c0,1.11 0.89,2 2,2h16c1.11,0 2,-0.89 2,-2L22,6c0,-1.11 -0.89,-2 -2,-2zM20,18L4,18v-6h16v6zM20,8L4,8L4,6h16v2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/payments.xml b/qqq/android/mobileapp/src/main/res/drawable/payments.xml new file mode 100644 index 0000000..f6952c6 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/payments.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/navigation/payments/materialicons/black/res/drawable/baseline_payments_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19,14L19,6c0,-1.1 -0.9,-2 -2,-2L3,4c-1.1,0 -2,0.9 -2,2v8c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2zM10,13c-1.66,0 -3,-1.34 -3,-3s1.34,-3 3,-3 3,1.34 3,3 -1.34,3 -3,3zM23,7v11c0,1.1 -0.9,2 -2,2L4,20v-2h17L21,7h2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/pedal_bike.xml b/qqq/android/mobileapp/src/main/res/drawable/pedal_bike.xml new file mode 100644 index 0000000..561bda9 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/pedal_bike.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/pedal_bike/materialicons/black/res/drawable/baseline_pedal_bike_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M18.18,10l-1.7,-4.68C16.19,4.53 15.44,4 14.6,4H12v2h2.6l1.46,4h-4.81l-0.36,-1H12V7H7v2h1.75l1.82,5H9.9c-0.44,-2.23 -2.31,-3.88 -4.65,-3.99C2.45,9.87 0,12.2 0,15c0,2.8 2.2,5 5,5c2.46,0 4.45,-1.69 4.9,-4h4.2c0.44,2.23 2.31,3.88 4.65,3.99c2.8,0.13 5.25,-2.19 5.25,-5c0,-2.8 -2.2,-5 -5,-5H18.18zM7.82,16c-0.4,1.17 -1.49,2 -2.82,2c-1.68,0 -3,-1.32 -3,-3s1.32,-3 3,-3c1.33,0 2.42,0.83 2.82,2H5v2H7.82zM14.1,14h-1.4l-0.73,-2H15C14.56,12.58 14.24,13.25 14.1,14zM19,18c-1.68,0 -3,-1.32 -3,-3c0,-0.93 0.41,-1.73 1.05,-2.28l0.96,2.64l1.88,-0.68l-0.97,-2.67c0.03,0 0.06,-0.01 0.09,-0.01c1.68,0 3,1.32 3,3S20.68,18 19,18z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/pending.xml b/qqq/android/mobileapp/src/main/res/drawable/pending.xml new file mode 100644 index 0000000..cc50750 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/pending.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/pending/materialicons/black/res/drawable/baseline_pending_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,2C6.48,2 2,6.48 2,12c0,5.52 4.48,10 10,10s10,-4.48 10,-10C22,6.48 17.52,2 12,2zM7,13.5c-0.83,0 -1.5,-0.67 -1.5,-1.5c0,-0.83 0.67,-1.5 1.5,-1.5s1.5,0.67 1.5,1.5C8.5,12.83 7.83,13.5 7,13.5zM12,13.5c-0.83,0 -1.5,-0.67 -1.5,-1.5c0,-0.83 0.67,-1.5 1.5,-1.5s1.5,0.67 1.5,1.5C13.5,12.83 12.83,13.5 12,13.5zM17,13.5c-0.83,0 -1.5,-0.67 -1.5,-1.5c0,-0.83 0.67,-1.5 1.5,-1.5s1.5,0.67 1.5,1.5C18.5,12.83 17.83,13.5 17,13.5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/pending_actions.xml b/qqq/android/mobileapp/src/main/res/drawable/pending_actions.xml new file mode 100644 index 0000000..1a29f65 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/pending_actions.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/pending_actions/materialicons/black/res/drawable/baseline_pending_actions_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M17,12c-2.76,0 -5,2.24 -5,5s2.24,5 5,5c2.76,0 5,-2.24 5,-5S19.76,12 17,12zM18.65,19.35l-2.15,-2.15V14h1v2.79l1.85,1.85L18.65,19.35zM18,3h-3.18C14.4,1.84 13.3,1 12,1S9.6,1.84 9.18,3H6C4.9,3 4,3.9 4,5v15c0,1.1 0.9,2 2,2h6.11c-0.59,-0.57 -1.07,-1.25 -1.42,-2H6V5h2v3h8V5h2v5.08c0.71,0.1 1.38,0.31 2,0.6V5C20,3.9 19.1,3 18,3zM12,5c-0.55,0 -1,-0.45 -1,-1c0,-0.55 0.45,-1 1,-1c0.55,0 1,0.45 1,1C13,4.55 12.55,5 12,5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/pentagon.xml b/qqq/android/mobileapp/src/main/res/drawable/pentagon.xml new file mode 100644 index 0000000..7de15ef --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/pentagon.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/editor/pentagon/materialicons/black/res/drawable/baseline_pentagon_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M2,9l4,12l12,0l4,-12l-10,-7z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/people.xml b/qqq/android/mobileapp/src/main/res/drawable/people.xml new file mode 100644 index 0000000..2014f6e --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/people.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/people/materialicons/black/res/drawable/baseline_people_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M16,11c1.66,0 2.99,-1.34 2.99,-3S17.66,5 16,5c-1.66,0 -3,1.34 -3,3s1.34,3 3,3zM8,11c1.66,0 2.99,-1.34 2.99,-3S9.66,5 8,5C6.34,5 5,6.34 5,8s1.34,3 3,3zM8,13c-2.33,0 -7,1.17 -7,3.5L1,19h14v-2.5c0,-2.33 -4.67,-3.5 -7,-3.5zM16,13c-0.29,0 -0.62,0.02 -0.97,0.05 1.16,0.84 1.97,1.97 1.97,3.45L17,19h6v-2.5c0,-2.33 -4.67,-3.5 -7,-3.5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/people_alt.xml b/qqq/android/mobileapp/src/main/res/drawable/people_alt.xml new file mode 100644 index 0000000..6324405 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/people_alt.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/people_alt/materialicons/black/res/drawable/baseline_people_alt_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M16.67,13.13C18.04,14.06 19,15.32 19,17v3h4v-3C23,14.82 19.43,13.53 16.67,13.13z" + android:fillType="evenOdd" /> + <path + android:fillColor="#FF000000" + android:pathData="M9,8m-4,0a4,4 0,1 1,8 0a4,4 0,1 1,-8 0" + android:fillType="evenOdd" /> + <path + android:fillColor="#FF000000" + android:pathData="M15,12c2.21,0 4,-1.79 4,-4c0,-2.21 -1.79,-4 -4,-4c-0.47,0 -0.91,0.1 -1.33,0.24C14.5,5.27 15,6.58 15,8s-0.5,2.73 -1.33,3.76C14.09,11.9 14.53,12 15,12z" + android:fillType="evenOdd" /> + <path + android:fillColor="#FF000000" + android:pathData="M9,13c-2.67,0 -8,1.34 -8,4v3h16v-3C17,14.34 11.67,13 9,13z" + android:fillType="evenOdd" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/people_outline.xml b/qqq/android/mobileapp/src/main/res/drawable/people_outline.xml new file mode 100644 index 0000000..cd0036a --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/people_outline.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/people_outline/materialicons/black/res/drawable/baseline_people_outline_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M16.5,13c-1.2,0 -3.07,0.34 -4.5,1 -1.43,-0.67 -3.3,-1 -4.5,-1C5.33,13 1,14.08 1,16.25L1,19h22v-2.75c0,-2.17 -4.33,-3.25 -6.5,-3.25zM12.5,17.5h-10v-1.25c0,-0.54 2.56,-1.75 5,-1.75s5,1.21 5,1.75v1.25zM21.5,17.5L14,17.5v-1.25c0,-0.46 -0.2,-0.86 -0.52,-1.22 0.88,-0.3 1.96,-0.53 3.02,-0.53 2.44,0 5,1.21 5,1.75v1.25zM7.5,12c1.93,0 3.5,-1.57 3.5,-3.5S9.43,5 7.5,5 4,6.57 4,8.5 5.57,12 7.5,12zM7.5,6.5c1.1,0 2,0.9 2,2s-0.9,2 -2,2 -2,-0.9 -2,-2 0.9,-2 2,-2zM16.5,12c1.93,0 3.5,-1.57 3.5,-3.5S18.43,5 16.5,5 13,6.57 13,8.5s1.57,3.5 3.5,3.5zM16.5,6.5c1.1,0 2,0.9 2,2s-0.9,2 -2,2 -2,-0.9 -2,-2 0.9,-2 2,-2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/percent.xml b/qqq/android/mobileapp/src/main/res/drawable/percent.xml new file mode 100644 index 0000000..a0f2856 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/percent.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/percent/materialicons/black/res/drawable/baseline_percent_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M7.5,11C9.43,11 11,9.43 11,7.5S9.43,4 7.5,4S4,5.57 4,7.5S5.57,11 7.5,11zM7.5,6C8.33,6 9,6.67 9,7.5S8.33,9 7.5,9S6,8.33 6,7.5S6.67,6 7.5,6z" /> + <path + android:fillColor="#FF000000" + android:pathData="M4.0025,18.5831l14.5875,-14.5875l1.4142,1.4142l-14.5875,14.5875z" /> + <path + android:fillColor="#FF000000" + android:pathData="M16.5,13c-1.93,0 -3.5,1.57 -3.5,3.5s1.57,3.5 3.5,3.5s3.5,-1.57 3.5,-3.5S18.43,13 16.5,13zM16.5,18c-0.83,0 -1.5,-0.67 -1.5,-1.5s0.67,-1.5 1.5,-1.5s1.5,0.67 1.5,1.5S17.33,18 16.5,18z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/perm_camera_mic.xml b/qqq/android/mobileapp/src/main/res/drawable/perm_camera_mic.xml new file mode 100644 index 0000000..8457b04 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/perm_camera_mic.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/perm_camera_mic/materialicons/black/res/drawable/baseline_perm_camera_mic_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,5h-3.17L15,3L9,3L7.17,5L4,5c-1.1,0 -2,0.9 -2,2v12c0,1.1 0.9,2 2,2h7v-2.09c-2.83,-0.48 -5,-2.94 -5,-5.91h2c0,2.21 1.79,4 4,4s4,-1.79 4,-4h2c0,2.97 -2.17,5.43 -5,5.91L13,21h7c1.1,0 2,-0.9 2,-2L22,7c0,-1.1 -0.9,-2 -2,-2zM14,13c0,1.1 -0.9,2 -2,2s-2,-0.9 -2,-2L10,9c0,-1.1 0.9,-2 2,-2s2,0.9 2,2v4z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/perm_contact_calendar.xml b/qqq/android/mobileapp/src/main/res/drawable/perm_contact_calendar.xml new file mode 100644 index 0000000..68dff48 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/perm_contact_calendar.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/perm_contact_calendar/materialicons/black/res/drawable/baseline_perm_contact_calendar_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19,3h-1L18,1h-2v2L8,3L8,1L6,1v2L5,3c-1.11,0 -2,0.9 -2,2v14c0,1.1 0.89,2 2,2h14c1.1,0 2,-0.9 2,-2L21,5c0,-1.1 -0.9,-2 -2,-2zM12,6c1.66,0 3,1.34 3,3s-1.34,3 -3,3 -3,-1.34 -3,-3 1.34,-3 3,-3zM18,18L6,18v-1c0,-2 4,-3.1 6,-3.1s6,1.1 6,3.1v1z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/perm_data_setting.xml b/qqq/android/mobileapp/src/main/res/drawable/perm_data_setting.xml new file mode 100644 index 0000000..94ddf3b --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/perm_data_setting.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/perm_data_setting/materialicons/black/res/drawable/baseline_perm_data_setting_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M18.99,11.5c0.34,0 0.67,0.03 1,0.07L20,0 0,20h11.56c-0.04,-0.33 -0.07,-0.66 -0.07,-1 0,-4.14 3.36,-7.5 7.5,-7.5zM22.7,19.49c0.02,-0.16 0.04,-0.32 0.04,-0.49 0,-0.17 -0.01,-0.33 -0.04,-0.49l1.06,-0.83c0.09,-0.08 0.12,-0.21 0.06,-0.32l-1,-1.73c-0.06,-0.11 -0.19,-0.15 -0.31,-0.11l-1.24,0.5c-0.26,-0.2 -0.54,-0.37 -0.85,-0.49l-0.19,-1.32c-0.01,-0.12 -0.12,-0.21 -0.24,-0.21h-2c-0.12,0 -0.23,0.09 -0.25,0.21l-0.19,1.32c-0.3,0.13 -0.59,0.29 -0.85,0.49l-1.24,-0.5c-0.11,-0.04 -0.24,0 -0.31,0.11l-1,1.73c-0.06,0.11 -0.04,0.24 0.06,0.32l1.06,0.83c-0.02,0.16 -0.03,0.32 -0.03,0.49 0,0.17 0.01,0.33 0.03,0.49l-1.06,0.83c-0.09,0.08 -0.12,0.21 -0.06,0.32l1,1.73c0.06,0.11 0.19,0.15 0.31,0.11l1.24,-0.5c0.26,0.2 0.54,0.37 0.85,0.49l0.19,1.32c0.02,0.12 0.12,0.21 0.25,0.21h2c0.12,0 0.23,-0.09 0.25,-0.21l0.19,-1.32c0.3,-0.13 0.59,-0.29 0.84,-0.49l1.25,0.5c0.11,0.04 0.24,0 0.31,-0.11l1,-1.73c0.06,-0.11 0.03,-0.24 -0.06,-0.32l-1.07,-0.83zM18.99,20.5c-0.83,0 -1.5,-0.67 -1.5,-1.5s0.67,-1.5 1.5,-1.5 1.5,0.67 1.5,1.5 -0.67,1.5 -1.5,1.5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/perm_device_information.xml b/qqq/android/mobileapp/src/main/res/drawable/perm_device_information.xml new file mode 100644 index 0000000..0fa768d --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/perm_device_information.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/perm_device_information/materialicons/black/res/drawable/baseline_perm_device_information_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M13,7h-2v2h2L13,7zM13,11h-2v6h2v-6zM17,1.01L7,1c-1.1,0 -2,0.9 -2,2v18c0,1.1 0.9,2 2,2h10c1.1,0 2,-0.9 2,-2L19,3c0,-1.1 -0.9,-1.99 -2,-1.99zM17,19L7,19L7,5h10v14z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/perm_identity.xml b/qqq/android/mobileapp/src/main/res/drawable/perm_identity.xml new file mode 100644 index 0000000..49fc814 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/perm_identity.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/perm_identity/materialicons/black/res/drawable/baseline_perm_identity_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,5.9c1.16,0 2.1,0.94 2.1,2.1s-0.94,2.1 -2.1,2.1S9.9,9.16 9.9,8s0.94,-2.1 2.1,-2.1m0,9c2.97,0 6.1,1.46 6.1,2.1v1.1L5.9,18.1L5.9,17c0,-0.64 3.13,-2.1 6.1,-2.1M12,4C9.79,4 8,5.79 8,8s1.79,4 4,4 4,-1.79 4,-4 -1.79,-4 -4,-4zM12,13c-2.67,0 -8,1.34 -8,4v3h16v-3c0,-2.66 -5.33,-4 -8,-4z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/perm_media.xml b/qqq/android/mobileapp/src/main/res/drawable/perm_media.xml new file mode 100644 index 0000000..273d6f6 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/perm_media.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/perm_media/materialicons/black/res/drawable/baseline_perm_media_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M2,6L0,6v5h0.01L0,20c0,1.1 0.9,2 2,2h18v-2L2,20L2,6zM22,4h-8l-2,-2L6,2c-1.1,0 -1.99,0.9 -1.99,2L4,16c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2L24,6c0,-1.1 -0.9,-2 -2,-2zM7,15l4.5,-6 3.5,4.51 2.5,-3.01L21,15L7,15z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/perm_phone_msg.xml b/qqq/android/mobileapp/src/main/res/drawable/perm_phone_msg.xml new file mode 100644 index 0000000..34eec58 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/perm_phone_msg.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/perm_phone_msg/materialicons/black/res/drawable/baseline_perm_phone_msg_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,15.5c-1.25,0 -2.45,-0.2 -3.57,-0.57 -0.35,-0.11 -0.74,-0.03 -1.02,0.24l-2.2,2.2c-2.83,-1.44 -5.15,-3.75 -6.59,-6.58l2.2,-2.21c0.28,-0.27 0.36,-0.66 0.25,-1.01C8.7,6.45 8.5,5.25 8.5,4c0,-0.55 -0.45,-1 -1,-1H4c-0.55,0 -1,0.45 -1,1 0,9.39 7.61,17 17,17 0.55,0 1,-0.45 1,-1v-3.5c0,-0.55 -0.45,-1 -1,-1zM12,3v10l3,-3h6V3h-9z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/perm_scan_wifi.xml b/qqq/android/mobileapp/src/main/res/drawable/perm_scan_wifi.xml new file mode 100644 index 0000000..a989535 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/perm_scan_wifi.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/perm_scan_wifi/materialicons/black/res/drawable/baseline_perm_scan_wifi_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,3C6.95,3 3.15,4.85 0,7.23L12,22 24,7.25C20.85,4.87 17.05,3 12,3zM13,16h-2v-6h2v6zM11,8L11,6h2v2h-2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/person.xml b/qqq/android/mobileapp/src/main/res/drawable/person.xml new file mode 100644 index 0000000..1f54a06 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/person.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/person/materialicons/black/res/drawable/baseline_person_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,12c2.21,0 4,-1.79 4,-4s-1.79,-4 -4,-4 -4,1.79 -4,4 1.79,4 4,4zM12,14c-2.67,0 -8,1.34 -8,4v2h16v-2c0,-2.66 -5.33,-4 -8,-4z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/person_2.xml b/qqq/android/mobileapp/src/main/res/drawable/person_2.xml new file mode 100644 index 0000000..48e5c51 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/person_2.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/person_2/materialicons/black/res/drawable/baseline_person_2_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M18.39,14.56C16.71,13.7 14.53,13 12,13c-2.53,0 -4.71,0.7 -6.39,1.56C4.61,15.07 4,16.1 4,17.22V20h16v-2.78C20,16.1 19.39,15.07 18.39,14.56z" /> + <path + android:fillColor="#FF000000" + android:pathData="M9.78,12h4.44c1.21,0 2.14,-1.06 1.98,-2.26l-0.32,-2.45C15.57,5.39 13.92,4 12,4S8.43,5.39 8.12,7.29L7.8,9.74C7.64,10.94 8.57,12 9.78,12z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/person_3.xml b/qqq/android/mobileapp/src/main/res/drawable/person_3.xml new file mode 100644 index 0000000..f23813e --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/person_3.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/person_3/materialicons/black/res/drawable/baseline_person_3_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M18.39,14.56C16.71,13.7 14.53,13 12,13c-2.53,0 -4.71,0.7 -6.39,1.56C4.61,15.07 4,16.1 4,17.22V20h16v-2.78C20,16.1 19.39,15.07 18.39,14.56z" /> + <path + android:fillColor="#FF000000" + android:pathData="M10,12c0.17,0 3.83,0 4,0c1.66,0 3,-1.34 3,-3c0,-0.73 -0.27,-1.4 -0.71,-1.92C16.42,6.75 16.5,6.38 16.5,6c0,-1.25 -0.77,-2.32 -1.86,-2.77C14,2.48 13.06,2 12,2s-2,0.48 -2.64,1.23C8.27,3.68 7.5,4.75 7.5,6c0,0.38 0.08,0.75 0.21,1.08C7.27,7.6 7,8.27 7,9C7,10.66 8.34,12 10,12z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/person_4.xml b/qqq/android/mobileapp/src/main/res/drawable/person_4.xml new file mode 100644 index 0000000..c93e80f --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/person_4.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/person_4/materialicons/black/res/drawable/baseline_person_4_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M18.39,14.56C16.71,13.7 14.53,13 12,13c-2.53,0 -4.71,0.7 -6.39,1.56C4.61,15.07 4,16.1 4,17.22V20h16v-2.78C20,16.1 19.39,15.07 18.39,14.56z" /> + <path + android:fillColor="#FF000000" + android:pathData="M12,12c2.21,0 4,-1.79 4,-4c0,-1.37 0,-3.5 0,-3.5C16,3.67 15.33,3 14.5,3c-0.52,0 -0.98,0.27 -1.25,0.67C12.98,3.27 12.52,3 12,3s-0.98,0.27 -1.25,0.67C10.48,3.27 10.02,3 9.5,3C8.67,3 8,3.67 8,4.5c0,0 0,2.12 0,3.5C8,10.21 9.79,12 12,12z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/person_add.xml b/qqq/android/mobileapp/src/main/res/drawable/person_add.xml new file mode 100644 index 0000000..ef14708 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/person_add.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/person_add/materialicons/black/res/drawable/baseline_person_add_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M15,12c2.21,0 4,-1.79 4,-4s-1.79,-4 -4,-4 -4,1.79 -4,4 1.79,4 4,4zM6,10L6,7L4,7v3L1,10v2h3v3h2v-3h3v-2L6,10zM15,14c-2.67,0 -8,1.34 -8,4v2h16v-2c0,-2.66 -5.33,-4 -8,-4z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/person_add_alt.xml b/qqq/android/mobileapp/src/main/res/drawable/person_add_alt.xml new file mode 100644 index 0000000..9adf617 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/person_add_alt.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/person_add_alt/materialicons/black/res/drawable/baseline_person_add_alt_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M13,8c0,-2.21 -1.79,-4 -4,-4S5,5.79 5,8s1.79,4 4,4S13,10.21 13,8zM11,8c0,1.1 -0.9,2 -2,2S7,9.1 7,8s0.9,-2 2,-2S11,6.9 11,8zM1,18v2h16v-2c0,-2.66 -5.33,-4 -8,-4S1,15.34 1,18zM3,18c0.2,-0.71 3.3,-2 6,-2c2.69,0 5.78,1.28 6,2H3zM20,15v-3h3v-2h-3V7h-2v3h-3v2h3v3H20z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/person_add_alt_1.xml b/qqq/android/mobileapp/src/main/res/drawable/person_add_alt_1.xml new file mode 100644 index 0000000..44bb3f5 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/person_add_alt_1.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/person_add_alt_1/materialicons/black/res/drawable/baseline_person_add_alt_1_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M13,8c0,-2.21 -1.79,-4 -4,-4S5,5.79 5,8s1.79,4 4,4S13,10.21 13,8zM15,10v2h3v3h2v-3h3v-2h-3V7h-2v3H15zM1,18v2h16v-2c0,-2.66 -5.33,-4 -8,-4S1,15.34 1,18z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/person_add_disabled.xml b/qqq/android/mobileapp/src/main/res/drawable/person_add_disabled.xml new file mode 100644 index 0000000..c235ba9 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/person_add_disabled.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/communication/person_add_disabled/materialicons/black/res/drawable/baseline_person_add_disabled_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M15,8m-4,0a4,4 0,1 1,8 0a4,4 0,1 1,-8 0" /> + <path + android:fillColor="#FF000000" + android:pathData="M23,20v-2c0,-2.3 -4.1,-3.7 -6.9,-3.9l6,5.9h0.9zM11.4,14.5C9.2,15.1 7,16.3 7,18v2h9.9l4,4 1.3,-1.3 -21,-20.9L0,3.1l4,4L4,10L1,10v2h3v3h2v-3h2.9l2.5,2.5zM6,10v-0.9l0.9,0.9L6,10z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/person_off.xml b/qqq/android/mobileapp/src/main/res/drawable/person_off.xml new file mode 100644 index 0000000..7f5b756 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/person_off.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/person_off/materialicons/black/res/drawable/baseline_person_off_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M8.65,5.82C9.36,4.72 10.6,4 12,4c2.21,0 4,1.79 4,4c0,1.4 -0.72,2.64 -1.82,3.35L8.65,5.82zM20,17.17c-0.02,-1.1 -0.63,-2.11 -1.61,-2.62c-0.54,-0.28 -1.13,-0.54 -1.77,-0.76L20,17.17zM21.19,21.19L2.81,2.81L1.39,4.22l8.89,8.89c-1.81,0.23 -3.39,0.79 -4.67,1.45C4.61,15.07 4,16.1 4,17.22V20h13.17l2.61,2.61L21.19,21.19z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/person_outline.xml b/qqq/android/mobileapp/src/main/res/drawable/person_outline.xml new file mode 100644 index 0000000..d46f951 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/person_outline.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/person_outline/materialicons/black/res/drawable/baseline_person_outline_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,5.9c1.16,0 2.1,0.94 2.1,2.1s-0.94,2.1 -2.1,2.1S9.9,9.16 9.9,8s0.94,-2.1 2.1,-2.1m0,9c2.97,0 6.1,1.46 6.1,2.1v1.1L5.9,18.1L5.9,17c0,-0.64 3.13,-2.1 6.1,-2.1M12,4C9.79,4 8,5.79 8,8s1.79,4 4,4 4,-1.79 4,-4 -1.79,-4 -4,-4zM12,13c-2.67,0 -8,1.34 -8,4v3h16v-3c0,-2.66 -5.33,-4 -8,-4z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/person_pin.xml b/qqq/android/mobileapp/src/main/res/drawable/person_pin.xml new file mode 100644 index 0000000..df313c6 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/person_pin.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/person_pin/materialicons/black/res/drawable/baseline_person_pin_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,2c-4.97,0 -9,4.03 -9,9 0,4.17 2.84,7.67 6.69,8.69L12,22l2.31,-2.31C18.16,18.67 21,15.17 21,11c0,-4.97 -4.03,-9 -9,-9zM12,4c1.66,0 3,1.34 3,3s-1.34,3 -3,3 -3,-1.34 -3,-3 1.34,-3 3,-3zM12,18.3c-2.5,0 -4.71,-1.28 -6,-3.22 0.03,-1.99 4,-3.08 6,-3.08 1.99,0 5.97,1.09 6,3.08 -1.29,1.94 -3.5,3.22 -6,3.22z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/person_pin_circle.xml b/qqq/android/mobileapp/src/main/res/drawable/person_pin_circle.xml new file mode 100644 index 0000000..909be88 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/person_pin_circle.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/person_pin_circle/materialicons/black/res/drawable/baseline_person_pin_circle_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,2C8.14,2 5,5.14 5,9c0,5.25 7,13 7,13s7,-7.75 7,-13C19,5.14 15.86,2 12,2zM12,4c1.1,0 2,0.9 2,2c0,1.11 -0.9,2 -2,2s-2,-0.89 -2,-2C10,4.9 10.9,4 12,4zM12,14c-1.67,0 -3.14,-0.85 -4,-2.15c0.02,-1.32 2.67,-2.05 4,-2.05s3.98,0.73 4,2.05C15.14,13.15 13.67,14 12,14z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/person_remove.xml b/qqq/android/mobileapp/src/main/res/drawable/person_remove.xml new file mode 100644 index 0000000..56718ec --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/person_remove.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/person_remove/materialicons/black/res/drawable/baseline_person_remove_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M14,8c0,-2.21 -1.79,-4 -4,-4S6,5.79 6,8s1.79,4 4,4S14,10.21 14,8zM17,10v2h6v-2H17zM2,18v2h16v-2c0,-2.66 -5.33,-4 -8,-4S2,15.34 2,18z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/person_remove_alt_1.xml b/qqq/android/mobileapp/src/main/res/drawable/person_remove_alt_1.xml new file mode 100644 index 0000000..7663185 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/person_remove_alt_1.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/person_remove_alt_1/materialicons/black/res/drawable/baseline_person_remove_alt_1_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M14,8c0,-2.21 -1.79,-4 -4,-4S6,5.79 6,8s1.79,4 4,4S14,10.21 14,8zM17,10v2h6v-2H17zM2,18v2h16v-2c0,-2.66 -5.33,-4 -8,-4S2,15.34 2,18z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/person_search.xml b/qqq/android/mobileapp/src/main/res/drawable/person_search.xml new file mode 100644 index 0000000..c4526a7 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/person_search.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/communication/person_search/materialicons/black/res/drawable/baseline_person_search_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M10,8m-4,0a4,4 0,1 1,8 0a4,4 0,1 1,-8 0" /> + <path + android:fillColor="#FF000000" + android:pathData="M10.35,14.01C7.62,13.91 2,15.27 2,18v2h9.54C9.07,17.24 10.31,14.11 10.35,14.01z" /> + <path + android:fillColor="#FF000000" + android:pathData="M19.43,18.02C19.79,17.43 20,16.74 20,16c0,-2.21 -1.79,-4 -4,-4s-4,1.79 -4,4c0,2.21 1.79,4 4,4c0.74,0 1.43,-0.22 2.02,-0.57L20.59,22L22,20.59L19.43,18.02zM16,18c-1.1,0 -2,-0.9 -2,-2c0,-1.1 0.9,-2 2,-2s2,0.9 2,2C18,17.1 17.1,18 16,18z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/personal_injury.xml b/qqq/android/mobileapp/src/main/res/drawable/personal_injury.xml new file mode 100644 index 0000000..41676d1 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/personal_injury.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/personal_injury/materialicons/black/res/drawable/baseline_personal_injury_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M8,6c0,-2.21 1.79,-4 4,-4s4,1.79 4,4c0,2.21 -1.79,4 -4,4S8,8.21 8,6zM17,22h1c1.1,0 2,-0.9 2,-2l0,-4.78c0,-1.12 -0.61,-2.15 -1.61,-2.66c-0.43,-0.22 -0.9,-0.43 -1.39,-0.62L17,22zM12.34,17L15,11.33C14.07,11.12 13.07,11 12,11c-2.53,0 -4.71,0.7 -6.39,1.56C4.61,13.07 4,14.1 4,15.22L4,22h2.34C6.12,21.55 6,21.04 6,20.5C6,18.57 7.57,17 9.5,17H12.34zM10,22l1.41,-3H9.5C8.67,19 8,19.67 8,20.5S8.67,22 9.5,22H10z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/personal_video.xml b/qqq/android/mobileapp/src/main/res/drawable/personal_video.xml new file mode 100644 index 0000000..a61527c --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/personal_video.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/notification/personal_video/materialicons/black/res/drawable/baseline_personal_video_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M21,3L3,3c-1.11,0 -2,0.89 -2,2v12c0,1.1 0.89,2 2,2h5v2h8v-2h5c1.1,0 1.99,-0.9 1.99,-2L23,5c0,-1.11 -0.9,-2 -2,-2zM21,17L3,17L3,5h18v12z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/pest_control.xml b/qqq/android/mobileapp/src/main/res/drawable/pest_control.xml new file mode 100644 index 0000000..5b1ff85 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/pest_control.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/pest_control/materialicons/black/res/drawable/baseline_pest_control_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M21,15v-2h-3.07c-0.05,-0.39 -0.12,-0.77 -0.22,-1.14l2.58,-1.49l-1,-1.73L16.92,10c-0.28,-0.48 -0.62,-0.91 -0.99,-1.29C15.97,8.48 16,8.25 16,8c0,-0.8 -0.24,-1.55 -0.65,-2.18L17,4.17l-1.41,-1.41l-1.72,1.72c-1.68,-0.89 -3.1,-0.33 -3.73,0L8.41,2.76L7,4.17l1.65,1.65C8.24,6.45 8,7.2 8,8c0,0.25 0.03,0.48 0.07,0.72C7.7,9.1 7.36,9.53 7.08,10L4.71,8.63l-1,1.73l2.58,1.49c-0.1,0.37 -0.17,0.75 -0.22,1.14H3v2h3.07c0.05,0.39 0.12,0.77 0.22,1.14l-2.58,1.49l1,1.73L7.08,18c1.08,1.81 2.88,3 4.92,3s3.84,-1.19 4.92,-3l2.37,1.37l1,-1.73l-2.58,-1.49c0.1,-0.37 0.17,-0.75 0.22,-1.14H21zM13,17h-2v-6h2V17z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/pest_control_rodent.xml b/qqq/android/mobileapp/src/main/res/drawable/pest_control_rodent.xml new file mode 100644 index 0000000..02fddd1 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/pest_control_rodent.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/pest_control_rodent/materialicons/black/res/drawable/baseline_pest_control_rodent_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M21.31,17.38l-2.39,-2.13C19.44,12.89 17.56,11 15.5,11c-1.16,0 -3.5,0.9 -3.5,3.5c0,0.97 0.39,1.84 1.03,2.47l-0.71,0.71C11.5,16.87 11,15.74 11,14.5c0,-1.7 0.96,-3.17 2.35,-3.93c-0.7,-0.36 -1.48,-0.57 -2.28,-0.57c-2.38,0 -4.37,1.65 -4.91,3.87C4.91,13.5 4,12.36 4,11c0,-1.66 1.34,-3 3,-3c0.94,0 1.56,0 2.5,0C10.88,8 12,6.88 12,5.5C12,4.12 10.88,3 9.5,3H8C7.45,3 7,3.45 7,4c0,0.55 0.45,1 1,1h1.5C9.78,5 10,5.22 10,5.5C10,5.78 9.78,6 9.5,6C9.47,6 9,6 7,6c-2.76,0 -5,2.24 -5,5c0,2.42 1.72,4.44 4,4.9v0.03C6,18.73 8.27,21 11.07,21h8.86C21.8,21 22.74,18.66 21.31,17.38zM18,19c-0.55,0 -1,-0.45 -1,-1c0,-0.55 0.45,-1 1,-1s1,0.45 1,1C19,18.55 18.55,19 18,19z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/pets.xml b/qqq/android/mobileapp/src/main/res/drawable/pets.xml new file mode 100644 index 0000000..2867dc7 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/pets.xml @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/pets/materialicons/black/res/drawable/baseline_pets_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M4.5,9.5m-2.5,0a2.5,2.5 0,1 1,5 0a2.5,2.5 0,1 1,-5 0" /> + <path + android:fillColor="#FF000000" + android:pathData="M9,5.5m-2.5,0a2.5,2.5 0,1 1,5 0a2.5,2.5 0,1 1,-5 0" /> + <path + android:fillColor="#FF000000" + android:pathData="M15,5.5m-2.5,0a2.5,2.5 0,1 1,5 0a2.5,2.5 0,1 1,-5 0" /> + <path + android:fillColor="#FF000000" + android:pathData="M19.5,9.5m-2.5,0a2.5,2.5 0,1 1,5 0a2.5,2.5 0,1 1,-5 0" /> + <path + android:fillColor="#FF000000" + android:pathData="M17.34,14.86c-0.87,-1.02 -1.6,-1.89 -2.48,-2.91 -0.46,-0.54 -1.05,-1.08 -1.75,-1.32 -0.11,-0.04 -0.22,-0.07 -0.33,-0.09 -0.25,-0.04 -0.52,-0.04 -0.78,-0.04s-0.53,0 -0.79,0.05c-0.11,0.02 -0.22,0.05 -0.33,0.09 -0.7,0.24 -1.28,0.78 -1.75,1.32 -0.87,1.02 -1.6,1.89 -2.48,2.91 -1.31,1.31 -2.92,2.76 -2.62,4.79 0.29,1.02 1.02,2.03 2.33,2.32 0.73,0.15 3.06,-0.44 5.54,-0.44h0.18c2.48,0 4.81,0.58 5.54,0.44 1.31,-0.29 2.04,-1.31 2.33,-2.32 0.31,-2.04 -1.3,-3.49 -2.61,-4.8z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/phishing.xml b/qqq/android/mobileapp/src/main/res/drawable/phishing.xml new file mode 100644 index 0000000..6c446c1 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/phishing.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/phishing/materialicons/black/res/drawable/baseline_phishing_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19,9c0,-1.3 -0.84,-2.4 -2,-2.82V2h-2v4.18C13.84,6.6 13,7.7 13,9s0.84,2.4 2,2.82V15c0,2.21 -1.79,4 -4,4s-4,-1.79 -4,-4v-1h3L5,9v6c0,3.31 2.69,6 6,6s6,-2.69 6,-6v-3.18C18.16,11.4 19,10.3 19,9zM16,10c-0.55,0 -1,-0.45 -1,-1s0.45,-1 1,-1s1,0.45 1,1S16.55,10 16,10z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/phone.xml b/qqq/android/mobileapp/src/main/res/drawable/phone.xml new file mode 100644 index 0000000..718d896 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/phone.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/communication/phone/materialicons/black/res/drawable/baseline_phone_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M6.62,10.79c1.44,2.83 3.76,5.14 6.59,6.59l2.2,-2.2c0.27,-0.27 0.67,-0.36 1.02,-0.24 1.12,0.37 2.33,0.57 3.57,0.57 0.55,0 1,0.45 1,1V20c0,0.55 -0.45,1 -1,1 -9.39,0 -17,-7.61 -17,-17 0,-0.55 0.45,-1 1,-1h3.5c0.55,0 1,0.45 1,1 0,1.25 0.2,2.45 0.57,3.57 0.11,0.35 0.03,0.74 -0.25,1.02l-2.2,2.2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/phone_android.xml b/qqq/android/mobileapp/src/main/res/drawable/phone_android.xml new file mode 100644 index 0000000..ffa5424 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/phone_android.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/hardware/phone_android/materialicons/black/res/drawable/baseline_phone_android_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M16,1L8,1C6.34,1 5,2.34 5,4v16c0,1.66 1.34,3 3,3h8c1.66,0 3,-1.34 3,-3L19,4c0,-1.66 -1.34,-3 -3,-3zM14,21h-4v-1h4v1zM17.25,18L6.75,18L6.75,4h10.5v14z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/phone_bluetooth_speaker.xml b/qqq/android/mobileapp/src/main/res/drawable/phone_bluetooth_speaker.xml new file mode 100644 index 0000000..cfc17cc --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/phone_bluetooth_speaker.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/notification/phone_bluetooth_speaker/materialicons/black/res/drawable/baseline_phone_bluetooth_speaker_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M14.71,9.5L17,7.21L17,11h0.5l2.85,-2.85L18.21,6l2.15,-2.15L17.5,1L17,1v3.79L14.71,2.5l-0.71,0.71L16.79,6 14,8.79l0.71,0.71zM18,2.91l0.94,0.94 -0.94,0.94L18,2.91zM18,7.21l0.94,0.94 -0.94,0.94L18,7.21zM20,15.5c-1.25,0 -2.45,-0.2 -3.57,-0.57 -0.35,-0.11 -0.74,-0.03 -1.02,0.24l-2.2,2.2c-2.83,-1.44 -5.15,-3.75 -6.59,-6.59l2.2,-2.21c0.28,-0.26 0.36,-0.65 0.25,-1C8.7,6.45 8.5,5.25 8.5,4c0,-0.55 -0.45,-1 -1,-1L4,3c-0.55,0 -1,0.45 -1,1 0,9.39 7.61,17 17,17 0.55,0 1,-0.45 1,-1v-3.5c0,-0.55 -0.45,-1 -1,-1z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/phone_callback.xml b/qqq/android/mobileapp/src/main/res/drawable/phone_callback.xml new file mode 100644 index 0000000..5ab9176 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/phone_callback.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/notification/phone_callback/materialicons/black/res/drawable/baseline_phone_callback_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M6.62,10.79c1.44,2.83 3.76,5.14 6.59,6.59l2.2,-2.2c0.27,-0.27 0.67,-0.36 1.02,-0.24 1.12,0.37 2.33,0.57 3.57,0.57 0.55,0 1,0.45 1,1L21,20c0,0.55 -0.45,1 -1,1 -9.39,0 -17,-7.61 -17,-17 0,-0.55 0.45,-1 1,-1h3.5c0.55,0 1,0.45 1,1 0,1.25 0.2,2.45 0.57,3.57 0.11,0.35 0.03,0.74 -0.25,1.02l-2.2,2.2zM20.16,3.69l-0.71,-0.7L13,9.29L13,5h-1v6h6v-1h-4.15z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/phone_disabled.xml b/qqq/android/mobileapp/src/main/res/drawable/phone_disabled.xml new file mode 100644 index 0000000..36fd1a6 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/phone_disabled.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/communication/phone_disabled/materialicons/black/res/drawable/baseline_phone_disabled_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M17.34,14.54l-1.43,-1.43c0.56,-0.73 1.05,-1.5 1.47,-2.32l-2.2,-2.2c-0.28,-0.28 -0.36,-0.67 -0.25,-1.02 0.37,-1.12 0.57,-2.32 0.57,-3.57 0,-0.55 0.45,-1 1,-1L20,3c0.55,0 1,0.45 1,1 0,3.98 -1.37,7.64 -3.66,10.54zM14.52,17.35C11.63,19.64 7.97,21 4,21c-0.55,0 -1,-0.45 -1,-1v-3.49c0,-0.55 0.45,-1 1,-1 1.24,0 2.45,-0.2 3.57,-0.57 0.35,-0.12 0.75,-0.03 1.02,0.24l2.2,2.2c0.81,-0.42 1.58,-0.9 2.3,-1.46L1.39,4.22l1.42,-1.41L21.19,21.2l-1.41,1.41 -5.26,-5.26z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/phone_enabled.xml b/qqq/android/mobileapp/src/main/res/drawable/phone_enabled.xml new file mode 100644 index 0000000..4cb2502 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/phone_enabled.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/communication/phone_enabled/materialicons/black/res/drawable/baseline_phone_enabled_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M17.38,10.79l-2.2,-2.2c-0.28,-0.28 -0.36,-0.67 -0.25,-1.02 0.37,-1.12 0.57,-2.32 0.57,-3.57 0,-0.55 0.45,-1 1,-1H20c0.55,0 1,0.45 1,1 0,9.39 -7.61,17 -17,17 -0.55,0 -1,-0.45 -1,-1v-3.49c0,-0.55 0.45,-1 1,-1 1.24,0 2.45,-0.2 3.57,-0.57 0.35,-0.12 0.75,-0.03 1.02,0.24l2.2,2.2c2.83,-1.45 5.15,-3.76 6.59,-6.59z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/phone_forwarded.xml b/qqq/android/mobileapp/src/main/res/drawable/phone_forwarded.xml new file mode 100644 index 0000000..784b3b4 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/phone_forwarded.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/notification/phone_forwarded/materialicons/black/res/drawable/baseline_phone_forwarded_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M18,11l5,-5 -5,-5v3h-4v4h4v3zM20,15.5c-1.25,0 -2.45,-0.2 -3.57,-0.57 -0.35,-0.11 -0.74,-0.03 -1.02,0.24l-2.2,2.2c-2.83,-1.44 -5.15,-3.75 -6.59,-6.59l2.2,-2.21c0.28,-0.26 0.36,-0.65 0.25,-1C8.7,6.45 8.5,5.25 8.5,4c0,-0.55 -0.45,-1 -1,-1L4,3c-0.55,0 -1,0.45 -1,1 0,9.39 7.61,17 17,17 0.55,0 1,-0.45 1,-1v-3.5c0,-0.55 -0.45,-1 -1,-1z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/phone_in_talk.xml b/qqq/android/mobileapp/src/main/res/drawable/phone_in_talk.xml new file mode 100644 index 0000000..b523a5a --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/phone_in_talk.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/notification/phone_in_talk/materialicons/black/res/drawable/baseline_phone_in_talk_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,15.5c-1.25,0 -2.45,-0.2 -3.57,-0.57 -0.35,-0.11 -0.74,-0.03 -1.02,0.24l-2.2,2.2c-2.83,-1.44 -5.15,-3.75 -6.59,-6.59l2.2,-2.21c0.28,-0.26 0.36,-0.65 0.25,-1C8.7,6.45 8.5,5.25 8.5,4c0,-0.55 -0.45,-1 -1,-1L4,3c-0.55,0 -1,0.45 -1,1 0,9.39 7.61,17 17,17 0.55,0 1,-0.45 1,-1v-3.5c0,-0.55 -0.45,-1 -1,-1zM19,12h2c0,-4.97 -4.03,-9 -9,-9v2c3.87,0 7,3.13 7,7zM15,12h2c0,-2.76 -2.24,-5 -5,-5v2c1.66,0 3,1.34 3,3z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/phone_iphone.xml b/qqq/android/mobileapp/src/main/res/drawable/phone_iphone.xml new file mode 100644 index 0000000..fc86a7c --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/phone_iphone.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/hardware/phone_iphone/materialicons/black/res/drawable/baseline_phone_iphone_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M15.5,1h-8C6.12,1 5,2.12 5,3.5v17C5,21.88 6.12,23 7.5,23h8c1.38,0 2.5,-1.12 2.5,-2.5v-17C18,2.12 16.88,1 15.5,1zM11.5,22c-0.83,0 -1.5,-0.67 -1.5,-1.5s0.67,-1.5 1.5,-1.5 1.5,0.67 1.5,1.5 -0.67,1.5 -1.5,1.5zM16,18L7,18L7,4h9v14z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/phone_locked.xml b/qqq/android/mobileapp/src/main/res/drawable/phone_locked.xml new file mode 100644 index 0000000..c3e5625 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/phone_locked.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/notification/phone_locked/materialicons/black/res/drawable/baseline_phone_locked_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,5V4c0,-1.1 -0.9,-2 -2,-2s-2,0.9 -2,2v1h-1v5h6V5H20zM19,5h-2V4c0,-0.55 0.45,-1 1,-1s1,0.45 1,1V5z" /> + <path + android:fillColor="#FF000000" + android:pathData="M15.63,14.4l-2.52,2.5c-2.5,-1.43 -4.57,-3.5 -6,-6l2.5,-2.52c0.23,-0.24 0.33,-0.57 0.27,-0.9L9.13,3.8C9.04,3.34 8.63,3 8.15,3L4,3C3.44,3 2.97,3.47 3,4.03C3.17,6.92 4.05,9.63 5.43,12c1.58,2.73 3.85,4.99 6.57,6.57c2.37,1.37 5.08,2.26 7.97,2.43c0.56,0.03 1.03,-0.44 1.03,-1l0,-4.15c0,-0.48 -0.34,-0.89 -0.8,-0.98l-3.67,-0.73C16.2,14.07 15.86,14.17 15.63,14.4z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/phone_missed.xml b/qqq/android/mobileapp/src/main/res/drawable/phone_missed.xml new file mode 100644 index 0000000..56d5f7a --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/phone_missed.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/notification/phone_missed/materialicons/black/res/drawable/baseline_phone_missed_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M6.5,5.5L12,11l7,-7 -1,-1 -6,6 -4.5,-4.5L11,4.5L11,3L5,3v6h1.5L6.5,5.5zM23.71,16.67C20.66,13.78 16.54,12 12,12 7.46,12 3.34,13.78 0.29,16.67c-0.18,0.18 -0.29,0.43 -0.29,0.71s0.11,0.53 0.29,0.71l2.48,2.48c0.18,0.18 0.43,0.29 0.71,0.29 0.27,0 0.52,-0.11 0.7,-0.28 0.79,-0.74 1.69,-1.36 2.66,-1.85 0.33,-0.16 0.56,-0.5 0.56,-0.9v-3.1c1.45,-0.48 3,-0.73 4.6,-0.73 1.6,0 3.15,0.25 4.6,0.72v3.1c0,0.39 0.23,0.74 0.56,0.9 0.98,0.49 1.87,1.12 2.67,1.85 0.18,0.18 0.43,0.28 0.7,0.28 0.28,0 0.53,-0.11 0.71,-0.29l2.48,-2.48c0.18,-0.18 0.29,-0.43 0.29,-0.71s-0.12,-0.52 -0.3,-0.7z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/phone_paused.xml b/qqq/android/mobileapp/src/main/res/drawable/phone_paused.xml new file mode 100644 index 0000000..471c551 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/phone_paused.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/notification/phone_paused/materialicons/black/res/drawable/baseline_phone_paused_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M17,3h-2v7h2L17,3zM20,15.5c-1.25,0 -2.45,-0.2 -3.57,-0.57 -0.35,-0.11 -0.74,-0.03 -1.02,0.24l-2.2,2.2c-2.83,-1.44 -5.15,-3.75 -6.59,-6.59l2.2,-2.21c0.28,-0.26 0.36,-0.65 0.25,-1C8.7,6.45 8.5,5.25 8.5,4c0,-0.55 -0.45,-1 -1,-1L4,3c-0.55,0 -1,0.45 -1,1 0,9.39 7.61,17 17,17 0.55,0 1,-0.45 1,-1v-3.5c0,-0.55 -0.45,-1 -1,-1zM19,3v7h2L21,3h-2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/phonelink.xml b/qqq/android/mobileapp/src/main/res/drawable/phonelink.xml new file mode 100644 index 0000000..bb24b8d --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/phonelink.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/hardware/phonelink/materialicons/black/res/drawable/baseline_phonelink_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M4,6h18L22,4L4,4c-1.1,0 -2,0.9 -2,2v11L0,17v3h14v-3L4,17L4,6zM23,8h-6c-0.55,0 -1,0.45 -1,1v10c0,0.55 0.45,1 1,1h6c0.55,0 1,-0.45 1,-1L24,9c0,-0.55 -0.45,-1 -1,-1zM22,17h-4v-7h4v7z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/phonelink_erase.xml b/qqq/android/mobileapp/src/main/res/drawable/phonelink_erase.xml new file mode 100644 index 0000000..3ba4490 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/phonelink_erase.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/communication/phonelink_erase/materialicons/black/res/drawable/baseline_phonelink_erase_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M13,8.2l-1,-1 -4,4 -4,-4 -1,1 4,4 -4,4 1,1 4,-4 4,4 1,-1 -4,-4 4,-4zM19,1H9c-1.1,0 -2,0.9 -2,2v3h2V4h10v16H9v-2H7v3c0,1.1 0.9,2 2,2h10c1.1,0 2,-0.9 2,-2V3c0,-1.1 -0.9,-2 -2,-2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/phonelink_lock.xml b/qqq/android/mobileapp/src/main/res/drawable/phonelink_lock.xml new file mode 100644 index 0000000..a7b21a6 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/phonelink_lock.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/communication/phonelink_lock/materialicons/black/res/drawable/baseline_phonelink_lock_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19,1L9,1c-1.1,0 -2,0.9 -2,2v3h2L9,4h10v16L9,20v-2L7,18v3c0,1.1 0.9,2 2,2h10c1.1,0 2,-0.9 2,-2L21,3c0,-1.1 -0.9,-2 -2,-2zM10.8,11L10.8,9.5C10.8,8.1 9.4,7 8,7S5.2,8.1 5.2,9.5L5.2,11c-0.6,0 -1.2,0.6 -1.2,1.2v3.5c0,0.7 0.6,1.3 1.2,1.3h5.5c0.7,0 1.3,-0.6 1.3,-1.2v-3.5c0,-0.7 -0.6,-1.3 -1.2,-1.3zM9.5,11h-3L6.5,9.5c0,-0.8 0.7,-1.3 1.5,-1.3s1.5,0.5 1.5,1.3L9.5,11z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/phonelink_off.xml b/qqq/android/mobileapp/src/main/res/drawable/phonelink_off.xml new file mode 100644 index 0000000..7247214 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/phonelink_off.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/hardware/phonelink_off/materialicons/black/res/drawable/baseline_phonelink_off_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M22,6V4H6.82l2,2H22zM1.92,1.65L0.65,2.92l1.82,1.82C2.18,5.08 2,5.52 2,6v11H0v3h17.73l2.35,2.35 1.27,-1.27L3.89,3.62 1.92,1.65zM4,6.27L14.73,17H4V6.27zM23,8h-6c-0.55,0 -1,0.45 -1,1v4.18l2,2V10h4v7h-2.18l3,3H23c0.55,0 1,-0.45 1,-1V9c0,-0.55 -0.45,-1 -1,-1z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/phonelink_ring.xml b/qqq/android/mobileapp/src/main/res/drawable/phonelink_ring.xml new file mode 100644 index 0000000..c7bd2a1 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/phonelink_ring.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/communication/phonelink_ring/materialicons/black/res/drawable/baseline_phonelink_ring_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20.1,7.7l-1,1c1.8,1.8 1.8,4.6 0,6.5l1,1c2.5,-2.3 2.5,-6.1 0,-8.5zM18,9.8l-1,1c0.5,0.7 0.5,1.6 0,2.3l1,1c1.2,-1.2 1.2,-3 0,-4.3zM14,1L4,1c-1.1,0 -2,0.9 -2,2v18c0,1.1 0.9,2 2,2h10c1.1,0 2,-0.9 2,-2L16,3c0,-1.1 -0.9,-2 -2,-2zM14,20L4,20L4,4h10v16z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/phonelink_setup.xml b/qqq/android/mobileapp/src/main/res/drawable/phonelink_setup.xml new file mode 100644 index 0000000..f69c12d --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/phonelink_setup.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/communication/phonelink_setup/materialicons/black/res/drawable/baseline_phonelink_setup_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M10.82,12.49c0.02,-0.16 0.04,-0.32 0.04,-0.49 0,-0.17 -0.02,-0.33 -0.04,-0.49l1.08,-0.82c0.1,-0.07 0.12,-0.21 0.06,-0.32l-1.03,-1.73c-0.06,-0.11 -0.2,-0.15 -0.31,-0.11l-1.28,0.5c-0.27,-0.2 -0.56,-0.36 -0.87,-0.49l-0.2,-1.33c0,-0.12 -0.11,-0.21 -0.24,-0.21H5.98c-0.13,0 -0.24,0.09 -0.26,0.21l-0.2,1.32c-0.31,0.12 -0.6,0.3 -0.87,0.49l-1.28,-0.5c-0.12,-0.05 -0.25,0 -0.31,0.11l-1.03,1.73c-0.06,0.12 -0.03,0.25 0.07,0.33l1.08,0.82c-0.02,0.16 -0.03,0.33 -0.03,0.49 0,0.17 0.02,0.33 0.04,0.49l-1.09,0.83c-0.1,0.07 -0.12,0.21 -0.06,0.32l1.03,1.73c0.06,0.11 0.2,0.15 0.31,0.11l1.28,-0.5c0.27,0.2 0.56,0.36 0.87,0.49l0.2,1.32c0.01,0.12 0.12,0.21 0.25,0.21h2.06c0.13,0 0.24,-0.09 0.25,-0.21l0.2,-1.32c0.31,-0.12 0.6,-0.3 0.87,-0.49l1.28,0.5c0.12,0.05 0.25,0 0.31,-0.11l1.03,-1.73c0.06,-0.11 0.04,-0.24 -0.06,-0.32l-1.1,-0.83zM7,13.75c-0.99,0 -1.8,-0.78 -1.8,-1.75s0.81,-1.75 1.8,-1.75 1.8,0.78 1.8,1.75S8,13.75 7,13.75zM18,1.01L8,1c-1.1,0 -2,0.9 -2,2v3h2V5h10v14H8v-1H6v3c0,1.1 0.9,2 2,2h10c1.1,0 2,-0.9 2,-2V3c0,-1.1 -0.9,-1.99 -2,-1.99z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/photo.xml b/qqq/android/mobileapp/src/main/res/drawable/photo.xml new file mode 100644 index 0000000..e2bb33b --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/photo.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/photo/materialicons/black/res/drawable/baseline_photo_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M21,19V5c0,-1.1 -0.9,-2 -2,-2H5c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2zM8.5,13.5l2.5,3.01L14.5,12l4.5,6H5l3.5,-4.5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/photo_album.xml b/qqq/android/mobileapp/src/main/res/drawable/photo_album.xml new file mode 100644 index 0000000..be15e3e --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/photo_album.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/photo_album/materialicons/black/res/drawable/baseline_photo_album_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M18,2H6C4.9,2 4,2.9 4,4v16c0,1.1 0.9,2 2,2h12c1.1,0 2,-0.9 2,-2V4C20,2.9 19.1,2 18,2zM11,4h5v7l-2.5,-1.5L11,11V4zM7,18l2.38,-3.17L11,17l2.62,-3.5L17,18H7z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/photo_camera.xml b/qqq/android/mobileapp/src/main/res/drawable/photo_camera.xml new file mode 100644 index 0000000..08986a0 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/photo_camera.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/photo_camera/materialicons/black/res/drawable/baseline_photo_camera_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,12m-3.2,0a3.2,3.2 0,1 1,6.4 0a3.2,3.2 0,1 1,-6.4 0" /> + <path + android:fillColor="#FF000000" + android:pathData="M9,2L7.17,4L4,4c-1.1,0 -2,0.9 -2,2v12c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2L22,6c0,-1.1 -0.9,-2 -2,-2h-3.17L15,2L9,2zM12,17c-2.76,0 -5,-2.24 -5,-5s2.24,-5 5,-5 5,2.24 5,5 -2.24,5 -5,5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/photo_camera_back.xml b/qqq/android/mobileapp/src/main/res/drawable/photo_camera_back.xml new file mode 100644 index 0000000..e500805 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/photo_camera_back.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/photo_camera_back/materialicons/black/res/drawable/baseline_photo_camera_back_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,5c1.1,0 2,0.9 2,2v12c0,1.1 -0.9,2 -2,2L4,21c-1.1,0 -2,-0.9 -2,-2L2,7c0,-1.1 0.9,-2 2,-2h3.17L9,3h6l1.83,2L20,5zM20,19L20,7L4,7v12h16zM14,12l-3,3.72L9,13l-3,4h12l-4,-5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/photo_camera_front.xml b/qqq/android/mobileapp/src/main/res/drawable/photo_camera_front.xml new file mode 100644 index 0000000..fddb24b --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/photo_camera_front.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/photo_camera_front/materialicons/black/res/drawable/baseline_photo_camera_front_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M18,10.48l4,-3.98v11l-4,-3.98L18,18c0,1.1 -0.9,2 -2,2L4,20c-1.1,0 -2,-0.9 -2,-2L2,6c0,-1.1 0.9,-2 2,-2h12c1.1,0 2,0.9 2,2v4.48zM16,9.69L16,6L4,6v12h12L16,9.69zM10,12c-1.1,0 -2,-0.9 -2,-2s0.9,-2 2,-2 2,0.9 2,2 -0.9,2 -2,2zM10,13c1.34,0 4,0.67 4,2v1L6,16v-1c0,-1.33 2.66,-2 4,-2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/photo_filter.xml b/qqq/android/mobileapp/src/main/res/drawable/photo_filter.xml new file mode 100644 index 0000000..cad7061 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/photo_filter.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/photo_filter/materialicons/black/res/drawable/baseline_photo_filter_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19.02,10v9L5,19L5,5h9L14,3L5.02,3c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2v-9h-2zM17,10l0.94,-2.06L20,7l-2.06,-0.94L17,4l-0.94,2.06L14,7l2.06,0.94zM13.25,10.75L12,8l-1.25,2.75L8,12l2.75,1.25L12,16l1.25,-2.75L16,12z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/photo_library.xml b/qqq/android/mobileapp/src/main/res/drawable/photo_library.xml new file mode 100644 index 0000000..8332628 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/photo_library.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/photo_library/materialicons/black/res/drawable/baseline_photo_library_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M22,16L22,4c0,-1.1 -0.9,-2 -2,-2L8,2c-1.1,0 -2,0.9 -2,2v12c0,1.1 0.9,2 2,2h12c1.1,0 2,-0.9 2,-2zM11,12l2.03,2.71L16,11l4,5L8,16l3,-4zM2,6v14c0,1.1 0.9,2 2,2h14v-2L4,20L4,6L2,6z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/photo_size_select_actual.xml b/qqq/android/mobileapp/src/main/res/drawable/photo_size_select_actual.xml new file mode 100644 index 0000000..ec710af --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/photo_size_select_actual.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/photo_size_select_actual/materialicons/black/res/drawable/baseline_photo_size_select_actual_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M21,3H3C2,3 1,4 1,5v14c0,1.1 0.9,2 2,2h18c1,0 2,-1 2,-2V5c0,-1 -1,-2 -2,-2zM5,17l3.5,-4.5 2.5,3.01L14.5,11l4.5,6H5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/photo_size_select_large.xml b/qqq/android/mobileapp/src/main/res/drawable/photo_size_select_large.xml new file mode 100644 index 0000000..bdba63d --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/photo_size_select_large.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/photo_size_select_large/materialicons/black/res/drawable/baseline_photo_size_select_large_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M21,15h2v2h-2v-2zM21,11h2v2h-2v-2zM23,19h-2v2c1,0 2,-1 2,-2zM13,3h2v2h-2L13,3zM21,7h2v2h-2L21,7zM21,3v2h2c0,-1 -1,-2 -2,-2zM1,7h2v2L1,9L1,7zM17,3h2v2h-2L17,3zM17,19h2v2h-2v-2zM3,3C2,3 1,4 1,5h2L3,3zM9,3h2v2L9,5L9,3zM5,3h2v2L5,5L5,3zM1,11v8c0,1.1 0.9,2 2,2h12L15,11L1,11zM3,19l2.5,-3.21 1.79,2.15 2.5,-3.22L13,19L3,19z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/photo_size_select_small.xml b/qqq/android/mobileapp/src/main/res/drawable/photo_size_select_small.xml new file mode 100644 index 0000000..e6520e8 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/photo_size_select_small.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/photo_size_select_small/materialicons/black/res/drawable/baseline_photo_size_select_small_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M23,15h-2v2h2v-2zM23,11h-2v2h2v-2zM23,19h-2v2c1,0 2,-1 2,-2zM15,3h-2v2h2L15,3zM23,7h-2v2h2L23,7zM21,3v2h2c0,-1 -1,-2 -2,-2zM3,21h8v-6L1,15v4c0,1.1 0.9,2 2,2zM3,7L1,7v2h2L3,7zM15,19h-2v2h2v-2zM19,3h-2v2h2L19,3zM19,19h-2v2h2v-2zM3,3C2,3 1,4 1,5h2L3,3zM3,11L1,11v2h2v-2zM11,3L9,3v2h2L11,3zM7,3L5,3v2h2L7,3z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/php.xml b/qqq/android/mobileapp/src/main/res/drawable/php.xml new file mode 100644 index 0000000..49d3375 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/php.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/php/materialicons/black/res/drawable/baseline_php_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M13,9h1.5v6H13v-2.5h-2V15H9.5V9H11v2h2V9zM8,10.5v1C8,12.3 7.3,13 6.5,13h-2v2H3V9h3.5C7.3,9 8,9.7 8,10.5zM6.5,10.5h-2v1h2V10.5zM21.5,10.5v1c0,0.8 -0.7,1.5 -1.5,1.5h-2v2h-1.5V9H20C20.8,9 21.5,9.7 21.5,10.5zM20,10.5h-2v1h2V10.5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/piano.xml b/qqq/android/mobileapp/src/main/res/drawable/piano.xml new file mode 100644 index 0000000..b5f4e90 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/piano.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/piano/materialicons/black/res/drawable/baseline_piano_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19,3H5C3.9,3 3,3.9 3,5v14c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2V5C21,3.9 20.1,3 19,3zM14,14.5h0.25V19h-4.5v-4.5H10c0.55,0 1,-0.45 1,-1V5h2v8.5C13,14.05 13.45,14.5 14,14.5zM5,5h2v8.5c0,0.55 0.45,1 1,1h0.25V19H5V5zM19,19h-3.25v-4.5H16c0.55,0 1,-0.45 1,-1V5h2V19z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/piano_off.xml b/qqq/android/mobileapp/src/main/res/drawable/piano_off.xml new file mode 100644 index 0000000..a571300 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/piano_off.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/piano_off/materialicons/black/res/drawable/baseline_piano_off_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M21.19,21.19L2.81,2.81L1.39,4.22L3,5.83V19c0,1.1 0.9,2 2,2h13.17l1.61,1.61L21.19,21.19zM8.25,19H5V7.83l2,2v3.67c0,0.55 0.45,1 1,1h0.25V19zM9.75,19v-4.5H10c0.46,0 0.82,-0.31 0.94,-0.73l3.31,3.31V19H9.75zM11,8.17L5.83,3H19c1.1,0 2,0.9 2,2v13.17l-2,-2V5h-2v8.5c0,0.19 -0.07,0.36 -0.16,0.51L13,10.17V5h-2V8.17z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/picture_as_pdf.xml b/qqq/android/mobileapp/src/main/res/drawable/picture_as_pdf.xml new file mode 100644 index 0000000..c02c437 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/picture_as_pdf.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/picture_as_pdf/materialicons/black/res/drawable/baseline_picture_as_pdf_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,2L8,2c-1.1,0 -2,0.9 -2,2v12c0,1.1 0.9,2 2,2h12c1.1,0 2,-0.9 2,-2L22,4c0,-1.1 -0.9,-2 -2,-2zM11.5,9.5c0,0.83 -0.67,1.5 -1.5,1.5L9,11v2L7.5,13L7.5,7L10,7c0.83,0 1.5,0.67 1.5,1.5v1zM16.5,11.5c0,0.83 -0.67,1.5 -1.5,1.5h-2.5L12.5,7L15,7c0.83,0 1.5,0.67 1.5,1.5v3zM20.5,8.5L19,8.5v1h1.5L20.5,11L19,11v2h-1.5L17.5,7h3v1.5zM9,9.5h1v-1L9,8.5v1zM4,6L2,6v14c0,1.1 0.9,2 2,2h14v-2L4,20L4,6zM14,11.5h1v-3h-1v3z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/picture_in_picture.xml b/qqq/android/mobileapp/src/main/res/drawable/picture_in_picture.xml new file mode 100644 index 0000000..986fbee --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/picture_in_picture.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/picture_in_picture/materialicons/black/res/drawable/baseline_picture_in_picture_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19,7h-8v6h8L19,7zM21,3L3,3c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,1.98 2,1.98h18c1.1,0 2,-0.88 2,-1.98L23,5c0,-1.1 -0.9,-2 -2,-2zM21,19.01L3,19.01L3,4.98h18v14.03z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/picture_in_picture_alt.xml b/qqq/android/mobileapp/src/main/res/drawable/picture_in_picture_alt.xml new file mode 100644 index 0000000..bef0a98 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/picture_in_picture_alt.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/picture_in_picture_alt/materialicons/black/res/drawable/baseline_picture_in_picture_alt_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19,11h-8v6h8v-6zM23,19L23,4.98C23,3.88 22.1,3 21,3L3,3c-1.1,0 -2,0.88 -2,1.98L1,19c0,1.1 0.9,2 2,2h18c1.1,0 2,-0.9 2,-2zM21,19.02L3,19.02L3,4.97h18v14.05z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/pie_chart.xml b/qqq/android/mobileapp/src/main/res/drawable/pie_chart.xml new file mode 100644 index 0000000..3c51b7e --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/pie_chart.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/editor/pie_chart/materialicons/black/res/drawable/baseline_pie_chart_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M11,2v20c-5.07,-0.5 -9,-4.79 -9,-10s3.93,-9.5 9,-10zM13.03,2v8.99L22,10.99c-0.47,-4.74 -4.24,-8.52 -8.97,-8.99zM13.03,13.01L13.03,22c4.74,-0.47 8.5,-4.25 8.97,-8.99h-8.97z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/pie_chart_outline.xml b/qqq/android/mobileapp/src/main/res/drawable/pie_chart_outline.xml new file mode 100644 index 0000000..fe92165 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/pie_chart_outline.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/editor/pie_chart_outline/materialicons/black/res/drawable/baseline_pie_chart_outline_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,2C6.5,2 2,6.5 2,12s4.5,10 10,10s10,-4.5 10,-10S17.5,2 12,2zM13,4.07c3.61,0.45 6.48,3.33 6.93,6.93H13V4.07zM4,12c0,-4.06 3.07,-7.44 7,-7.93v15.87C7.07,19.44 4,16.06 4,12zM13,19.93V13h6.93C19.48,16.61 16.61,19.48 13,19.93z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/pie_chart_outlined.xml b/qqq/android/mobileapp/src/main/res/drawable/pie_chart_outlined.xml new file mode 100644 index 0000000..f254508 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/pie_chart_outlined.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/editor/pie_chart_outlined/materialicons/black/res/drawable/baseline_pie_chart_outlined_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,2C6.5,2 2,6.5 2,12s4.5,10 10,10 10,-4.5 10,-10S17.5,2 12,2zM13,4.07c3.61,0.45 6.48,3.33 6.93,6.93L13,11L13,4.07zM4,12c0,-4.06 3.07,-7.44 7,-7.93v15.87c-3.93,-0.5 -7,-3.88 -7,-7.94zM13,19.93L13,13h6.93c-0.45,3.61 -3.32,6.48 -6.93,6.93z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/pin.xml b/qqq/android/mobileapp/src/main/res/drawable/pin.xml new file mode 100644 index 0000000..e5d5530 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/pin.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/pin/materialicons/black/res/drawable/baseline_pin_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,4H4C2.9,4 2,4.9 2,6v12c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2V6C22,4.9 21.1,4 20,4zM7.64,15H6.49v-4.5l-0.9,0.66l-0.58,-0.89L6.77,9h0.87V15zM13.5,15H9.61v-1.02c1.07,-1.07 1.77,-1.77 2.13,-2.15c0.4,-0.42 0.54,-0.69 0.54,-1.06c0,-0.4 -0.31,-0.72 -0.81,-0.72c-0.52,0 -0.8,0.39 -0.9,0.72l-1.01,-0.42c0.01,-0.02 0.18,-0.76 1,-1.15c0.69,-0.33 1.48,-0.2 1.95,0.03c0.86,0.44 0.91,1.24 0.91,1.48c0,0.64 -0.31,1.26 -0.92,1.86c-0.25,0.25 -0.72,0.71 -1.4,1.39l0.03,0.05h2.37V15zM18.75,14.15C18.67,14.28 18.19,15 16.99,15c-0.04,0 -1.6,0.08 -2.05,-1.51l1.03,-0.41c0.03,0.1 0.19,0.86 1.02,0.86c0.41,0 0.89,-0.28 0.89,-0.77c0,-0.55 -0.48,-0.79 -1.04,-0.79h-0.5v-1h0.46c0.33,0 0.88,-0.14 0.88,-0.72c0,-0.39 -0.31,-0.65 -0.75,-0.65c-0.5,0 -0.74,0.32 -0.85,0.64l-0.99,-0.41C15.2,9.9 15.68,9 16.94,9c1.09,0 1.54,0.64 1.62,0.75c0.33,0.5 0.28,1.16 0.02,1.57c-0.15,0.22 -0.32,0.38 -0.52,0.48v0.07c0.28,0.11 0.51,0.28 0.68,0.52C19.11,12.91 19.07,13.66 18.75,14.15z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/pin_drop.xml b/qqq/android/mobileapp/src/main/res/drawable/pin_drop.xml new file mode 100644 index 0000000..47c7882 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/pin_drop.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/pin_drop/materialicons/black/res/drawable/baseline_pin_drop_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M18,8c0,-3.31 -2.69,-6 -6,-6S6,4.69 6,8c0,4.5 6,11 6,11s6,-6.5 6,-11zM10,8c0,-1.1 0.9,-2 2,-2s2,0.9 2,2 -0.89,2 -2,2c-1.1,0 -2,-0.9 -2,-2zM5,20v2h14v-2L5,20z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/pin_end.xml b/qqq/android/mobileapp/src/main/res/drawable/pin_end.xml new file mode 100644 index 0000000..2bcb192 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/pin_end.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/pin_end/materialicons/black/res/drawable/baseline_pin_end_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,12V6H4v12h10l0,2H4c-1.1,0 -2,-0.9 -2,-2V6c0,-1.1 0.9,-2 2,-2h16c1.1,0 2,0.9 2,2v6H20zM19,14c-1.66,0 -3,1.34 -3,3s1.34,3 3,3c1.66,0 3,-1.34 3,-3S20.66,14 19,14zM14.66,8H9v5.66l2.12,-2.12l2.83,2.83l1.41,-1.41l-2.83,-2.83L14.66,8z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/pin_invoke.xml b/qqq/android/mobileapp/src/main/res/drawable/pin_invoke.xml new file mode 100644 index 0000000..f06a87a --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/pin_invoke.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/pin_invoke/materialicons/black/res/drawable/baseline_pin_invoke_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M22,12v6c0,1.1 -0.9,2 -2,2H4c-1.1,0 -2,-0.9 -2,-2V6c0,-1.1 0.9,-2 2,-2h10l0,2H4v12h16v-6H22zM22,7c0,-1.66 -1.34,-3 -3,-3c-1.66,0 -3,1.34 -3,3s1.34,3 3,3C20.66,10 22,8.66 22,7zM11.47,12.12l-2.83,2.83l1.41,1.41l2.83,-2.83L15,15.66V10H9.34L11.47,12.12z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/pinch.xml b/qqq/android/mobileapp/src/main/res/drawable/pinch.xml new file mode 100644 index 0000000..3c70378 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/pinch.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/pinch/materialicons/black/res/drawable/baseline_pinch_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M6,2.5V1h5v5H9.5V3.56L3.56,9.5H6V11H1V6h1.5v2.44L8.44,2.5H6zM22.98,16.82l-0.63,4.46C22.21,22.27 21.36,23 20.37,23h-6.16c-0.53,0 -1.29,-0.21 -1.66,-0.59L8,17.62l0.83,-0.84c0.24,-0.24 0.58,-0.35 0.92,-0.28L13,17.24V6.5C13,5.67 13.67,5 14.5,5S16,5.67 16,6.5v6h0.91c0.31,0 0.62,0.07 0.89,0.21l4.09,2.04C22.66,15.14 23.1,15.97 22.98,16.82z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/pivot_table_chart.xml b/qqq/android/mobileapp/src/main/res/drawable/pivot_table_chart.xml new file mode 100644 index 0000000..a82634b --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/pivot_table_chart.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/navigation/pivot_table_chart/materialicons/black/res/drawable/baseline_pivot_table_chart_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M10,8h11L21,5c0,-1.1 -0.9,-2 -2,-2h-9v5zM3,8h5L8,3L5,3c-1.1,0 -2,0.9 -2,2v3zM5,21h3L8,10L3,10v9c0,1.1 0.9,2 2,2zM13,22l-4,-4 4,-4zM14,13l4,-4 4,4z" /> + <path + android:fillColor="#FF000000" + android:pathData="M14.58,19H13v-2h1.58c1.33,0 2.42,-1.08 2.42,-2.42V13h2v1.58c0,2.44 -1.98,4.42 -4.42,4.42z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/pix.xml b/qqq/android/mobileapp/src/main/res/drawable/pix.xml new file mode 100644 index 0000000..aebac83 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/pix.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/pix/materialicons/black/res/drawable/baseline_pix_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M15.45,16.52l-3.01,-3.01c-0.11,-0.11 -0.24,-0.13 -0.31,-0.13s-0.2,0.02 -0.31,0.13L8.8,16.53c-0.34,0.34 -0.87,0.89 -2.64,0.89l3.71,3.7c1.17,1.17 3.07,1.17 4.24,0l3.72,-3.71C16.92,17.41 16.16,17.23 15.45,16.52z" /> + <path + android:fillColor="#FF000000" + android:pathData="M8.8,7.47l3.02,3.02c0.08,0.08 0.2,0.13 0.31,0.13s0.23,-0.05 0.31,-0.13l2.99,-2.99c0.71,-0.74 1.52,-0.91 2.43,-0.91l-3.72,-3.71c-1.17,-1.17 -3.07,-1.17 -4.24,0l-3.71,3.7C7.95,6.58 8.49,7.16 8.8,7.47z" /> + <path + android:fillColor="#FF000000" + android:pathData="M21.11,9.85l-2.25,-2.26H17.6c-0.54,0 -1.08,0.22 -1.45,0.61l-3,3c-0.28,0.28 -0.65,0.42 -1.02,0.42c-0.36,0 -0.74,-0.15 -1.02,-0.42L8.09,8.17c-0.38,-0.38 -0.9,-0.6 -1.45,-0.6H5.17l-2.29,2.3c-1.17,1.17 -1.17,3.07 0,4.24l2.29,2.3h1.48c0.54,0 1.06,-0.22 1.45,-0.6l3.02,-3.02c0.28,-0.28 0.65,-0.42 1.02,-0.42c0.37,0 0.74,0.14 1.02,0.42l3.01,3.01c0.38,0.38 0.9,0.6 1.45,0.6h1.26l2.25,-2.26C22.3,12.96 22.3,11.04 21.11,9.85z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/place.xml b/qqq/android/mobileapp/src/main/res/drawable/place.xml new file mode 100644 index 0000000..4ead8d0 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/place.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/place/materialicons/black/res/drawable/baseline_place_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,2C8.13,2 5,5.13 5,9c0,5.25 7,13 7,13s7,-7.75 7,-13c0,-3.87 -3.13,-7 -7,-7zM12,11.5c-1.38,0 -2.5,-1.12 -2.5,-2.5s1.12,-2.5 2.5,-2.5 2.5,1.12 2.5,2.5 -1.12,2.5 -2.5,2.5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/plagiarism.xml b/qqq/android/mobileapp/src/main/res/drawable/plagiarism.xml new file mode 100644 index 0000000..65f08a8 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/plagiarism.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/plagiarism/materialicons/black/res/drawable/baseline_plagiarism_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M14,2H6C4.9,2 4,2.9 4,4v16c0,1.1 0.89,2 1.99,2H18c1.1,0 2,-0.9 2,-2V8L14,2zM15.04,19.45l-1.88,-1.88c-1.33,0.71 -3.01,0.53 -4.13,-0.59c-1.37,-1.37 -1.37,-3.58 0,-4.95c1.37,-1.37 3.58,-1.37 4.95,0c1.12,1.12 1.31,2.8 0.59,4.13l1.88,1.88L15.04,19.45zM13,9V3.5L18.5,9H13z" /> + <path + android:fillColor="#FF000000" + android:pathData="M11.5,14.5m-1.5,0a1.5,1.5 0,1 1,3 0a1.5,1.5 0,1 1,-3 0" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/play_arrow.xml b/qqq/android/mobileapp/src/main/res/drawable/play_arrow.xml new file mode 100644 index 0000000..08c687b --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/play_arrow.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/av/play_arrow/materialicons/black/res/drawable/baseline_play_arrow_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M8,5v14l11,-7z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/play_circle.xml b/qqq/android/mobileapp/src/main/res/drawable/play_circle.xml new file mode 100644 index 0000000..6557fa8 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/play_circle.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/av/play_circle/materialicons/black/res/drawable/baseline_play_circle_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10s10,-4.48 10,-10S17.52,2 12,2zM9.5,16.5v-9l7,4.5L9.5,16.5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/play_circle_filled.xml b/qqq/android/mobileapp/src/main/res/drawable/play_circle_filled.xml new file mode 100644 index 0000000..77df68a --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/play_circle_filled.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/av/play_circle_filled/materialicons/black/res/drawable/baseline_play_circle_filled_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM10,16.5v-9l6,4.5 -6,4.5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/play_circle_outline.xml b/qqq/android/mobileapp/src/main/res/drawable/play_circle_outline.xml new file mode 100644 index 0000000..1e60e63 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/play_circle_outline.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/av/play_circle_outline/materialicons/black/res/drawable/baseline_play_circle_outline_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M10,16.5l6,-4.5 -6,-4.5v9zM12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM12,20c-4.41,0 -8,-3.59 -8,-8s3.59,-8 8,-8 8,3.59 8,8 -3.59,8 -8,8z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/play_disabled.xml b/qqq/android/mobileapp/src/main/res/drawable/play_disabled.xml new file mode 100644 index 0000000..c9a3512 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/play_disabled.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/av/play_disabled/materialicons/black/res/drawable/baseline_play_disabled_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M8,5.19L8,5l11,7 -2.55,1.63L8,5.19zM20,19.73l-5.11,-5.11L8,7.73 4.27,4 3,5.27l5,5L8,19l5.33,-3.4 5.4,5.4L20,19.73z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/play_for_work.xml b/qqq/android/mobileapp/src/main/res/drawable/play_for_work.xml new file mode 100644 index 0000000..621c73a --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/play_for_work.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/play_for_work/materialicons/black/res/drawable/baseline_play_for_work_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M11,5v5.59L7.5,10.59l4.5,4.5 4.5,-4.5L13,10.59L13,5h-2zM6,14c0,3.31 2.69,6 6,6s6,-2.69 6,-6h-2c0,2.21 -1.79,4 -4,4s-4,-1.79 -4,-4L6,14z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/play_lesson.xml b/qqq/android/mobileapp/src/main/res/drawable/play_lesson.xml new file mode 100644 index 0000000..daea623 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/play_lesson.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/play_lesson/materialicons/black/res/drawable/baseline_play_lesson_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M18,11c0.34,0 0.67,0.03 1,0.08V4c0,-1.1 -0.9,-2 -2,-2H5C3.9,2 3,2.9 3,4v16c0,1.1 0.9,2 2,2h7.26C11.47,20.87 11,19.49 11,18C11,14.13 14.13,11 18,11zM7,11V4h5v7L9.5,9.5L7,11z" /> + <path + android:fillColor="#FF000000" + android:pathData="M18,13c-2.76,0 -5,2.24 -5,5s2.24,5 5,5s5,-2.24 5,-5S20.76,13 18,13zM16.75,20.5v-5l4,2.5L16.75,20.5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/playlist_add.xml b/qqq/android/mobileapp/src/main/res/drawable/playlist_add.xml new file mode 100644 index 0000000..38220bc --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/playlist_add.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/av/playlist_add/materialicons/black/res/drawable/baseline_playlist_add_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M14,10H3v2h11V10zM14,6H3v2h11V6zM18,14v-4h-2v4h-4v2h4v4h2v-4h4v-2H18zM3,16h7v-2H3V16z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/playlist_add_check.xml b/qqq/android/mobileapp/src/main/res/drawable/playlist_add_check.xml new file mode 100644 index 0000000..7832814 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/playlist_add_check.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/av/playlist_add_check/materialicons/black/res/drawable/baseline_playlist_add_check_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M3,10h11v2h-11z" /> + <path + android:fillColor="#FF000000" + android:pathData="M3,6h11v2h-11z" /> + <path + android:fillColor="#FF000000" + android:pathData="M3,14h7v2h-7z" /> + <path + android:fillColor="#FF000000" + android:pathData="M20.59,11.93l-4.25,4.24l-2.12,-2.12l-1.41,1.41l3.53,3.54l5.66,-5.66z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/playlist_add_check_circle.xml b/qqq/android/mobileapp/src/main/res/drawable/playlist_add_check_circle.xml new file mode 100644 index 0000000..bea43f5 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/playlist_add_check_circle.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/av/playlist_add_check_circle/materialicons/black/res/drawable/baseline_playlist_add_check_circle_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,2C6.48,2 2,6.48 2,12c0,5.52 4.48,10 10,10c5.52,0 10,-4.48 10,-10C22,6.48 17.52,2 12,2zM7,7h7v2H7V7zM7,10h7v2H7V10zM10,15H7v-2h3V15zM14.05,18.36l-2.83,-2.83l1.41,-1.41l1.41,1.41L17.59,12L19,13.41L14.05,18.36z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/playlist_add_circle.xml b/qqq/android/mobileapp/src/main/res/drawable/playlist_add_circle.xml new file mode 100644 index 0000000..e4ae798 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/playlist_add_circle.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/av/playlist_add_circle/materialicons/black/res/drawable/baseline_playlist_add_circle_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10s10,-4.48 10,-10S17.52,2 12,2zM7,7h7v2H7V7zM10,15H7v-2h3V15zM7,12v-2h7v2H7zM19,15h-2v2h-2v-2h-2v-2h2v-2h2v2h2V15z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/playlist_play.xml b/qqq/android/mobileapp/src/main/res/drawable/playlist_play.xml new file mode 100644 index 0000000..e6f03f2 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/playlist_play.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/av/playlist_play/materialicons/black/res/drawable/baseline_playlist_play_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M3,10h11v2h-11z" /> + <path + android:fillColor="#FF000000" + android:pathData="M3,6h11v2h-11z" /> + <path + android:fillColor="#FF000000" + android:pathData="M3,14h7v2h-7z" /> + <path + android:fillColor="#FF000000" + android:pathData="M16,13l0,8l6,-4z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/playlist_remove.xml b/qqq/android/mobileapp/src/main/res/drawable/playlist_remove.xml new file mode 100644 index 0000000..8d9137d --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/playlist_remove.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/av/playlist_remove/materialicons/black/res/drawable/baseline_playlist_remove_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M14,10H3v2h11V10zM14,6H3v2h11V6zM3,16h7v-2H3V16zM14.41,22L17,19.41L19.59,22L21,20.59L18.41,18L21,15.41L19.59,14L17,16.59L14.41,14L13,15.41L15.59,18L13,20.59L14.41,22z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/plumbing.xml b/qqq/android/mobileapp/src/main/res/drawable/plumbing.xml new file mode 100644 index 0000000..11e554c --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/plumbing.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/plumbing/materialicons/black/res/drawable/baseline_plumbing_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19.28,4.93l-2.12,-2.12c-0.78,-0.78 -2.05,-0.78 -2.83,0L11.5,5.64l2.12,2.12l2.12,-2.12l3.54,3.54C20.45,8 20.45,6.1 19.28,4.93z" /> + <path + android:fillColor="#FF000000" + android:pathData="M5.49,13.77c0.59,0.59 1.54,0.59 2.12,0l2.47,-2.47L7.96,9.17l-2.47,2.47C4.9,12.23 4.9,13.18 5.49,13.77L5.49,13.77z" /> + <path + android:fillColor="#FF000000" + android:pathData="M15.04,7.76l-0.71,0.71l-0.71,0.71l-3.18,-3.18C9.85,5.4 8.9,5.4 8.32,5.99c-0.59,0.59 -0.59,1.54 0,2.12l3.18,3.18L10.79,12l-6.36,6.36c-0.78,0.78 -0.78,2.05 0,2.83c0.78,0.78 2.05,0.78 2.83,0L16.45,12c0.39,0.39 1.02,0.39 1.41,0c0.39,-0.39 0.39,-1.02 0,-1.41L15.04,7.76z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/plus_one.xml b/qqq/android/mobileapp/src/main/res/drawable/plus_one.xml new file mode 100644 index 0000000..3eb3bd9 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/plus_one.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/plus_one/materialicons/black/res/drawable/baseline_plus_one_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M10,8L8,8v4L4,12v2h4v4h2v-4h4v-2h-4zM14.5,6.08L14.5,7.9l2.5,-0.5L17,18h2L19,5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/podcasts.xml b/qqq/android/mobileapp/src/main/res/drawable/podcasts.xml new file mode 100644 index 0000000..3a5ed2c --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/podcasts.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/search/podcasts/materialicons/black/res/drawable/baseline_podcasts_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M14,12c0,0.74 -0.4,1.38 -1,1.72V22h-2v-8.28c-0.6,-0.35 -1,-0.98 -1,-1.72c0,-1.1 0.9,-2 2,-2S14,10.9 14,12zM12,6c-3.31,0 -6,2.69 -6,6c0,1.74 0.75,3.31 1.94,4.4l1.42,-1.42C8.53,14.25 8,13.19 8,12c0,-2.21 1.79,-4 4,-4s4,1.79 4,4c0,1.19 -0.53,2.25 -1.36,2.98l1.42,1.42C17.25,15.31 18,13.74 18,12C18,8.69 15.31,6 12,6zM12,2C6.48,2 2,6.48 2,12c0,2.85 1.2,5.41 3.11,7.24l1.42,-1.42C4.98,16.36 4,14.29 4,12c0,-4.41 3.59,-8 8,-8s8,3.59 8,8c0,2.29 -0.98,4.36 -2.53,5.82l1.42,1.42C20.8,17.41 22,14.85 22,12C22,6.48 17.52,2 12,2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/point_of_sale.xml b/qqq/android/mobileapp/src/main/res/drawable/point_of_sale.xml new file mode 100644 index 0000000..3881c53 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/point_of_sale.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/hardware/point_of_sale/materialicons/black/res/drawable/baseline_point_of_sale_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M17,2H7C5.9,2 5,2.9 5,4v2c0,1.1 0.9,2 2,2h10c1.1,0 2,-0.9 2,-2V4C19,2.9 18.1,2 17,2zM17,6H7V4h10V6zM20,22H4c-1.1,0 -2,-0.9 -2,-2v-1h20v1C22,21.1 21.1,22 20,22zM18.53,10.19C18.21,9.47 17.49,9 16.7,9H7.3c-0.79,0 -1.51,0.47 -1.83,1.19L2,18h20L18.53,10.19zM9.5,16h-1C8.22,16 8,15.78 8,15.5C8,15.22 8.22,15 8.5,15h1c0.28,0 0.5,0.22 0.5,0.5C10,15.78 9.78,16 9.5,16zM9.5,14h-1C8.22,14 8,13.78 8,13.5C8,13.22 8.22,13 8.5,13h1c0.28,0 0.5,0.22 0.5,0.5C10,13.78 9.78,14 9.5,14zM9.5,12h-1C8.22,12 8,11.78 8,11.5C8,11.22 8.22,11 8.5,11h1c0.28,0 0.5,0.22 0.5,0.5C10,11.78 9.78,12 9.5,12zM12.5,16h-1c-0.28,0 -0.5,-0.22 -0.5,-0.5c0,-0.28 0.22,-0.5 0.5,-0.5h1c0.28,0 0.5,0.22 0.5,0.5C13,15.78 12.78,16 12.5,16zM12.5,14h-1c-0.28,0 -0.5,-0.22 -0.5,-0.5c0,-0.28 0.22,-0.5 0.5,-0.5h1c0.28,0 0.5,0.22 0.5,0.5C13,13.78 12.78,14 12.5,14zM12.5,12h-1c-0.28,0 -0.5,-0.22 -0.5,-0.5c0,-0.28 0.22,-0.5 0.5,-0.5h1c0.28,0 0.5,0.22 0.5,0.5C13,11.78 12.78,12 12.5,12zM15.5,16h-1c-0.28,0 -0.5,-0.22 -0.5,-0.5c0,-0.28 0.22,-0.5 0.5,-0.5h1c0.28,0 0.5,0.22 0.5,0.5C16,15.78 15.78,16 15.5,16zM15.5,14h-1c-0.28,0 -0.5,-0.22 -0.5,-0.5c0,-0.28 0.22,-0.5 0.5,-0.5h1c0.28,0 0.5,0.22 0.5,0.5C16,13.78 15.78,14 15.5,14zM15.5,12h-1c-0.28,0 -0.5,-0.22 -0.5,-0.5c0,-0.28 0.22,-0.5 0.5,-0.5h1c0.28,0 0.5,0.22 0.5,0.5C16,11.78 15.78,12 15.5,12z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/policy.xml b/qqq/android/mobileapp/src/main/res/drawable/policy.xml new file mode 100644 index 0000000..7cb761a --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/policy.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/content/policy/materialicons/black/res/drawable/baseline_policy_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M21,5l-9,-4L3,5v6c0,5.55 3.84,10.74 9,12c2.3,-0.56 4.33,-1.9 5.88,-3.71l-3.12,-3.12c-1.94,1.29 -4.58,1.07 -6.29,-0.64c-1.95,-1.95 -1.95,-5.12 0,-7.07c1.95,-1.95 5.12,-1.95 7.07,0c1.71,1.71 1.92,4.35 0.64,6.29l2.9,2.9C20.29,15.69 21,13.38 21,11V5z" /> + <path + android:fillColor="#FF000000" + android:pathData="M12,12m-3,0a3,3 0,1 1,6 0a3,3 0,1 1,-6 0" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/poll.xml b/qqq/android/mobileapp/src/main/res/drawable/poll.xml new file mode 100644 index 0000000..9f14edc --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/poll.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/poll/materialicons/black/res/drawable/baseline_poll_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19,3L5,3c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2L21,5c0,-1.1 -0.9,-2 -2,-2zM9,17L7,17v-7h2v7zM13,17h-2L11,7h2v10zM17,17h-2v-4h2v4z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/polyline.xml b/qqq/android/mobileapp/src/main/res/drawable/polyline.xml new file mode 100644 index 0000000..ab84a7a --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/polyline.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/editor/polyline/materialicons/black/res/drawable/baseline_polyline_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M15,16l0,1.26l-6,-3l0,-3.17l2.7,-3.09l4.3,0l0,-6l-6,0l0,4.9l-2.7,3.1l-4.3,0l0,6l5,0l7,3.5l0,2.5l6,0l0,-6z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/polymer.xml b/qqq/android/mobileapp/src/main/res/drawable/polymer.xml new file mode 100644 index 0000000..6431d16 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/polymer.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/polymer/materialicons/black/res/drawable/baseline_polymer_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19,4h-4L7.11,16.63 4.5,12 9,4H5L0.5,12 5,20h4l7.89,-12.63L19.5,12 15,20h4l4.5,-8z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/pool.xml b/qqq/android/mobileapp/src/main/res/drawable/pool.xml new file mode 100644 index 0000000..2a27c4a --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/pool.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/places/pool/materialicons/black/res/drawable/baseline_pool_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M22,21c-1.11,0 -1.73,-0.37 -2.18,-0.64 -0.37,-0.22 -0.6,-0.36 -1.15,-0.36 -0.56,0 -0.78,0.13 -1.15,0.36 -0.46,0.27 -1.07,0.64 -2.18,0.64s-1.73,-0.37 -2.18,-0.64c-0.37,-0.22 -0.6,-0.36 -1.15,-0.36 -0.56,0 -0.78,0.13 -1.15,0.36 -0.46,0.27 -1.08,0.64 -2.19,0.64 -1.11,0 -1.73,-0.37 -2.18,-0.64 -0.37,-0.23 -0.6,-0.36 -1.15,-0.36s-0.78,0.13 -1.15,0.36c-0.46,0.27 -1.08,0.64 -2.19,0.64v-2c0.56,0 0.78,-0.13 1.15,-0.36 0.46,-0.27 1.08,-0.64 2.19,-0.64s1.73,0.37 2.18,0.64c0.37,0.23 0.59,0.36 1.15,0.36 0.56,0 0.78,-0.13 1.15,-0.36 0.46,-0.27 1.08,-0.64 2.19,-0.64 1.11,0 1.73,0.37 2.18,0.64 0.37,0.22 0.6,0.36 1.15,0.36s0.78,-0.13 1.15,-0.36c0.45,-0.27 1.07,-0.64 2.18,-0.64s1.73,0.37 2.18,0.64c0.37,0.23 0.59,0.36 1.15,0.36v2zM22,16.5c-1.11,0 -1.73,-0.37 -2.18,-0.64 -0.37,-0.22 -0.6,-0.36 -1.15,-0.36 -0.56,0 -0.78,0.13 -1.15,0.36 -0.45,0.27 -1.07,0.64 -2.18,0.64s-1.73,-0.37 -2.18,-0.64c-0.37,-0.22 -0.6,-0.36 -1.15,-0.36 -0.56,0 -0.78,0.13 -1.15,0.36 -0.45,0.27 -1.07,0.64 -2.18,0.64s-1.73,-0.37 -2.18,-0.64c-0.37,-0.22 -0.6,-0.36 -1.15,-0.36s-0.78,0.13 -1.15,0.36c-0.47,0.27 -1.09,0.64 -2.2,0.64v-2c0.56,0 0.78,-0.13 1.15,-0.36 0.45,-0.27 1.07,-0.64 2.18,-0.64s1.73,0.37 2.18,0.64c0.37,0.22 0.6,0.36 1.15,0.36 0.56,0 0.78,-0.13 1.15,-0.36 0.45,-0.27 1.07,-0.64 2.18,-0.64s1.73,0.37 2.18,0.64c0.37,0.22 0.6,0.36 1.15,0.36s0.78,-0.13 1.15,-0.36c0.45,-0.27 1.07,-0.64 2.18,-0.64s1.73,0.37 2.18,0.64c0.37,0.22 0.6,0.36 1.15,0.36v2zM8.67,12c0.56,0 0.78,-0.13 1.15,-0.36 0.46,-0.27 1.08,-0.64 2.19,-0.64 1.11,0 1.73,0.37 2.18,0.64 0.37,0.22 0.6,0.36 1.15,0.36s0.78,-0.13 1.15,-0.36c0.12,-0.07 0.26,-0.15 0.41,-0.23L10.48,5C8.93,3.45 7.5,2.99 5,3v2.5c1.82,-0.01 2.89,0.39 4,1.5l1,1 -3.25,3.25c0.31,0.12 0.56,0.27 0.77,0.39 0.37,0.23 0.59,0.36 1.15,0.36z" /> + <path + android:fillColor="#FF000000" + android:pathData="M16.5,5.5m-2.5,0a2.5,2.5 0,1 1,5 0a2.5,2.5 0,1 1,-5 0" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/portable_wifi_off.xml b/qqq/android/mobileapp/src/main/res/drawable/portable_wifi_off.xml new file mode 100644 index 0000000..fdbfec2 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/portable_wifi_off.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/communication/portable_wifi_off/materialicons/black/res/drawable/baseline_portable_wifi_off_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M17.56,14.24c0.28,-0.69 0.44,-1.45 0.44,-2.24 0,-3.31 -2.69,-6 -6,-6 -0.79,0 -1.55,0.16 -2.24,0.44l1.62,1.62c0.2,-0.03 0.41,-0.06 0.62,-0.06 2.21,0 4,1.79 4,4 0,0.21 -0.02,0.42 -0.05,0.63l1.61,1.61zM12,4c4.42,0 8,3.58 8,8 0,1.35 -0.35,2.62 -0.95,3.74l1.47,1.47C21.46,15.69 22,13.91 22,12c0,-5.52 -4.48,-10 -10,-10 -1.91,0 -3.69,0.55 -5.21,1.47l1.46,1.46C9.37,4.34 10.65,4 12,4zM3.27,2.5L2,3.77l2.1,2.1C2.79,7.57 2,9.69 2,12c0,3.7 2.01,6.92 4.99,8.65l1,-1.73C5.61,17.53 4,14.96 4,12c0,-1.76 0.57,-3.38 1.53,-4.69l1.43,1.44C6.36,9.68 6,10.8 6,12c0,2.22 1.21,4.15 3,5.19l1,-1.74c-1.19,-0.7 -2,-1.97 -2,-3.45 0,-0.65 0.17,-1.25 0.44,-1.79l1.58,1.58L10,12c0,1.1 0.9,2 2,2l0.21,-0.02 0.01,0.01 7.51,7.51L21,20.23 4.27,3.5l-1,-1z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/portrait.xml b/qqq/android/mobileapp/src/main/res/drawable/portrait.xml new file mode 100644 index 0000000..687d11d --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/portrait.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/portrait/materialicons/black/res/drawable/baseline_portrait_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,12.25c1.24,0 2.25,-1.01 2.25,-2.25S13.24,7.75 12,7.75 9.75,8.76 9.75,10s1.01,2.25 2.25,2.25zM16.5,16.25c0,-1.5 -3,-2.25 -4.5,-2.25s-4.5,0.75 -4.5,2.25L7.5,17h9v-0.75zM19,3L5,3c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2L21,5c0,-1.1 -0.9,-2 -2,-2zM19,19L5,19L5,5h14v14z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/post_add.xml b/qqq/android/mobileapp/src/main/res/drawable/post_add.xml new file mode 100644 index 0000000..1e5ff12 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/post_add.xml @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/editor/post_add/materialicons/black/res/drawable/baseline_post_add_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M17,19.22H5V7h7V5H5C3.9,5 3,5.9 3,7v12c0,1.1 0.9,2 2,2h12c1.1,0 2,-0.9 2,-2v-7h-2V19.22z" /> + <path + android:fillColor="#FF000000" + android:pathData="M19,2h-2v3h-3c0.01,0.01 0,2 0,2h3v2.99c0.01,0.01 2,0 2,0V7h3V5h-3V2z" /> + <path + android:fillColor="#FF000000" + android:pathData="M7,9h8v2h-8z" /> + <path + android:fillColor="#FF000000" + android:pathData="M7,12l0,2l8,0l0,-2l-3,0z" /> + <path + android:fillColor="#FF000000" + android:pathData="M7,15h8v2h-8z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/power.xml b/qqq/android/mobileapp/src/main/res/drawable/power.xml new file mode 100644 index 0000000..4808eff --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/power.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/notification/power/materialicons/black/res/drawable/baseline_power_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M16.01,7L16,3h-2v4h-4V3H8v4h-0.01C7,6.99 6,7.99 6,8.99v5.49L9.5,18v3h5v-3l3.5,-3.51v-5.5c0,-1 -1,-2 -1.99,-1.99z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/power_input.xml b/qqq/android/mobileapp/src/main/res/drawable/power_input.xml new file mode 100644 index 0000000..1dc6da2 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/power_input.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/hardware/power_input/materialicons/black/res/drawable/baseline_power_input_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M2,9v2h19L21,9L2,9zM2,15h5v-2L2,13v2zM9,15h5v-2L9,13v2zM16,15h5v-2h-5v2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/power_off.xml b/qqq/android/mobileapp/src/main/res/drawable/power_off.xml new file mode 100644 index 0000000..10ad19f --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/power_off.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/notification/power_off/materialicons/black/res/drawable/baseline_power_off_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M18,14.49L18,9c0,-1 -1.01,-2.01 -2,-2L16,3h-2v4h-4L10,3L8,3v2.48l9.51,9.5 0.49,-0.49zM16.24,16.26L7.2,7.2l-0.01,0.01L3.98,4 2.71,5.25l3.36,3.36C6.04,8.74 6,8.87 6,9v5.48L9.5,18v3h5v-3l0.48,-0.48L19.45,22l1.26,-1.28 -4.47,-4.46z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/power_settings_new.xml b/qqq/android/mobileapp/src/main/res/drawable/power_settings_new.xml new file mode 100644 index 0000000..09b9631 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/power_settings_new.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/power_settings_new/materialicons/black/res/drawable/baseline_power_settings_new_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M13,3h-2v10h2L13,3zM17.83,5.17l-1.42,1.42C17.99,7.86 19,9.81 19,12c0,3.87 -3.13,7 -7,7s-7,-3.13 -7,-7c0,-2.19 1.01,-4.14 2.58,-5.42L6.17,5.17C4.23,6.82 3,9.26 3,12c0,4.97 4.03,9 9,9s9,-4.03 9,-9c0,-2.74 -1.23,-5.18 -3.17,-6.83z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/precision_manufacturing.xml b/qqq/android/mobileapp/src/main/res/drawable/precision_manufacturing.xml new file mode 100644 index 0000000..ee36703 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/precision_manufacturing.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/precision_manufacturing/materialicons/black/res/drawable/baseline_precision_manufacturing_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19.93,8.21l-3.6,1.68L14,7.7V6.3l2.33,-2.19l3.6,1.68c0.38,0.18 0.82,0.01 1,-0.36c0.18,-0.38 0.01,-0.82 -0.36,-1L16.65,2.6c-0.38,-0.18 -0.83,-0.1 -1.13,0.2l-1.74,1.6C13.6,4.16 13.32,4 13,4c-0.55,0 -1,0.45 -1,1v1H8.82C8.34,4.65 6.98,3.73 5.4,4.07C4.24,4.32 3.25,5.32 3.04,6.5C2.82,7.82 3.5,8.97 4.52,9.58L7.08,18H4v3h13v-3h-3.62L8.41,8.77C8.58,8.53 8.72,8.28 8.82,8H12v1c0,0.55 0.45,1 1,1c0.32,0 0.6,-0.16 0.78,-0.4l1.74,1.6c0.3,0.3 0.75,0.38 1.13,0.2l3.92,-1.83c0.38,-0.18 0.54,-0.62 0.36,-1C20.75,8.2 20.31,8.03 19.93,8.21zM6,8C5.45,8 5,7.55 5,7s0.45,-1 1,-1s1,0.45 1,1S6.55,8 6,8z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/pregnant_woman.xml b/qqq/android/mobileapp/src/main/res/drawable/pregnant_woman.xml new file mode 100644 index 0000000..6edeea0 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/pregnant_woman.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/pregnant_woman/materialicons/black/res/drawable/baseline_pregnant_woman_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M9,4c0,-1.11 0.89,-2 2,-2s2,0.89 2,2s-0.89,2 -2,2S9,5.11 9,4zM16,13c-0.01,-1.34 -0.83,-2.51 -2,-3c0,-1.66 -1.34,-3 -3,-3s-3,1.34 -3,3v7h2v5h3v-5h3V13z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/present_to_all.xml b/qqq/android/mobileapp/src/main/res/drawable/present_to_all.xml new file mode 100644 index 0000000..1f45697 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/present_to_all.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/communication/present_to_all/materialicons/black/res/drawable/baseline_present_to_all_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M21,3L3,3c-1.11,0 -2,0.89 -2,2v14c0,1.11 0.89,2 2,2h18c1.11,0 2,-0.89 2,-2L23,5c0,-1.11 -0.89,-2 -2,-2zM21,19.02L3,19.02L3,4.98h18v14.04zM10,12L8,12l4,-4 4,4h-2v4h-4v-4z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/preview.xml b/qqq/android/mobileapp/src/main/res/drawable/preview.xml new file mode 100644 index 0000000..1380a58 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/preview.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/preview/materialicons/black/res/drawable/baseline_preview_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19,3H5C3.89,3 3,3.9 3,5v14c0,1.1 0.89,2 2,2h14c1.1,0 2,-0.9 2,-2V5C21,3.9 20.11,3 19,3zM19,19H5V7h14V19zM13.5,13c0,0.83 -0.67,1.5 -1.5,1.5s-1.5,-0.67 -1.5,-1.5c0,-0.83 0.67,-1.5 1.5,-1.5S13.5,12.17 13.5,13zM12,9c-2.73,0 -5.06,1.66 -6,4c0.94,2.34 3.27,4 6,4s5.06,-1.66 6,-4C17.06,10.66 14.73,9 12,9zM12,15.5c-1.38,0 -2.5,-1.12 -2.5,-2.5c0,-1.38 1.12,-2.5 2.5,-2.5c1.38,0 2.5,1.12 2.5,2.5C14.5,14.38 13.38,15.5 12,15.5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/price_change.xml b/qqq/android/mobileapp/src/main/res/drawable/price_change.xml new file mode 100644 index 0000000..edca563 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/price_change.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/price_change/materialicons/black/res/drawable/baseline_price_change_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,4H4C2.89,4 2.01,4.89 2.01,6L2,18c0,1.11 0.89,2 2,2h16c1.11,0 2,-0.89 2,-2V6C22,4.89 21.11,4 20,4zM12,10H8v1h3c0.55,0 1,0.45 1,1v3c0,0.55 -0.45,1 -1,1h-1v1H8v-1H6v-2h4v-1H7c-0.55,0 -1,-0.45 -1,-1V9c0,-0.55 0.45,-1 1,-1h1V7h2v1h2V10zM16,16.25l-2,-2h4L16,16.25zM14,10l2,-2l2,2H14z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/price_check.xml b/qqq/android/mobileapp/src/main/res/drawable/price_check.xml new file mode 100644 index 0000000..f08b85c --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/price_check.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/price_check/materialicons/black/res/drawable/baseline_price_check_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,13V9c0,-0.55 -0.45,-1 -1,-1H7V6h5V4H9.5V3h-2v1H6C5.45,4 5,4.45 5,5v4c0,0.55 0.45,1 1,1h4v2H5v2h2.5v1h2v-1H11C11.55,14 12,13.55 12,13z" /> + <path + android:fillColor="#FF000000" + android:pathData="M19.59,12.52l-5.66,5.65l-2.83,-2.83l-1.41,1.42l4.24,4.24l7.07,-7.07z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/print.xml b/qqq/android/mobileapp/src/main/res/drawable/print.xml new file mode 100644 index 0000000..62cc00c --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/print.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/print/materialicons/black/res/drawable/baseline_print_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19,8L5,8c-1.66,0 -3,1.34 -3,3v6h4v4h12v-4h4v-6c0,-1.66 -1.34,-3 -3,-3zM16,19L8,19v-5h8v5zM19,12c-0.55,0 -1,-0.45 -1,-1s0.45,-1 1,-1 1,0.45 1,1 -0.45,1 -1,1zM18,3L6,3v4h12L18,3z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/print_disabled.xml b/qqq/android/mobileapp/src/main/res/drawable/print_disabled.xml new file mode 100644 index 0000000..1b82832 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/print_disabled.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/communication/print_disabled/materialicons/black/res/drawable/baseline_print_disabled_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19.1,17L22,17v-6c0,-1.7 -1.3,-3 -3,-3h-9l9.1,9zM19,10c0.55,0 1,0.45 1,1s-0.45,1 -1,1 -1,-0.45 -1,-1 0.45,-1 1,-1zM18,7L18,3L6,3v1.1L9,7zM1.2,1.8L0,3l4.9,5C3.3,8.1 2,9.4 2,11v6h4v4h11.9l3,3 1.3,-1.3 -21,-20.9zM8,19v-5h2.9l5,5L8,19z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/priority_high.xml b/qqq/android/mobileapp/src/main/res/drawable/priority_high.xml new file mode 100644 index 0000000..8c228ac --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/priority_high.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/notification/priority_high/materialicons/black/res/drawable/baseline_priority_high_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,19m-2,0a2,2 0,1 1,4 0a2,2 0,1 1,-4 0" /> + <path + android:fillColor="#FF000000" + android:pathData="M10,3h4v12h-4z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/privacy_tip.xml b/qqq/android/mobileapp/src/main/res/drawable/privacy_tip.xml new file mode 100644 index 0000000..4094011 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/privacy_tip.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/privacy_tip/materialicons/black/res/drawable/baseline_privacy_tip_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,1L3,5v6c0,5.55 3.84,10.74 9,12c5.16,-1.26 9,-6.45 9,-12V5L12,1L12,1zM11,7h2v2h-2V7zM11,11h2v6h-2V11z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/private_connectivity.xml b/qqq/android/mobileapp/src/main/res/drawable/private_connectivity.xml new file mode 100644 index 0000000..d986a62 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/private_connectivity.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/private_connectivity/materialicons/black/res/drawable/baseline_private_connectivity_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M18.93,11c-0.49,-3.39 -3.4,-6 -6.93,-6s-6.44,2.61 -6.93,6H2v2h3.07c0.49,3.39 3.4,6 6.93,6s6.44,-2.61 6.93,-6H22v-2H18.93zM15,14.5c0,0.55 -0.45,1 -1,1h-4c-0.55,0 -1,-0.45 -1,-1v-3c0,-0.55 0.45,-1 1,-1v-1c0,-1.21 1.08,-2.18 2.34,-1.97C13.32,7.69 14,8.61 14,9.61v0.89c0.55,0 1,0.45 1,1V14.5zM12.75,13c0,0.41 -0.34,0.75 -0.75,0.75s-0.75,-0.34 -0.75,-0.75c0,-0.41 0.34,-0.75 0.75,-0.75S12.75,12.59 12.75,13zM13,9.5v1h-2v-1c0,-0.55 0.45,-1 1,-1S13,8.95 13,9.5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/production_quantity_limits.xml b/qqq/android/mobileapp/src/main/res/drawable/production_quantity_limits.xml new file mode 100644 index 0000000..076653d --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/production_quantity_limits.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/production_quantity_limits/materialicons/black/res/drawable/baseline_production_quantity_limits_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M13,10h-2V8h2V10zM13,6h-2V1h2V6zM7,18c-1.1,0 -1.99,0.9 -1.99,2S5.9,22 7,22s2,-0.9 2,-2S8.1,18 7,18zM17,18c-1.1,0 -1.99,0.9 -1.99,2s0.89,2 1.99,2s2,-0.9 2,-2S18.1,18 17,18zM8.1,13h7.45c0.75,0 1.41,-0.41 1.75,-1.03L21,4.96L19.25,4l-3.7,7H8.53L4.27,2H1v2h2l3.6,7.59l-1.35,2.44C4.52,15.37 5.48,17 7,17h12v-2H7L8.1,13z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/propane.xml b/qqq/android/mobileapp/src/main/res/drawable/propane.xml new file mode 100644 index 0000000..f19620d --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/propane.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/home/propane/materialicons/black/res/drawable/baseline_propane_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M17,6h-1V5c0,-1.1 -0.9,-2 -2,-2h-4C8.9,3 8,3.9 8,5v1H7c-3.31,0 -6,2.69 -6,6s2.69,6 6,6v3h2v-3h6v3h2v-3c3.31,0 6,-2.69 6,-6S20.31,6 17,6zM10,5h4v1h-4V5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/propane_tank.xml b/qqq/android/mobileapp/src/main/res/drawable/propane_tank.xml new file mode 100644 index 0000000..532edb2 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/propane_tank.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/home/propane_tank/materialicons/black/res/drawable/baseline_propane_tank_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M4,15v3c0,2.21 1.79,4 4,4h8c2.21,0 4,-1.79 4,-4v-3H4z" /> + <path + android:fillColor="#FF000000" + android:pathData="M20,13v-3c0,-1.86 -1.28,-3.41 -3,-3.86V4c0,-1.1 -0.9,-2 -2,-2H9C7.9,2 7,2.9 7,4v2.14c-1.72,0.45 -3,2 -3,3.86v3H20zM9,4h6v2h-2c0,-0.55 -0.45,-1 -1,-1s-1,0.45 -1,1H9V4z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/psychology.xml b/qqq/android/mobileapp/src/main/res/drawable/psychology.xml new file mode 100644 index 0000000..70ab051 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/psychology.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/psychology/materialicons/black/res/drawable/baseline_psychology_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M13,8.57c-0.79,0 -1.43,0.64 -1.43,1.43s0.64,1.43 1.43,1.43s1.43,-0.64 1.43,-1.43S13.79,8.57 13,8.57z" /> + <path + android:fillColor="#FF000000" + android:pathData="M13,3C9.25,3 6.2,5.94 6.02,9.64L4.1,12.2C3.85,12.53 4.09,13 4.5,13H6v3c0,1.1 0.9,2 2,2h1v3h7v-4.68c2.36,-1.12 4,-3.53 4,-6.32C20,6.13 16.87,3 13,3zM16,10c0,0.13 -0.01,0.26 -0.02,0.39l0.83,0.66c0.08,0.06 0.1,0.16 0.05,0.25l-0.8,1.39c-0.05,0.09 -0.16,0.12 -0.24,0.09l-0.99,-0.4c-0.21,0.16 -0.43,0.29 -0.67,0.39L14,13.83c-0.01,0.1 -0.1,0.17 -0.2,0.17h-1.6c-0.1,0 -0.18,-0.07 -0.2,-0.17l-0.15,-1.06c-0.25,-0.1 -0.47,-0.23 -0.68,-0.39l-0.99,0.4c-0.09,0.03 -0.2,0 -0.25,-0.09l-0.8,-1.39c-0.05,-0.08 -0.03,-0.19 0.05,-0.25l0.84,-0.66C10.01,10.26 10,10.13 10,10c0,-0.13 0.02,-0.27 0.04,-0.39L9.19,8.95c-0.08,-0.06 -0.1,-0.16 -0.05,-0.26l0.8,-1.38c0.05,-0.09 0.15,-0.12 0.24,-0.09l1,0.4c0.2,-0.15 0.43,-0.29 0.67,-0.39l0.15,-1.06C12.02,6.07 12.1,6 12.2,6h1.6c0.1,0 0.18,0.07 0.2,0.17l0.15,1.06c0.24,0.1 0.46,0.23 0.67,0.39l1,-0.4c0.09,-0.03 0.2,0 0.24,0.09l0.8,1.38c0.05,0.09 0.03,0.2 -0.05,0.26l-0.85,0.66C15.99,9.73 16,9.86 16,10z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/psychology_alt.xml b/qqq/android/mobileapp/src/main/res/drawable/psychology_alt.xml new file mode 100644 index 0000000..dfc3ead --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/psychology_alt.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/psychology_alt/materialicons/black/res/drawable/baseline_psychology_alt_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19.94,9.06C19.5,5.73 16.57,3 13,3C9.47,3 6.57,5.61 6.08,9l-1.93,3.48C3.74,13.14 4.22,14 5,14h1l0,2c0,1.1 0.9,2 2,2h1v3h7l0,-4.68C18.62,15.07 20.35,12.24 19.94,9.06zM12.5,14c-0.41,0 -0.74,-0.33 -0.74,-0.74c0,-0.41 0.33,-0.73 0.74,-0.73c0.41,0 0.73,0.32 0.73,0.73C13.23,13.67 12.92,14 12.5,14zM14.26,9.68c-0.44,0.65 -0.86,0.85 -1.09,1.27c-0.09,0.17 -0.13,0.28 -0.13,0.82h-1.06c0,-0.29 -0.04,-0.75 0.18,-1.16c0.28,-0.51 0.83,-0.81 1.14,-1.26c0.33,-0.47 0.15,-1.36 -0.8,-1.36c-0.62,0 -0.92,0.47 -1.05,0.86l-0.96,-0.4C10.76,7.67 11.46,7 12.5,7c0.86,0 1.45,0.39 1.75,0.88C14.51,8.31 14.66,9.1 14.26,9.68z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/public_off.xml b/qqq/android/mobileapp/src/main/res/drawable/public_off.xml new file mode 100644 index 0000000..c6bd502 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/public_off.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/public_off/materialicons/black/res/drawable/baseline_public_off_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M11,8.17L6.49,3.66C8.07,2.61 9.96,2 12,2c5.52,0 10,4.48 10,10c0,2.04 -0.61,3.93 -1.66,5.51l-1.46,-1.46C19.59,14.87 20,13.48 20,12c0,-3.35 -2.07,-6.22 -5,-7.41V5c0,1.1 -0.9,2 -2,2h-2V8.17zM21.19,21.19l-1.41,1.41l-2.27,-2.27C15.93,21.39 14.04,22 12,22C6.48,22 2,17.52 2,12c0,-2.04 0.61,-3.93 1.66,-5.51L1.39,4.22l1.41,-1.41L21.19,21.19zM11,18c-1.1,0 -2,-0.9 -2,-2v-1l-4.79,-4.79C4.08,10.79 4,11.38 4,12c0,4.08 3.05,7.44 7,7.93V18z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/publish.xml b/qqq/android/mobileapp/src/main/res/drawable/publish.xml new file mode 100644 index 0000000..8a82193 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/publish.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/editor/publish/materialicons/black/res/drawable/baseline_publish_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M5,4v2h14L19,4L5,4zM5,14h4v6h6v-6h4l-7,-7 -7,7z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/published_with_changes.xml b/qqq/android/mobileapp/src/main/res/drawable/published_with_changes.xml new file mode 100644 index 0000000..32bed81 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/published_with_changes.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/published_with_changes/materialicons/black/res/drawable/baseline_published_with_changes_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M17.66,9.53l-7.07,7.07l-4.24,-4.24l1.41,-1.41l2.83,2.83l5.66,-5.66L17.66,9.53zM4,12c0,-2.33 1.02,-4.42 2.62,-5.88L9,8.5v-6H3l2.2,2.2C3.24,6.52 2,9.11 2,12c0,5.19 3.95,9.45 9,9.95v-2.02C7.06,19.44 4,16.07 4,12zM22,12c0,-5.19 -3.95,-9.45 -9,-9.95v2.02c3.94,0.49 7,3.86 7,7.93c0,2.33 -1.02,4.42 -2.62,5.88L15,15.5v6h6l-2.2,-2.2C20.76,17.48 22,14.89 22,12z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/punch_clock.xml b/qqq/android/mobileapp/src/main/res/drawable/punch_clock.xml new file mode 100644 index 0000000..6ff89bf --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/punch_clock.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/punch_clock/materialicons/black/res/drawable/baseline_punch_clock_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19,6h-1V1H6v5H5C3.9,6 3,6.9 3,8v12c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2V8C21,6.9 20.1,6 19,6zM8,3h8v3H8V3zM12,19c-2.76,0 -5,-2.24 -5,-5s2.24,-5 5,-5c2.76,0 5,2.24 5,5S14.76,19 12,19z" /> + <path + android:fillColor="#FF000000" + android:pathData="M12.5,11.5l-1,0l0,2.71l1.64,1.64l0.71,-0.71l-1.35,-1.35z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/push_pin.xml b/qqq/android/mobileapp/src/main/res/drawable/push_pin.xml new file mode 100644 index 0000000..086504c --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/push_pin.xml @@ -0,0 +1,20 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/content/push_pin/materialicons/black/res/drawable/baseline_push_pin_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M16,9V4l1,0c0.55,0 1,-0.45 1,-1v0c0,-0.55 -0.45,-1 -1,-1H7C6.45,2 6,2.45 6,3v0c0,0.55 0.45,1 1,1l1,0v5c0,1.66 -1.34,3 -3,3h0v2h5.97v7l1,1l1,-1v-7H19v-2h0C17.34,12 16,10.66 16,9z" + android:fillType="evenOdd" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/qqq_no_network.xml b/qqq/android/mobileapp/src/main/res/drawable/qqq_no_network.xml new file mode 100644 index 0000000..391e7f1 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/qqq_no_network.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/notification/wifi_off/materialicons/black/res/drawable/baseline_wifi_off_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="154dp" + android:height="129dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#0062FF" + android:pathData="M22.99,9C19.15,5.16 13.8,3.76 8.84,4.78l2.52,2.52c3.47,-0.17 6.99,1.05 9.63,3.7l2,-2zM18.99,13c-1.29,-1.29 -2.84,-2.13 -4.49,-2.56l3.53,3.53 0.96,-0.97zM2,3.05L5.07,6.1C3.6,6.82 2.22,7.78 1,9l1.99,2c1.24,-1.24 2.67,-2.16 4.2,-2.77l2.24,2.24C7.81,10.89 6.27,11.73 5,13v0.01L6.99,15c1.36,-1.36 3.14,-2.04 4.92,-2.06L18.98,20l1.27,-1.26L3.29,1.79 2,3.05zM9,17l3,3 3,-3c-1.65,-1.66 -4.34,-1.66 -6,0z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/qr_code.xml b/qqq/android/mobileapp/src/main/res/drawable/qr_code.xml new file mode 100644 index 0000000..e71face --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/qr_code.xml @@ -0,0 +1,49 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/communication/qr_code/materialicons/black/res/drawable/baseline_qr_code_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M3,11h8V3H3V11zM5,5h4v4H5V5z" /> + <path + android:fillColor="#FF000000" + android:pathData="M3,21h8v-8H3V21zM5,15h4v4H5V15z" /> + <path + android:fillColor="#FF000000" + android:pathData="M13,3v8h8V3H13zM19,9h-4V5h4V9z" /> + <path + android:fillColor="#FF000000" + android:pathData="M19,19h2v2h-2z" /> + <path + android:fillColor="#FF000000" + android:pathData="M13,13h2v2h-2z" /> + <path + android:fillColor="#FF000000" + android:pathData="M15,15h2v2h-2z" /> + <path + android:fillColor="#FF000000" + android:pathData="M13,17h2v2h-2z" /> + <path + android:fillColor="#FF000000" + android:pathData="M15,19h2v2h-2z" /> + <path + android:fillColor="#FF000000" + android:pathData="M17,17h2v2h-2z" /> + <path + android:fillColor="#FF000000" + android:pathData="M17,13h2v2h-2z" /> + <path + android:fillColor="#FF000000" + android:pathData="M19,15h2v2h-2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/qr_code_2.xml b/qqq/android/mobileapp/src/main/res/drawable/qr_code_2.xml new file mode 100644 index 0000000..98798f3 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/qr_code_2.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/communication/qr_code_2/materialicons/black/res/drawable/baseline_qr_code_2_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M15,21h-2v-2h2V21zM13,14h-2v5h2V14zM21,12h-2v4h2V12zM19,10h-2v2h2V10zM7,12H5v2h2V12zM5,10H3v2h2V10zM12,5h2V3h-2V5zM4.5,4.5v3h3v-3H4.5zM9,9H3V3h6V9zM4.5,16.5v3h3v-3H4.5zM9,21H3v-6h6V21zM16.5,4.5v3h3v-3H16.5zM21,9h-6V3h6V9zM19,19v-3l-4,0v2h2v3h4v-2H19zM17,12l-4,0v2h4V12zM13,10H7v2h2v2h2v-2h2V10zM14,9V7h-2V5h-2v4L14,9zM6.75,5.25h-1.5v1.5h1.5V5.25zM6.75,17.25h-1.5v1.5h1.5V17.25zM18.75,5.25h-1.5v1.5h1.5V5.25z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/qr_code_scanner.xml b/qqq/android/mobileapp/src/main/res/drawable/qr_code_scanner.xml new file mode 100644 index 0000000..d59119a --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/qr_code_scanner.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/communication/qr_code_scanner/materialicons/black/res/drawable/baseline_qr_code_scanner_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M9.5,6.5v3h-3v-3H9.5M11,5H5v6h6V5L11,5zM9.5,14.5v3h-3v-3H9.5M11,13H5v6h6V13L11,13zM17.5,6.5v3h-3v-3H17.5M19,5h-6v6h6V5L19,5zM13,13h1.5v1.5H13V13zM14.5,14.5H16V16h-1.5V14.5zM16,13h1.5v1.5H16V13zM13,16h1.5v1.5H13V16zM14.5,17.5H16V19h-1.5V17.5zM16,16h1.5v1.5H16V16zM17.5,14.5H19V16h-1.5V14.5zM17.5,17.5H19V19h-1.5V17.5zM22,7h-2V4h-3V2h5V7zM22,22v-5h-2v3h-3v2H22zM2,22h5v-2H4v-3H2V22zM2,2v5h2V4h3V2H2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/query_builder.xml b/qqq/android/mobileapp/src/main/res/drawable/query_builder.xml new file mode 100644 index 0000000..180415e --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/query_builder.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/query_builder/materialicons/black/res/drawable/baseline_query_builder_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M11.99,2C6.47,2 2,6.48 2,12s4.47,10 9.99,10C17.52,22 22,17.52 22,12S17.52,2 11.99,2zM12,20c-4.42,0 -8,-3.58 -8,-8s3.58,-8 8,-8 8,3.58 8,8 -3.58,8 -8,8z" /> + <path + android:fillColor="#FF000000" + android:pathData="M12.5,7H11v6l5.25,3.15 0.75,-1.23 -4.5,-2.67z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/query_stats.xml b/qqq/android/mobileapp/src/main/res/drawable/query_stats.xml new file mode 100644 index 0000000..1bccfbf --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/query_stats.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/editor/query_stats/materialicons/black/res/drawable/baseline_query_stats_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19.88,18.47c0.44,-0.7 0.7,-1.51 0.7,-2.39c0,-2.49 -2.01,-4.5 -4.5,-4.5s-4.5,2.01 -4.5,4.5s2.01,4.5 4.49,4.5c0.88,0 1.7,-0.26 2.39,-0.7L21.58,23L23,21.58L19.88,18.47zM16.08,18.58c-1.38,0 -2.5,-1.12 -2.5,-2.5c0,-1.38 1.12,-2.5 2.5,-2.5s2.5,1.12 2.5,2.5C18.58,17.46 17.46,18.58 16.08,18.58zM15.72,10.08c-0.74,0.02 -1.45,0.18 -2.1,0.45l-0.55,-0.83l-3.8,6.18l-3.01,-3.52l-3.63,5.81L1,17l5,-8l3,3.5L13,6C13,6 15.72,10.08 15.72,10.08zM18.31,10.58c-0.64,-0.28 -1.33,-0.45 -2.05,-0.49c0,0 5.12,-8.09 5.12,-8.09L23,3.18L18.31,10.58z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/question_answer.xml b/qqq/android/mobileapp/src/main/res/drawable/question_answer.xml new file mode 100644 index 0000000..1b94ddd --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/question_answer.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/question_answer/materialicons/black/res/drawable/baseline_question_answer_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M21,6h-2v9L6,15v2c0,0.55 0.45,1 1,1h11l4,4L22,7c0,-0.55 -0.45,-1 -1,-1zM17,12L17,3c0,-0.55 -0.45,-1 -1,-1L3,2c-0.55,0 -1,0.45 -1,1v14l4,-4h10c0.55,0 1,-0.45 1,-1z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/question_mark.xml b/qqq/android/mobileapp/src/main/res/drawable/question_mark.xml new file mode 100644 index 0000000..33a97b4 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/question_mark.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/question_mark/materialicons/black/res/drawable/baseline_question_mark_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M11.07,12.85c0.77,-1.39 2.25,-2.21 3.11,-3.44c0.91,-1.29 0.4,-3.7 -2.18,-3.7c-1.69,0 -2.52,1.28 -2.87,2.34L6.54,6.96C7.25,4.83 9.18,3 11.99,3c2.35,0 3.96,1.07 4.78,2.41c0.7,1.15 1.11,3.3 0.03,4.9c-1.2,1.77 -2.35,2.31 -2.97,3.45c-0.25,0.46 -0.35,0.76 -0.35,2.24h-2.89C10.58,15.22 10.46,13.95 11.07,12.85zM14,20c0,1.1 -0.9,2 -2,2s-2,-0.9 -2,-2c0,-1.1 0.9,-2 2,-2S14,18.9 14,20z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/queue.xml b/qqq/android/mobileapp/src/main/res/drawable/queue.xml new file mode 100644 index 0000000..d0df5f4 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/queue.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/av/queue/materialicons/black/res/drawable/baseline_queue_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M4,6L2,6v14c0,1.1 0.9,2 2,2h14v-2L4,20L4,6zM20,2L8,2c-1.1,0 -2,0.9 -2,2v12c0,1.1 0.9,2 2,2h12c1.1,0 2,-0.9 2,-2L22,4c0,-1.1 -0.9,-2 -2,-2zM19,11h-4v4h-2v-4L9,11L9,9h4L13,5h2v4h4v2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/queue_music.xml b/qqq/android/mobileapp/src/main/res/drawable/queue_music.xml new file mode 100644 index 0000000..503dfab --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/queue_music.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/av/queue_music/materialicons/black/res/drawable/baseline_queue_music_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M15,6H3v2h12V6zM15,10H3v2h12V10zM3,16h8v-2H3V16zM17,6v8.18C16.69,14.07 16.35,14 16,14c-1.66,0 -3,1.34 -3,3s1.34,3 3,3s3,-1.34 3,-3V8h3V6H17z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/queue_play_next.xml b/qqq/android/mobileapp/src/main/res/drawable/queue_play_next.xml new file mode 100644 index 0000000..6d268c8 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/queue_play_next.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/av/queue_play_next/materialicons/black/res/drawable/baseline_queue_play_next_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M21,3H3C1.89,3 1,3.89 1,5v12c0,1.1 0.89,2 2,2h5v2h8v-2h2v-2H3V5h18v8h2V5C23,3.89 22.1,3 21,3zM13,10V7h-2v3H8v2h3v3h2v-3h3v-2H13zM24,18l-4.5,4.5L18,21l3,-3l-3,-3l1.5,-1.5L24,18z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/quickreply.xml b/qqq/android/mobileapp/src/main/res/drawable/quickreply.xml new file mode 100644 index 0000000..a1acfd4 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/quickreply.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/quickreply/materialicons/black/res/drawable/baseline_quickreply_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M22,4c0,-1.1 -0.9,-2 -2,-2H4C2.9,2 2.01,2.9 2.01,4L2,22l4,-4h9v-8h7V4z" /> + <path + android:fillColor="#FF000000" + android:pathData="M22.5,16l-2.2,0l1.7,-4l-5,0l0,6l2,0l0,5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/quiz.xml b/qqq/android/mobileapp/src/main/res/drawable/quiz.xml new file mode 100644 index 0000000..e445440 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/quiz.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/quiz/materialicons/black/res/drawable/baseline_quiz_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M4,6H2v14c0,1.1 0.9,2 2,2h14v-2H4V6z" /> + <path + android:fillColor="#FF000000" + android:pathData="M20,2H8C6.9,2 6,2.9 6,4v12c0,1.1 0.9,2 2,2h12c1.1,0 2,-0.9 2,-2V4C22,2.9 21.1,2 20,2zM14.01,15c-0.59,0 -1.05,-0.47 -1.05,-1.05c0,-0.59 0.47,-1.04 1.05,-1.04c0.59,0 1.04,0.45 1.04,1.04C15.04,14.53 14.6,15 14.01,15zM16.51,8.83c-0.63,0.93 -1.23,1.21 -1.56,1.81c-0.13,0.24 -0.18,0.4 -0.18,1.18h-1.52c0,-0.41 -0.06,-1.08 0.26,-1.65c0.41,-0.73 1.18,-1.16 1.63,-1.8c0.48,-0.68 0.21,-1.94 -1.14,-1.94c-0.88,0 -1.32,0.67 -1.5,1.23l-1.37,-0.57C11.51,5.96 12.52,5 13.99,5c1.23,0 2.08,0.56 2.51,1.26C16.87,6.87 17.08,7.99 16.51,8.83z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/r_mobiledata.xml b/qqq/android/mobileapp/src/main/res/drawable/r_mobiledata.xml new file mode 100644 index 0000000..52272c7 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/r_mobiledata.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/r_mobiledata/materialicons/black/res/drawable/baseline_r_mobiledata_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M7.8,7.2L9,10H7L5.87,7.33H4V10H2V2h5c1.13,0 2,0.87 2,2v1.33C9,6.13 8.47,6.87 7.8,7.2zM7,4H4v1.33h3V4z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/radar.xml b/qqq/android/mobileapp/src/main/res/drawable/radar.xml new file mode 100644 index 0000000..b49b054 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/radar.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/radar/materialicons/black/res/drawable/baseline_radar_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19.74,18.33C21.15,16.6 22,14.4 22,12c0,-5.52 -4.48,-10 -10,-10S2,6.48 2,12s4.48,10 10,10c2.4,0 4.6,-0.85 6.33,-2.26c0.27,-0.22 0.53,-0.46 0.78,-0.71c0.03,-0.03 0.05,-0.06 0.07,-0.08C19.38,18.75 19.57,18.54 19.74,18.33zM12,20c-4.41,0 -8,-3.59 -8,-8s3.59,-8 8,-8s8,3.59 8,8c0,1.85 -0.63,3.54 -1.69,4.9l-1.43,-1.43c0.69,-0.98 1.1,-2.17 1.1,-3.46c0,-3.31 -2.69,-6 -6,-6s-6,2.69 -6,6s2.69,6 6,6c1.3,0 2.51,-0.42 3.49,-1.13l1.42,1.42C15.54,19.37 13.85,20 12,20zM13.92,12.51c0.17,-0.66 0.02,-1.38 -0.49,-1.9l-0.02,-0.02c-0.77,-0.77 -2,-0.78 -2.78,-0.04c-0.01,0.01 -0.03,0.02 -0.05,0.04c-0.78,0.78 -0.78,2.05 0,2.83l0.02,0.02c0.52,0.51 1.25,0.67 1.91,0.49l1.51,1.51c-0.6,0.36 -1.29,0.58 -2.04,0.58c-2.21,0 -4,-1.79 -4,-4s1.79,-4 4,-4s4,1.79 4,4c0,0.73 -0.21,1.41 -0.56,2L13.92,12.51z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/radio.xml b/qqq/android/mobileapp/src/main/res/drawable/radio.xml new file mode 100644 index 0000000..8b7a58b --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/radio.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/av/radio/materialicons/black/res/drawable/baseline_radio_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M3.24,6.15C2.51,6.43 2,7.17 2,8v12c0,1.1 0.89,2 2,2h16c1.11,0 2,-0.9 2,-2L22,8c0,-1.11 -0.89,-2 -2,-2L8.3,6l8.26,-3.34L15.88,1 3.24,6.15zM7,20c-1.66,0 -3,-1.34 -3,-3s1.34,-3 3,-3 3,1.34 3,3 -1.34,3 -3,3zM20,12h-2v-2h-2v2L4,12L4,8h16v4z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/radio_button_checked.xml b/qqq/android/mobileapp/src/main/res/drawable/radio_button_checked.xml new file mode 100644 index 0000000..604256d --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/radio_button_checked.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/toggle/radio_button_checked/materialicons/black/res/drawable/baseline_radio_button_checked_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,7c-2.76,0 -5,2.24 -5,5s2.24,5 5,5 5,-2.24 5,-5 -2.24,-5 -5,-5zM12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM12,20c-4.42,0 -8,-3.58 -8,-8s3.58,-8 8,-8 8,3.58 8,8 -3.58,8 -8,8z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/radio_button_unchecked.xml b/qqq/android/mobileapp/src/main/res/drawable/radio_button_unchecked.xml new file mode 100644 index 0000000..753d70e --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/radio_button_unchecked.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/toggle/radio_button_unchecked/materialicons/black/res/drawable/baseline_radio_button_unchecked_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM12,20c-4.42,0 -8,-3.58 -8,-8s3.58,-8 8,-8 8,3.58 8,8 -3.58,8 -8,8z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/railway_alert.xml b/qqq/android/mobileapp/src/main/res/drawable/railway_alert.xml new file mode 100644 index 0000000..2ed4b89 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/railway_alert.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/railway_alert/materialicons/black/res/drawable/baseline_railway_alert_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M23,8a7,7 0,0 0,-11.95 -4.95A33.8,33.8 0,0 0,9 3c-4.42,0 -8,0.5 -8,4v10.5A3.5,3.5 0,0 0,4.5 21L3,22.5v0.5h12v-0.5L13.5,21a3.5,3.5 0,0 0,3.5 -3.5v-2.58A7,7 0,0 0,23 8zM3,12L3,7h6.08a6.96,6.96 0,0 0,1.18 5L3,12zM9,19c-1.1,0 -2,-0.9 -2,-2s0.9,-2 2,-2 2,0.9 2,2 -0.9,2 -2,2zM16.71,12.94l-0.2,0.03L16,13l-0.47,-0.02 -0.16,-0.02 -0.29,-0.04 -0.2,-0.04 -0.22,-0.06a1.55,1.55 0,0 1,-0.23 -0.07l-0.13,-0.05A4.99,4.99 0,0 1,11.1 7c0.04,-0.19 0.09,-0.37 0.15,-0.54l0.05,-0.14 0.15,-0.38 0.07,-0.15 0.2,-0.36 0.07,-0.12 0.3,-0.42 0.02,-0.02c0.24,-0.3 0.52,-0.57 0.82,-0.81l0.01,-0.01 0.46,-0.32 0.03,-0.02A5.25,5.25 0,0 1,16 3a5,5 0,0 1,0.71 9.94zM15,4h2v5h-2zM15,10h2v2h-2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/ramen_dining.xml b/qqq/android/mobileapp/src/main/res/drawable/ramen_dining.xml new file mode 100644 index 0000000..9990d8a --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/ramen_dining.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/ramen_dining/materialicons/black/res/drawable/baseline_ramen_dining_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M9,6H8V4.65l1,-0.12V6zM9,12H8V7h1V12zM6,7h1v5H6V7zM6,4.88l1,-0.12V6H6V4.88zM22,3V2L5,4v8H2c0,3.69 2.47,6.86 6,8.25V22h8v-1.75c3.53,-1.39 6,-4.56 6,-8.25H10V7h12V6H10V4.41L22,3z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/ramp_left.xml b/qqq/android/mobileapp/src/main/res/drawable/ramp_left.xml new file mode 100644 index 0000000..ad8289a --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/ramp_left.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/ramp_left/materialicons/black/res/drawable/baseline_ramp_left_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M13,21h-2V6.83L9.41,8.41L8,7l4,-4l4,4l-1.41,1.41L13,6.83V9c0,4.27 4.03,7.13 6,8.27l-1.46,1.46c-1.91,-1.16 -3.44,-2.53 -4.54,-4.02L13,21z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/ramp_right.xml b/qqq/android/mobileapp/src/main/res/drawable/ramp_right.xml new file mode 100644 index 0000000..8ee4d15 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/ramp_right.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/ramp_right/materialicons/black/res/drawable/baseline_ramp_right_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M11,21h2V6.83l1.59,1.59L16,7l-4,-4L8,7l1.41,1.41L11,6.83V9c0,4.27 -4.03,7.13 -6,8.27l1.46,1.46C8.37,17.56 9.9,16.19 11,14.7L11,21z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/rate_review.xml b/qqq/android/mobileapp/src/main/res/drawable/rate_review.xml new file mode 100644 index 0000000..4892d9d --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/rate_review.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/rate_review/materialicons/black/res/drawable/baseline_rate_review_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,2L4,2c-1.1,0 -1.99,0.9 -1.99,2L2,22l4,-4h14c1.1,0 2,-0.9 2,-2L22,4c0,-1.1 -0.9,-2 -2,-2zM6,14v-2.47l6.88,-6.88c0.2,-0.2 0.51,-0.2 0.71,0l1.77,1.77c0.2,0.2 0.2,0.51 0,0.71L8.47,14L6,14zM18,14h-7.5l2,-2L18,12v2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/raw_off.xml b/qqq/android/mobileapp/src/main/res/drawable/raw_off.xml new file mode 100644 index 0000000..ff6f4b2 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/raw_off.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/raw_off/materialicons/black/res/drawable/baseline_raw_off_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M17.15,14.32l0.59,-2.36l0.76,3.04l1.48,0l1.5,-6l-1.5,0l-0.74,3l-0.74,-3l-1.52,0l-0.74,3l-0.74,-3l-1.5,0l0.72,2.9z" /> + <path + android:fillColor="#FF000000" + android:pathData="M1.39,4.22L6.17,9H3v6h1.5v-2h1.1l0.9,2H8l-0.9,-2.1C7.6,12.6 8,12.1 8,11.5v-0.67l1.43,1.43L8.75,15h1.5l0.38,-1.5h0.04l9.11,9.11l1.41,-1.41L2.81,2.81L1.39,4.22zM6.5,11.5h-2v-1h2V11.5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/raw_on.xml b/qqq/android/mobileapp/src/main/res/drawable/raw_on.xml new file mode 100644 index 0000000..b9e5fa7 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/raw_on.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/raw_on/materialicons/black/res/drawable/baseline_raw_on_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M6.5,9H3v6h1.5v-2h1.1l0.9,2H8l-0.9,-2.1C7.6,12.6 8,12.1 8,11.5v-1C8,9.7 7.3,9 6.5,9zM6.5,11.5h-2v-1h2V11.5z" /> + <path + android:fillColor="#FF000000" + android:pathData="M10.25,9l-1.5,6h1.5l0.38,-1.5h1.75l0.37,1.5h1.5l-1.5,-6H10.25zM11,12l0.25,-1h0.5L12,12H11z" /> + <path + android:fillColor="#FF000000" + android:pathData="M19.98,9l-0.74,3l-0.74,-3l-1.52,0l-0.74,3l-0.74,-3l-1.5,0l1.5,6l1.48,0l0.76,-3.04l0.76,3.04l1.48,0l1.5,-6z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/read_more.xml b/qqq/android/mobileapp/src/main/res/drawable/read_more.xml new file mode 100644 index 0000000..e9f67d7 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/read_more.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/communication/read_more/materialicons/black/res/drawable/baseline_read_more_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M13,7h9v2h-9z" /> + <path + android:fillColor="#FF000000" + android:pathData="M13,15h9v2h-9z" /> + <path + android:fillColor="#FF000000" + android:pathData="M16,11h6v2h-6z" /> + <path + android:fillColor="#FF000000" + android:pathData="M13,12l-5,-5l0,4l-6,0l0,2l6,0l0,4z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/real_estate_agent.xml b/qqq/android/mobileapp/src/main/res/drawable/real_estate_agent.xml new file mode 100644 index 0000000..ec59ae8 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/real_estate_agent.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/real_estate_agent/materialicons/black/res/drawable/baseline_real_estate_agent_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M1,22h4V11H1V22zM20,17h-7l-2.09,-0.73l0.33,-0.94L13,16h2.82c0.65,0 1.18,-0.53 1.18,-1.18l0,0c0,-0.49 -0.31,-0.93 -0.77,-1.11L8.97,11H7v9.02L14,22l8,-3l0,0C21.99,17.9 21.11,17 20,17zM14,1.5l-7,5V9h2l8.14,3.26C18.26,12.71 19,13.79 19,15h2V6.5L14,1.5zM13.5,10h-1V9h1V10zM13.5,8h-1V7h1V8zM15.5,10h-1V9h1V10zM15.5,8h-1V7h1V8z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/rebase_edit.xml b/qqq/android/mobileapp/src/main/res/drawable/rebase_edit.xml new file mode 100644 index 0000000..d8d5256 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/rebase_edit.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/rebase_edit/materialicons/black/res/drawable/baseline_rebase_edit_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19,5m-3,0a3,3 0,1 1,6 0a3,3 0,1 1,-6 0" /> + <path + android:fillColor="#FF000000" + android:pathData="M10.76,9.24L15,5l-4.24,-4.24L9.34,2.17L11.17,4L7.82,4C7.4,2.84 6.3,2 5,2C3.34,2 2,3.34 2,5c0,1.3 0.84,2.4 2,2.82v8.37C2.84,16.6 2,17.7 2,19c0,1.66 1.34,3 3,3s3,-1.34 3,-3c0,-1.3 -0.84,-2.4 -2,-2.82V7.82C6.85,7.51 7.51,6.85 7.82,6h3.36L9.34,7.83L10.76,9.24z" /> + <path + android:fillColor="#FF000000" + android:pathData="M10,19l0,3l3,0l6.26,-6.26l-3,-3z" /> + <path + android:fillColor="#FF000000" + android:pathData="M20.12,10.29c-0.39,-0.39 -1.02,-0.39 -1.41,0l-1.38,1.38l3,3l1.38,-1.38c0.39,-0.39 0.39,-1.02 0,-1.41L20.12,10.29z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/receipt.xml b/qqq/android/mobileapp/src/main/res/drawable/receipt.xml new file mode 100644 index 0000000..886b3e3 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/receipt.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/receipt/materialicons/black/res/drawable/baseline_receipt_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M18,17L6,17v-2h12v2zM18,13L6,13v-2h12v2zM18,9L6,9L6,7h12v2zM3,22l1.5,-1.5L6,22l1.5,-1.5L9,22l1.5,-1.5L12,22l1.5,-1.5L15,22l1.5,-1.5L18,22l1.5,-1.5L21,22L21,2l-1.5,1.5L18,2l-1.5,1.5L15,2l-1.5,1.5L12,2l-1.5,1.5L9,2 7.5,3.5 6,2 4.5,3.5 3,2v20z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/receipt_long.xml b/qqq/android/mobileapp/src/main/res/drawable/receipt_long.xml new file mode 100644 index 0000000..6bfa3f1 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/receipt_long.xml @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/receipt_long/materialicons/black/res/drawable/baseline_receipt_long_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19.5,3.5L18,2l-1.5,1.5L15,2l-1.5,1.5L12,2l-1.5,1.5L9,2L7.5,3.5L6,2v14H3v3c0,1.66 1.34,3 3,3h12c1.66,0 3,-1.34 3,-3V2L19.5,3.5zM19,19c0,0.55 -0.45,1 -1,1s-1,-0.45 -1,-1v-3H8V5h11V19z" /> + <path + android:fillColor="#FF000000" + android:pathData="M9,7h6v2h-6z" /> + <path + android:fillColor="#FF000000" + android:pathData="M16,7h2v2h-2z" /> + <path + android:fillColor="#FF000000" + android:pathData="M9,10h6v2h-6z" /> + <path + android:fillColor="#FF000000" + android:pathData="M16,10h2v2h-2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/recent_actors.xml b/qqq/android/mobileapp/src/main/res/drawable/recent_actors.xml new file mode 100644 index 0000000..e07f1ca --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/recent_actors.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/av/recent_actors/materialicons/black/res/drawable/baseline_recent_actors_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M21,5v14h2L23,5h-2zM17,19h2L19,5h-2v14zM14,5L2,5c-0.55,0 -1,0.45 -1,1v12c0,0.55 0.45,1 1,1h12c0.55,0 1,-0.45 1,-1L15,6c0,-0.55 -0.45,-1 -1,-1zM8,7.75c1.24,0 2.25,1.01 2.25,2.25S9.24,12.25 8,12.25 5.75,11.24 5.75,10 6.76,7.75 8,7.75zM12.5,17h-9v-0.75c0,-1.5 3,-2.25 4.5,-2.25s4.5,0.75 4.5,2.25L12.5,17z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/recommend.xml b/qqq/android/mobileapp/src/main/res/drawable/recommend.xml new file mode 100644 index 0000000..d76ef09 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/recommend.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/recommend/materialicons/black/res/drawable/baseline_recommend_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,2a10,10 0,1 0,10 10A10,10 0,0 0,12 2zM18,11.8a0.9,0.9 0,0 1,-0.1 0.5l-2.1,4.9a1.34,1.34 0,0 1,-1.3 0.8L9,18a2,2 0,0 1,-2 -2v-5a1.28,1.28 0,0 1,0.4 -1L12,5l0.69,0.69a1.08,1.08 0,0 1,0.3 0.7v0.2L12.41,10L17,10a1,1 0,0 1,1 1z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/record_voice_over.xml b/qqq/android/mobileapp/src/main/res/drawable/record_voice_over.xml new file mode 100644 index 0000000..602c932 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/record_voice_over.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/record_voice_over/materialicons/black/res/drawable/baseline_record_voice_over_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M9,9m-4,0a4,4 0,1 1,8 0a4,4 0,1 1,-8 0" /> + <path + android:fillColor="#FF000000" + android:pathData="M9,15c-2.67,0 -8,1.34 -8,4v2h16v-2c0,-2.66 -5.33,-4 -8,-4zM16.76,5.36l-1.68,1.69c0.84,1.18 0.84,2.71 0,3.89l1.68,1.69c2.02,-2.02 2.02,-5.07 0,-7.27zM20.07,2l-1.63,1.63c2.77,3.02 2.77,7.56 0,10.74L20.07,16c3.9,-3.89 3.91,-9.95 0,-14z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/rectangle.xml b/qqq/android/mobileapp/src/main/res/drawable/rectangle.xml new file mode 100644 index 0000000..ef9461f --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/rectangle.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/editor/rectangle/materialicons/black/res/drawable/baseline_rectangle_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M2,4h20v16h-20z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/recycling.xml b/qqq/android/mobileapp/src/main/res/drawable/recycling.xml new file mode 100644 index 0000000..56f978b --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/recycling.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/recycling/materialicons/black/res/drawable/baseline_recycling_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M5.77,7.15L7.2,4.78l1.03,-1.71c0.39,-0.65 1.33,-0.65 1.72,0l1.48,2.46l-1.23,2.06L9.2,9.21L5.77,7.15zM21.72,12.97l-1.6,-2.66l-3.46,2L18.87,16H20c0.76,0 1.45,-0.43 1.79,-1.11C21.93,14.61 22,14.31 22,14C22,13.64 21.9,13.29 21.72,12.97zM16,21h1.5c0.76,0 1.45,-0.43 1.79,-1.11L20.74,17H16v-2l-4,4l4,4V21zM10,17H5.7l-0.84,1.41c-0.3,0.5 -0.32,1.12 -0.06,1.65l0,0C5.08,20.63 5.67,21 6.32,21H10V17zM6.12,14.35l1.73,1.04L6.48,9.9L1,11.27l1.7,1.02l-0.41,0.69c-0.35,0.59 -0.38,1.31 -0.07,1.92l1.63,3.26L6.12,14.35zM17.02,5.14l-1.3,-2.17C15.35,2.37 14.7,2 14,2h-3.53l3.12,5.2l-1.72,1.03l5.49,1.37l1.37,-5.49L17.02,5.14z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/redeem.xml b/qqq/android/mobileapp/src/main/res/drawable/redeem.xml new file mode 100644 index 0000000..caf6c63 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/redeem.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/redeem/materialicons/black/res/drawable/baseline_redeem_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,6h-2.18c0.11,-0.31 0.18,-0.65 0.18,-1 0,-1.66 -1.34,-3 -3,-3 -1.05,0 -1.96,0.54 -2.5,1.35l-0.5,0.67 -0.5,-0.68C10.96,2.54 10.05,2 9,2 7.34,2 6,3.34 6,5c0,0.35 0.07,0.69 0.18,1L4,6c-1.11,0 -1.99,0.89 -1.99,2L2,19c0,1.11 0.89,2 2,2h16c1.11,0 2,-0.89 2,-2L22,8c0,-1.11 -0.89,-2 -2,-2zM15,4c0.55,0 1,0.45 1,1s-0.45,1 -1,1 -1,-0.45 -1,-1 0.45,-1 1,-1zM9,4c0.55,0 1,0.45 1,1s-0.45,1 -1,1 -1,-0.45 -1,-1 0.45,-1 1,-1zM20,19L4,19v-2h16v2zM20,14L4,14L4,8h5.08L7,10.83 8.62,12 11,8.76l1,-1.36 1,1.36L15.38,12 17,10.83 14.92,8L20,8v6z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/redo.xml b/qqq/android/mobileapp/src/main/res/drawable/redo.xml new file mode 100644 index 0000000..09e881f --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/redo.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/content/redo/materialicons/black/res/drawable/baseline_redo_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M18.4,10.6C16.55,8.99 14.15,8 11.5,8c-4.65,0 -8.58,3.03 -9.96,7.22L3.9,16c1.05,-3.19 4.05,-5.5 7.6,-5.5 1.95,0 3.73,0.72 5.12,1.88L13,16h9V7l-3.6,3.6z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/reduce_capacity.xml b/qqq/android/mobileapp/src/main/res/drawable/reduce_capacity.xml new file mode 100644 index 0000000..246f6ea --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/reduce_capacity.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/reduce_capacity/materialicons/black/res/drawable/baseline_reduce_capacity_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M16,4c0,-1.1 0.9,-2 2,-2s2,0.9 2,2s-0.9,2 -2,2S16,5.1 16,4zM20.78,7.58C19.93,7.21 18.99,7 18,7c-0.67,0 -1.31,0.1 -1.92,0.28C16.66,7.83 17,8.6 17,9.43V10h5V9.43C22,8.62 21.52,7.9 20.78,7.58zM6,6c1.1,0 2,-0.9 2,-2S7.1,2 6,2S4,2.9 4,4S4.9,6 6,6zM7.92,7.28C7.31,7.1 6.67,7 6,7C5.01,7 4.07,7.21 3.22,7.58C2.48,7.9 2,8.62 2,9.43V10h5V9.43C7,8.6 7.34,7.83 7.92,7.28zM10,4c0,-1.1 0.9,-2 2,-2s2,0.9 2,2s-0.9,2 -2,2S10,5.1 10,4zM16,10H8V9.43C8,8.62 8.48,7.9 9.22,7.58C10.07,7.21 11.01,7 12,7c0.99,0 1.93,0.21 2.78,0.58C15.52,7.9 16,8.62 16,9.43V10zM15,16c0,-1.1 0.9,-2 2,-2s2,0.9 2,2s-0.9,2 -2,2S15,17.1 15,16zM21,22h-8v-0.57c0,-0.81 0.48,-1.53 1.22,-1.85C15.07,19.21 16.01,19 17,19c0.99,0 1.93,0.21 2.78,0.58C20.52,19.9 21,20.62 21,21.43V22zM5,16c0,-1.1 0.9,-2 2,-2s2,0.9 2,2s-0.9,2 -2,2S5,17.1 5,16zM11,22H3v-0.57c0,-0.81 0.48,-1.53 1.22,-1.85C5.07,19.21 6.01,19 7,19c0.99,0 1.93,0.21 2.78,0.58C10.52,19.9 11,20.62 11,21.43V22zM12.75,13v-2h-1.5v2H9l3,3l3,-3H12.75z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/refresh.xml b/qqq/android/mobileapp/src/main/res/drawable/refresh.xml new file mode 100644 index 0000000..81451c8 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/refresh.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/navigation/refresh/materialicons/black/res/drawable/baseline_refresh_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M17.65,6.35C16.2,4.9 14.21,4 12,4c-4.42,0 -7.99,3.58 -7.99,8s3.57,8 7.99,8c3.73,0 6.84,-2.55 7.73,-6h-2.08c-0.82,2.33 -3.04,4 -5.65,4 -3.31,0 -6,-2.69 -6,-6s2.69,-6 6,-6c1.66,0 3.14,0.69 4.22,1.78L13,11h7V4l-2.35,2.35z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/remember_me.xml b/qqq/android/mobileapp/src/main/res/drawable/remember_me.xml new file mode 100644 index 0000000..12f594d --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/remember_me.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/remember_me/materialicons/black/res/drawable/baseline_remember_me_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M17,1H7C5.9,1 5,1.9 5,3v18c0,1.1 0.9,2 2,2h10c1.1,0 2,-0.9 2,-2V3C19,1.9 18.1,1 17,1zM17,15.21C15.5,14.44 13.8,14 12,14s-3.5,0.44 -5,1.21V6h10V15.21z" /> + <path + android:fillColor="#FF000000" + android:pathData="M12,10m-3,0a3,3 0,1 1,6 0a3,3 0,1 1,-6 0" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/remove.xml b/qqq/android/mobileapp/src/main/res/drawable/remove.xml new file mode 100644 index 0000000..96b9b5d --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/remove.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/content/remove/materialicons/black/res/drawable/baseline_remove_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19,13H5v-2h14v2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/remove_circle.xml b/qqq/android/mobileapp/src/main/res/drawable/remove_circle.xml new file mode 100644 index 0000000..bb0777c --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/remove_circle.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/content/remove_circle/materialicons/black/res/drawable/baseline_remove_circle_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM17,13L7,13v-2h10v2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/remove_circle_outline.xml b/qqq/android/mobileapp/src/main/res/drawable/remove_circle_outline.xml new file mode 100644 index 0000000..546813c --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/remove_circle_outline.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/content/remove_circle_outline/materialicons/black/res/drawable/baseline_remove_circle_outline_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M7,11v2h10v-2L7,11zM12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM12,20c-4.41,0 -8,-3.59 -8,-8s3.59,-8 8,-8 8,3.59 8,8 -3.59,8 -8,8z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/remove_done.xml b/qqq/android/mobileapp/src/main/res/drawable/remove_done.xml new file mode 100644 index 0000000..7547b36 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/remove_done.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/remove_done/materialicons/black/res/drawable/baseline_remove_done_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M1.79,12l5.58,5.59L5.96,19 0.37,13.41 1.79,12zM2.24,4.22L12.9,14.89l-1.28,1.28L7.44,12l-1.41,1.41L11.62,19l2.69,-2.69 4.89,4.89 1.41,-1.41L3.65,2.81 2.24,4.22zM17.14,13.49L23.62,7 22.2,5.59l-6.48,6.48 1.42,1.42zM17.96,7l-1.41,-1.41 -3.65,3.66 1.41,1.41L17.96,7z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/remove_from_queue.xml b/qqq/android/mobileapp/src/main/res/drawable/remove_from_queue.xml new file mode 100644 index 0000000..c15e295 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/remove_from_queue.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/av/remove_from_queue/materialicons/black/res/drawable/baseline_remove_from_queue_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M21,3H3C1.89,3 1,3.89 1,5v12c0,1.1 0.89,2 2,2h5v2h8v-2h5c1.1,0 1.99,-0.9 1.99,-2L23,5C23,3.89 22.1,3 21,3zM21,17H3V5h18V17zM16,10v2H8v-2H16z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/remove_moderator.xml b/qqq/android/mobileapp/src/main/res/drawable/remove_moderator.xml new file mode 100644 index 0000000..0c09a8d --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/remove_moderator.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/remove_moderator/materialicons/black/res/drawable/baseline_remove_moderator_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M22.27,21.73l-3.54,-3.55L5.78,5.23 2.27,1.72 1,2.99 3.01,5H3v6c0,5.55 3.84,10.74 9,12 2.16,-0.53 4.08,-1.76 5.6,-3.41L21,23l1.27,-1.27zM13,9.92l6.67,6.67C20.51,14.87 21,12.96 21,11V5l-9,-4 -5.48,2.44L11,7.92l2,2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/remove_red_eye.xml b/qqq/android/mobileapp/src/main/res/drawable/remove_red_eye.xml new file mode 100644 index 0000000..9d4d572 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/remove_red_eye.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/remove_red_eye/materialicons/black/res/drawable/baseline_remove_red_eye_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,4.5C7,4.5 2.73,7.61 1,12c1.73,4.39 6,7.5 11,7.5s9.27,-3.11 11,-7.5c-1.73,-4.39 -6,-7.5 -11,-7.5zM12,17c-2.76,0 -5,-2.24 -5,-5s2.24,-5 5,-5 5,2.24 5,5 -2.24,5 -5,5zM12,9c-1.66,0 -3,1.34 -3,3s1.34,3 3,3 3,-1.34 3,-3 -1.34,-3 -3,-3z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/remove_road.xml b/qqq/android/mobileapp/src/main/res/drawable/remove_road.xml new file mode 100644 index 0000000..8753a86 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/remove_road.xml @@ -0,0 +1,34 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/remove_road/materialicons/black/res/drawable/baseline_remove_road_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M18,4h2v9h-2z" /> + <path + android:fillColor="#FF000000" + android:pathData="M4,4h2v16h-2z" /> + <path + android:fillColor="#FF000000" + android:pathData="M11,4h2v4h-2z" /> + <path + android:fillColor="#FF000000" + android:pathData="M11,10h2v4h-2z" /> + <path + android:fillColor="#FF000000" + android:pathData="M11,16h2v4h-2z" /> + <path + android:fillColor="#FF000000" + android:pathData="M22.5,16.41l-1.41,-1.41l-2.09,2.09l-2.09,-2.09l-1.41,1.41l2.09,2.09l-2.09,2.09l1.41,1.41l2.09,-2.09l2.09,2.09l1.41,-1.41l-2.09,-2.09z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/remove_shopping_cart.xml b/qqq/android/mobileapp/src/main/res/drawable/remove_shopping_cart.xml new file mode 100644 index 0000000..3aa7376 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/remove_shopping_cart.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/remove_shopping_cart/materialicons/black/res/drawable/baseline_remove_shopping_cart_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M22.73,22.73L2.77,2.77 2,2l-0.73,-0.73L0,2.54l4.39,4.39 2.21,4.66 -1.35,2.45c-0.16,0.28 -0.25,0.61 -0.25,0.96 0,1.1 0.9,2 2,2h7.46l1.38,1.38c-0.5,0.36 -0.83,0.95 -0.83,1.62 0,1.1 0.89,2 1.99,2 0.67,0 1.26,-0.33 1.62,-0.84L21.46,24l1.27,-1.27zM7.42,15c-0.14,0 -0.25,-0.11 -0.25,-0.25l0.03,-0.12 0.9,-1.63h2.36l2,2L7.42,15zM15.55,13c0.75,0 1.41,-0.41 1.75,-1.03l3.58,-6.49c0.08,-0.14 0.12,-0.31 0.12,-0.48 0,-0.55 -0.45,-1 -1,-1L6.54,4l9.01,9zM7,18c-1.1,0 -1.99,0.9 -1.99,2S5.9,22 7,22s2,-0.9 2,-2 -0.9,-2 -2,-2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/reorder.xml b/qqq/android/mobileapp/src/main/res/drawable/reorder.xml new file mode 100644 index 0000000..81d0e8e --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/reorder.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/reorder/materialicons/black/res/drawable/baseline_reorder_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M3,15h18v-2L3,13v2zM3,19h18v-2L3,17v2zM3,11h18L21,9L3,9v2zM3,5v2h18L21,5L3,5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/repartition.xml b/qqq/android/mobileapp/src/main/res/drawable/repartition.xml new file mode 100644 index 0000000..9b7bf00 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/repartition.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/repartition/materialicons/black/res/drawable/baseline_repartition_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M3,21h18v-6H3V21zM10.33,19v-2h3.33v2H10.33zM19,19h-3.33v-2H19V19zM5,17h3.33v2H5V17z" /> + <path + android:fillColor="#FF000000" + android:pathData="M6,10l1.42,-1.42L5.83,7H17c1.1,0 2,0.9 2,2s-0.9,2 -2,2H3v2h14c2.21,0 4,-1.79 4,-4s-1.79,-4 -4,-4H5.83l1.59,-1.59L6,2L2,6L6,10z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/repeat.xml b/qqq/android/mobileapp/src/main/res/drawable/repeat.xml new file mode 100644 index 0000000..6ef589f --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/repeat.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/av/repeat/materialicons/black/res/drawable/baseline_repeat_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M7,7h10v3l4,-4 -4,-4v3L5,5v6h2L7,7zM17,17L7,17v-3l-4,4 4,4v-3h12v-6h-2v4z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/repeat_on.xml b/qqq/android/mobileapp/src/main/res/drawable/repeat_on.xml new file mode 100644 index 0000000..ac5befa --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/repeat_on.xml @@ -0,0 +1,20 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/av/repeat_on/materialicons/black/res/drawable/baseline_repeat_on_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M21,1L3,1c-1.1,0 -2,0.9 -2,2v18c0,1.1 0.9,2 2,2h18c1.1,0 2,-0.9 2,-2L23,3c0,-1.1 -0.9,-2 -2,-2zM7,7h10v3l4,-4 -4,-4v3L5,5v6h2L7,7zM17,17L7,17v-3l-4,4 4,4v-3h12v-6h-2v4z" + android:fillType="evenOdd" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/repeat_one.xml b/qqq/android/mobileapp/src/main/res/drawable/repeat_one.xml new file mode 100644 index 0000000..e3047c3 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/repeat_one.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/av/repeat_one/materialicons/black/res/drawable/baseline_repeat_one_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M7,7h10v3l4,-4 -4,-4v3L5,5v6h2L7,7zM17,17L7,17v-3l-4,4 4,4v-3h12v-6h-2v4zM13,15L13,9h-1l-2,1v1h1.5v4L13,15z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/repeat_one_on.xml b/qqq/android/mobileapp/src/main/res/drawable/repeat_one_on.xml new file mode 100644 index 0000000..92a2569 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/repeat_one_on.xml @@ -0,0 +1,20 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/av/repeat_one_on/materialicons/black/res/drawable/baseline_repeat_one_on_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M21,1L3,1c-1.1,0 -2,0.9 -2,2v18c0,1.1 0.9,2 2,2h18c1.1,0 2,-0.9 2,-2L23,3c0,-1.1 -0.9,-2 -2,-2zM7,7h10v3l4,-4 -4,-4v3L5,5v6h2L7,7zM17,17L7,17v-3l-4,4 4,4v-3h12v-6h-2v4zM13,15L13,9h-1l-2,1v1h1.5v4L13,15z" + android:fillType="evenOdd" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/replay.xml b/qqq/android/mobileapp/src/main/res/drawable/replay.xml new file mode 100644 index 0000000..9962d06 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/replay.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/av/replay/materialicons/black/res/drawable/baseline_replay_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,5V1L7,6l5,5V7c3.31,0 6,2.69 6,6s-2.69,6 -6,6 -6,-2.69 -6,-6H4c0,4.42 3.58,8 8,8s8,-3.58 8,-8 -3.58,-8 -8,-8z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/replay_10.xml b/qqq/android/mobileapp/src/main/res/drawable/replay_10.xml new file mode 100644 index 0000000..031abbe --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/replay_10.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/av/replay_10/materialicons/black/res/drawable/baseline_replay_10_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M11.99,5V1l-5,5l5,5V7c3.31,0 6,2.69 6,6s-2.69,6 -6,6s-6,-2.69 -6,-6h-2c0,4.42 3.58,8 8,8s8,-3.58 8,-8S16.41,5 11.99,5z" /> + <path + android:fillColor="#FF000000" + android:pathData="M10.89,16h-0.85v-3.26l-1.01,0.31v-0.69l1.77,-0.63h0.09V16z" /> + <path + android:fillColor="#FF000000" + android:pathData="M15.17,14.24c0,0.32 -0.03,0.6 -0.1,0.82s-0.17,0.42 -0.29,0.57s-0.28,0.26 -0.45,0.33s-0.37,0.1 -0.59,0.1s-0.41,-0.03 -0.59,-0.1s-0.33,-0.18 -0.46,-0.33s-0.23,-0.34 -0.3,-0.57s-0.11,-0.5 -0.11,-0.82V13.5c0,-0.32 0.03,-0.6 0.1,-0.82s0.17,-0.42 0.29,-0.57s0.28,-0.26 0.45,-0.33s0.37,-0.1 0.59,-0.1s0.41,0.03 0.59,0.1c0.18,0.07 0.33,0.18 0.46,0.33s0.23,0.34 0.3,0.57s0.11,0.5 0.11,0.82V14.24zM14.32,13.38c0,-0.19 -0.01,-0.35 -0.04,-0.48s-0.07,-0.23 -0.12,-0.31s-0.11,-0.14 -0.19,-0.17s-0.16,-0.05 -0.25,-0.05s-0.18,0.02 -0.25,0.05s-0.14,0.09 -0.19,0.17s-0.09,0.18 -0.12,0.31s-0.04,0.29 -0.04,0.48v0.97c0,0.19 0.01,0.35 0.04,0.48s0.07,0.24 0.12,0.32s0.11,0.14 0.19,0.17s0.16,0.05 0.25,0.05s0.18,-0.02 0.25,-0.05s0.14,-0.09 0.19,-0.17s0.09,-0.19 0.11,-0.32s0.04,-0.29 0.04,-0.48V13.38z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/replay_30.xml b/qqq/android/mobileapp/src/main/res/drawable/replay_30.xml new file mode 100644 index 0000000..37df327 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/replay_30.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/av/replay_30/materialicons/black/res/drawable/baseline_replay_30_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,5V1L7,6l5,5V7c3.31,0 6,2.69 6,6s-2.69,6 -6,6s-6,-2.69 -6,-6H4c0,4.42 3.58,8 8,8s8,-3.58 8,-8S16.42,5 12,5z" /> + <path + android:fillColor="#FF000000" + android:pathData="M9.56,13.49h0.45c0.21,0 0.37,-0.05 0.48,-0.16s0.16,-0.25 0.16,-0.43c0,-0.08 -0.01,-0.15 -0.04,-0.22s-0.06,-0.12 -0.11,-0.17s-0.11,-0.09 -0.18,-0.11s-0.16,-0.04 -0.25,-0.04c-0.08,0 -0.15,0.01 -0.22,0.03s-0.13,0.05 -0.18,0.1s-0.09,0.09 -0.12,0.15s-0.05,0.13 -0.05,0.2H8.65c0,-0.18 0.04,-0.34 0.11,-0.48s0.17,-0.27 0.3,-0.37s0.27,-0.18 0.44,-0.23s0.35,-0.08 0.54,-0.08c0.21,0 0.41,0.03 0.59,0.08s0.33,0.13 0.46,0.23s0.23,0.23 0.3,0.38s0.11,0.33 0.11,0.53c0,0.09 -0.01,0.18 -0.04,0.27s-0.07,0.17 -0.13,0.25s-0.12,0.15 -0.2,0.22s-0.17,0.12 -0.28,0.17c0.24,0.09 0.42,0.21 0.54,0.39s0.18,0.38 0.18,0.61c0,0.2 -0.04,0.38 -0.12,0.53s-0.18,0.29 -0.32,0.39s-0.29,0.19 -0.48,0.24s-0.38,0.08 -0.6,0.08c-0.18,0 -0.36,-0.02 -0.53,-0.07s-0.33,-0.12 -0.46,-0.23s-0.25,-0.23 -0.33,-0.38s-0.12,-0.34 -0.12,-0.55h0.85c0,0.08 0.02,0.15 0.05,0.22s0.07,0.12 0.13,0.17s0.12,0.09 0.2,0.11s0.16,0.04 0.25,0.04c0.1,0 0.19,-0.01 0.27,-0.04s0.15,-0.07 0.2,-0.12s0.1,-0.11 0.13,-0.18s0.04,-0.15 0.04,-0.24c0,-0.11 -0.02,-0.21 -0.05,-0.29s-0.08,-0.15 -0.14,-0.2s-0.13,-0.09 -0.22,-0.11s-0.18,-0.04 -0.29,-0.04H9.56V13.49z" /> + <path + android:fillColor="#FF000000" + android:pathData="M15.3,14.24c0,0.32 -0.03,0.6 -0.1,0.82s-0.17,0.42 -0.29,0.57s-0.28,0.26 -0.45,0.33s-0.37,0.1 -0.59,0.1s-0.41,-0.03 -0.59,-0.1s-0.33,-0.18 -0.46,-0.33s-0.23,-0.34 -0.3,-0.57s-0.11,-0.5 -0.11,-0.82V13.5c0,-0.32 0.03,-0.6 0.1,-0.82s0.17,-0.42 0.29,-0.57s0.28,-0.26 0.45,-0.33s0.37,-0.1 0.59,-0.1s0.41,0.03 0.59,0.1s0.33,0.18 0.46,0.33s0.23,0.34 0.3,0.57s0.11,0.5 0.11,0.82V14.24zM14.45,13.38c0,-0.19 -0.01,-0.35 -0.04,-0.48c-0.03,-0.13 -0.07,-0.23 -0.12,-0.31s-0.11,-0.14 -0.19,-0.17s-0.16,-0.05 -0.25,-0.05s-0.18,0.02 -0.25,0.05s-0.14,0.09 -0.19,0.17s-0.09,0.18 -0.12,0.31s-0.04,0.29 -0.04,0.48v0.97c0,0.19 0.01,0.35 0.04,0.48s0.07,0.24 0.12,0.32s0.11,0.14 0.19,0.17s0.16,0.05 0.25,0.05s0.18,-0.02 0.25,-0.05s0.14,-0.09 0.19,-0.17s0.09,-0.19 0.11,-0.32c0.03,-0.13 0.04,-0.29 0.04,-0.48V13.38z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/replay_5.xml b/qqq/android/mobileapp/src/main/res/drawable/replay_5.xml new file mode 100644 index 0000000..f9d5a95 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/replay_5.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/av/replay_5/materialicons/black/res/drawable/baseline_replay_5_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,5V1L7,6l5,5V7c3.31,0 6,2.69 6,6s-2.69,6 -6,6s-6,-2.69 -6,-6H4c0,4.42 3.58,8 8,8s8,-3.58 8,-8S16.42,5 12,5z" /> + <path + android:fillColor="#FF000000" + android:pathData="M10.69,13.9l0.25,-2.17h2.39v0.71h-1.7l-0.11,0.92c0.03,-0.02 0.07,-0.03 0.11,-0.05s0.09,-0.04 0.15,-0.05s0.12,-0.03 0.18,-0.04s0.13,-0.02 0.2,-0.02c0.21,0 0.39,0.03 0.55,0.1s0.3,0.16 0.41,0.28s0.2,0.27 0.25,0.45s0.09,0.38 0.09,0.6c0,0.19 -0.03,0.37 -0.09,0.54s-0.15,0.32 -0.27,0.45s-0.27,0.24 -0.45,0.31s-0.39,0.12 -0.64,0.12c-0.18,0 -0.36,-0.03 -0.53,-0.08s-0.32,-0.14 -0.46,-0.24s-0.24,-0.24 -0.32,-0.39s-0.13,-0.33 -0.13,-0.53h0.84c0.02,0.18 0.08,0.32 0.19,0.41s0.25,0.15 0.42,0.15c0.11,0 0.2,-0.02 0.27,-0.06s0.14,-0.1 0.18,-0.17s0.08,-0.15 0.11,-0.25s0.03,-0.2 0.03,-0.31s-0.01,-0.21 -0.04,-0.31s-0.07,-0.17 -0.13,-0.24s-0.13,-0.12 -0.21,-0.15s-0.19,-0.05 -0.3,-0.05c-0.08,0 -0.15,0.01 -0.2,0.02s-0.11,0.03 -0.15,0.05s-0.08,0.05 -0.12,0.07s-0.07,0.06 -0.1,0.09L10.69,13.9z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/replay_circle_filled.xml b/qqq/android/mobileapp/src/main/res/drawable/replay_circle_filled.xml new file mode 100644 index 0000000..1ed7389 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/replay_circle_filled.xml @@ -0,0 +1,20 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/av/replay_circle_filled/materialicons/black/res/drawable/baseline_replay_circle_filled_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM18,12c0,3.31 -2.69,6 -6,6s-6,-2.69 -6,-6h2c0,2.21 1.79,4 4,4s4,-1.79 4,-4 -1.79,-4 -4,-4v3L8,7l4,-4v3c3.31,0 6,2.69 6,6z" + android:fillType="evenOdd" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/reply.xml b/qqq/android/mobileapp/src/main/res/drawable/reply.xml new file mode 100644 index 0000000..4785cf3 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/reply.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/content/reply/materialicons/black/res/drawable/baseline_reply_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M10,9V5l-7,7 7,7v-4.1c5,0 8.5,1.6 11,5.1 -1,-5 -4,-10 -11,-11z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/reply_all.xml b/qqq/android/mobileapp/src/main/res/drawable/reply_all.xml new file mode 100644 index 0000000..159d323 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/reply_all.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/content/reply_all/materialicons/black/res/drawable/baseline_reply_all_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M7,8L7,5l-7,7 7,7v-3l-4,-4 4,-4zM13,9L13,5l-7,7 7,7v-4.1c5,0 8.5,1.6 11,5.1 -1,-5 -4,-10 -11,-11z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/report.xml b/qqq/android/mobileapp/src/main/res/drawable/report.xml new file mode 100644 index 0000000..45d93c2 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/report.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/content/report/materialicons/black/res/drawable/baseline_report_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M15.73,3L8.27,3L3,8.27v7.46L8.27,21h7.46L21,15.73L21,8.27L15.73,3zM12,17.3c-0.72,0 -1.3,-0.58 -1.3,-1.3 0,-0.72 0.58,-1.3 1.3,-1.3 0.72,0 1.3,0.58 1.3,1.3 0,0.72 -0.58,1.3 -1.3,1.3zM13,13h-2L11,7h2v6z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/report_gmailerrorred.xml b/qqq/android/mobileapp/src/main/res/drawable/report_gmailerrorred.xml new file mode 100644 index 0000000..d5a840b --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/report_gmailerrorred.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/content/report_gmailerrorred/materialicons/black/res/drawable/baseline_report_gmailerrorred_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M15.73,3H8.27L3,8.27v7.46L8.27,21h7.46L21,15.73V8.27L15.73,3zM19,14.9L14.9,19H9.1L5,14.9V9.1L9.1,5h5.8L19,9.1V14.9z" /> + <path + android:fillColor="#FF000000" + android:pathData="M11,7h2v6h-2z" /> + <path + android:fillColor="#FF000000" + android:pathData="M11,15h2v2h-2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/report_off.xml b/qqq/android/mobileapp/src/main/res/drawable/report_off.xml new file mode 100644 index 0000000..f670736 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/report_off.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/content/report_off/materialicons/black/res/drawable/baseline_report_off_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M11,7h2v2.92l6.91,6.91 1.09,-1.1L21,8.27L15.73,3L8.27,3L7.18,4.1 11,7.92zM22.27,21.73l-20,-20.01L1,2.99l3.64,3.64L3,8.27v7.46L8.27,21h7.46l1.64,-1.63L21,23l1.27,-1.27zM12,17.3c-0.72,0 -1.3,-0.58 -1.3,-1.3s0.58,-1.3 1.3,-1.3 1.3,0.58 1.3,1.3 -0.58,1.3 -1.3,1.3z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/report_problem.xml b/qqq/android/mobileapp/src/main/res/drawable/report_problem.xml new file mode 100644 index 0000000..e5bfb7c --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/report_problem.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/report_problem/materialicons/black/res/drawable/baseline_report_problem_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M1,21h22L12,2 1,21zM13,18h-2v-2h2v2zM13,14h-2v-4h2v4z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/request_page.xml b/qqq/android/mobileapp/src/main/res/drawable/request_page.xml new file mode 100644 index 0000000..1757bfd --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/request_page.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/request_page/materialicons/black/res/drawable/baseline_request_page_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M14,2H6C4.9,2 4,2.9 4,4v16c0,1.1 0.9,2 2,2h12c1.1,0 2,-0.9 2,-2V8L14,2zM15,11h-4v1h3c0.55,0 1,0.45 1,1v3c0,0.55 -0.45,1 -1,1h-1v1h-2v-1H9v-2h4v-1h-3c-0.55,0 -1,-0.45 -1,-1v-3c0,-0.55 0.45,-1 1,-1h1V8h2v1h2V11z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/request_quote.xml b/qqq/android/mobileapp/src/main/res/drawable/request_quote.xml new file mode 100644 index 0000000..23375e1 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/request_quote.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/file/request_quote/materialicons/black/res/drawable/baseline_request_quote_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M14,2H6C4.9,2 4.01,2.9 4.01,4L4,20c0,1.1 0.89,2 1.99,2H18c1.1,0 2,-0.9 2,-2V8L14,2zM15,12h-4v1h3c0.55,0 1,0.45 1,1v3c0,0.55 -0.45,1 -1,1h-1v1h-2v-1H9v-2h4v-1h-3c-0.55,0 -1,-0.45 -1,-1v-3c0,-0.55 0.45,-1 1,-1h1V9h2v1h2V12zM13,8V3.5L17.5,8H13z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/reset_tv.xml b/qqq/android/mobileapp/src/main/res/drawable/reset_tv.xml new file mode 100644 index 0000000..497dc70 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/reset_tv.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/reset_tv/materialicons/black/res/drawable/baseline_reset_tv_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M21,10h-8.01V7L9,11l3.99,4v-3H21v5H3V5h18v3h2V5c0,-1.1 -0.9,-2 -2,-2H3c-1.1,0 -2,0.9 -2,2v12c0,1.1 0.9,2 2,2h5v2h8v-2h5c1.1,0 1.99,-0.9 1.99,-2v-5H23c0,-1.1 -0.9,-2 -2,-2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/resource_class.xml b/qqq/android/mobileapp/src/main/res/drawable/resource_class.xml new file mode 100644 index 0000000..8171e9a --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/resource_class.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/class/materialicons/black/res/drawable/baseline_class_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M18,2H6c-1.1,0 -2,0.9 -2,2v16c0,1.1 0.9,2 2,2h12c1.1,0 2,-0.9 2,-2V4c0,-1.1 -0.9,-2 -2,-2zM6,4h5v8l-2.5,-1.5L6,12V4z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/resource_public.xml b/qqq/android/mobileapp/src/main/res/drawable/resource_public.xml new file mode 100644 index 0000000..60692e7 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/resource_public.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/public/materialicons/black/res/drawable/baseline_public_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM11,19.93c-3.95,-0.49 -7,-3.85 -7,-7.93 0,-0.62 0.08,-1.21 0.21,-1.79L9,15v1c0,1.1 0.9,2 2,2v1.93zM17.9,17.39c-0.26,-0.81 -1,-1.39 -1.9,-1.39h-1v-3c0,-0.55 -0.45,-1 -1,-1L8,12v-2h2c0.55,0 1,-0.45 1,-1L11,7h2c1.1,0 2,-0.9 2,-2v-0.41c2.93,1.19 5,4.06 5,7.41 0,2.08 -0.8,3.97 -2.1,5.39z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/resource_try.xml b/qqq/android/mobileapp/src/main/res/drawable/resource_try.xml new file mode 100644 index 0000000..ce89f32 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/resource_try.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/try/materialicons/black/res/drawable/baseline_try_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,2H4C2.9,2 2,2.9 2,4v18l4,-4h14c1.1,0 2,-0.9 2,-2V4C22,2.9 21.1,2 20,2zM13.57,11.57L12,15l-1.57,-3.43L7,10l3.43,-1.57L12,5l1.57,3.43L17,10L13.57,11.57z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/restart_alt.xml b/qqq/android/mobileapp/src/main/res/drawable/restart_alt.xml new file mode 100644 index 0000000..54e37d8 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/restart_alt.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/restart_alt/materialicons/black/res/drawable/baseline_restart_alt_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,5V2L8,6l4,4V7c3.31,0 6,2.69 6,6c0,2.97 -2.17,5.43 -5,5.91v2.02c3.95,-0.49 7,-3.85 7,-7.93C20,8.58 16.42,5 12,5z" /> + <path + android:fillColor="#FF000000" + android:pathData="M6,13c0,-1.65 0.67,-3.15 1.76,-4.24L6.34,7.34C4.9,8.79 4,10.79 4,13c0,4.08 3.05,7.44 7,7.93v-2.02C8.17,18.43 6,15.97 6,13z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/restaurant.xml b/qqq/android/mobileapp/src/main/res/drawable/restaurant.xml new file mode 100644 index 0000000..73d3d56 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/restaurant.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/restaurant/materialicons/black/res/drawable/baseline_restaurant_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M11,9L9,9L9,2L7,2v7L5,9L5,2L3,2v7c0,2.12 1.66,3.84 3.75,3.97L6.75,22h2.5v-9.03C11.34,12.84 13,11.12 13,9L13,2h-2v7zM16,6v8h2.5v8L21,22L21,2c-2.76,0 -5,2.24 -5,4z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/restaurant_menu.xml b/qqq/android/mobileapp/src/main/res/drawable/restaurant_menu.xml new file mode 100644 index 0000000..8ada858 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/restaurant_menu.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/restaurant_menu/materialicons/black/res/drawable/baseline_restaurant_menu_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M8.1,13.34l2.83,-2.83L3.91,3.5c-1.56,1.56 -1.56,4.09 0,5.66l4.19,4.18zM14.88,11.53c1.53,0.71 3.68,0.21 5.27,-1.38 1.91,-1.91 2.28,-4.65 0.81,-6.12 -1.46,-1.46 -4.2,-1.1 -6.12,0.81 -1.59,1.59 -2.09,3.74 -1.38,5.27L3.7,19.87l1.41,1.41L12,14.41l6.88,6.88 1.41,-1.41L13.41,13l1.47,-1.47z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/restore.xml b/qqq/android/mobileapp/src/main/res/drawable/restore.xml new file mode 100644 index 0000000..d70014c --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/restore.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/restore/materialicons/black/res/drawable/baseline_restore_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M13,3c-4.97,0 -9,4.03 -9,9L1,12l3.89,3.89 0.07,0.14L9,12L6,12c0,-3.87 3.13,-7 7,-7s7,3.13 7,7 -3.13,7 -7,7c-1.93,0 -3.68,-0.79 -4.94,-2.06l-1.42,1.42C8.27,19.99 10.51,21 13,21c4.97,0 9,-4.03 9,-9s-4.03,-9 -9,-9zM12,8v5l4.28,2.54 0.72,-1.21 -3.5,-2.08L13.5,8L12,8z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/restore_from_trash.xml b/qqq/android/mobileapp/src/main/res/drawable/restore_from_trash.xml new file mode 100644 index 0000000..df87d82 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/restore_from_trash.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/restore_from_trash/materialicons/black/res/drawable/baseline_restore_from_trash_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19,4h-3.5l-1,-1h-5l-1,1L5,4v2h14zM6,7v12c0,1.1 0.9,2 2,2h8c1.1,0 2,-0.9 2,-2L18,7L6,7zM14,14v4h-4v-4L8,14l4,-4 4,4h-2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/restore_page.xml b/qqq/android/mobileapp/src/main/res/drawable/restore_page.xml new file mode 100644 index 0000000..6befff0 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/restore_page.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/restore_page/materialicons/black/res/drawable/baseline_restore_page_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M14,2L6,2c-1.1,0 -1.99,0.9 -1.99,2L4,20c0,1.1 0.89,2 1.99,2L18,22c1.1,0 2,-0.9 2,-2L20,8l-6,-6zM12,18c-2.05,0 -3.81,-1.24 -4.58,-3h1.71c0.63,0.9 1.68,1.5 2.87,1.5 1.93,0 3.5,-1.57 3.5,-3.5S13.93,9.5 12,9.5c-1.35,0 -2.52,0.78 -3.1,1.9l1.6,1.6h-4L6.5,9l1.3,1.3C8.69,8.92 10.23,8 12,8c2.76,0 5,2.24 5,5s-2.24,5 -5,5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/reviews.xml b/qqq/android/mobileapp/src/main/res/drawable/reviews.xml new file mode 100644 index 0000000..0e9231f --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/reviews.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/reviews/materialicons/black/res/drawable/baseline_reviews_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,2H4C2.9,2 2,2.9 2,4v18l4,-4h14c1.1,0 2,-0.9 2,-2V4C22,2.9 21.1,2 20,2zM13.57,11.57L12,15l-1.57,-3.43L7,10l3.43,-1.57L12,5l1.57,3.43L17,10L13.57,11.57z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/rice_bowl.xml b/qqq/android/mobileapp/src/main/res/drawable/rice_bowl.xml new file mode 100644 index 0000000..29490af --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/rice_bowl.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/places/rice_bowl/materialicons/black/res/drawable/baseline_rice_bowl_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M22,12L22,12c0,-5.52 -4.48,-10 -10,-10S2,6.48 2,12c0,3.69 2.47,6.86 6,8.25V22h8v-1.75C19.53,18.86 22,15.69 22,12zM20,12h-4V5.08C18.39,6.47 20,9.05 20,12zM14,4.26V12h-4V4.26C10.64,4.1 11.31,4 12,4S13.36,4.1 14,4.26zM4,12c0,-2.95 1.61,-5.53 4,-6.92V12H4z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/ring_volume.xml b/qqq/android/mobileapp/src/main/res/drawable/ring_volume.xml new file mode 100644 index 0000000..2df1711 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/ring_volume.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/communication/ring_volume/materialicons/black/res/drawable/baseline_ring_volume_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M23.71,16.67C20.66,13.78 16.54,12 12,12 7.46,12 3.34,13.78 0.29,16.67c-0.18,0.18 -0.29,0.43 -0.29,0.71 0,0.28 0.11,0.53 0.29,0.71l2.48,2.48c0.18,0.18 0.43,0.29 0.71,0.29 0.27,0 0.52,-0.11 0.7,-0.28 0.79,-0.74 1.69,-1.36 2.66,-1.85 0.33,-0.16 0.56,-0.5 0.56,-0.9v-3.1c1.45,-0.48 3,-0.73 4.6,-0.73s3.15,0.25 4.6,0.72v3.1c0,0.39 0.23,0.74 0.56,0.9 0.98,0.49 1.87,1.12 2.66,1.85 0.18,0.18 0.43,0.28 0.7,0.28 0.28,0 0.53,-0.11 0.71,-0.29l2.48,-2.48c0.18,-0.18 0.29,-0.43 0.29,-0.71 0,-0.27 -0.11,-0.52 -0.29,-0.7zM21.16,6.26l-1.41,-1.41 -3.56,3.55 1.41,1.41s3.45,-3.52 3.56,-3.55zM13,2h-2v5h2V2zM6.4,9.81L7.81,8.4 4.26,4.84 2.84,6.26c0.11,0.03 3.56,3.55 3.56,3.55z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/rocket.xml b/qqq/android/mobileapp/src/main/res/drawable/rocket.xml new file mode 100644 index 0000000..ec48f3b --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/rocket.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/rocket/materialicons/black/res/drawable/baseline_rocket_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,2.5c0,0 4.5,2.04 4.5,10.5c0,2.49 -1.04,5.57 -1.6,7H9.1c-0.56,-1.43 -1.6,-4.51 -1.6,-7C7.5,4.54 12,2.5 12,2.5zM14,11c0,-1.1 -0.9,-2 -2,-2s-2,0.9 -2,2s0.9,2 2,2S14,12.1 14,11zM7.69,20.52c-0.48,-1.23 -1.52,-4.17 -1.67,-6.87l-1.13,0.75C4.33,14.78 4,15.4 4,16.07V22L7.69,20.52zM20,22v-5.93c0,-0.67 -0.33,-1.29 -0.89,-1.66l-1.13,-0.75c-0.15,2.69 -1.2,5.64 -1.67,6.87L20,22z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/rocket_launch.xml b/qqq/android/mobileapp/src/main/res/drawable/rocket_launch.xml new file mode 100644 index 0000000..70b4a28 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/rocket_launch.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/rocket_launch/materialicons/black/res/drawable/baseline_rocket_launch_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M9.19,6.35c-2.04,2.29 -3.44,5.58 -3.57,5.89L2,10.69l4.05,-4.05c0.47,-0.47 1.15,-0.68 1.81,-0.55L9.19,6.35L9.19,6.35zM11.17,17c0,0 3.74,-1.55 5.89,-3.7c5.4,-5.4 4.5,-9.62 4.21,-10.57c-0.95,-0.3 -5.17,-1.19 -10.57,4.21C8.55,9.09 7,12.83 7,12.83L11.17,17zM17.65,14.81c-2.29,2.04 -5.58,3.44 -5.89,3.57L13.31,22l4.05,-4.05c0.47,-0.47 0.68,-1.15 0.55,-1.81L17.65,14.81L17.65,14.81zM9,18c0,0.83 -0.34,1.58 -0.88,2.12C6.94,21.3 2,22 2,22s0.7,-4.94 1.88,-6.12C4.42,15.34 5.17,15 6,15C7.66,15 9,16.34 9,18zM13,9c0,-1.1 0.9,-2 2,-2s2,0.9 2,2s-0.9,2 -2,2S13,10.1 13,9z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/roller_shades.xml b/qqq/android/mobileapp/src/main/res/drawable/roller_shades.xml new file mode 100644 index 0000000..b569e3c --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/roller_shades.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/home/roller_shades/materialicons/black/res/drawable/baseline_roller_shades_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,19V3H4v16H2v2h20v-2H20zM6,19v-6h5v1.8c-0.4,0.3 -0.8,0.8 -0.8,1.4c0,1 0.8,1.8 1.8,1.8s1.8,-0.8 1.8,-1.8c0,-0.6 -0.3,-1.1 -0.8,-1.4V13h5v6H6z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/roller_shades_closed.xml b/qqq/android/mobileapp/src/main/res/drawable/roller_shades_closed.xml new file mode 100644 index 0000000..4bb403d --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/roller_shades_closed.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/home/roller_shades_closed/materialicons/black/res/drawable/baseline_roller_shades_closed_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,19V3H4v16H2v2h8.25c0,0.97 0.78,1.75 1.75,1.75s1.75,-0.78 1.75,-1.75H22v-2H20zM6,19v-2h5v2H6zM13,19v-2h5v2H13z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/roller_skating.xml b/qqq/android/mobileapp/src/main/res/drawable/roller_skating.xml new file mode 100644 index 0000000..a7e0dba --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/roller_skating.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/roller_skating/materialicons/black/res/drawable/baseline_roller_skating_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M9,6.5C9,6.22 9.22,6 9.5,6h2.52L12,5H9.5C9.22,5 9,4.78 9,4.5C9,4.22 9.22,4 9.5,4H12V1H4v15h3h13l0,-2.88c0,-2.1 -1.55,-3.53 -3.03,-3.88l-2.7,-0.67C13.4,8.35 12.7,7.76 12.32,7H9.5C9.22,7 9,6.78 9,6.5zM5,23c-1.66,0 -3,-1.34 -3,-3s1.34,-3 3,-3s3,1.34 3,3S6.66,23 5,23zM19,23c-1.66,0 -3,-1.34 -3,-3s1.34,-3 3,-3s3,1.34 3,3S20.66,23 19,23zM12,23c-1.66,0 -3,-1.34 -3,-3s1.34,-3 3,-3s3,1.34 3,3S13.66,23 12,23z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/roofing.xml b/qqq/android/mobileapp/src/main/res/drawable/roofing.xml new file mode 100644 index 0000000..35cdfd2 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/roofing.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/places/roofing/materialicons/black/res/drawable/baseline_roofing_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M13,18h-2v-2h2V18zM15,14H9v6h6V14L15,14zM19,9.3L19,9.3V4h-3v2.6v0L12,3L2,12h3l7,-6.31L19,12h3L19,9.3z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/room.xml b/qqq/android/mobileapp/src/main/res/drawable/room.xml new file mode 100644 index 0000000..72a12cd --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/room.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/room/materialicons/black/res/drawable/baseline_room_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,2C8.13,2 5,5.13 5,9c0,5.25 7,13 7,13s7,-7.75 7,-13c0,-3.87 -3.13,-7 -7,-7zM12,11.5c-1.38,0 -2.5,-1.12 -2.5,-2.5s1.12,-2.5 2.5,-2.5 2.5,1.12 2.5,2.5 -1.12,2.5 -2.5,2.5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/room_preferences.xml b/qqq/android/mobileapp/src/main/res/drawable/room_preferences.xml new file mode 100644 index 0000000..576dc80 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/room_preferences.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/places/room_preferences/materialicons/black/res/drawable/baseline_room_preferences_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M14,11.26V6h3v4h2V4h-5V3H5v16H3v2h9.26C11.47,19.87 11,18.49 11,17C11,14.62 12.19,12.53 14,11.26zM10,11h2v2h-2V11zM21.69,16.37l1.14,-1l-1,-1.73l-1.45,0.49c-0.32,-0.27 -0.68,-0.48 -1.08,-0.63L19,12h-2l-0.3,1.49c-0.4,0.15 -0.76,0.36 -1.08,0.63l-1.45,-0.49l-1,1.73l1.14,1c-0.08,0.5 -0.08,0.76 0,1.26l-1.14,1l1,1.73l1.45,-0.49c0.32,0.27 0.68,0.48 1.08,0.63L17,22h2l0.3,-1.49c0.4,-0.15 0.76,-0.36 1.08,-0.63l1.45,0.49l1,-1.73l-1.14,-1C21.77,17.13 21.77,16.87 21.69,16.37zM18,19c-1.1,0 -2,-0.9 -2,-2s0.9,-2 2,-2s2,0.9 2,2S19.1,19 18,19z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/room_service.xml b/qqq/android/mobileapp/src/main/res/drawable/room_service.xml new file mode 100644 index 0000000..23dd30b --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/room_service.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/places/room_service/materialicons/black/res/drawable/baseline_room_service_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M2,17h20v2L2,19zM13.84,7.79c0.1,-0.24 0.16,-0.51 0.16,-0.79 0,-1.1 -0.9,-2 -2,-2s-2,0.9 -2,2c0,0.28 0.06,0.55 0.16,0.79C6.25,8.6 3.27,11.93 3,16h18c-0.27,-4.07 -3.25,-7.4 -7.16,-8.21z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/rotate_90_degrees_ccw.xml b/qqq/android/mobileapp/src/main/res/drawable/rotate_90_degrees_ccw.xml new file mode 100644 index 0000000..1a31689 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/rotate_90_degrees_ccw.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/rotate_90_degrees_ccw/materialicons/black/res/drawable/baseline_rotate_90_degrees_ccw_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M7.34,6.41L0.86,12.9l6.49,6.48 6.49,-6.48 -6.5,-6.49zM3.69,12.9l3.66,-3.66L11,12.9l-3.66,3.66 -3.65,-3.66zM19.36,6.64C17.61,4.88 15.3,4 13,4L13,0.76L8.76,5 13,9.24L13,6c1.79,0 3.58,0.68 4.95,2.05 2.73,2.73 2.73,7.17 0,9.9C16.58,19.32 14.79,20 13,20c-0.97,0 -1.94,-0.21 -2.84,-0.61l-1.49,1.49C10.02,21.62 11.51,22 13,22c2.3,0 4.61,-0.88 6.36,-2.64 3.52,-3.51 3.52,-9.21 0,-12.72z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/rotate_90_degrees_cw.xml b/qqq/android/mobileapp/src/main/res/drawable/rotate_90_degrees_cw.xml new file mode 100644 index 0000000..bc67806 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/rotate_90_degrees_cw.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/rotate_90_degrees_cw/materialicons/black/res/drawable/baseline_rotate_90_degrees_cw_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M4.64,19.37c3.03,3.03 7.67,3.44 11.15,1.25l-1.46,-1.46c-2.66,1.43 -6.04,1.03 -8.28,-1.21c-2.73,-2.73 -2.73,-7.17 0,-9.9C7.42,6.69 9.21,6.03 11,6.03V9l4,-4l-4,-4v3.01c-2.3,0 -4.61,0.87 -6.36,2.63C1.12,10.15 1.12,15.85 4.64,19.37zM11,13l6,6l6,-6l-6,-6L11,13z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/rotate_left.xml b/qqq/android/mobileapp/src/main/res/drawable/rotate_left.xml new file mode 100644 index 0000000..0ea79ad --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/rotate_left.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/rotate_left/materialicons/black/res/drawable/baseline_rotate_left_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M7.11,8.53L5.7,7.11C4.8,8.27 4.24,9.61 4.07,11h2.02c0.14,-0.87 0.49,-1.72 1.02,-2.47zM6.09,13L4.07,13c0.17,1.39 0.72,2.73 1.62,3.89l1.41,-1.42c-0.52,-0.75 -0.87,-1.59 -1.01,-2.47zM7.1,18.32c1.16,0.9 2.51,1.44 3.9,1.61L11,17.9c-0.87,-0.15 -1.71,-0.49 -2.46,-1.03L7.1,18.32zM13,4.07L13,1L8.45,5.55 13,10L13,6.09c2.84,0.48 5,2.94 5,5.91s-2.16,5.43 -5,5.91v2.02c3.95,-0.49 7,-3.85 7,-7.93s-3.05,-7.44 -7,-7.93z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/rotate_right.xml b/qqq/android/mobileapp/src/main/res/drawable/rotate_right.xml new file mode 100644 index 0000000..04dfaa3 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/rotate_right.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/rotate_right/materialicons/black/res/drawable/baseline_rotate_right_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M15.55,5.55L11,1v3.07C7.06,4.56 4,7.92 4,12s3.05,7.44 7,7.93v-2.02c-2.84,-0.48 -5,-2.94 -5,-5.91s2.16,-5.43 5,-5.91L11,10l4.55,-4.45zM19.93,11c-0.17,-1.39 -0.72,-2.73 -1.62,-3.89l-1.42,1.42c0.54,0.75 0.88,1.6 1.02,2.47h2.02zM13,17.9v2.02c1.39,-0.17 2.74,-0.71 3.9,-1.61l-1.44,-1.44c-0.75,0.54 -1.59,0.89 -2.46,1.03zM16.89,15.48l1.42,1.41c0.9,-1.16 1.45,-2.5 1.62,-3.89h-2.02c-0.14,0.87 -0.48,1.72 -1.02,2.48z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/roundabout_left.xml b/qqq/android/mobileapp/src/main/res/drawable/roundabout_left.xml new file mode 100644 index 0000000..00f16a7 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/roundabout_left.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/roundabout_left/materialicons/black/res/drawable/baseline_roundabout_left_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M10.08,8c0.48,-2.84 2.94,-5 5.92,-5c3.31,0 6,2.69 6,6c0,2.97 -2.16,5.44 -5,5.92L17,21h-2l0,-6.09c0,-0.98 0.71,-1.8 1.67,-1.97C18.56,12.63 20,10.98 20,9c0,-2.21 -1.79,-4 -4,-4c-1.98,0 -3.63,1.44 -3.94,3.33C11.89,9.29 11.07,10 10.09,10l-4.26,0l1.59,1.59L6,13L2,9l4,-4l1.41,1.41L5.83,8L10.08,8z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/roundabout_right.xml b/qqq/android/mobileapp/src/main/res/drawable/roundabout_right.xml new file mode 100644 index 0000000..89e7edd --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/roundabout_right.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/roundabout_right/materialicons/black/res/drawable/baseline_roundabout_right_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M13.92,8C13.44,5.16 10.97,3 8,3C4.69,3 2,5.69 2,9c0,2.97 2.16,5.44 5,5.92L7,21h2l0,-6.09c0,-0.98 -0.71,-1.8 -1.67,-1.97C5.44,12.63 4,10.98 4,9c0,-2.21 1.79,-4 4,-4c1.98,0 3.63,1.44 3.94,3.33C12.11,9.29 12.93,10 13.91,10l4.26,0l-1.59,1.59L18,13l4,-4l-4,-4l-1.41,1.41L18.17,8L13.92,8z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/rounded_corner.xml b/qqq/android/mobileapp/src/main/res/drawable/rounded_corner.xml new file mode 100644 index 0000000..1058e1d --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/rounded_corner.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/rounded_corner/materialicons/black/res/drawable/baseline_rounded_corner_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19,19h2v2h-2V19zM19,17h2v-2h-2V17zM3,13h2v-2H3V13zM3,17h2v-2H3V17zM3,9h2V7H3V9zM3,5h2V3H3V5zM7,5h2V3H7V5zM15,21h2v-2h-2V21zM11,21h2v-2h-2V21zM15,21h2v-2h-2V21zM7,21h2v-2H7V21zM3,21h2v-2H3V21zM21,8c0,-2.76 -2.24,-5 -5,-5h-5v2h5c1.65,0 3,1.35 3,3v5h2V8z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/route.xml b/qqq/android/mobileapp/src/main/res/drawable/route.xml new file mode 100644 index 0000000..270515e --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/route.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/route/materialicons/black/res/drawable/baseline_route_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19,15.18V7c0,-2.21 -1.79,-4 -4,-4s-4,1.79 -4,4v10c0,1.1 -0.9,2 -2,2s-2,-0.9 -2,-2V8.82C8.16,8.4 9,7.3 9,6c0,-1.66 -1.34,-3 -3,-3S3,4.34 3,6c0,1.3 0.84,2.4 2,2.82V17c0,2.21 1.79,4 4,4s4,-1.79 4,-4V7c0,-1.1 0.9,-2 2,-2s2,0.9 2,2v8.18c-1.16,0.41 -2,1.51 -2,2.82c0,1.66 1.34,3 3,3s3,-1.34 3,-3C21,16.7 20.16,15.6 19,15.18z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/router.xml b/qqq/android/mobileapp/src/main/res/drawable/router.xml new file mode 100644 index 0000000..d7fcfcd --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/router.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/hardware/router/materialicons/black/res/drawable/baseline_router_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20.2,5.9l0.8,-0.8C19.6,3.7 17.8,3 16,3s-3.6,0.7 -5,2.1l0.8,0.8C13,4.8 14.5,4.2 16,4.2s3,0.6 4.2,1.7zM19.3,6.7c-0.9,-0.9 -2.1,-1.4 -3.3,-1.4s-2.4,0.5 -3.3,1.4l0.8,0.8c0.7,-0.7 1.6,-1 2.5,-1 0.9,0 1.8,0.3 2.5,1l0.8,-0.8zM19,13h-2L17,9h-2v4L5,13c-1.1,0 -2,0.9 -2,2v4c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2v-4c0,-1.1 -0.9,-2 -2,-2zM8,18L6,18v-2h2v2zM11.5,18h-2v-2h2v2zM15,18h-2v-2h2v2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/rowing.xml b/qqq/android/mobileapp/src/main/res/drawable/rowing.xml new file mode 100644 index 0000000..6418646 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/rowing.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/rowing/materialicons/black/res/drawable/baseline_rowing_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M8.5,14.5L4,19l1.5,1.5L9,17h2L8.5,14.5zM15,1c-1.1,0 -2,0.9 -2,2s0.9,2 2,2s2,-0.9 2,-2S16.1,1 15,1zM21,21.01L18,24l-2.99,-3.01V19.5l-7.1,-7.09C7.6,12.46 7.3,12.48 7,12.48v-2.16c1.66,0.03 3.61,-0.87 4.67,-2.04l1.4,-1.55C13.42,6.34 14.06,6 14.72,6h0.03C15.99,6.01 17,7.02 17,8.26v5.75c0,0.84 -0.35,1.61 -0.92,2.16l-3.58,-3.58v-2.27c-0.63,0.52 -1.43,1.02 -2.29,1.39L16.5,18H18L21,21.01z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/rss_feed.xml b/qqq/android/mobileapp/src/main/res/drawable/rss_feed.xml new file mode 100644 index 0000000..a5f33c7 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/rss_feed.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/communication/rss_feed/materialicons/black/res/drawable/baseline_rss_feed_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M6.18,17.82m-2.18,0a2.18,2.18 0,1 1,4.36 0a2.18,2.18 0,1 1,-4.36 0" /> + <path + android:fillColor="#FF000000" + android:pathData="M4,4.44v2.83c7.03,0 12.73,5.7 12.73,12.73h2.83c0,-8.59 -6.97,-15.56 -15.56,-15.56zM4,10.1v2.83c3.9,0 7.07,3.17 7.07,7.07h2.83c0,-5.47 -4.43,-9.9 -9.9,-9.9z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/rsvp.xml b/qqq/android/mobileapp/src/main/res/drawable/rsvp.xml new file mode 100644 index 0000000..9d56dc6 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/rsvp.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/rsvp/materialicons/black/res/drawable/baseline_rsvp_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M16,9h1.5l-1.75,6h-1.5L12.5,9H14l1,3.43L16,9zM5.1,12.9L6,15H4.5l-0.85,-2H2.5v2H1V9h3.5C5.35,9 6,9.65 6,10.5v1C6,12.1 5.6,12.65 5.1,12.9zM4.5,10.5h-2v1h2V10.5zM21.5,13h-2v2H18V9h3.5c0.83,0 1.5,0.67 1.5,1.5v1C23,12.33 22.33,13 21.5,13zM21.5,10.5h-2v1h2V10.5zM11.5,9v1.5h-3v0.75h2c0.55,0 1,0.45 1,1V14c0,0.55 -0.45,1 -1,1H7v-1.5h3v-0.75H7.75C7.34,12.75 7,12.41 7,12v-2c0,-0.55 0.45,-1 1,-1H11.5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/rtt.xml b/qqq/android/mobileapp/src/main/res/drawable/rtt.xml new file mode 100644 index 0000000..741664b --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/rtt.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/communication/rtt/materialicons/black/res/drawable/baseline_rtt_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M9.03,3l-1.11,7.07h2.62l0.7,-4.5h2.58L11.8,18.43L9.47,18.43L9.06,21h7.27l0.4,-2.57h-2.35l2,-12.86h2.58l-0.71,4.5h2.65L22,3L9.03,3zM8,5L4,5l-0.31,2h4L8,5zM7.39,9h-4l-0.31,2h4l0.31,-2zM8.31,17h-6L2,19h6l0.31,-2zM8.93,13h-6l-0.31,2h6.01l0.3,-2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/rule.xml b/qqq/android/mobileapp/src/main/res/drawable/rule.xml new file mode 100644 index 0000000..98b5aa6 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/rule.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/rule/materialicons/black/res/drawable/baseline_rule_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M16.54,11L13,7.46l1.41,-1.41l2.12,2.12l4.24,-4.24l1.41,1.41L16.54,11zM11,7H2v2h9V7zM21,13.41L19.59,12L17,14.59L14.41,12L13,13.41L15.59,16L13,18.59L14.41,20L17,17.41L19.59,20L21,18.59L18.41,16L21,13.41zM11,15H2v2h9V15z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/rule_folder.xml b/qqq/android/mobileapp/src/main/res/drawable/rule_folder.xml new file mode 100644 index 0000000..0f4f7d5 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/rule_folder.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/file/rule_folder/materialicons/black/res/drawable/baseline_rule_folder_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,6h-8l-2,-2H4C2.9,4 2.01,4.9 2.01,6L2,18c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2V8C22,6.9 21.1,6 20,6zM7.83,16L5,13.17l1.41,-1.41l1.41,1.41l3.54,-3.54l1.41,1.41L7.83,16zM17.41,13L19,14.59L17.59,16L16,14.41L14.41,16L13,14.59L14.59,13L13,11.41L14.41,10L16,11.59L17.59,10L19,11.41L17.41,13z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/run_circle.xml b/qqq/android/mobileapp/src/main/res/drawable/run_circle.xml new file mode 100644 index 0000000..d6b5a23 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/run_circle.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/run_circle/materialicons/black/res/drawable/baseline_run_circle_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,2C6.48,2 2,6.48 2,12c0,5.52 4.48,10 10,10s10,-4.48 10,-10C22,6.48 17.52,2 12,2zM13.5,6c0.55,0 1,0.45 1,1c0,0.55 -0.45,1 -1,1s-1,-0.45 -1,-1C12.5,6.45 12.95,6 13.5,6zM16,12c-0.7,0 -2.01,-0.54 -2.91,-1.76l-0.41,2.35L14,14.03V18h-1v-3.58l-1.11,-1.21l-0.52,2.64L7.6,15.08l0.2,-0.98l2.78,0.57l0.96,-4.89L10,10.35V12H9V9.65l3.28,-1.21c0.49,-0.18 1.03,0.06 1.26,0.53C14.37,10.67 15.59,11 16,11V12z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/running_with_errors.xml b/qqq/android/mobileapp/src/main/res/drawable/running_with_errors.xml new file mode 100644 index 0000000..1cd86ab --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/running_with_errors.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/notification/running_with_errors/materialicons/black/res/drawable/baseline_running_with_errors_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M22,10v8h-2v-8H22zM20,20v2h2v-2H20zM18,17.29C16.53,18.95 14.39,20 12,20c-4.41,0 -8,-3.59 -8,-8c0,-4.41 3.59,-8 8,-8v9l7.55,-7.55C17.72,3.34 15.02,2 12,2C6.48,2 2,6.48 2,12c0,5.52 4.48,10 10,10c2.25,0 4.33,-0.74 6,-2V17.29z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/rv_hookup.xml b/qqq/android/mobileapp/src/main/res/drawable/rv_hookup.xml new file mode 100644 index 0000000..8c88c4d --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/rv_hookup.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/places/rv_hookup/materialicons/black/res/drawable/baseline_rv_hookup_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,17v-6c0,-1.1 -0.9,-2 -2,-2L7,9L7,7l-3,3 3,3v-2h4v3L4,14v3c0,1.1 0.9,2 2,2h2c0,1.66 1.34,3 3,3s3,-1.34 3,-3h8v-2h-2zM11,20c-0.55,0 -1,-0.45 -1,-1s0.45,-1 1,-1 1,0.45 1,1 -0.45,1 -1,1zM18,14h-4v-3h4v3zM17,2v2L9,4v2h8v2l3,-3z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/safety_check.xml b/qqq/android/mobileapp/src/main/res/drawable/safety_check.xml new file mode 100644 index 0000000..cac9de2 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/safety_check.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/safety_check/materialicons/black/res/drawable/baseline_safety_check_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,2L4,5v6.09c0,5.05 3.41,9.76 8,10.91c4.59,-1.15 8,-5.86 8,-10.91V5L12,2zM12,17c-2.76,0 -5,-2.24 -5,-5s2.24,-5 5,-5s5,2.24 5,5S14.76,17 12,17zM13.65,14.35l-2.15,-2.15V9h1v2.79l1.85,1.85L13.65,14.35z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/safety_divider.xml b/qqq/android/mobileapp/src/main/res/drawable/safety_divider.xml new file mode 100644 index 0000000..3a1b742 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/safety_divider.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/safety_divider/materialicons/black/res/drawable/baseline_safety_divider_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M11,5h2v14h-2V5zM5,12c1.1,0 2,-0.9 2,-2c0,-1.1 -0.9,-2 -2,-2s-2,0.9 -2,2C3,11.1 3.9,12 5,12zM7.78,13.58C6.93,13.21 5.99,13 5,13s-1.93,0.21 -2.78,0.58C1.48,13.9 1,14.62 1,15.43L1,16h8l0,-0.57C9,14.62 8.52,13.9 7.78,13.58zM19,12c1.1,0 2,-0.9 2,-2c0,-1.1 -0.9,-2 -2,-2s-2,0.9 -2,2C17,11.1 17.9,12 19,12zM21.78,13.58C20.93,13.21 19.99,13 19,13s-1.93,0.21 -2.78,0.58C15.48,13.9 15,14.62 15,15.43L15,16h8l0,-0.57C23,14.62 22.52,13.9 21.78,13.58z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/sailing.xml b/qqq/android/mobileapp/src/main/res/drawable/sailing.xml new file mode 100644 index 0000000..671ddef --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/sailing.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/sailing/materialicons/black/res/drawable/baseline_sailing_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M11,13.5V2L3,13.5H11zM21,13.5C21,6.5 14.5,1 12.5,1c0,0 1,3 1,6.5s-1,6 -1,6H21zM22,15H2c0.31,1.53 1.16,2.84 2.33,3.73C4.98,18.46 5.55,18.01 6,17.5C6.73,18.34 7.8,19 9,19s2.27,-0.66 3,-1.5c0.73,0.84 1.8,1.5 3,1.5s2.26,-0.66 3,-1.5c0.45,0.51 1.02,0.96 1.67,1.23C20.84,17.84 21.69,16.53 22,15zM22,23v-2h-1c-1.04,0 -2.08,-0.35 -3,-1c-1.83,1.3 -4.17,1.3 -6,0c-1.83,1.3 -4.17,1.3 -6,0c-0.91,0.65 -1.96,1 -3,1H2l0,2h1c1.03,0 2.05,-0.25 3,-0.75c1.89,1 4.11,1 6,0c1.89,1 4.11,1 6,0h0c0.95,0.5 1.97,0.75 3,0.75H22z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/sanitizer.xml b/qqq/android/mobileapp/src/main/res/drawable/sanitizer.xml new file mode 100644 index 0000000..b3854b5 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/sanitizer.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/sanitizer/materialicons/black/res/drawable/baseline_sanitizer_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M15.5,6.5C15.5,5.66 17,4 17,4s1.5,1.66 1.5,2.5C18.5,7.33 17.83,8 17,8S15.5,7.33 15.5,6.5zM19.5,15c1.38,0 2.5,-1.12 2.5,-2.5c0,-1.67 -2.5,-4.5 -2.5,-4.5S17,10.83 17,12.5C17,13.88 18.12,15 19.5,15zM13,14h-2v-2H9v2H7v2h2v2h2v-2h2V14zM16,12v10H4V12c0,-2.97 2.16,-5.43 5,-5.91V4H7V2h6c1.13,0 2.15,0.39 2.99,1.01l-1.43,1.43C14.1,4.17 13.57,4 13,4h-2v2.09C13.84,6.57 16,9.03 16,12z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/satellite.xml b/qqq/android/mobileapp/src/main/res/drawable/satellite.xml new file mode 100644 index 0000000..a4f0382 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/satellite.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/satellite/materialicons/black/res/drawable/baseline_satellite_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19,3L5,3c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2L21,5c0,-1.1 -0.9,-2 -2,-2zM5,4.99h3C8,6.65 6.66,8 5,8L5,4.99zM5,12v-2c2.76,0 5,-2.25 5,-5.01h2C12,8.86 8.87,12 5,12zM5,18l3.5,-4.5 2.5,3.01L14.5,12l4.5,6L5,18z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/satellite_alt.xml b/qqq/android/mobileapp/src/main/res/drawable/satellite_alt.xml new file mode 100644 index 0000000..aa10607 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/satellite_alt.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/satellite_alt/materialicons/black/res/drawable/baseline_satellite_alt_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M15.44,0.59l-3.18,3.18c-0.78,0.78 -0.78,2.05 0,2.83l1.24,1.24l-0.71,0.71L11.55,7.3c-0.78,-0.78 -2.05,-0.78 -2.83,0L7.3,8.72c-0.78,0.78 -0.78,2.05 0,2.83l1.24,1.24l-0.71,0.71L6.6,12.25c-0.78,-0.78 -2.05,-0.78 -2.83,0l-3.18,3.18c-0.78,0.78 -0.78,2.05 0,2.83l3.54,3.54c0.78,0.78 2.05,0.78 2.83,0l3.18,-3.18c0.78,-0.78 0.78,-2.05 0,-2.83l-1.24,-1.24l0.71,-0.71l1.24,1.24c0.78,0.78 2.05,0.78 2.83,0l1.41,-1.41c0.78,-0.78 0.78,-2.05 0,-2.83L13.84,9.6l0.71,-0.71l1.24,1.24c0.78,0.78 2.05,0.78 2.83,0l3.18,-3.18c0.78,-0.78 0.78,-2.05 0,-2.83l-3.54,-3.54C17.48,-0.2 16.22,-0.2 15.44,0.59zM6.6,19.32l-1.06,1.06L2,16.85l1.06,-1.06L6.6,19.32zM8.72,17.2l-1.06,1.06l-3.54,-3.54l1.06,-1.06L8.72,17.2zM18.26,7.66L17.2,8.72l-3.54,-3.54l1.06,-1.06L18.26,7.66zM20.38,5.54L19.32,6.6l-3.54,-3.54L16.85,2L20.38,5.54zM14,21l0,2c4.97,0 9,-4.03 9,-9l-2,0C21,17.87 17.87,21 14,21zM14,17l0,2c2.76,0 5,-2.24 5,-5l-2,0C17,15.66 15.66,17 14,17z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/save.xml b/qqq/android/mobileapp/src/main/res/drawable/save.xml new file mode 100644 index 0000000..49ef5d0 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/save.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/content/save/materialicons/black/res/drawable/baseline_save_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M17,3L5,3c-1.11,0 -2,0.9 -2,2v14c0,1.1 0.89,2 2,2h14c1.1,0 2,-0.9 2,-2L21,7l-4,-4zM12,19c-1.66,0 -3,-1.34 -3,-3s1.34,-3 3,-3 3,1.34 3,3 -1.34,3 -3,3zM15,9L5,9L5,5h10v4z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/save_alt.xml b/qqq/android/mobileapp/src/main/res/drawable/save_alt.xml new file mode 100644 index 0000000..d2147cb --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/save_alt.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/content/save_alt/materialicons/black/res/drawable/baseline_save_alt_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19,12v7L5,19v-7L3,12v7c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2v-7h-2zM13,12.67l2.59,-2.58L17,11.5l-5,5 -5,-5 1.41,-1.41L11,12.67L11,3h2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/save_as.xml b/qqq/android/mobileapp/src/main/res/drawable/save_as.xml new file mode 100644 index 0000000..09f971b --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/save_as.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/content/save_as/materialicons/black/res/drawable/baseline_save_as_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M21,12.4V7l-4,-4H5C3.89,3 3,3.9 3,5v14c0,1.1 0.89,2 2,2h7.4L21,12.4zM15,15c0,1.66 -1.34,3 -3,3s-3,-1.34 -3,-3s1.34,-3 3,-3S15,13.34 15,15zM6,6h9v4H6V6zM19.99,16.25l1.77,1.77L16.77,23H15v-1.77L19.99,16.25zM23.25,16.51l-0.85,0.85l-1.77,-1.77l0.85,-0.85c0.2,-0.2 0.51,-0.2 0.71,0l1.06,1.06C23.45,16 23.45,16.32 23.25,16.51z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/saved_search.xml b/qqq/android/mobileapp/src/main/res/drawable/saved_search.xml new file mode 100644 index 0000000..a6d5c01 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/saved_search.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/saved_search/materialicons/black/res/drawable/baseline_saved_search_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M15.5,14h-0.79l-0.28,-0.27C15.41,12.59 16,11.11 16,9.5 16,5.91 13.09,3 9.5,3S3,5.91 3,9.5 5.91,16 9.5,16c1.61,0 3.09,-0.59 4.23,-1.57l0.27,0.28v0.79l5,4.99L20.49,19l-4.99,-5zM9.5,14C7.01,14 5,11.99 5,9.5S7.01,5 9.5,5 14,7.01 14,9.5 11.99,14 9.5,14zM7.33,12.5l2.14,-1.53 2.14,1.53 -0.83,-2.46 2.15,-1.5h-2.62L9.47,6l-0.84,2.54L6,8.54l2.14,1.49z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/savings.xml b/qqq/android/mobileapp/src/main/res/drawable/savings.xml new file mode 100644 index 0000000..98cffe3 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/savings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/savings/materialicons/black/res/drawable/baseline_savings_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19.83,7.5l-2.27,-2.27c0.07,-0.42 0.18,-0.81 0.32,-1.15C17.96,3.9 18,3.71 18,3.5C18,2.67 17.33,2 16.5,2c-1.64,0 -3.09,0.79 -4,2l-5,0C4.46,4 2,6.46 2,9.5S4.5,21 4.5,21l5.5,0v-2h2v2l5.5,0l1.68,-5.59L22,14.47V7.5H19.83zM13,9H8V7h5V9zM16,11c-0.55,0 -1,-0.45 -1,-1c0,-0.55 0.45,-1 1,-1s1,0.45 1,1C17,10.55 16.55,11 16,11z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/scale.xml b/qqq/android/mobileapp/src/main/res/drawable/scale.xml new file mode 100644 index 0000000..8e806ee --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/scale.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/scale/materialicons/black/res/drawable/baseline_scale_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M14,11V8c4.56,-0.58 8,-3.1 8,-6H2c0,2.9 3.44,5.42 8,6l0,3c-3.68,0.73 -8,3.61 -8,11h6v-2H4.13c0.93,-6.83 6.65,-7.2 7.87,-7.2s6.94,0.37 7.87,7.2H16v2h6C22,14.61 17.68,11.73 14,11zM12,22c-1.1,0 -2,-0.9 -2,-2c0,-0.55 0.22,-1.05 0.59,-1.41C11.39,17.79 16,16 16,16s-1.79,4.61 -2.59,5.41C13.05,21.78 12.55,22 12,22z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/scanner.xml b/qqq/android/mobileapp/src/main/res/drawable/scanner.xml new file mode 100644 index 0000000..fefc89b --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/scanner.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/hardware/scanner/materialicons/black/res/drawable/baseline_scanner_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19.8,10.7L4.2,5l-0.7,1.9L17.6,12L5,12c-1.1,0 -2,0.9 -2,2v4c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2v-5.5c0,-0.8 -0.5,-1.6 -1.2,-1.8zM7,17L5,17v-2h2v2zM19,17L9,17v-2h10v2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/scatter_plot.xml b/qqq/android/mobileapp/src/main/res/drawable/scatter_plot.xml new file mode 100644 index 0000000..f244a0e --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/scatter_plot.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/editor/scatter_plot/materialicons/black/res/drawable/baseline_scatter_plot_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M7,14m-3,0a3,3 0,1 1,6 0a3,3 0,1 1,-6 0" /> + <path + android:fillColor="#FF000000" + android:pathData="M11,6m-3,0a3,3 0,1 1,6 0a3,3 0,1 1,-6 0" /> + <path + android:fillColor="#FF000000" + android:pathData="M16.6,17.6m-3,0a3,3 0,1 1,6 0a3,3 0,1 1,-6 0" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/schedule.xml b/qqq/android/mobileapp/src/main/res/drawable/schedule.xml new file mode 100644 index 0000000..4506de5 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/schedule.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/schedule/materialicons/black/res/drawable/baseline_schedule_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M11.99,2C6.47,2 2,6.48 2,12s4.47,10 9.99,10C17.52,22 22,17.52 22,12S17.52,2 11.99,2zM12,20c-4.42,0 -8,-3.58 -8,-8s3.58,-8 8,-8 8,3.58 8,8 -3.58,8 -8,8z" /> + <path + android:fillColor="#FF000000" + android:pathData="M12.5,7H11v6l5.25,3.15 0.75,-1.23 -4.5,-2.67z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/schedule_send.xml b/qqq/android/mobileapp/src/main/res/drawable/schedule_send.xml new file mode 100644 index 0000000..a2d0a2f --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/schedule_send.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/schedule_send/materialicons/black/res/drawable/baseline_schedule_send_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M16.5,12.5L15,12.5v4l3,2 0.75,-1.23 -2.25,-1.52L16.5,12.5zM16,9L2,3v7l9,2 -9,2v7l7.27,-3.11C10.09,20.83 12.79,23 16,23c3.86,0 7,-3.14 7,-7s-3.14,-7 -7,-7zM16,21c-2.75,0 -4.98,-2.22 -5,-4.97v-0.07c0.02,-2.74 2.25,-4.97 5,-4.97 2.76,0 5,2.24 5,5S18.76,21 16,21z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/schema.xml b/qqq/android/mobileapp/src/main/res/drawable/schema.xml new file mode 100644 index 0000000..e4450a5 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/schema.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/editor/schema/materialicons/black/res/drawable/baseline_schema_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M14,9v2h-3V9H8.5V7H11V1H4v6h2.5v2H4v6h2.5v2H4v6h7v-6H8.5v-2H11v-2h3v2h7V9H14z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/school.xml b/qqq/android/mobileapp/src/main/res/drawable/school.xml new file mode 100644 index 0000000..c9fe7ea --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/school.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/school/materialicons/black/res/drawable/baseline_school_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M5,13.18v4L12,21l7,-3.82v-4L12,17l-7,-3.82zM12,3L1,9l11,6 9,-4.91V17h2V9L12,3z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/science.xml b/qqq/android/mobileapp/src/main/res/drawable/science.xml new file mode 100644 index 0000000..8a53816 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/science.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/science/materialicons/black/res/drawable/baseline_science_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19.8,18.4L14,10.67V6.5l1.35,-1.69C15.61,4.48 15.38,4 14.96,4H9.04C8.62,4 8.39,4.48 8.65,4.81L10,6.5v4.17L4.2,18.4C3.71,19.06 4.18,20 5,20h14C19.82,20 20.29,19.06 19.8,18.4z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/score.xml b/qqq/android/mobileapp/src/main/res/drawable/score.xml new file mode 100644 index 0000000..9c401a5 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/score.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/editor/score/materialicons/black/res/drawable/baseline_score_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19,3L5,3c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2L21,5c0,-1.1 -0.9,-2 -2,-2zM12,5h1.5v3l2,-3h1.7l-2,3 2,3h-1.7l-2,-3v3L12,11L12,5zM7,7.25h2.5L9.5,6.5L7,6.5L7,5h4v3.75L8.5,8.75v0.75L11,9.5L11,11L7,11L7,7.25zM19,13l-6,6 -4,-4 -4,4v-2.5l4,-4 4,4 6,-6L19,13z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/scoreboard.xml b/qqq/android/mobileapp/src/main/res/drawable/scoreboard.xml new file mode 100644 index 0000000..3d83aea --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/scoreboard.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/scoreboard/materialicons/black/res/drawable/baseline_scoreboard_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M17.5,13.5H16v-3h1.5V13.5zM20,4h-3V2h-2v2H9V2H7v2H4C2.9,4 2,4.9 2,6v12c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2V6C22,4.9 21.1,4 20,4zM9.5,11.5c0,0.55 -0.45,1 -1,1h-2v1h3V15H5v-2.5c0,-0.55 0.45,-1 1,-1h2v-1H5V9h3.5c0.55,0 1,0.45 1,1V11.5zM12.75,18h-1.5v-1.5h1.5V18zM12.75,14.5h-1.5V13h1.5V14.5zM12.75,11h-1.5V9.5h1.5V11zM12.75,7.5h-1.5V6h1.5V7.5zM19,14c0,0.55 -0.45,1 -1,1h-2.5c-0.55,0 -1,-0.45 -1,-1v-4c0,-0.55 0.45,-1 1,-1H18c0.55,0 1,0.45 1,1V14z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/screen_lock_landscape.xml b/qqq/android/mobileapp/src/main/res/drawable/screen_lock_landscape.xml new file mode 100644 index 0000000..02cf182 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/screen_lock_landscape.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/screen_lock_landscape/materialicons/black/res/drawable/baseline_screen_lock_landscape_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M21,5L3,5c-1.1,0 -2,0.9 -2,2v10c0,1.1 0.9,2 2,2h18c1.1,0 2,-0.9 2,-2L23,7c0,-1.1 -0.9,-2 -2,-2zM19,17L5,17L5,7h14v10zM10,16h4c0.55,0 1,-0.45 1,-1v-3c0,-0.55 -0.45,-1 -1,-1v-1c0,-1.11 -0.9,-2 -2,-2 -1.11,0 -2,0.9 -2,2v1c-0.55,0 -1,0.45 -1,1v3c0,0.55 0.45,1 1,1zM10.8,10c0,-0.66 0.54,-1.2 1.2,-1.2 0.66,0 1.2,0.54 1.2,1.2v1h-2.4v-1z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/screen_lock_portrait.xml b/qqq/android/mobileapp/src/main/res/drawable/screen_lock_portrait.xml new file mode 100644 index 0000000..676303f --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/screen_lock_portrait.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/screen_lock_portrait/materialicons/black/res/drawable/baseline_screen_lock_portrait_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M10,16h4c0.55,0 1,-0.45 1,-1v-3c0,-0.55 -0.45,-1 -1,-1v-1c0,-1.11 -0.9,-2 -2,-2 -1.11,0 -2,0.9 -2,2v1c-0.55,0 -1,0.45 -1,1v3c0,0.55 0.45,1 1,1zM10.8,10c0,-0.66 0.54,-1.2 1.2,-1.2 0.66,0 1.2,0.54 1.2,1.2v1h-2.4v-1zM17,1L7,1c-1.1,0 -2,0.9 -2,2v18c0,1.1 0.9,2 2,2h10c1.1,0 2,-0.9 2,-2L19,3c0,-1.1 -0.9,-2 -2,-2zM17,19L7,19L7,5h10v14z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/screen_lock_rotation.xml b/qqq/android/mobileapp/src/main/res/drawable/screen_lock_rotation.xml new file mode 100644 index 0000000..a856eb8 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/screen_lock_rotation.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/screen_lock_rotation/materialicons/black/res/drawable/baseline_screen_lock_rotation_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M23.25,12.77l-2.57,-2.57 -1.41,1.41 2.22,2.22 -5.66,5.66L4.51,8.17l5.66,-5.66 2.1,2.1 1.41,-1.41L11.23,0.75c-0.59,-0.59 -1.54,-0.59 -2.12,0L2.75,7.11c-0.59,0.59 -0.59,1.54 0,2.12l12.02,12.02c0.59,0.59 1.54,0.59 2.12,0l6.36,-6.36c0.59,-0.59 0.59,-1.54 0,-2.12zM8.47,20.48C5.2,18.94 2.86,15.76 2.5,12L1,12c0.51,6.16 5.66,11 11.95,11l0.66,-0.03 -3.81,-3.82 -1.33,1.33zM16,9h5c0.55,0 1,-0.45 1,-1L22,4c0,-0.55 -0.45,-1 -1,-1v-0.5C21,1.12 19.88,0 18.5,0S16,1.12 16,2.5L16,3c-0.55,0 -1,0.45 -1,1v4c0,0.55 0.45,1 1,1zM16.8,2.5c0,-0.94 0.76,-1.7 1.7,-1.7s1.7,0.76 1.7,1.7L20.2,3h-3.4v-0.5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/screen_rotation.xml b/qqq/android/mobileapp/src/main/res/drawable/screen_rotation.xml new file mode 100644 index 0000000..79eafea --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/screen_rotation.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/screen_rotation/materialicons/black/res/drawable/baseline_screen_rotation_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M16.48,2.52c3.27,1.55 5.61,4.72 5.97,8.48h1.5C23.44,4.84 18.29,0 12,0l-0.66,0.03 3.81,3.81 1.33,-1.32zM10.23,1.75c-0.59,-0.59 -1.54,-0.59 -2.12,0L1.75,8.11c-0.59,0.59 -0.59,1.54 0,2.12l12.02,12.02c0.59,0.59 1.54,0.59 2.12,0l6.36,-6.36c0.59,-0.59 0.59,-1.54 0,-2.12L10.23,1.75zM14.83,21.19L2.81,9.17l6.36,-6.36 12.02,12.02 -6.36,6.36zM7.52,21.48C4.25,19.94 1.91,16.76 1.55,13L0.05,13C0.56,19.16 5.71,24 12,24l0.66,-0.03 -3.81,-3.81 -1.33,1.32z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/screen_rotation_alt.xml b/qqq/android/mobileapp/src/main/res/drawable/screen_rotation_alt.xml new file mode 100644 index 0000000..d7dc53a --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/screen_rotation_alt.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/screen_rotation_alt/materialicons/black/res/drawable/baseline_screen_rotation_alt_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M4,7.59l5,-5c0.78,-0.78 2.05,-0.78 2.83,0L20.24,11h-2.83L10.4,4L5.41,9H8v2H2V5h2V7.59zM20,19h2v-6h-6v2h2.59l-4.99,5l-7.01,-7H3.76l8.41,8.41c0.78,0.78 2.05,0.78 2.83,0l5,-5V19z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/screen_search_desktop.xml b/qqq/android/mobileapp/src/main/res/drawable/screen_search_desktop.xml new file mode 100644 index 0000000..559b2af --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/screen_search_desktop.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/screen_search_desktop/materialicons/black/res/drawable/baseline_screen_search_desktop_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,18C21.1,18 21.99,17.1 21.99,16L22,6C22,4.89 21.1,4 20,4L4,4C2.89,4 2,4.89 2,6L2,16C2,17.1 2.89,18 4,18L0,18L0,20L24,20L24,18L20,18ZM4,16L4,6L20,6L20,16L20,16.01L4,16ZM9.0967,9.9531C9.0967,8.9261 9.9327,8.0891 10.9607,8.0891C11.9877,8.0891 12.8247,8.9261 12.8247,9.9531C12.8247,10.9801 11.9877,11.8171 10.9607,11.8171C9.9327,11.8171 9.0967,10.9801 9.0967,9.9531ZM16.1287,14.1891L13.6467,11.7071C13.9777,11.2021 14.1737,10.6001 14.1737,9.9531C14.1737,8.1811 12.7327,6.7401 10.9607,6.7401C9.1887,6.7401 7.7467,8.1811 7.7467,9.9531C7.7467,11.7251 9.1887,13.1671 10.9607,13.1671C11.5967,13.1671 12.1857,12.9751 12.6847,12.6561L15.1737,15.1441L16.1287,14.1891Z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/screen_share.xml b/qqq/android/mobileapp/src/main/res/drawable/screen_share.xml new file mode 100644 index 0000000..f03bdfe --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/screen_share.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/communication/screen_share/materialicons/black/res/drawable/baseline_screen_share_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,18c1.1,0 1.99,-0.9 1.99,-2L22,6c0,-1.11 -0.9,-2 -2,-2L4,4c-1.11,0 -2,0.89 -2,2v10c0,1.1 0.89,2 2,2L0,18v2h24v-2h-4zM13,14.47v-2.19c-2.78,0 -4.61,0.85 -6,2.72 0.56,-2.67 2.11,-5.33 6,-5.87L13,7l4,3.73 -4,3.74z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/screenshot.xml b/qqq/android/mobileapp/src/main/res/drawable/screenshot.xml new file mode 100644 index 0000000..1dc852b --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/screenshot.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/screenshot/materialicons/black/res/drawable/baseline_screenshot_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M17,1.01L7,1C5.9,1 5,1.9 5,3v18c0,1.1 0.9,2 2,2h10c1.1,0 2,-0.9 2,-2V3C19,1.9 18.1,1.01 17,1.01zM17,18H7V6h10V18zM9.5,8.5H12V7H8v4h1.5V8.5zM12,17h4v-4h-1.5v2.5H12V17z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/screenshot_monitor.xml b/qqq/android/mobileapp/src/main/res/drawable/screenshot_monitor.xml new file mode 100644 index 0000000..f21b909 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/screenshot_monitor.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/screenshot_monitor/materialicons/black/res/drawable/baseline_screenshot_monitor_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,3H4C2.89,3 2,3.89 2,5v12c0,1.1 0.89,2 2,2h4v2h8v-2h4c1.1,0 2,-0.9 2,-2V5C22,3.89 21.1,3 20,3zM20,17H4V5h16V17z" /> + <path + android:fillColor="#FF000000" + android:pathData="M6.5,7.5l2.5,0l0,-1.5l-4,0l0,4l1.5,0z" /> + <path + android:fillColor="#FF000000" + android:pathData="M19,12l-1.5,0l0,2.5l-2.5,0l0,1.5l4,0z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/scuba_diving.xml b/qqq/android/mobileapp/src/main/res/drawable/scuba_diving.xml new file mode 100644 index 0000000..3da30bb --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/scuba_diving.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/scuba_diving/materialicons/black/res/drawable/baseline_scuba_diving_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M1,13c0,-1.1 0.9,-2 2,-2s2,0.9 2,2s-0.9,2 -2,2S1,14.1 1,13zM8.89,10.11l4.53,-1.21L12.64,6L8.11,7.21c-0.8,0.21 -1.28,1.04 -1.06,1.84l0,0C7.27,9.85 8.09,10.33 8.89,10.11zM20.5,5.9L23,3l-1,-1l-3,3l-2,4l-9.48,2.87c-0.82,0.2 -1.39,0.89 -1.5,1.68L5.24,18L2.4,21.8L4,23l3,-4l1.14,-3.14L14,14l5,-3.5L20.5,5.9z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/sd.xml b/qqq/android/mobileapp/src/main/res/drawable/sd.xml new file mode 100644 index 0000000..906b696 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/sd.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/av/sd/materialicons/black/res/drawable/baseline_sd_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19,3L5,3c-1.11,0 -2,0.9 -2,2v14c0,1.1 0.89,2 2,2h14c1.1,0 2,-0.9 2,-2L21,5c0,-1.1 -0.9,-2 -2,-2zM13,9h4c0.55,0 1,0.45 1,1v4c0,0.55 -0.45,1 -1,1h-4L13,9zM9.5,13.5v-1L7,12.5c-0.55,0 -1,-0.45 -1,-1L6,10c0,-0.55 0.45,-1 1,-1h3c0.55,0 1,0.45 1,1v1L9.5,11v-0.5h-2v1L10,11.5c0.55,0 1,0.45 1,1L11,14c0,0.55 -0.45,1 -1,1L7,15c-0.55,0 -1,-0.45 -1,-1v-1h1.5v0.5h2zM14.5,13.5h2v-3h-2v3z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/sd_card.xml b/qqq/android/mobileapp/src/main/res/drawable/sd_card.xml new file mode 100644 index 0000000..8cd9e5c --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/sd_card.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/notification/sd_card/materialicons/black/res/drawable/baseline_sd_card_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M18,2h-8L4.02,8 4,20c0,1.1 0.9,2 2,2h12c1.1,0 2,-0.9 2,-2L20,4c0,-1.1 -0.9,-2 -2,-2zM12,8h-2L10,4h2v4zM15,8h-2L13,4h2v4zM18,8h-2L16,4h2v4z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/sd_card_alert.xml b/qqq/android/mobileapp/src/main/res/drawable/sd_card_alert.xml new file mode 100644 index 0000000..217fb7a --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/sd_card_alert.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/notification/sd_card_alert/materialicons/black/res/drawable/baseline_sd_card_alert_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M18,2h-8L4.02,8L4,20c0,1.1 0.9,2 2,2h12c1.1,0 2,-0.9 2,-2V4C20,2.9 19.1,2 18,2zM13,17h-2v-2h2V17zM13,13h-2V8h2V13z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/sd_storage.xml b/qqq/android/mobileapp/src/main/res/drawable/sd_storage.xml new file mode 100644 index 0000000..756dff2 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/sd_storage.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/sd_storage/materialicons/black/res/drawable/baseline_sd_storage_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M18,2h-8L4.02,8 4,20c0,1.1 0.9,2 2,2h12c1.1,0 2,-0.9 2,-2L20,4c0,-1.1 -0.9,-2 -2,-2zM12,8h-2L10,4h2v4zM15,8h-2L13,4h2v4zM18,8h-2L16,4h2v4z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/search.xml b/qqq/android/mobileapp/src/main/res/drawable/search.xml new file mode 100644 index 0000000..b723c5f --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/search.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/search/materialicons/black/res/drawable/baseline_search_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M15.5,14h-0.79l-0.28,-0.27C15.41,12.59 16,11.11 16,9.5 16,5.91 13.09,3 9.5,3S3,5.91 3,9.5 5.91,16 9.5,16c1.61,0 3.09,-0.59 4.23,-1.57l0.27,0.28v0.79l5,4.99L20.49,19l-4.99,-5zM9.5,14C7.01,14 5,11.99 5,9.5S7.01,5 9.5,5 14,7.01 14,9.5 11.99,14 9.5,14z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/search_off.xml b/qqq/android/mobileapp/src/main/res/drawable/search_off.xml new file mode 100644 index 0000000..90f1aea --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/search_off.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/search_off/materialicons/black/res/drawable/baseline_search_off_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M15.5,14h-0.79l-0.28,-0.27C15.41,12.59 16,11.11 16,9.5C16,5.91 13.09,3 9.5,3C6.08,3 3.28,5.64 3.03,9h2.02C5.3,6.75 7.18,5 9.5,5C11.99,5 14,7.01 14,9.5S11.99,14 9.5,14c-0.17,0 -0.33,-0.03 -0.5,-0.05v2.02C9.17,15.99 9.33,16 9.5,16c1.61,0 3.09,-0.59 4.23,-1.57L14,14.71v0.79l5,4.99L20.49,19L15.5,14z" /> + <path + android:fillColor="#FF000000" + android:pathData="M6.47,10.82l-2.47,2.47l-2.47,-2.47l-0.71,0.71l2.47,2.47l-2.47,2.47l0.71,0.71l2.47,-2.47l2.47,2.47l0.71,-0.71l-2.47,-2.47l2.47,-2.47z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/security.xml b/qqq/android/mobileapp/src/main/res/drawable/security.xml new file mode 100644 index 0000000..03becff --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/security.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/hardware/security/materialicons/black/res/drawable/baseline_security_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,1L3,5v6c0,5.55 3.84,10.74 9,12 5.16,-1.26 9,-6.45 9,-12L21,5l-9,-4zM12,11.99h7c-0.53,4.12 -3.28,7.79 -7,8.94L12,12L5,12L5,6.3l7,-3.11v8.8z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/security_update.xml b/qqq/android/mobileapp/src/main/res/drawable/security_update.xml new file mode 100644 index 0000000..06bb307 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/security_update.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/security_update/materialicons/black/res/drawable/baseline_security_update_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M5,3v18c0,1.1 0.9,2 2,2h10c1.1,0 2,-0.9 2,-2V3c0,-1.1 -0.9,-2 -2,-2H7C5.9,1 5,1.9 5,3zM17,18H7V6h10V18zM16,12h-3V8h-2v4H8l4,4L16,12z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/security_update_good.xml b/qqq/android/mobileapp/src/main/res/drawable/security_update_good.xml new file mode 100644 index 0000000..f950cd5 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/security_update_good.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/security_update_good/materialicons/black/res/drawable/baseline_security_update_good_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M17,1H7C5.9,1 5,1.9 5,3v18c0,1.1 0.9,2 2,2h10c1.1,0 2,-0.9 2,-2V3C19,1.9 18.1,1 17,1zM17,18H7V6h10V18zM16,10.05l-1.41,-1.41l-3.54,3.54l-1.41,-1.41l-1.41,1.41L11.05,15L16,10.05z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/security_update_warning.xml b/qqq/android/mobileapp/src/main/res/drawable/security_update_warning.xml new file mode 100644 index 0000000..75d849c --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/security_update_warning.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/security_update_warning/materialicons/black/res/drawable/baseline_security_update_warning_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M11,15h2v2h-2z" /> + <path + android:fillColor="#FF000000" + android:pathData="M11,7h2v6h-2z" /> + <path + android:fillColor="#FF000000" + android:pathData="M17,1H7C5.9,1 5.01,1.9 5.01,3v18c0,1.1 0.89,2 1.99,2h10c1.1,0 2,-0.9 2,-2V3C19,1.9 18.1,1 17,1zM17,18H7V6h10V18z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/segment.xml b/qqq/android/mobileapp/src/main/res/drawable/segment.xml new file mode 100644 index 0000000..9f57219 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/segment.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/segment/materialicons/black/res/drawable/baseline_segment_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M9,18h12v-2L9,16v2zM3,6v2h18L21,6L3,6zM9,13h12v-2L9,11v2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/select_all.xml b/qqq/android/mobileapp/src/main/res/drawable/select_all.xml new file mode 100644 index 0000000..1330872 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/select_all.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/content/select_all/materialicons/black/res/drawable/baseline_select_all_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M3,5h2L5,3c-1.1,0 -2,0.9 -2,2zM3,13h2v-2L3,11v2zM7,21h2v-2L7,19v2zM3,9h2L5,7L3,7v2zM13,3h-2v2h2L13,3zM19,3v2h2c0,-1.1 -0.9,-2 -2,-2zM5,21v-2L3,19c0,1.1 0.9,2 2,2zM3,17h2v-2L3,15v2zM9,3L7,3v2h2L9,3zM11,21h2v-2h-2v2zM19,13h2v-2h-2v2zM19,21c1.1,0 2,-0.9 2,-2h-2v2zM19,9h2L21,7h-2v2zM19,17h2v-2h-2v2zM15,21h2v-2h-2v2zM15,5h2L17,3h-2v2zM7,17h10L17,7L7,7v10zM9,9h6v6L9,15L9,9z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/self_improvement.xml b/qqq/android/mobileapp/src/main/res/drawable/self_improvement.xml new file mode 100644 index 0000000..b7dc7c9 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/self_improvement.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/self_improvement/materialicons/black/res/drawable/baseline_self_improvement_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,6m-2,0a2,2 0,1 1,4 0a2,2 0,1 1,-4 0" /> + <path + android:fillColor="#FF000000" + android:pathData="M21,16v-2c-2.24,0 -4.16,-0.96 -5.6,-2.68l-1.34,-1.6C13.68,9.26 13.12,9 12.53,9h-1.05c-0.59,0 -1.15,0.26 -1.53,0.72l-1.34,1.6C7.16,13.04 5.24,14 3,14v2c2.77,0 5.19,-1.17 7,-3.25V15l-3.88,1.55C5.45,16.82 5,17.48 5,18.21C5,19.2 5.8,20 6.79,20H9v-0.5c0,-1.38 1.12,-2.5 2.5,-2.5h3c0.28,0 0.5,0.22 0.5,0.5S14.78,18 14.5,18h-3c-0.83,0 -1.5,0.67 -1.5,1.5V20h7.21C18.2,20 19,19.2 19,18.21c0,-0.73 -0.45,-1.39 -1.12,-1.66L14,15v-2.25C15.81,14.83 18.23,16 21,16z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/sell.xml b/qqq/android/mobileapp/src/main/res/drawable/sell.xml new file mode 100644 index 0000000..79c8ceb --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/sell.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/sell/materialicons/black/res/drawable/baseline_sell_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M21.41,11.41l-8.83,-8.83C12.21,2.21 11.7,2 11.17,2H4C2.9,2 2,2.9 2,4v7.17c0,0.53 0.21,1.04 0.59,1.41l8.83,8.83c0.78,0.78 2.05,0.78 2.83,0l7.17,-7.17C22.2,13.46 22.2,12.2 21.41,11.41zM6.5,8C5.67,8 5,7.33 5,6.5S5.67,5 6.5,5S8,5.67 8,6.5S7.33,8 6.5,8z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/send.xml b/qqq/android/mobileapp/src/main/res/drawable/send.xml new file mode 100644 index 0000000..d7b6a6d --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/send.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/content/send/materialicons/black/res/drawable/baseline_send_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M2.01,21L23,12 2.01,3 2,10l15,2 -15,2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/send_and_archive.xml b/qqq/android/mobileapp/src/main/res/drawable/send_and_archive.xml new file mode 100644 index 0000000..59922f0 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/send_and_archive.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/send_and_archive/materialicons/black/res/drawable/baseline_send_and_archive_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M21,10h-3L2,3v7l9,2 -9,2v7l8,-3.5L10,21c0,1.1 0.9,2 2,2h9c1.1,0 2,-0.9 2,-2v-9c0,-1.1 -0.9,-2 -2,-2zM21,21h-9v-9h9v9zM16.5,20L13,16h2v-3h3v3h2l-3.5,4z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/send_time_extension.xml b/qqq/android/mobileapp/src/main/res/drawable/send_time_extension.xml new file mode 100644 index 0000000..f0b67a5 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/send_time_extension.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/communication/send_time_extension/materialicons/black/res/drawable/baseline_send_time_extension_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,6c0,-1.1 -0.9,-2 -2,-2h-4c0,-1.38 -1.12,-2.5 -2.5,-2.5S9,2.62 9,4H5.01c-1.1,0 -2,0.9 -2,2v3.8C5.7,9.8 6,11.96 6,12.5c0,0.54 -0.29,2.7 -3,2.7V19c0,1.1 0.9,2 2,2h3.8c0,-2.16 1.37,-2.78 2.2,-2.94v-9.3l9,4.5V6z" /> + <path + android:fillColor="#FF000000" + android:pathData="M13,12l0,4l4,1l-4,1l0,4l10,-5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/send_to_mobile.xml b/qqq/android/mobileapp/src/main/res/drawable/send_to_mobile.xml new file mode 100644 index 0000000..98cd373 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/send_to_mobile.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/send_to_mobile/materialicons/black/res/drawable/baseline_send_to_mobile_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M17,17h2v4c0,1.1 -0.9,2 -2,2H7c-1.1,0 -2,-0.9 -2,-2V3c0,-1.1 0.9,-1.99 2,-1.99L17,1c1.1,0 2,0.9 2,2v4h-2V6H7v12h10V17zM22,12l-4,-4v3h-5v2h5v3L22,12z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/sensor_door.xml b/qqq/android/mobileapp/src/main/res/drawable/sensor_door.xml new file mode 100644 index 0000000..82b0e08 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/sensor_door.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/home/sensor_door/materialicons/black/res/drawable/baseline_sensor_door_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M18,2H6C4.9,2 4,2.9 4,4v18h16V4C20,2.9 19.1,2 18,2zM15.5,13.5c-0.83,0 -1.5,-0.67 -1.5,-1.5s0.67,-1.5 1.5,-1.5S17,11.17 17,12S16.33,13.5 15.5,13.5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/sensor_occupied.xml b/qqq/android/mobileapp/src/main/res/drawable/sensor_occupied.xml new file mode 100644 index 0000000..2b87d2c --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/sensor_occupied.xml @@ -0,0 +1,34 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/home/sensor_occupied/materialicons/black/res/drawable/baseline_sensor_occupied_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,11c1.66,0 3,-1.34 3,-3s-1.34,-3 -3,-3S9,6.34 9,8S10.34,11 12,11z" /> + <path + android:fillColor="#FF000000" + android:pathData="M12,12c-1.84,0 -3.56,0.5 -5.03,1.37C6.36,13.72 6,14.39 6,15.09V17h12v-1.91c0,-0.7 -0.36,-1.36 -0.97,-1.72C15.56,12.5 13.84,12 12,12z" /> + <path + android:fillColor="#FF000000" + android:pathData="M21.23,8.15l1.85,-0.77c-1.22,-2.91 -3.55,-5.25 -6.46,-6.46l-0.77,1.85C18.27,3.79 20.21,5.73 21.23,8.15z" /> + <path + android:fillColor="#FF000000" + android:pathData="M8.15,2.77L7.38,0.92C4.47,2.14 2.14,4.47 0.92,7.38l1.85,0.77C3.79,5.73 5.73,3.79 8.15,2.77z" /> + <path + android:fillColor="#FF000000" + android:pathData="M2.77,15.85l-1.85,0.77c1.22,2.91 3.55,5.25 6.46,6.46l0.77,-1.85C5.73,20.21 3.79,18.27 2.77,15.85z" /> + <path + android:fillColor="#FF000000" + android:pathData="M15.85,21.23l0.77,1.85c2.91,-1.22 5.25,-3.55 6.46,-6.46l-1.85,-0.77C20.21,18.27 18.27,20.21 15.85,21.23z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/sensor_window.xml b/qqq/android/mobileapp/src/main/res/drawable/sensor_window.xml new file mode 100644 index 0000000..847b814 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/sensor_window.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/home/sensor_window/materialicons/black/res/drawable/baseline_sensor_window_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M18,4v16H6V4H18M18,2H6C4.9,2 4,2.9 4,4v16c0,1.1 0.9,2 2,2h12c1.1,0 2,-0.9 2,-2V4C20,2.9 19.1,2 18,2L18,2zM7,19h10v-6H7V19zM10,10h4v1h3V5H7v6h3V10z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/sensors.xml b/qqq/android/mobileapp/src/main/res/drawable/sensors.xml new file mode 100644 index 0000000..a823efb --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/sensors.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/sensors/materialicons/black/res/drawable/baseline_sensors_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M7.76,16.24C6.67,15.16 6,13.66 6,12s0.67,-3.16 1.76,-4.24l1.42,1.42C8.45,9.9 8,10.9 8,12c0,1.1 0.45,2.1 1.17,2.83L7.76,16.24zM16.24,16.24C17.33,15.16 18,13.66 18,12s-0.67,-3.16 -1.76,-4.24l-1.42,1.42C15.55,9.9 16,10.9 16,12c0,1.1 -0.45,2.1 -1.17,2.83L16.24,16.24zM12,10c-1.1,0 -2,0.9 -2,2s0.9,2 2,2s2,-0.9 2,-2S13.1,10 12,10zM20,12c0,2.21 -0.9,4.21 -2.35,5.65l1.42,1.42C20.88,17.26 22,14.76 22,12s-1.12,-5.26 -2.93,-7.07l-1.42,1.42C19.1,7.79 20,9.79 20,12zM6.35,6.35L4.93,4.93C3.12,6.74 2,9.24 2,12s1.12,5.26 2.93,7.07l1.42,-1.42C4.9,16.21 4,14.21 4,12S4.9,7.79 6.35,6.35z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/sensors_off.xml b/qqq/android/mobileapp/src/main/res/drawable/sensors_off.xml new file mode 100644 index 0000000..b1dd732 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/sensors_off.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/sensors_off/materialicons/black/res/drawable/baseline_sensors_off_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M8.14,10.96C8.05,11.29 8,11.64 8,12c0,1.1 0.45,2.1 1.17,2.83l-1.42,1.42C6.67,15.16 6,13.66 6,12c0,-0.93 0.21,-1.8 0.58,-2.59L5.11,7.94C4.4,9.13 4,10.52 4,12c0,2.21 0.9,4.21 2.35,5.65l-1.42,1.42C3.12,17.26 2,14.76 2,12c0,-2.04 0.61,-3.93 1.66,-5.51L1.39,4.22l1.41,-1.41l18.38,18.38l-1.41,1.41L8.14,10.96zM17.42,14.59C17.79,13.8 18,12.93 18,12c0,-1.66 -0.67,-3.16 -1.76,-4.24l-1.42,1.42C15.55,9.9 16,10.9 16,12c0,0.36 -0.05,0.71 -0.14,1.04L17.42,14.59zM20,12c0,1.48 -0.4,2.87 -1.11,4.06l1.45,1.45C21.39,15.93 22,14.04 22,12c0,-2.76 -1.12,-5.26 -2.93,-7.07l-1.42,1.42C19.1,7.79 20,9.79 20,12z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/sentiment_dissatisfied.xml b/qqq/android/mobileapp/src/main/res/drawable/sentiment_dissatisfied.xml new file mode 100644 index 0000000..0ae0f0f --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/sentiment_dissatisfied.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/sentiment_dissatisfied/materialicons/black/res/drawable/baseline_sentiment_dissatisfied_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M15.5,9.5m-1.5,0a1.5,1.5 0,1 1,3 0a1.5,1.5 0,1 1,-3 0" /> + <path + android:fillColor="#FF000000" + android:pathData="M8.5,9.5m-1.5,0a1.5,1.5 0,1 1,3 0a1.5,1.5 0,1 1,-3 0" /> + <path + android:fillColor="#FF000000" + android:pathData="M11.99,2C6.47,2 2,6.48 2,12s4.47,10 9.99,10C17.52,22 22,17.52 22,12S17.52,2 11.99,2zM12,20c-4.42,0 -8,-3.58 -8,-8s3.58,-8 8,-8 8,3.58 8,8 -3.58,8 -8,8zM12,16.5c0.73,0 1.39,0.19 1.97,0.53 0.12,-0.14 0.86,-0.98 1.01,-1.14 -0.85,-0.56 -1.87,-0.89 -2.98,-0.89 -1.11,0 -2.13,0.33 -2.99,0.88 0.97,1.09 0.01,0.02 1.01,1.14 0.59,-0.33 1.25,-0.52 1.98,-0.52z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/sentiment_neutral.xml b/qqq/android/mobileapp/src/main/res/drawable/sentiment_neutral.xml new file mode 100644 index 0000000..819be8f --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/sentiment_neutral.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/sentiment_neutral/materialicons/black/res/drawable/baseline_sentiment_neutral_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M9,15.5h6v1H9v-1z" /> + <path + android:fillColor="#FF000000" + android:pathData="M15.5,9.5m-1.5,0a1.5,1.5 0,1 1,3 0a1.5,1.5 0,1 1,-3 0" /> + <path + android:fillColor="#FF000000" + android:pathData="M8.5,9.5m-1.5,0a1.5,1.5 0,1 1,3 0a1.5,1.5 0,1 1,-3 0" /> + <path + android:fillColor="#FF000000" + android:pathData="M11.99,2C6.47,2 2,6.48 2,12s4.47,10 9.99,10C17.52,22 22,17.52 22,12S17.52,2 11.99,2zM12,20c-4.42,0 -8,-3.58 -8,-8s3.58,-8 8,-8 8,3.58 8,8 -3.58,8 -8,8z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/sentiment_satisfied.xml b/qqq/android/mobileapp/src/main/res/drawable/sentiment_satisfied.xml new file mode 100644 index 0000000..3d0dcff --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/sentiment_satisfied.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/sentiment_satisfied/materialicons/black/res/drawable/baseline_sentiment_satisfied_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M15.5,9.5m-1.5,0a1.5,1.5 0,1 1,3 0a1.5,1.5 0,1 1,-3 0" /> + <path + android:fillColor="#FF000000" + android:pathData="M8.5,9.5m-1.5,0a1.5,1.5 0,1 1,3 0a1.5,1.5 0,1 1,-3 0" /> + <path + android:fillColor="#FF000000" + android:pathData="M11.99,2C6.47,2 2,6.48 2,12s4.47,10 9.99,10C17.52,22 22,17.52 22,12S17.52,2 11.99,2zM12,20c-4.42,0 -8,-3.58 -8,-8s3.58,-8 8,-8 8,3.58 8,8 -3.58,8 -8,8zM12,16c-0.73,0 -1.38,-0.18 -1.96,-0.52 -0.12,0.14 -0.86,0.98 -1.01,1.15 0.86,0.55 1.87,0.87 2.97,0.87 1.11,0 2.12,-0.33 2.98,-0.88 -0.97,-1.09 -0.01,-0.02 -1.01,-1.15 -0.59,0.35 -1.24,0.53 -1.97,0.53z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/sentiment_satisfied_alt.xml b/qqq/android/mobileapp/src/main/res/drawable/sentiment_satisfied_alt.xml new file mode 100644 index 0000000..42417f5 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/sentiment_satisfied_alt.xml @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/communication/sentiment_satisfied_alt/materialicons/black/res/drawable/baseline_sentiment_satisfied_alt_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M15.5,9.5m-1.5,0a1.5,1.5 0,1 1,3 0a1.5,1.5 0,1 1,-3 0" /> + <path + android:fillColor="#FF000000" + android:pathData="M8.5,9.5m-1.5,0a1.5,1.5 0,1 1,3 0a1.5,1.5 0,1 1,-3 0" /> + <path + android:fillColor="#FF000000" + android:pathData="M15.5,9.5m-1.5,0a1.5,1.5 0,1 1,3 0a1.5,1.5 0,1 1,-3 0" /> + <path + android:fillColor="#FF000000" + android:pathData="M8.5,9.5m-1.5,0a1.5,1.5 0,1 1,3 0a1.5,1.5 0,1 1,-3 0" /> + <path + android:fillColor="#FF000000" + android:pathData="M11.99,2C6.47,2 2,6.48 2,12s4.47,10 9.99,10C17.52,22 22,17.52 22,12S17.52,2 11.99,2zM12,20c-4.42,0 -8,-3.58 -8,-8s3.58,-8 8,-8 8,3.58 8,8 -3.58,8 -8,8zM12,17.5c2.33,0 4.32,-1.45 5.12,-3.5h-1.67c-0.69,1.19 -1.97,2 -3.45,2s-2.75,-0.81 -3.45,-2L6.88,14c0.8,2.05 2.79,3.5 5.12,3.5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/sentiment_very_dissatisfied.xml b/qqq/android/mobileapp/src/main/res/drawable/sentiment_very_dissatisfied.xml new file mode 100644 index 0000000..c50b15c --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/sentiment_very_dissatisfied.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/sentiment_very_dissatisfied/materialicons/black/res/drawable/baseline_sentiment_very_dissatisfied_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M15.5,9.5m-1.5,0a1.5,1.5 0,1 1,3 0a1.5,1.5 0,1 1,-3 0" /> + <path + android:fillColor="#FF000000" + android:pathData="M8.5,9.5m-1.5,0a1.5,1.5 0,1 1,3 0a1.5,1.5 0,1 1,-3 0" /> + <path + android:fillColor="#FF000000" + android:pathData="M11.99,2C6.47,2 2,6.48 2,12s4.47,10 9.99,10C17.52,22 22,17.52 22,12S17.52,2 11.99,2zM12,20c-4.42,0 -8,-3.58 -8,-8s3.58,-8 8,-8 8,3.58 8,8 -3.58,8 -8,8zM12,14c-2.33,0 -4.32,1.45 -5.12,3.5h1.67c0.69,-1.19 1.97,-2 3.45,-2s2.75,0.81 3.45,2h1.67c-0.8,-2.05 -2.79,-3.5 -5.12,-3.5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/sentiment_very_satisfied.xml b/qqq/android/mobileapp/src/main/res/drawable/sentiment_very_satisfied.xml new file mode 100644 index 0000000..d3f84fe --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/sentiment_very_satisfied.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/sentiment_very_satisfied/materialicons/black/res/drawable/baseline_sentiment_very_satisfied_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M15.5,9.5m-1.5,0a1.5,1.5 0,1 1,3 0a1.5,1.5 0,1 1,-3 0" /> + <path + android:fillColor="#FF000000" + android:pathData="M8.5,9.5m-1.5,0a1.5,1.5 0,1 1,3 0a1.5,1.5 0,1 1,-3 0" /> + <path + android:fillColor="#FF000000" + android:pathData="M11.99,2C6.47,2 2,6.48 2,12s4.47,10 9.99,10C17.52,22 22,17.52 22,12S17.52,2 11.99,2zM12,20c-4.42,0 -8,-3.58 -8,-8s3.58,-8 8,-8 8,3.58 8,8 -3.58,8 -8,8zM7,14c0.78,2.34 2.72,4 5,4s4.22,-1.66 5,-4L7,14z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/set_meal.xml b/qqq/android/mobileapp/src/main/res/drawable/set_meal.xml new file mode 100644 index 0000000..7c168ef --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/set_meal.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/set_meal/materialicons/black/res/drawable/baseline_set_meal_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M21.05,17.56L3.08,18.5L3,17l17.98,-0.94L21.05,17.56zM21,19.48H3v1.5h18V19.48zM22,5v7c0,1.1 -0.9,2 -2,2H4c-1.1,0 -2,-0.9 -2,-2V5c0,-1.1 0.9,-2 2,-2h16C21.1,3 22,3.9 22,5zM20,6c-1.68,0 -3.04,0.98 -3.21,2.23C16.15,7.5 14.06,5.5 10.25,5.5c-4.67,0 -6.75,3 -6.75,3s2.08,3 6.75,3c3.81,0 5.9,-2 6.54,-2.73C16.96,10.02 18.32,11 20,11V6z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/settings.xml b/qqq/android/mobileapp/src/main/res/drawable/settings.xml new file mode 100644 index 0000000..c2a89ca --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/settings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/settings/materialicons/black/res/drawable/baseline_settings_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19.14,12.94c0.04,-0.3 0.06,-0.61 0.06,-0.94c0,-0.32 -0.02,-0.64 -0.07,-0.94l2.03,-1.58c0.18,-0.14 0.23,-0.41 0.12,-0.61l-1.92,-3.32c-0.12,-0.22 -0.37,-0.29 -0.59,-0.22l-2.39,0.96c-0.5,-0.38 -1.03,-0.7 -1.62,-0.94L14.4,2.81c-0.04,-0.24 -0.24,-0.41 -0.48,-0.41h-3.84c-0.24,0 -0.43,0.17 -0.47,0.41L9.25,5.35C8.66,5.59 8.12,5.92 7.63,6.29L5.24,5.33c-0.22,-0.08 -0.47,0 -0.59,0.22L2.74,8.87C2.62,9.08 2.66,9.34 2.86,9.48l2.03,1.58C4.84,11.36 4.8,11.69 4.8,12s0.02,0.64 0.07,0.94l-2.03,1.58c-0.18,0.14 -0.23,0.41 -0.12,0.61l1.92,3.32c0.12,0.22 0.37,0.29 0.59,0.22l2.39,-0.96c0.5,0.38 1.03,0.7 1.62,0.94l0.36,2.54c0.05,0.24 0.24,0.41 0.48,0.41h3.84c0.24,0 0.44,-0.17 0.47,-0.41l0.36,-2.54c0.59,-0.24 1.13,-0.56 1.62,-0.94l2.39,0.96c0.22,0.08 0.47,0 0.59,-0.22l1.92,-3.32c0.12,-0.22 0.07,-0.47 -0.12,-0.61L19.14,12.94zM12,15.6c-1.98,0 -3.6,-1.62 -3.6,-3.6s1.62,-3.6 3.6,-3.6s3.6,1.62 3.6,3.6S13.98,15.6 12,15.6z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/settings_accessibility.xml b/qqq/android/mobileapp/src/main/res/drawable/settings_accessibility.xml new file mode 100644 index 0000000..6ec7993 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/settings_accessibility.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/settings_accessibility/materialicons/black/res/drawable/baseline_settings_accessibility_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20.5,4c-2.61,0.7 -5.67,1 -8.5,1S6.11,4.7 3.5,4L3,6c1.86,0.5 4,0.83 6,1v12h2v-6h2v6h2V7c2,-0.17 4.14,-0.5 6,-1L20.5,4zM12,4c1.1,0 2,-0.9 2,-2s-0.9,-2 -2,-2s-2,0.9 -2,2S10.9,4 12,4zM7,24h2v-2H7V24zM11,24h2v-2h-2V24zM15,24h2v-2h-2V24z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/settings_applications.xml b/qqq/android/mobileapp/src/main/res/drawable/settings_applications.xml new file mode 100644 index 0000000..521857c --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/settings_applications.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/settings_applications/materialicons/black/res/drawable/baseline_settings_applications_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,10c-1.1,0 -2,0.9 -2,2s0.9,2 2,2 2,-0.9 2,-2 -0.9,-2 -2,-2zM19,3L5,3c-1.11,0 -2,0.9 -2,2v14c0,1.1 0.89,2 2,2h14c1.11,0 2,-0.9 2,-2L21,5c0,-1.1 -0.89,-2 -2,-2zM17.25,12c0,0.23 -0.02,0.46 -0.05,0.68l1.48,1.16c0.13,0.11 0.17,0.3 0.08,0.45l-1.4,2.42c-0.09,0.15 -0.27,0.21 -0.43,0.15l-1.74,-0.7c-0.36,0.28 -0.76,0.51 -1.18,0.69l-0.26,1.85c-0.03,0.17 -0.18,0.3 -0.35,0.3h-2.8c-0.17,0 -0.32,-0.13 -0.35,-0.29l-0.26,-1.85c-0.43,-0.18 -0.82,-0.41 -1.18,-0.69l-1.74,0.7c-0.16,0.06 -0.34,0 -0.43,-0.15l-1.4,-2.42c-0.09,-0.15 -0.05,-0.34 0.08,-0.45l1.48,-1.16c-0.03,-0.23 -0.05,-0.46 -0.05,-0.69 0,-0.23 0.02,-0.46 0.05,-0.68l-1.48,-1.16c-0.13,-0.11 -0.17,-0.3 -0.08,-0.45l1.4,-2.42c0.09,-0.15 0.27,-0.21 0.43,-0.15l1.74,0.7c0.36,-0.28 0.76,-0.51 1.18,-0.69l0.26,-1.85c0.03,-0.17 0.18,-0.3 0.35,-0.3h2.8c0.17,0 0.32,0.13 0.35,0.29l0.26,1.85c0.43,0.18 0.82,0.41 1.18,0.69l1.74,-0.7c0.16,-0.06 0.34,0 0.43,0.15l1.4,2.42c0.09,0.15 0.05,0.34 -0.08,0.45l-1.48,1.16c0.03,0.23 0.05,0.46 0.05,0.69z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/settings_backup_restore.xml b/qqq/android/mobileapp/src/main/res/drawable/settings_backup_restore.xml new file mode 100644 index 0000000..f4ed5b0 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/settings_backup_restore.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/settings_backup_restore/materialicons/black/res/drawable/baseline_settings_backup_restore_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M14,12c0,-1.1 -0.9,-2 -2,-2s-2,0.9 -2,2 0.9,2 2,2 2,-0.9 2,-2zM12,3c-4.97,0 -9,4.03 -9,9L0,12l4,4 4,-4L5,12c0,-3.87 3.13,-7 7,-7s7,3.13 7,7 -3.13,7 -7,7c-1.51,0 -2.91,-0.49 -4.06,-1.3l-1.42,1.44C8.04,20.3 9.94,21 12,21c4.97,0 9,-4.03 9,-9s-4.03,-9 -9,-9z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/settings_bluetooth.xml b/qqq/android/mobileapp/src/main/res/drawable/settings_bluetooth.xml new file mode 100644 index 0000000..47acd37 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/settings_bluetooth.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/settings_bluetooth/materialicons/black/res/drawable/baseline_settings_bluetooth_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M11,24h2v-2h-2v2zM7,24h2v-2L7,22v2zM15,24h2v-2h-2v2zM17.71,5.71L12,0h-1v7.59L6.41,3 5,4.41 10.59,10 5,15.59 6.41,17 11,12.41L11,20h1l5.71,-5.71 -4.3,-4.29 4.3,-4.29zM13,3.83l1.88,1.88L13,7.59L13,3.83zM14.88,14.29L13,16.17v-3.76l1.88,1.88z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/settings_brightness.xml b/qqq/android/mobileapp/src/main/res/drawable/settings_brightness.xml new file mode 100644 index 0000000..edd9a26 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/settings_brightness.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/settings_brightness/materialicons/black/res/drawable/baseline_settings_brightness_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M21,3L3,3c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h18c1.1,0 2,-0.9 2,-2L23,5c0,-1.1 -0.9,-2 -2,-2zM21,19.01L3,19.01L3,4.99h18v14.02zM8,16h2.5l1.5,1.5 1.5,-1.5L16,16v-2.5l1.5,-1.5 -1.5,-1.5L16,8h-2.5L12,6.5 10.5,8L8,8v2.5L6.5,12 8,13.5L8,16zM12,9c1.66,0 3,1.34 3,3s-1.34,3 -3,3L12,9z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/settings_cell.xml b/qqq/android/mobileapp/src/main/res/drawable/settings_cell.xml new file mode 100644 index 0000000..f449819 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/settings_cell.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/settings_cell/materialicons/black/res/drawable/baseline_settings_cell_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M7,24h2v-2L7,22v2zM11,24h2v-2h-2v2zM15,24h2v-2h-2v2zM16,0.01L8,0C6.9,0 6,0.9 6,2v16c0,1.1 0.9,2 2,2h8c1.1,0 2,-0.9 2,-2L18,2c0,-1.1 -0.9,-1.99 -2,-1.99zM16,16L8,16L8,4h8v12z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/settings_ethernet.xml b/qqq/android/mobileapp/src/main/res/drawable/settings_ethernet.xml new file mode 100644 index 0000000..c4b9313 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/settings_ethernet.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/settings_ethernet/materialicons/black/res/drawable/baseline_settings_ethernet_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M7.77,6.76L6.23,5.48 0.82,12l5.41,6.52 1.54,-1.28L3.42,12l4.35,-5.24zM7,13h2v-2L7,11v2zM17,11h-2v2h2v-2zM11,13h2v-2h-2v2zM17.77,5.48l-1.54,1.28L20.58,12l-4.35,5.24 1.54,1.28L23.18,12l-5.41,-6.52z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/settings_input_antenna.xml b/qqq/android/mobileapp/src/main/res/drawable/settings_input_antenna.xml new file mode 100644 index 0000000..49543f3 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/settings_input_antenna.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/settings_input_antenna/materialicons/black/res/drawable/baseline_settings_input_antenna_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,5c-3.87,0 -7,3.13 -7,7h2c0,-2.76 2.24,-5 5,-5s5,2.24 5,5h2c0,-3.87 -3.13,-7 -7,-7zM13,14.29c0.88,-0.39 1.5,-1.26 1.5,-2.29 0,-1.38 -1.12,-2.5 -2.5,-2.5S9.5,10.62 9.5,12c0,1.02 0.62,1.9 1.5,2.29v3.3L7.59,21 9,22.41l3,-3 3,3L16.41,21 13,17.59v-3.3zM12,1C5.93,1 1,5.93 1,12h2c0,-4.97 4.03,-9 9,-9s9,4.03 9,9h2c0,-6.07 -4.93,-11 -11,-11z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/settings_input_component.xml b/qqq/android/mobileapp/src/main/res/drawable/settings_input_component.xml new file mode 100644 index 0000000..185edb9 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/settings_input_component.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/settings_input_component/materialicons/black/res/drawable/baseline_settings_input_component_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M5,2c0,-0.55 -0.45,-1 -1,-1s-1,0.45 -1,1v4L1,6v6h6L7,6L5,6L5,2zM9,16c0,1.3 0.84,2.4 2,2.82L11,23h2v-4.18c1.16,-0.41 2,-1.51 2,-2.82v-2L9,14v2zM1,16c0,1.3 0.84,2.4 2,2.82L3,23h2v-4.18C6.16,18.4 7,17.3 7,16v-2L1,14v2zM21,6L21,2c0,-0.55 -0.45,-1 -1,-1s-1,0.45 -1,1v4h-2v6h6L23,6h-2zM13,2c0,-0.55 -0.45,-1 -1,-1s-1,0.45 -1,1v4L9,6v6h6L15,6h-2L13,2zM17,16c0,1.3 0.84,2.4 2,2.82L19,23h2v-4.18c1.16,-0.41 2,-1.51 2,-2.82v-2h-6v2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/settings_input_composite.xml b/qqq/android/mobileapp/src/main/res/drawable/settings_input_composite.xml new file mode 100644 index 0000000..a33b7d7 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/settings_input_composite.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/settings_input_composite/materialicons/black/res/drawable/baseline_settings_input_composite_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M5,2c0,-0.55 -0.45,-1 -1,-1s-1,0.45 -1,1v4L1,6v6h6L7,6L5,6L5,2zM9,16c0,1.3 0.84,2.4 2,2.82L11,23h2v-4.18c1.16,-0.41 2,-1.51 2,-2.82v-2L9,14v2zM1,16c0,1.3 0.84,2.4 2,2.82L3,23h2v-4.18C6.16,18.4 7,17.3 7,16v-2L1,14v2zM21,6L21,2c0,-0.55 -0.45,-1 -1,-1s-1,0.45 -1,1v4h-2v6h6L23,6h-2zM13,2c0,-0.55 -0.45,-1 -1,-1s-1,0.45 -1,1v4L9,6v6h6L15,6h-2L13,2zM17,16c0,1.3 0.84,2.4 2,2.82L19,23h2v-4.18c1.16,-0.41 2,-1.51 2,-2.82v-2h-6v2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/settings_input_hdmi.xml b/qqq/android/mobileapp/src/main/res/drawable/settings_input_hdmi.xml new file mode 100644 index 0000000..6e1c233 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/settings_input_hdmi.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/settings_input_hdmi/materialicons/black/res/drawable/baseline_settings_input_hdmi_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M18,7V4c0,-1.1 -0.9,-2 -2,-2H8c-1.1,0 -2,0.9 -2,2v3H5v6l3,6v3h8v-3l3,-6V7h-1zM8,4h8v3h-2V5h-1v2h-2V5h-1v2H8V4z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/settings_input_svideo.xml b/qqq/android/mobileapp/src/main/res/drawable/settings_input_svideo.xml new file mode 100644 index 0000000..4b0e9b6 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/settings_input_svideo.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/settings_input_svideo/materialicons/black/res/drawable/baseline_settings_input_svideo_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M8,11.5c0,-0.83 -0.67,-1.5 -1.5,-1.5S5,10.67 5,11.5 5.67,13 6.5,13 8,12.33 8,11.5zM15,6.5c0,-0.83 -0.67,-1.5 -1.5,-1.5h-3C9.67,5 9,5.67 9,6.5S9.67,8 10.5,8h3c0.83,0 1.5,-0.67 1.5,-1.5zM8.5,15c-0.83,0 -1.5,0.67 -1.5,1.5S7.67,18 8.5,18s1.5,-0.67 1.5,-1.5S9.33,15 8.5,15zM12,1C5.93,1 1,5.93 1,12s4.93,11 11,11 11,-4.93 11,-11S18.07,1 12,1zM12,21c-4.96,0 -9,-4.04 -9,-9s4.04,-9 9,-9 9,4.04 9,9 -4.04,9 -9,9zM17.5,10c-0.83,0 -1.5,0.67 -1.5,1.5s0.67,1.5 1.5,1.5 1.5,-0.67 1.5,-1.5 -0.67,-1.5 -1.5,-1.5zM15.5,15c-0.83,0 -1.5,0.67 -1.5,1.5s0.67,1.5 1.5,1.5 1.5,-0.67 1.5,-1.5 -0.67,-1.5 -1.5,-1.5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/settings_overscan.xml b/qqq/android/mobileapp/src/main/res/drawable/settings_overscan.xml new file mode 100644 index 0000000..e4dce1c --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/settings_overscan.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/settings_overscan/materialicons/black/res/drawable/baseline_settings_overscan_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12.01,5.5L10,8h4l-1.99,-2.5zM18,10v4l2.5,-1.99L18,10zM6,10l-2.5,2.01L6,14v-4zM14,16h-4l2.01,2.5L14,16zM21,3L3,3c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h18c1.1,0 2,-0.9 2,-2L23,5c0,-1.1 -0.9,-2 -2,-2zM21,19.01L3,19.01L3,4.99h18v14.02z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/settings_phone.xml b/qqq/android/mobileapp/src/main/res/drawable/settings_phone.xml new file mode 100644 index 0000000..d0c9505 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/settings_phone.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/settings_phone/materialicons/black/res/drawable/baseline_settings_phone_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M13,9h-2v2h2L13,9zM17,9h-2v2h2L17,9zM20,15.5c-1.25,0 -2.45,-0.2 -3.57,-0.57 -0.35,-0.11 -0.74,-0.03 -1.02,0.24l-2.2,2.2c-2.83,-1.44 -5.15,-3.75 -6.59,-6.58l2.2,-2.21c0.28,-0.27 0.36,-0.66 0.25,-1.01C8.7,6.45 8.5,5.25 8.5,4c0,-0.55 -0.45,-1 -1,-1L4,3c-0.55,0 -1,0.45 -1,1 0,9.39 7.61,17 17,17 0.55,0 1,-0.45 1,-1v-3.5c0,-0.55 -0.45,-1 -1,-1zM19,9v2h2L21,9h-2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/settings_power.xml b/qqq/android/mobileapp/src/main/res/drawable/settings_power.xml new file mode 100644 index 0000000..3315a4c --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/settings_power.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/settings_power/materialicons/black/res/drawable/baseline_settings_power_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M7,24h2v-2L7,22v2zM11,24h2v-2h-2v2zM13,2h-2v10h2L13,2zM16.56,4.44l-1.45,1.45C16.84,6.94 18,8.83 18,11c0,3.31 -2.69,6 -6,6s-6,-2.69 -6,-6c0,-2.17 1.16,-4.06 2.88,-5.12L7.44,4.44C5.36,5.88 4,8.28 4,11c0,4.42 3.58,8 8,8s8,-3.58 8,-8c0,-2.72 -1.36,-5.12 -3.44,-6.56zM15,24h2v-2h-2v2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/settings_remote.xml b/qqq/android/mobileapp/src/main/res/drawable/settings_remote.xml new file mode 100644 index 0000000..65ef8fd --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/settings_remote.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/settings_remote/materialicons/black/res/drawable/baseline_settings_remote_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M15,9L9,9c-0.55,0 -1,0.45 -1,1v12c0,0.55 0.45,1 1,1h6c0.55,0 1,-0.45 1,-1L16,10c0,-0.55 -0.45,-1 -1,-1zM12,15c-1.1,0 -2,-0.9 -2,-2s0.9,-2 2,-2 2,0.9 2,2 -0.9,2 -2,2zM7.05,6.05l1.41,1.41C9.37,6.56 10.62,6 12,6s2.63,0.56 3.54,1.46l1.41,-1.41C15.68,4.78 13.93,4 12,4s-3.68,0.78 -4.95,2.05zM12,0C8.96,0 6.21,1.23 4.22,3.22l1.41,1.41C7.26,3.01 9.51,2 12,2s4.74,1.01 6.36,2.64l1.41,-1.41C17.79,1.23 15.04,0 12,0z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/settings_suggest.xml b/qqq/android/mobileapp/src/main/res/drawable/settings_suggest.xml new file mode 100644 index 0000000..26addb8 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/settings_suggest.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/settings_suggest/materialicons/black/res/drawable/baseline_settings_suggest_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M17.41,6.59L15,5.5l2.41,-1.09L18.5,2l1.09,2.41L22,5.5l-2.41,1.09L18.5,9L17.41,6.59zM21.28,12.72L20.5,11l-0.78,1.72L18,13.5l1.72,0.78L20.5,16l0.78,-1.72L23,13.5L21.28,12.72zM16.24,14.37l1.94,1.47l-2.5,4.33l-2.24,-0.94c-0.2,0.13 -0.42,0.26 -0.64,0.37L12.5,22h-5l-0.3,-2.41c-0.22,-0.11 -0.43,-0.23 -0.64,-0.37l-2.24,0.94l-2.5,-4.33l1.94,-1.47C3.75,14.25 3.75,14.12 3.75,14s0,-0.25 0.01,-0.37l-1.94,-1.47l2.5,-4.33l2.24,0.94c0.2,-0.13 0.42,-0.26 0.64,-0.37L7.5,6h5l0.3,2.41c0.22,0.11 0.43,0.23 0.64,0.37l2.24,-0.94l2.5,4.33l-1.94,1.47c0.01,0.12 0.01,0.24 0.01,0.37S16.25,14.25 16.24,14.37zM13,14c0,-1.66 -1.34,-3 -3,-3s-3,1.34 -3,3s1.34,3 3,3S13,15.66 13,14z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/settings_system_daydream.xml b/qqq/android/mobileapp/src/main/res/drawable/settings_system_daydream.xml new file mode 100644 index 0000000..59346d3 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/settings_system_daydream.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/settings_system_daydream/materialicons/black/res/drawable/baseline_settings_system_daydream_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M9,16h6.5c1.38,0 2.5,-1.12 2.5,-2.5S16.88,11 15.5,11h-0.05c-0.24,-1.69 -1.69,-3 -3.45,-3 -1.4,0 -2.6,0.83 -3.16,2.02h-0.16C7.17,10.18 6,11.45 6,13c0,1.66 1.34,3 3,3zM21,3L3,3c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h18c1.1,0 2,-0.9 2,-2L23,5c0,-1.1 -0.9,-2 -2,-2zM21,19.01L3,19.01L3,4.99h18v14.02z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/settings_voice.xml b/qqq/android/mobileapp/src/main/res/drawable/settings_voice.xml new file mode 100644 index 0000000..bf99e4d --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/settings_voice.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/settings_voice/materialicons/black/res/drawable/baseline_settings_voice_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M7,24h2v-2L7,22v2zM12,13c1.66,0 2.99,-1.34 2.99,-3L15,4c0,-1.66 -1.34,-3 -3,-3S9,2.34 9,4v6c0,1.66 1.34,3 3,3zM11,24h2v-2h-2v2zM15,24h2v-2h-2v2zM19,10h-1.7c0,3 -2.54,5.1 -5.3,5.1S6.7,13 6.7,10L5,10c0,3.41 2.72,6.23 6,6.72L11,20h2v-3.28c3.28,-0.49 6,-3.31 6,-6.72z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/severe_cold.xml b/qqq/android/mobileapp/src/main/res/drawable/severe_cold.xml new file mode 100644 index 0000000..a979594 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/severe_cold.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/severe_cold/materialicons/black/res/drawable/baseline_severe_cold_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,10.41l4,-4l-1.41,-1.41l-2.59,2.59l0,-3.59l-2,0l0,3.59l-2.59,-2.59l-1.41,1.41l4,4l0,1.59l-1.59,0l-4,-4l-1.41,1.41l2.59,2.59l-3.59,0l0,2l3.59,0l-2.59,2.59l1.41,1.41l4,-4l1.59,0l0,1.59l-4,4l1.41,1.41l2.59,-2.59l0,3.59l2,0l0,-3.59l2.59,2.59l1.41,-1.41l-4,-4l0,-1.59l1.59,0l4,4l1.41,-1.41l-2.59,-2.59l3.59,0l0,-2l-8,0z" /> + <path + android:fillColor="#FF000000" + android:pathData="M19,2h2v5h-2z" /> + <path + android:fillColor="#FF000000" + android:pathData="M19,8h2v2h-2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/shape_line.xml b/qqq/android/mobileapp/src/main/res/drawable/shape_line.xml new file mode 100644 index 0000000..151d74f --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/shape_line.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/editor/shape_line/materialicons/black/res/drawable/baseline_shape_line_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M6,11c2.76,0 5,-2.24 5,-5S8.76,1 6,1S1,3.24 1,6S3.24,11 6,11z" /> + <path + android:fillColor="#FF000000" + android:pathData="M21,14h-5c-1.1,0 -2,0.9 -2,2v5c0,1.1 0.9,2 2,2h5c1.1,0 2,-0.9 2,-2v-5C23,14.9 22.1,14 21,14z" /> + <path + android:fillColor="#FF000000" + android:pathData="M17.71,7.7C18.11,7.89 18.54,8 19,8c1.65,0 3,-1.35 3,-3s-1.35,-3 -3,-3s-3,1.35 -3,3c0,0.46 0.11,0.89 0.3,1.29L6.29,16.3C5.89,16.11 5.46,16 5,16c-1.65,0 -3,1.35 -3,3s1.35,3 3,3s3,-1.35 3,-3c0,-0.46 -0.11,-0.89 -0.3,-1.29L17.71,7.7z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/share.xml b/qqq/android/mobileapp/src/main/res/drawable/share.xml new file mode 100644 index 0000000..0b5265b --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/share.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/share/materialicons/black/res/drawable/baseline_share_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M18,16.08c-0.76,0 -1.44,0.3 -1.96,0.77L8.91,12.7c0.05,-0.23 0.09,-0.46 0.09,-0.7s-0.04,-0.47 -0.09,-0.7l7.05,-4.11c0.54,0.5 1.25,0.81 2.04,0.81 1.66,0 3,-1.34 3,-3s-1.34,-3 -3,-3 -3,1.34 -3,3c0,0.24 0.04,0.47 0.09,0.7L8.04,9.81C7.5,9.31 6.79,9 6,9c-1.66,0 -3,1.34 -3,3s1.34,3 3,3c0.79,0 1.5,-0.31 2.04,-0.81l7.12,4.16c-0.05,0.21 -0.08,0.43 -0.08,0.65 0,1.61 1.31,2.92 2.92,2.92 1.61,0 2.92,-1.31 2.92,-2.92s-1.31,-2.92 -2.92,-2.92z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/share_location.xml b/qqq/android/mobileapp/src/main/res/drawable/share_location.xml new file mode 100644 index 0000000..9dc8166 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/share_location.xml @@ -0,0 +1,34 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/share_location/materialicons/black/res/drawable/baseline_share_location_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M13.02,19.93v2.02c2.01,-0.2 3.84,-1 5.32,-2.21l-1.42,-1.43C15.81,19.17 14.48,19.75 13.02,19.93z" /> + <path + android:fillColor="#FF000000" + android:pathData="M4.03,12c0,-4.05 3.03,-7.41 6.95,-7.93V2.05C5.95,2.58 2.03,6.84 2.03,12c0,5.16 3.92,9.42 8.95,9.95v-2.02C7.06,19.41 4.03,16.05 4.03,12z" /> + <path + android:fillColor="#FF000000" + android:pathData="M19.95,11h2.02c-0.2,-2.01 -1,-3.84 -2.21,-5.32l-1.43,1.43C19.19,8.21 19.77,9.54 19.95,11z" /> + <path + android:fillColor="#FF000000" + android:pathData="M18.34,4.26c-1.48,-1.21 -3.32,-2.01 -5.32,-2.21v2.02c1.46,0.18 2.79,0.76 3.9,1.62L18.34,4.26z" /> + <path + android:fillColor="#FF000000" + android:pathData="M18.33,16.9l1.43,1.42c1.21,-1.48 2.01,-3.31 2.21,-5.32h-2.02C19.77,14.46 19.19,15.79 18.33,16.9z" /> + <path + android:fillColor="#FF000000" + android:pathData="M16,11.1C16,8.61 14.1,7 12,7s-4,1.61 -4,4.1c0,1.66 1.33,3.63 4,5.9C14.67,14.73 16,12.76 16,11.1zM12,12c-0.59,0 -1.07,-0.48 -1.07,-1.07c0,-0.59 0.48,-1.07 1.07,-1.07s1.07,0.48 1.07,1.07C13.07,11.52 12.59,12 12,12z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/shelves.xml b/qqq/android/mobileapp/src/main/res/drawable/shelves.xml new file mode 100644 index 0000000..307a8ed --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/shelves.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/home/shelves/materialicons/black/res/drawable/baseline_shelves_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19,1v2H5V1H3v22h2v-2h14v2h2V1H19zM19,5v6h-6V7H7v4H5V5H19zM17,19v-4h-6v4H5v-6h14v6H17z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/shield.xml b/qqq/android/mobileapp/src/main/res/drawable/shield.xml new file mode 100644 index 0000000..a0f3cf9 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/shield.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/content/shield/materialicons/black/res/drawable/baseline_shield_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,1L3,5v6c0,5.55 3.84,10.74 9,12 5.16,-1.26 9,-6.45 9,-12V5l-9,-4z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/shield_moon.xml b/qqq/android/mobileapp/src/main/res/drawable/shield_moon.xml new file mode 100644 index 0000000..95a52ae --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/shield_moon.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/home/shield_moon/materialicons/black/res/drawable/baseline_shield_moon_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,2L4,5v6.09c0,5.05 3.41,9.76 8,10.91c4.59,-1.15 8,-5.86 8,-10.91V5L12,2zM15.97,14.41c-1.84,2.17 -5.21,2.1 -6.96,-0.07c-2.19,-2.72 -0.65,-6.72 2.69,-7.33c0.34,-0.06 0.63,0.27 0.51,0.6c-0.46,1.23 -0.39,2.64 0.32,3.86c0.71,1.22 1.89,1.99 3.18,2.2C16.05,13.72 16.2,14.14 15.97,14.41z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/shop.xml b/qqq/android/mobileapp/src/main/res/drawable/shop.xml new file mode 100644 index 0000000..e7565d1 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/shop.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/shop/materialicons/black/res/drawable/baseline_shop_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M16,6L16,4c0,-1.11 -0.89,-2 -2,-2h-4c-1.11,0 -2,0.89 -2,2v2L2,6v13c0,1.11 0.89,2 2,2h16c1.11,0 2,-0.89 2,-2L22,6h-6zM10,4h4v2h-4L10,4zM9,18L9,9l7.5,4L9,18z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/shop_2.xml b/qqq/android/mobileapp/src/main/res/drawable/shop_2.xml new file mode 100644 index 0000000..f7f0460 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/shop_2.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/shop_2/materialicons/black/res/drawable/baseline_shop_2_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M3,9H1v11c0,1.11 0.89,2 2,2h16v-2H3V9z" /> + <path + android:fillColor="#FF000000" + android:pathData="M18,5V3c0,-1.11 -0.89,-2 -2,-2h-4c-1.11,0 -2,0.89 -2,2v2H5v11c0,1.11 0.89,2 2,2h14c1.11,0 2,-0.89 2,-2V5H18zM12,3h4v2h-4V3zM12,15V8l5.5,3.5L12,15z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/shop_two.xml b/qqq/android/mobileapp/src/main/res/drawable/shop_two.xml new file mode 100644 index 0000000..f0a0bb1 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/shop_two.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/shop_two/materialicons/black/res/drawable/baseline_shop_two_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M3,9L1,9v11c0,1.11 0.89,2 2,2h14c1.11,0 2,-0.89 2,-2L3,20L3,9zM18,5L18,3c0,-1.11 -0.89,-2 -2,-2h-4c-1.11,0 -2,0.89 -2,2v2L5,5v11c0,1.11 0.89,2 2,2h14c1.11,0 2,-0.89 2,-2L23,5h-5zM12,3h4v2h-4L12,3zM12,15L12,8l5.5,3 -5.5,4z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/shopping_bag.xml b/qqq/android/mobileapp/src/main/res/drawable/shopping_bag.xml new file mode 100644 index 0000000..3e654a4 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/shopping_bag.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/shopping_bag/materialicons/black/res/drawable/baseline_shopping_bag_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M18,6h-2c0,-2.21 -1.79,-4 -4,-4S8,3.79 8,6H6C4.9,6 4,6.9 4,8v12c0,1.1 0.9,2 2,2h12c1.1,0 2,-0.9 2,-2V8C20,6.9 19.1,6 18,6zM10,10c0,0.55 -0.45,1 -1,1s-1,-0.45 -1,-1V8h2V10zM12,4c1.1,0 2,0.9 2,2h-4C10,4.9 10.9,4 12,4zM16,10c0,0.55 -0.45,1 -1,1s-1,-0.45 -1,-1V8h2V10z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/shopping_basket.xml b/qqq/android/mobileapp/src/main/res/drawable/shopping_basket.xml new file mode 100644 index 0000000..7c10b58 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/shopping_basket.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/shopping_basket/materialicons/black/res/drawable/baseline_shopping_basket_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M17.21,9l-4.38,-6.56c-0.19,-0.28 -0.51,-0.42 -0.83,-0.42 -0.32,0 -0.64,0.14 -0.83,0.43L6.79,9L2,9c-0.55,0 -1,0.45 -1,1 0,0.09 0.01,0.18 0.04,0.27l2.54,9.27c0.23,0.84 1,1.46 1.92,1.46h13c0.92,0 1.69,-0.62 1.93,-1.46l2.54,-9.27L23,10c0,-0.55 -0.45,-1 -1,-1h-4.79zM9,9l3,-4.4L15,9L9,9zM12,17c-1.1,0 -2,-0.9 -2,-2s0.9,-2 2,-2 2,0.9 2,2 -0.9,2 -2,2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/shopping_cart.xml b/qqq/android/mobileapp/src/main/res/drawable/shopping_cart.xml new file mode 100644 index 0000000..d2e733c --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/shopping_cart.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/shopping_cart/materialicons/black/res/drawable/baseline_shopping_cart_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M7,18c-1.1,0 -1.99,0.9 -1.99,2S5.9,22 7,22s2,-0.9 2,-2 -0.9,-2 -2,-2zM1,2v2h2l3.6,7.59 -1.35,2.45c-0.16,0.28 -0.25,0.61 -0.25,0.96 0,1.1 0.9,2 2,2h12v-2L7.42,15c-0.14,0 -0.25,-0.11 -0.25,-0.25l0.03,-0.12 0.9,-1.63h7.45c0.75,0 1.41,-0.41 1.75,-1.03l3.58,-6.49c0.08,-0.14 0.12,-0.31 0.12,-0.48 0,-0.55 -0.45,-1 -1,-1L5.21,4l-0.94,-2L1,2zM17,18c-1.1,0 -1.99,0.9 -1.99,2s0.89,2 1.99,2 2,-0.9 2,-2 -0.9,-2 -2,-2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/shopping_cart_checkout.xml b/qqq/android/mobileapp/src/main/res/drawable/shopping_cart_checkout.xml new file mode 100644 index 0000000..40682fa --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/shopping_cart_checkout.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/shopping_cart_checkout/materialicons/black/res/drawable/baseline_shopping_cart_checkout_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M7,18c-1.1,0 -1.99,0.9 -1.99,2S5.9,22 7,22s2,-0.9 2,-2S8.1,18 7,18zM17,18c-1.1,0 -1.99,0.9 -1.99,2s0.89,2 1.99,2s2,-0.9 2,-2S18.1,18 17,18zM8.1,13h7.45c0.75,0 1.41,-0.41 1.75,-1.03L21,4.96L19.25,4l-3.7,7H8.53L4.27,2H1v2h2l3.6,7.59l-1.35,2.44C4.52,15.37 5.48,17 7,17h12v-2H7L8.1,13zM12,2l4,4l-4,4l-1.41,-1.41L12.17,7L8,7l0,-2l4.17,0l-1.59,-1.59L12,2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/short_text.xml b/qqq/android/mobileapp/src/main/res/drawable/short_text.xml new file mode 100644 index 0000000..d305ef3 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/short_text.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/editor/short_text/materialicons/black/res/drawable/baseline_short_text_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M4,9h16v2H4V9zM4,13h10v2H4V13z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/shortcut.xml b/qqq/android/mobileapp/src/main/res/drawable/shortcut.xml new file mode 100644 index 0000000..3c00d92 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/shortcut.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/shortcut/materialicons/black/res/drawable/baseline_shortcut_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M21,11l-6,-6v5H8c-2.76,0 -5,2.24 -5,5v4h2v-4c0,-1.65 1.35,-3 3,-3h7v5L21,11z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/show_chart.xml b/qqq/android/mobileapp/src/main/res/drawable/show_chart.xml new file mode 100644 index 0000000..b263232 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/show_chart.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/editor/show_chart/materialicons/black/res/drawable/baseline_show_chart_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M3.5,18.49l6,-6.01 4,4L22,6.92l-1.41,-1.41 -7.09,7.97 -4,-4L2,16.99z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/shower.xml b/qqq/android/mobileapp/src/main/res/drawable/shower.xml new file mode 100644 index 0000000..9085582 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/shower.xml @@ -0,0 +1,37 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/search/shower/materialicons/black/res/drawable/baseline_shower_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M8,17m-1,0a1,1 0,1 1,2 0a1,1 0,1 1,-2 0" /> + <path + android:fillColor="#FF000000" + android:pathData="M12,17m-1,0a1,1 0,1 1,2 0a1,1 0,1 1,-2 0" /> + <path + android:fillColor="#FF000000" + android:pathData="M16,17m-1,0a1,1 0,1 1,2 0a1,1 0,1 1,-2 0" /> + <path + android:fillColor="#FF000000" + android:pathData="M13,5.08V3h-2v2.08C7.61,5.57 5,8.47 5,12v2h14v-2C19,8.47 16.39,5.57 13,5.08z" /> + <path + android:fillColor="#FF000000" + android:pathData="M8,20m-1,0a1,1 0,1 1,2 0a1,1 0,1 1,-2 0" /> + <path + android:fillColor="#FF000000" + android:pathData="M12,20m-1,0a1,1 0,1 1,2 0a1,1 0,1 1,-2 0" /> + <path + android:fillColor="#FF000000" + android:pathData="M16,20m-1,0a1,1 0,1 1,2 0a1,1 0,1 1,-2 0" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/shuffle.xml b/qqq/android/mobileapp/src/main/res/drawable/shuffle.xml new file mode 100644 index 0000000..ba761d9 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/shuffle.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/av/shuffle/materialicons/black/res/drawable/baseline_shuffle_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M10.59,9.17L5.41,4 4,5.41l5.17,5.17 1.42,-1.41zM14.5,4l2.04,2.04L4,18.59 5.41,20 17.96,7.46 20,9.5L20,4h-5.5zM14.83,13.41l-1.41,1.41 3.13,3.13L14.5,20L20,20v-5.5l-2.04,2.04 -3.13,-3.13z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/shuffle_on.xml b/qqq/android/mobileapp/src/main/res/drawable/shuffle_on.xml new file mode 100644 index 0000000..6266ce8 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/shuffle_on.xml @@ -0,0 +1,20 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/av/shuffle_on/materialicons/black/res/drawable/baseline_shuffle_on_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M21,1L3,1c-1.1,0 -2,0.9 -2,2v18c0,1.1 0.9,2 2,2h18c1.1,0 2,-0.9 2,-2L23,3c0,-1.1 -0.9,-2 -2,-2zM10.59,9.17L5.41,4 4,5.41l5.17,5.17 1.42,-1.41zM14.5,4l2.04,2.04L4,18.59 5.41,20 17.96,7.46 20,9.5L20,4h-5.5zM14.83,13.41l-1.41,1.41 3.13,3.13L14.5,20L20,20v-5.5l-2.04,2.04 -3.13,-3.13z" + android:fillType="evenOdd" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/shutter_speed.xml b/qqq/android/mobileapp/src/main/res/drawable/shutter_speed.xml new file mode 100644 index 0000000..5798747 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/shutter_speed.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/shutter_speed/materialicons/black/res/drawable/baseline_shutter_speed_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M15,1L9,1v2h6L15,1zM19.03,7.39l1.42,-1.42c-0.43,-0.51 -0.9,-0.99 -1.41,-1.41l-1.42,1.42C16.07,4.74 14.12,4 12,4c-4.97,0 -9,4.03 -9,9s4.02,9 9,9 9,-4.03 9,-9c0,-2.12 -0.74,-4.07 -1.97,-5.61zM12,20c-3.87,0 -7,-3.13 -7,-7s3.13,-7 7,-7 7,3.13 7,7 -3.13,7 -7,7zM11.68,15L6.35,15c0.57,1.62 1.82,2.92 3.41,3.56l-0.11,-0.06 2.03,-3.5zM17.65,11c-0.57,-1.6 -1.78,-2.89 -3.34,-3.54L12.26,11h5.39zM10.61,18.83c0.45,0.11 0.91,0.17 1.39,0.17 1.34,0 2.57,-0.45 3.57,-1.19l-2.11,-3.9 -2.85,4.92zM7.55,8.99C6.59,10.05 6,11.46 6,13c0,0.34 0.04,0.67 0.09,1h4.72L7.55,8.99zM16.34,17.13C17.37,16.06 18,14.6 18,13c0,-0.34 -0.04,-0.67 -0.09,-1h-4.34l2.77,5.13zM13.33,7.15C12.9,7.06 12.46,7 12,7c-1.4,0 -2.69,0.49 -3.71,1.29l2.32,3.56 2.72,-4.7z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/sick.xml b/qqq/android/mobileapp/src/main/res/drawable/sick.xml new file mode 100644 index 0000000..c1b0c93 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/sick.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/sick/materialicons/black/res/drawable/baseline_sick_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M21,9c-1.1,0 -2,-0.9 -2,-2c0,-1.1 2,-4 2,-4s2,2.9 2,4C23,8.1 22.1,9 21,9zM17.5,7c0,-0.73 0.41,-1.71 0.92,-2.66C16.68,2.88 14.44,2 11.99,2C6.47,2 2,6.48 2,12c0,5.52 4.47,10 9.99,10C17.52,22 22,17.52 22,12c0,-0.55 -0.06,-1.09 -0.14,-1.62C21.58,10.45 21.3,10.5 21,10.5C19.07,10.5 17.5,8.93 17.5,7zM15.62,7.38l1.06,1.06L15.62,9.5l1.06,1.06l-1.06,1.06L13.5,9.5L15.62,7.38zM7.32,8.44l1.06,-1.06L10.5,9.5l-2.12,2.12l-1.06,-1.06L8.38,9.5L7.32,8.44zM15.44,17c-0.69,-1.19 -1.97,-2 -3.44,-2s-2.75,0.81 -3.44,2H6.88c0.3,-0.76 0.76,-1.43 1.34,-1.99L5.24,13.3c-0.45,0.26 -1.01,0.28 -1.49,0c-0.72,-0.41 -0.96,-1.33 -0.55,-2.05c0.41,-0.72 1.33,-0.96 2.05,-0.55c0.48,0.28 0.74,0.78 0.74,1.29l3.58,2.07c0.73,-0.36 1.55,-0.56 2.43,-0.56c2.33,0 4.32,1.45 5.12,3.5H15.44z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/sign_language.xml b/qqq/android/mobileapp/src/main/res/drawable/sign_language.xml new file mode 100644 index 0000000..b59418f --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/sign_language.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/sign_language/materialicons/black/res/drawable/baseline_sign_language_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12.49,13l-0.93,-1.86c-0.37,-0.74 -0.07,-1.64 0.67,-2.01L12.49,9l5.73,5.46c0.5,0.47 0.78,1.13 0.78,1.81v5.23c0,1.38 -1.12,2.5 -2.5,2.5h-11c-0.55,0 -1,-0.45 -1,-1c0,-0.55 0.45,-1 1,-1H10v-1H4c-0.55,0 -1,-0.45 -1,-1c0,-0.55 0.45,-1 1,-1h6v-1H3c-0.55,0 -1,-0.45 -1,-1c0,-0.55 0.45,-1 1,-1h7v-1H4.5c-0.55,0 -1,-0.45 -1,-1c0,-0.55 0.45,-1 1,-1H12.49zM11.78,7.12c-0.84,0.4 -1.17,0.62 -1.63,1.19l-2.7,-2.85c-0.38,-0.4 -0.36,-1.03 0.04,-1.41c0.4,-0.38 1.03,-0.36 1.41,0.04L11.78,7.12zM9.64,9.21C9.41,9.76 9.35,10.45 9.44,11H8.58L6.31,8.61C5.93,8.21 5.94,7.58 6.35,7.2c0.4,-0.38 1.03,-0.36 1.41,0.04L9.64,9.21zM20.33,13.91l0.88,-0.83c0.5,-0.47 0.79,-1.13 0.79,-1.82V3.35l-0.27,-0.1c-0.78,-0.28 -1.64,0.12 -1.92,0.9L19.1,6.11l-5.5,-5.8c-0.38,-0.4 -1.01,-0.42 -1.41,-0.04c-0.4,0.38 -0.42,1.01 -0.04,1.41l3.79,3.99l-0.73,0.69l-4.82,-5.08c-0.38,-0.4 -1.01,-0.42 -1.41,-0.04c-0.4,0.38 -0.42,1.01 -0.04,1.41l3.78,3.98L15.38,9l3.61,3.43l0.61,0.58C19.89,13.28 20.13,13.58 20.33,13.91z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/signal_cellular_0_bar.xml b/qqq/android/mobileapp/src/main/res/drawable/signal_cellular_0_bar.xml new file mode 100644 index 0000000..63b7d68 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/signal_cellular_0_bar.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/signal_cellular_0_bar/materialicons/black/res/drawable/baseline_signal_cellular_0_bar_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,6.83V20H6.83L20,6.83M22,2L2,22h20V2L22,2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/signal_cellular_4_bar.xml b/qqq/android/mobileapp/src/main/res/drawable/signal_cellular_4_bar.xml new file mode 100644 index 0000000..670af3e --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/signal_cellular_4_bar.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/signal_cellular_4_bar/materialicons/black/res/drawable/baseline_signal_cellular_4_bar_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M2,22h20V2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/signal_cellular_alt.xml b/qqq/android/mobileapp/src/main/res/drawable/signal_cellular_alt.xml new file mode 100644 index 0000000..8336f68 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/signal_cellular_alt.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/signal_cellular_alt/materialicons/black/res/drawable/baseline_signal_cellular_alt_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M17,4h3v16h-3zM5,14h3v6L5,20zM11,9h3v11h-3z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/signal_cellular_alt_1_bar.xml b/qqq/android/mobileapp/src/main/res/drawable/signal_cellular_alt_1_bar.xml new file mode 100644 index 0000000..5a9dec6 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/signal_cellular_alt_1_bar.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/signal_cellular_alt_1_bar/materialicons/black/res/drawable/baseline_signal_cellular_alt_1_bar_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M5,14h3v6H5V14z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/signal_cellular_alt_2_bar.xml b/qqq/android/mobileapp/src/main/res/drawable/signal_cellular_alt_2_bar.xml new file mode 100644 index 0000000..b8f62a6 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/signal_cellular_alt_2_bar.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/signal_cellular_alt_2_bar/materialicons/black/res/drawable/baseline_signal_cellular_alt_2_bar_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M5,14h3v6H5V14zM11,9h3v11h-3V9z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/signal_cellular_connected_no_internet_0_bar.xml b/qqq/android/mobileapp/src/main/res/drawable/signal_cellular_connected_no_internet_0_bar.xml new file mode 100644 index 0000000..e85d285 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/signal_cellular_connected_no_internet_0_bar.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/signal_cellular_connected_no_internet_0_bar/materialicons/black/res/drawable/baseline_signal_cellular_connected_no_internet_0_bar_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,18h2v-8h-2V18zM20,22h2v-2h-2V22zM18,20v2H2L22,2v6h-2V6.83L6.83,20H18z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/signal_cellular_connected_no_internet_4_bar.xml b/qqq/android/mobileapp/src/main/res/drawable/signal_cellular_connected_no_internet_4_bar.xml new file mode 100644 index 0000000..9f0e2bd --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/signal_cellular_connected_no_internet_4_bar.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/signal_cellular_connected_no_internet_4_bar/materialicons/black/res/drawable/baseline_signal_cellular_connected_no_internet_4_bar_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,18h2v-8h-2V18zM20,22h2v-2h-2V22zM2,22h16V8h4V2L2,22z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/signal_cellular_no_sim.xml b/qqq/android/mobileapp/src/main/res/drawable/signal_cellular_no_sim.xml new file mode 100644 index 0000000..f4df00e --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/signal_cellular_no_sim.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/signal_cellular_no_sim/materialicons/black/res/drawable/baseline_signal_cellular_no_sim_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M18.99,5c0,-1.1 -0.89,-2 -1.99,-2h-7L7.66,5.34 19,16.68 18.99,5zM3.65,3.88L2.38,5.15 5,7.77V19c0,1.1 0.9,2 2,2h10.01c0.35,0 0.67,-0.1 0.96,-0.26l1.88,1.88 1.27,-1.27L3.65,3.88z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/signal_cellular_nodata.xml b/qqq/android/mobileapp/src/main/res/drawable/signal_cellular_nodata.xml new file mode 100644 index 0000000..ea8f56d --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/signal_cellular_nodata.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/signal_cellular_nodata/materialicons/black/res/drawable/baseline_signal_cellular_nodata_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M22,13h-9v9H2L22,2V13zM21,15.41L19.59,14l-2.09,2.09L15.41,14L14,15.41l2.09,2.09L14,19.59L15.41,21l2.09,-2.08L19.59,21L21,19.59l-2.08,-2.09L21,15.41z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/signal_cellular_null.xml b/qqq/android/mobileapp/src/main/res/drawable/signal_cellular_null.xml new file mode 100644 index 0000000..3602ace --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/signal_cellular_null.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/signal_cellular_null/materialicons/black/res/drawable/baseline_signal_cellular_null_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,6.83V20H6.83L20,6.83M22,2L2,22h20V2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/signal_cellular_off.xml b/qqq/android/mobileapp/src/main/res/drawable/signal_cellular_off.xml new file mode 100644 index 0000000..ccfc042 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/signal_cellular_off.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/signal_cellular_off/materialicons/black/res/drawable/baseline_signal_cellular_off_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M21,1l-8.59,8.59L21,18.18V1zM4.77,4.5L3.5,5.77l6.36,6.36L1,21h17.73l2,2L22,21.73 4.77,4.5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/signal_wifi_0_bar.xml b/qqq/android/mobileapp/src/main/res/drawable/signal_wifi_0_bar.xml new file mode 100644 index 0000000..10f8333 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/signal_wifi_0_bar.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/signal_wifi_0_bar/materialicons/black/res/drawable/baseline_signal_wifi_0_bar_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,6L12,6c3.33,0 6.49,1.08 9.08,3.07L12,18.17l-9.08,-9.1C5.51,7.08 8.67,6 12,6M12,4C7.31,4 3.07,5.9 0,8.98L12,21L24,8.98C20.93,5.9 16.69,4 12,4L12,4z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/signal_wifi_4_bar.xml b/qqq/android/mobileapp/src/main/res/drawable/signal_wifi_4_bar.xml new file mode 100644 index 0000000..40baa27 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/signal_wifi_4_bar.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/signal_wifi_4_bar/materialicons/black/res/drawable/baseline_signal_wifi_4_bar_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12.01,21.49L23.64,7c-0.45,-0.34 -4.93,-4 -11.64,-4C5.28,3 0.81,6.66 0.36,7l11.63,14.49 0.01,0.01 0.01,-0.01z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/signal_wifi_4_bar_lock.xml b/qqq/android/mobileapp/src/main/res/drawable/signal_wifi_4_bar_lock.xml new file mode 100644 index 0000000..ac0c2d3 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/signal_wifi_4_bar_lock.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/signal_wifi_4_bar_lock/materialicons/black/res/drawable/baseline_signal_wifi_4_bar_lock_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M21.98,11L24,8.98C20.93,5.9 16.69,4 12,4C7.31,4 3.07,5.9 0,8.98l6.35,6.36L12,21l3.05,-3.05V15c0,-0.45 0.09,-0.88 0.23,-1.29c0.54,-1.57 2.01,-2.71 3.77,-2.71H21.98z" /> + <path + android:fillColor="#FF000000" + android:pathData="M22,16v-1c0,-1.1 -0.9,-2 -2,-2s-2,0.9 -2,2v1c-0.55,0 -1,0.45 -1,1v3c0,0.55 0.45,1 1,1h4c0.55,0 1,-0.45 1,-1v-3C23,16.45 22.55,16 22,16zM21,16h-2v-1c0,-0.55 0.45,-1 1,-1s1,0.45 1,1V16z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/signal_wifi_bad.xml b/qqq/android/mobileapp/src/main/res/drawable/signal_wifi_bad.xml new file mode 100644 index 0000000..08eab5a --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/signal_wifi_bad.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/signal_wifi_bad/materialicons/black/res/drawable/baseline_signal_wifi_bad_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M24,8.98C20.93,5.9 16.69,4 12,4C7.31,4 3.07,5.9 0,8.98L12,21v-9h8.99L24,8.98zM19.59,14l-2.09,2.09L15.41,14L14,15.41l2.09,2.09L14,19.59L15.41,21l2.09,-2.08L19.59,21L21,19.59l-2.08,-2.09L21,15.41L19.59,14z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/signal_wifi_connected_no_internet_4.xml b/qqq/android/mobileapp/src/main/res/drawable/signal_wifi_connected_no_internet_4.xml new file mode 100644 index 0000000..fff4f92 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/signal_wifi_connected_no_internet_4.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/signal_wifi_connected_no_internet_4/materialicons/black/res/drawable/baseline_signal_wifi_connected_no_internet_4_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M24,8.98C20.93,5.9 16.69,4 12,4C7.31,4 3.07,5.9 0,8.98L12,21v-9h8.99L24,8.98zM19.59,14l-2.09,2.09L15.41,14L14,15.41l2.09,2.09L14,19.59L15.41,21l2.09,-2.08L19.59,21L21,19.59l-2.08,-2.09L21,15.41L19.59,14z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/signal_wifi_off.xml b/qqq/android/mobileapp/src/main/res/drawable/signal_wifi_off.xml new file mode 100644 index 0000000..b532faf --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/signal_wifi_off.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/signal_wifi_off/materialicons/black/res/drawable/baseline_signal_wifi_off_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M23.64,7c-0.45,-0.34 -4.93,-4 -11.64,-4 -1.5,0 -2.89,0.19 -4.15,0.48L18.18,13.8 23.64,7zM17.04,15.22L3.27,1.44 2,2.72l2.05,2.06C1.91,5.76 0.59,6.82 0.36,7l11.63,14.49 0.01,0.01 0.01,-0.01 3.9,-4.86 3.32,3.32 1.27,-1.27 -3.46,-3.46z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/signal_wifi_statusbar_4_bar.xml b/qqq/android/mobileapp/src/main/res/drawable/signal_wifi_statusbar_4_bar.xml new file mode 100644 index 0000000..b0503d9 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/signal_wifi_statusbar_4_bar.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/signal_wifi_statusbar_4_bar/materialicons/black/res/drawable/baseline_signal_wifi_statusbar_4_bar_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,4C7.31,4 3.07,5.9 0,8.98L12,21L24,8.98C20.93,5.9 16.69,4 12,4z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/signal_wifi_statusbar_connected_no_internet_4.xml b/qqq/android/mobileapp/src/main/res/drawable/signal_wifi_statusbar_connected_no_internet_4.xml new file mode 100644 index 0000000..0610f8c --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/signal_wifi_statusbar_connected_no_internet_4.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/signal_wifi_statusbar_connected_no_internet_4/materialicons/black/res/drawable/baseline_signal_wifi_statusbar_connected_no_internet_4_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,4C7.31,4 3.07,5.9 0,8.98L12,21l5,-5.01V8h5.92C19.97,5.51 16.16,4 12,4z" /> + <path + android:fillColor="#FF000000" + android:pathData="M19,18h2v2h-2z" /> + <path + android:fillColor="#FF000000" + android:pathData="M19,10h2v6h-2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/signal_wifi_statusbar_null.xml b/qqq/android/mobileapp/src/main/res/drawable/signal_wifi_statusbar_null.xml new file mode 100644 index 0000000..9373e35 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/signal_wifi_statusbar_null.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/signal_wifi_statusbar_null/materialicons/black/res/drawable/baseline_signal_wifi_statusbar_null_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,4C7.31,4 3.07,5.9 0,8.98L12,21L24,8.98C20.93,5.9 16.69,4 12,4zM2.92,9.07C5.51,7.08 8.67,6 12,6c3.33,0 6.49,1.08 9.08,3.07L12,18.17L2.92,9.07z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/signpost.xml b/qqq/android/mobileapp/src/main/res/drawable/signpost.xml new file mode 100644 index 0000000..cadac88 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/signpost.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/signpost/materialicons/black/res/drawable/baseline_signpost_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M13,10l5,0l3,-3l-3,-3l-5,0l0,-2l-2,0l0,2l-7,0l0,6l7,0l0,2l-5,0l-3,3l3,3l5,0l0,4l2,0l0,-4l7,0l0,-6l-7,0z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/sim_card.xml b/qqq/android/mobileapp/src/main/res/drawable/sim_card.xml new file mode 100644 index 0000000..4bf1f4d --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/sim_card.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/hardware/sim_card/materialicons/black/res/drawable/baseline_sim_card_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19.99,4c0,-1.1 -0.89,-2 -1.99,-2h-8L4,8v12c0,1.1 0.9,2 2,2h12.01c1.1,0 1.99,-0.9 1.99,-2l-0.01,-16zM9,19L7,19v-2h2v2zM17,19h-2v-2h2v2zM9,15L7,15v-4h2v4zM13,19h-2v-4h2v4zM13,13h-2v-2h2v2zM17,15h-2v-4h2v4z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/sim_card_alert.xml b/qqq/android/mobileapp/src/main/res/drawable/sim_card_alert.xml new file mode 100644 index 0000000..8067c39 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/sim_card_alert.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/notification/sim_card_alert/materialicons/black/res/drawable/baseline_sim_card_alert_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M18,2h-8L4.02,8 4,20c0,1.1 0.9,2 2,2h12c1.1,0 2,-0.9 2,-2L20,4c0,-1.1 -0.9,-2 -2,-2zM13,17h-2v-2h2v2zM13,13h-2L11,8h2v5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/sim_card_download.xml b/qqq/android/mobileapp/src/main/res/drawable/sim_card_download.xml new file mode 100644 index 0000000..0107963 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/sim_card_download.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/sim_card_download/materialicons/black/res/drawable/baseline_sim_card_download_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M18,2h-8L4,8v12c0,1.1 0.9,2 2,2h12c1.1,0 2,-0.9 2,-2V4C20,2.9 19.1,2 18,2zM12,17l-4,-4h3V9.02L13,9v4h3L12,17z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/single_bed.xml b/qqq/android/mobileapp/src/main/res/drawable/single_bed.xml new file mode 100644 index 0000000..1ef1ce5 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/single_bed.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/single_bed/materialicons/black/res/drawable/baseline_single_bed_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,12c0,-1.1 -0.9,-2 -2,-2V7c0,-1.1 -0.9,-2 -2,-2H8C6.9,5 6,5.9 6,7v3c-1.1,0 -2,0.9 -2,2v5h1.33L6,19h1l0.67,-2h8.67L17,19h1l0.67,-2H20V12zM16,10h-3V7h3V10zM8,7h3v3H8V7zM6,12h12v3H6V12z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/sip.xml b/qqq/android/mobileapp/src/main/res/drawable/sip.xml new file mode 100644 index 0000000..083a71c --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/sip.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/communication/sip/materialicons/black/res/drawable/baseline_sip_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M15.5,10.5h2v1h-2z" /> + <path + android:fillColor="#FF000000" + android:pathData="M20,4H4C2.9,4 2,4.9 2,6v12c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2V6C22,4.9 21.1,4 20,4zM10,10.5H6.5v0.75H9c0.55,0 1,0.45 1,1V14c0,0.55 -0.45,1 -1,1H5v-1.5h3.5v-0.75H6c-0.55,0 -1,-0.45 -1,-1V10c0,-0.55 0.45,-1 1,-1h4V10.5zM13,15h-2V9h2V15zM19,12c0,0.55 -0.45,1 -1,1h-2.5v2H14V9h4c0.55,0 1,0.45 1,1V12z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/skateboarding.xml b/qqq/android/mobileapp/src/main/res/drawable/skateboarding.xml new file mode 100644 index 0000000..3e58732 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/skateboarding.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/skateboarding/materialicons/black/res/drawable/baseline_skateboarding_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M13,3c0,-1.1 0.9,-2 2,-2s2,0.9 2,2c0,1.1 -0.9,2 -2,2S13,4.1 13,3zM7.25,22.5c-0.41,0 -0.75,0.34 -0.75,0.75S6.84,24 7.25,24S8,23.66 8,23.25S7.66,22.5 7.25,22.5zM15.75,22.5c-0.41,0 -0.75,0.34 -0.75,0.75S15.34,24 15.75,24s0.75,-0.34 0.75,-0.75S16.16,22.5 15.75,22.5zM19.24,19c-0.24,0 -0.45,0.11 -0.59,0.3c-0.55,0.73 -1.42,1.2 -2.4,1.2H16v-6l-4.32,-2.67l1.8,-2.89C14.63,10.78 16.68,12 19,12v-2c-1.85,0 -3.44,-1.12 -4.13,-2.72l-0.52,-1.21C14.16,5.64 13.61,5 12.7,5H7L4.5,9l1.7,1.06L8.1,7h2.35l-2.4,3.84c-0.31,0.5 -0.39,1.11 -0.21,1.67l1.34,4.15l-3.12,3.76c-0.7,-0.16 -1.3,-0.57 -1.71,-1.12C4.21,19.11 3.99,19 3.75,19C3.31,19 3,19.36 3,19.75c0,0.15 0.05,0.31 0.15,0.45c0.82,1.1 2.13,1.8 3.6,1.8h9.5c1.47,0 2.78,-0.7 3.6,-1.8c0.1,-0.14 0.15,-0.3 0.15,-0.45C20,19.36 19.68,19 19.24,19zM14,20.5H8.6l2.9,-3.5l-1,-3.3l3.5,2.2V20.5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/skip_next.xml b/qqq/android/mobileapp/src/main/res/drawable/skip_next.xml new file mode 100644 index 0000000..65f23a9 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/skip_next.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/av/skip_next/materialicons/black/res/drawable/baseline_skip_next_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M6,18l8.5,-6L6,6v12zM16,6v12h2V6h-2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/skip_previous.xml b/qqq/android/mobileapp/src/main/res/drawable/skip_previous.xml new file mode 100644 index 0000000..db55626 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/skip_previous.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/av/skip_previous/materialicons/black/res/drawable/baseline_skip_previous_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M6,6h2v12L6,18zM9.5,12l8.5,6L18,6z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/sledding.xml b/qqq/android/mobileapp/src/main/res/drawable/sledding.xml new file mode 100644 index 0000000..f57f285 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/sledding.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/sledding/materialicons/black/res/drawable/baseline_sledding_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M14,4.5c0,1.1 -0.9,2 -2,2s-2,-0.9 -2,-2s0.9,-2 2,-2S14,3.4 14,4.5zM22.8,20.24c-0.68,2.1 -2.94,3.25 -5.04,2.57h0L1,17.36l0.46,-1.43l3.93,1.28l0.46,-1.43L1.93,14.5l0.46,-1.43L4,13.6V9.5l5.47,-2.35c0.39,-0.17 0.84,-0.21 1.28,-0.07c0.95,0.31 1.46,1.32 1.16,2.27l-1.05,3.24L13,12.25c0.89,-0.15 1.76,0.32 2.14,1.14l2.08,4.51l1.93,0.63l-0.46,1.43l-3.32,-1.08L14.9,20.3l3.32,1.08l0,0c1.31,0.43 2.72,-0.29 3.15,-1.61c0.43,-1.31 -0.29,-2.72 -1.61,-3.15l0.46,-1.43C22.33,15.88 23.49,18.14 22.8,20.24zM6,14.25l1.01,0.33c-0.22,-0.42 -0.28,-0.92 -0.12,-1.4L7.92,10L6,10.82V14.25zM13.94,18.41l-6.66,-2.16l-0.46,1.43l6.66,2.16L13.94,18.41zM14.63,17.05l-1.18,-2.56l-3.97,0.89L14.63,17.05z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/slideshow.xml b/qqq/android/mobileapp/src/main/res/drawable/slideshow.xml new file mode 100644 index 0000000..083288d --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/slideshow.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/slideshow/materialicons/black/res/drawable/baseline_slideshow_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M10,8v8l5,-4 -5,-4zM19,3L5,3c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2L21,5c0,-1.1 -0.9,-2 -2,-2zM19,19L5,19L5,5h14v14z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/slow_motion_video.xml b/qqq/android/mobileapp/src/main/res/drawable/slow_motion_video.xml new file mode 100644 index 0000000..bb71c4e --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/slow_motion_video.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/av/slow_motion_video/materialicons/black/res/drawable/baseline_slow_motion_video_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M13.05,9.79L10,7.5v9l3.05,-2.29L16,12zM13.05,9.79L10,7.5v9l3.05,-2.29L16,12zM13.05,9.79L10,7.5v9l3.05,-2.29L16,12zM11,4.07L11,2.05c-2.01,0.2 -3.84,1 -5.32,2.21L7.1,5.69c1.11,-0.86 2.44,-1.44 3.9,-1.62zM5.69,7.1L4.26,5.68C3.05,7.16 2.25,8.99 2.05,11h2.02c0.18,-1.46 0.76,-2.79 1.62,-3.9zM4.07,13L2.05,13c0.2,2.01 1,3.84 2.21,5.32l1.43,-1.43c-0.86,-1.1 -1.44,-2.43 -1.62,-3.89zM5.68,19.74C7.16,20.95 9,21.75 11,21.95v-2.02c-1.46,-0.18 -2.79,-0.76 -3.9,-1.62l-1.42,1.43zM22,12c0,5.16 -3.92,9.42 -8.95,9.95v-2.02C16.97,19.41 20,16.05 20,12s-3.03,-7.41 -6.95,-7.93L13.05,2.05C18.08,2.58 22,6.84 22,12z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/smart_button.xml b/qqq/android/mobileapp/src/main/res/drawable/smart_button.xml new file mode 100644 index 0000000..2822bce --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/smart_button.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/smart_button/materialicons/black/res/drawable/baseline_smart_button_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M22,9v6c0,1.1 -0.9,2 -2,2h-1l0,-2h1V9H4v6h6v2H4c-1.1,0 -2,-0.9 -2,-2V9c0,-1.1 0.9,-2 2,-2h16C21.1,7 22,7.9 22,9zM14.5,19l1.09,-2.41L18,15.5l-2.41,-1.09L14.5,12l-1.09,2.41L11,15.5l2.41,1.09L14.5,19zM17,14l0.62,-1.38L19,12l-1.38,-0.62L17,10l-0.62,1.38L15,12l1.38,0.62L17,14zM14.5,19l1.09,-2.41L18,15.5l-2.41,-1.09L14.5,12l-1.09,2.41L11,15.5l2.41,1.09L14.5,19zM17,14l0.62,-1.38L19,12l-1.38,-0.62L17,10l-0.62,1.38L15,12l1.38,0.62L17,14z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/smart_display.xml b/qqq/android/mobileapp/src/main/res/drawable/smart_display.xml new file mode 100644 index 0000000..3634202 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/smart_display.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/hardware/smart_display/materialicons/black/res/drawable/baseline_smart_display_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,4H4C2.9,4 2,4.9 2,6v12c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2V6C22,4.9 21.1,4 20,4zM9.5,16.5v-9l7,4.5L9.5,16.5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/smart_screen.xml b/qqq/android/mobileapp/src/main/res/drawable/smart_screen.xml new file mode 100644 index 0000000..46b2ac5 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/smart_screen.xml @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/hardware/smart_screen/materialicons/black/res/drawable/baseline_smart_screen_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M21,5H3C1.9,5 1,5.9 1,7v10c0,1.1 0.9,2 2,2h18c1.1,0 2,-0.9 2,-2V7C23,5.9 22.1,5 21,5zM18,17H6V7h12V17z" /> + <path + android:fillColor="#FF000000" + android:pathData="M15,11.25h1.5v1.5h-1.5z" /> + <path + android:fillColor="#FF000000" + android:pathData="M12.5,11.25h1.5v1.5h-1.5z" /> + <path + android:fillColor="#FF000000" + android:pathData="M10,11.25h1.5v1.5h-1.5z" /> + <path + android:fillColor="#FF000000" + android:pathData="M7.5,11.25h1.5v1.5h-1.5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/smart_toy.xml b/qqq/android/mobileapp/src/main/res/drawable/smart_toy.xml new file mode 100644 index 0000000..b19b133 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/smart_toy.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/hardware/smart_toy/materialicons/black/res/drawable/baseline_smart_toy_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,9V7c0,-1.1 -0.9,-2 -2,-2h-3c0,-1.66 -1.34,-3 -3,-3S9,3.34 9,5H6C4.9,5 4,5.9 4,7v2c-1.66,0 -3,1.34 -3,3c0,1.66 1.34,3 3,3v4c0,1.1 0.9,2 2,2h12c1.1,0 2,-0.9 2,-2v-4c1.66,0 3,-1.34 3,-3C23,10.34 21.66,9 20,9zM7.5,11.5C7.5,10.67 8.17,10 9,10s1.5,0.67 1.5,1.5S9.83,13 9,13S7.5,12.33 7.5,11.5zM16,17H8v-2h8V17zM15,13c-0.83,0 -1.5,-0.67 -1.5,-1.5S14.17,10 15,10s1.5,0.67 1.5,1.5S15.83,13 15,13z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/smartphone.xml b/qqq/android/mobileapp/src/main/res/drawable/smartphone.xml new file mode 100644 index 0000000..a4d24de --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/smartphone.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/hardware/smartphone/materialicons/black/res/drawable/baseline_smartphone_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M17,1.01L7,1c-1.1,0 -2,0.9 -2,2v18c0,1.1 0.9,2 2,2h10c1.1,0 2,-0.9 2,-2V3c0,-1.1 -0.9,-1.99 -2,-1.99zM17,19H7V5h10v14z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/smoke_free.xml b/qqq/android/mobileapp/src/main/res/drawable/smoke_free.xml new file mode 100644 index 0000000..63cdbf4 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/smoke_free.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/places/smoke_free/materialicons/black/res/drawable/baseline_smoke_free_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M2,6l6.99,7L2,13v3h9.99l7,7 1.26,-1.25 -17,-17zM20.5,13L22,13v3h-1.5zM18,13h1.5v3L18,16zM18.85,4.88c0.62,-0.61 1,-1.45 1,-2.38h-1.5c0,1.02 -0.83,1.85 -1.85,1.85v1.5c2.24,0 4,1.83 4,4.07L20.5,12L22,12L22,9.92c0,-2.23 -1.28,-4.15 -3.15,-5.04zM14.5,8.7h1.53c1.05,0 1.97,0.74 1.97,2.05L18,12h1.5v-1.59c0,-1.8 -1.6,-3.16 -3.47,-3.16L14.5,7.25c-1.02,0 -1.85,-0.98 -1.85,-2s0.83,-1.75 1.85,-1.75L14.5,2c-1.85,0 -3.35,1.5 -3.35,3.35s1.5,3.35 3.35,3.35zM17,15.93L17,13h-2.93z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/smoking_rooms.xml b/qqq/android/mobileapp/src/main/res/drawable/smoking_rooms.xml new file mode 100644 index 0000000..9186556 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/smoking_rooms.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/places/smoking_rooms/materialicons/black/res/drawable/baseline_smoking_rooms_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M2,16h15v3L2,19zM20.5,16L22,16v3h-1.5zM18,16h1.5v3L18,19zM18.85,7.73c0.62,-0.61 1,-1.45 1,-2.38C19.85,3.5 18.35,2 16.5,2v1.5c1.02,0 1.85,0.83 1.85,1.85S17.52,7.2 16.5,7.2v1.5c2.24,0 4,1.83 4,4.07L20.5,15L22,15v-2.24c0,-2.22 -1.28,-4.14 -3.15,-5.03zM16.03,10.2L14.5,10.2c-1.02,0 -1.85,-0.98 -1.85,-2s0.83,-1.75 1.85,-1.75v-1.5c-1.85,0 -3.35,1.5 -3.35,3.35s1.5,3.35 3.35,3.35h1.53c1.05,0 1.97,0.74 1.97,2.05L18,15h1.5v-1.64c0,-1.81 -1.6,-3.16 -3.47,-3.16z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/sms.xml b/qqq/android/mobileapp/src/main/res/drawable/sms.xml new file mode 100644 index 0000000..4e1d63e --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/sms.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/notification/sms/materialicons/black/res/drawable/baseline_sms_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,2L4,2c-1.1,0 -1.99,0.9 -1.99,2L2,22l4,-4h14c1.1,0 2,-0.9 2,-2L22,4c0,-1.1 -0.9,-2 -2,-2zM9,11L7,11L7,9h2v2zM13,11h-2L11,9h2v2zM17,11h-2L15,9h2v2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/sms_failed.xml b/qqq/android/mobileapp/src/main/res/drawable/sms_failed.xml new file mode 100644 index 0000000..0e486cc --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/sms_failed.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/notification/sms_failed/materialicons/black/res/drawable/baseline_sms_failed_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,2L4,2c-1.1,0 -1.99,0.9 -1.99,2L2,22l4,-4h14c1.1,0 2,-0.9 2,-2L22,4c0,-1.1 -0.9,-2 -2,-2zM13,14h-2v-2h2v2zM13,10h-2L11,6h2v4z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/snippet_folder.xml b/qqq/android/mobileapp/src/main/res/drawable/snippet_folder.xml new file mode 100644 index 0000000..360c63d --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/snippet_folder.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/file/snippet_folder/materialicons/black/res/drawable/baseline_snippet_folder_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M15.88,10.5l1.62,1.62v3.38l-3,0v-5H15.88zM22,8v10c0,1.1 -0.9,2 -2,2H4c-1.1,0 -2,-0.9 -2,-2L2.01,6C2.01,4.9 2.9,4 4,4h6l2,2h8C21.1,6 22,6.9 22,8zM19,11.5L16.5,9H13v8l6,0V11.5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/snooze.xml b/qqq/android/mobileapp/src/main/res/drawable/snooze.xml new file mode 100644 index 0000000..a0f1876 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/snooze.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/av/snooze/materialicons/black/res/drawable/baseline_snooze_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M7.88,3.39L6.6,1.86 2,5.71l1.29,1.53 4.59,-3.85zM22,5.72l-4.6,-3.86 -1.29,1.53 4.6,3.86L22,5.72zM12,4c-4.97,0 -9,4.03 -9,9s4.02,9 9,9c4.97,0 9,-4.03 9,-9s-4.03,-9 -9,-9zM12,20c-3.87,0 -7,-3.13 -7,-7s3.13,-7 7,-7 7,3.13 7,7 -3.13,7 -7,7zM9,11h3.63L9,15.2L9,17h6v-2h-3.63L15,10.8L15,9L9,9v2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/snowboarding.xml b/qqq/android/mobileapp/src/main/res/drawable/snowboarding.xml new file mode 100644 index 0000000..28cb9f6 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/snowboarding.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/snowboarding/materialicons/black/res/drawable/baseline_snowboarding_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M14,3c0,-1.1 0.9,-2 2,-2s2,0.9 2,2c0,1.1 -0.9,2 -2,2S14,4.1 14,3zM21.4,20.09c-0.23,-0.05 -0.46,0.02 -0.64,0.17c-0.69,0.6 -1.64,0.88 -2.6,0.67L17,20.69l-1,-6.19l-3.32,-2.67l1.8,-2.89C15.63,10.78 17.68,12 20,12v-2c-1.85,0 -3.44,-1.12 -4.13,-2.72l-0.52,-1.21C15.16,5.64 14.61,5 13.7,5H8L5.5,9l1.7,1.06L9.1,7h2.35l-2.51,3.99c-0.28,0.45 -0.37,1 -0.25,1.52L9.5,16L6,18.35l-0.47,-0.1c-0.96,-0.2 -1.71,-0.85 -2.1,-1.67c-0.1,-0.21 -0.28,-0.37 -0.51,-0.42c-0.43,-0.09 -0.82,0.2 -0.9,0.58C1.98,16.88 2,17.05 2.07,17.2c0.58,1.24 1.71,2.2 3.15,2.51l12.63,2.69c1.44,0.31 2.86,-0.11 3.9,-1.01c0.13,-0.11 0.21,-0.26 0.24,-0.41C22.06,20.6 21.83,20.18 21.4,20.09zM8.73,18.93l3.02,-2.03l-0.44,-3.32l2.84,2.02l0.75,4.64L8.73,18.93z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/snowing.xml b/qqq/android/mobileapp/src/main/res/drawable/snowing.xml new file mode 100644 index 0000000..478fd93 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/snowing.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/home/snowing/materialicons/black/res/drawable/baseline_snowing_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M6,12.75c0.69,0 1.25,0.56 1.25,1.25S6.69,15.25 6,15.25S4.75,14.69 4.75,14S5.31,12.75 6,12.75zM4.75,6c0,0.69 0.56,1.25 1.25,1.25S7.25,6.69 7.25,6S6.69,4.75 6,4.75S4.75,5.31 4.75,6zM16.75,14c0,0.69 0.56,1.25 1.25,1.25s1.25,-0.56 1.25,-1.25s-0.56,-1.25 -1.25,-1.25S16.75,13.31 16.75,14zM16.75,6c0,0.69 0.56,1.25 1.25,1.25S19.25,6.69 19.25,6S18.69,4.75 18,4.75S16.75,5.31 16.75,6zM7.75,18c0,0.69 0.56,1.25 1.25,1.25s1.25,-0.56 1.25,-1.25S9.69,16.75 9,16.75S7.75,17.31 7.75,18zM7.75,10c0,0.69 0.56,1.25 1.25,1.25s1.25,-0.56 1.25,-1.25S9.69,8.75 9,8.75S7.75,9.31 7.75,10zM10.75,14c0,0.69 0.56,1.25 1.25,1.25s1.25,-0.56 1.25,-1.25s-0.56,-1.25 -1.25,-1.25S10.75,13.31 10.75,14zM10.75,6c0,0.69 0.56,1.25 1.25,1.25S13.25,6.69 13.25,6S12.69,4.75 12,4.75S10.75,5.31 10.75,6zM13.75,18c0,0.69 0.56,1.25 1.25,1.25s1.25,-0.56 1.25,-1.25s-0.56,-1.25 -1.25,-1.25S13.75,17.31 13.75,18zM13.75,10c0,0.69 0.56,1.25 1.25,1.25s1.25,-0.56 1.25,-1.25S15.69,8.75 15,8.75S13.75,9.31 13.75,10z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/snowmobile.xml b/qqq/android/mobileapp/src/main/res/drawable/snowmobile.xml new file mode 100644 index 0000000..dccc756 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/snowmobile.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/snowmobile/materialicons/black/res/drawable/baseline_snowmobile_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M22,17c0,0.55 -0.45,1 -1,1h-0.17l-2.2,-2.2C20.58,15.37 22,14.4 22,13c0,-1 -8,-8 -8,-8h-3v2h2.25l1.45,1.3L11,11l-9.5,-1L0,13l4.54,1.36l-3.49,1.88C-0.77,17.22 -0.07,20 2,20h6c2.21,0 4,-1.79 4,-4h4l2,2h-3v2h6c1.66,0 3,-1.34 3,-3H22zM8,18H2l5.25,-2.83L10,16C10,17.1 9.11,18 8,18z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/snowshoeing.xml b/qqq/android/mobileapp/src/main/res/drawable/snowshoeing.xml new file mode 100644 index 0000000..c1efd0d --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/snowshoeing.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/snowshoeing/materialicons/black/res/drawable/baseline_snowshoeing_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12.5,3.5c0,-1.1 0.9,-2 2,-2s2,0.9 2,2c0,1.1 -0.9,2 -2,2S12.5,4.6 12.5,3.5zM6.32,19.03l-1.14,-1.47L4,18.5l2.38,3.04c0.51,0.65 1.16,1.15 1.88,1.41c0.28,0.1 0.53,0.04 0.72,-0.11c0.3,-0.23 0.42,-0.7 0.12,-1.07c-0.08,-0.1 -0.2,-0.17 -0.31,-0.22c-0.43,-0.18 -0.82,-0.45 -1.14,-0.83l-0.08,-0.1L11,18.2l0.89,-3.22l2.11,2v4.52h-2V23h3.87c0.82,0 1.61,-0.21 2.26,-0.61c0.26,-0.16 0.37,-0.39 0.37,-0.64c0,-0.38 -0.3,-0.75 -0.77,-0.75c-0.13,0 -0.26,0.04 -0.37,0.1c-0.4,0.23 -0.87,0.37 -1.36,0.4l0,-6.02l-2.11,-2l0.6,-3C15.79,11.98 17.8,13 20,13v-2c-1.9,0 -3.51,-1.02 -4.31,-2.42l-1,-1.58c-0.4,-0.6 -1,-1 -1.7,-1C12.24,6 11.58,6.34 7,8.28V13h2V9.58l1.79,-0.7L9.2,17L6.32,19.03z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/soap.xml b/qqq/android/mobileapp/src/main/res/drawable/soap.xml new file mode 100644 index 0000000..adc2873 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/soap.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/places/soap/materialicons/black/res/drawable/baseline_soap_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M9.12,5l-7.18,6.79C1.34,12.35 1,13.14 1,13.97V20c0,1.66 1.34,3 3,3h6.25H12h5.75c0.69,0 1.25,-0.56 1.25,-1.25s-0.56,-1.25 -1.25,-1.25H12v-1h7.75c0.69,0 1.25,-0.56 1.25,-1.25S20.44,17 19.75,17H12v-1h8.75c0.69,0 1.25,-0.56 1.25,-1.25s-0.56,-1.25 -1.25,-1.25H12v-1h6.75c0.69,0 1.25,-0.56 1.25,-1.25S19.44,10 18.75,10H8.86c0.64,-1.11 1.48,-2.58 1.49,-2.61c0.09,-0.16 0.14,-0.33 0.14,-0.53c0,-0.26 -0.09,-0.5 -0.26,-0.7C10.22,6.12 9.12,5 9.12,5L9.12,5zM14,6.25c0.41,0 0.75,0.34 0.75,0.75S14.41,7.75 14,7.75S13.25,7.41 13.25,7S13.59,6.25 14,6.25M14,4.75c-1.24,0 -2.25,1.01 -2.25,2.25S12.76,9.25 14,9.25S16.25,8.24 16.25,7S15.24,4.75 14,4.75L14,4.75zM19.75,5.5c0.28,0 0.5,0.22 0.5,0.5s-0.22,0.5 -0.5,0.5s-0.5,-0.22 -0.5,-0.5S19.47,5.5 19.75,5.5M19.75,4c-1.1,0 -2,0.9 -2,2s0.9,2 2,2s2,-0.9 2,-2S20.85,4 19.75,4L19.75,4zM16.5,1C15.67,1 15,1.67 15,2.5S15.67,4 16.5,4C17.33,4 18,3.33 18,2.5S17.33,1 16.5,1z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/social_distance.xml b/qqq/android/mobileapp/src/main/res/drawable/social_distance.xml new file mode 100644 index 0000000..858a649 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/social_distance.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/social_distance/materialicons/black/res/drawable/baseline_social_distance_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M4,5c0,-1.1 0.9,-2 2,-2s2,0.9 2,2c0,1.1 -0.9,2 -2,2S4,6.1 4,5zM8.78,8.58C7.93,8.21 6.99,8 6,8S4.07,8.21 3.22,8.58C2.48,8.9 2,9.62 2,10.43L2,11h8l0,-0.57C10,9.62 9.52,8.9 8.78,8.58zM18,7c1.1,0 2,-0.9 2,-2c0,-1.1 -0.9,-2 -2,-2s-2,0.9 -2,2C16,6.1 16.9,7 18,7zM20.78,8.58C19.93,8.21 18.99,8 18,8c-0.99,0 -1.93,0.21 -2.78,0.58C14.48,8.9 14,9.62 14,10.43L14,11h8l0,-0.57C22,9.62 21.52,8.9 20.78,8.58zM22,17l-4,-4v3H6v-3l-4,4l4,4v-3h12v3L22,17z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/solar_power.xml b/qqq/android/mobileapp/src/main/res/drawable/solar_power.xml new file mode 100644 index 0000000..6a3e7b2 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/solar_power.xml @@ -0,0 +1,46 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/home/solar_power/materialicons/black/res/drawable/baseline_solar_power_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M3.33,16l7.67,0l0,-3l-7,0z" /> + <path + android:fillColor="#FF000000" + android:pathData="M13,16l7.67,0l-0.67,-3l-7,0z" /> + <path + android:fillColor="#FF000000" + android:pathData="M21.11,18l-8.11,0l0,4l9,0z" /> + <path + android:fillColor="#FF000000" + android:pathData="M2,22l9,0l0,-4l-8.11,0z" /> + <path + android:fillColor="#FF000000" + android:pathData="M11,8h2v3h-2z" /> + <path + android:fillColor="#FF000000" + android:pathData="M15.764,7.205l1.414,-1.414l2.121,2.121l-1.414,1.414z" /> + <path + android:fillColor="#FF000000" + android:pathData="M4.705,7.913l2.121,-2.121l1.414,1.414l-2.121,2.121z" /> + <path + android:fillColor="#FF000000" + android:pathData="M3,2h3v2h-3z" /> + <path + android:fillColor="#FF000000" + android:pathData="M18,2h3v2h-3z" /> + <path + android:fillColor="#FF000000" + android:pathData="M12,7c2.76,0 5,-2.24 5,-5H7C7,4.76 9.24,7 12,7z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/sort.xml b/qqq/android/mobileapp/src/main/res/drawable/sort.xml new file mode 100644 index 0000000..b0628ed --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/sort.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/content/sort/materialicons/black/res/drawable/baseline_sort_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M3,18h6v-2L3,16v2zM3,6v2h18L21,6L3,6zM3,13h12v-2L3,11v2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/sort_by_alpha.xml b/qqq/android/mobileapp/src/main/res/drawable/sort_by_alpha.xml new file mode 100644 index 0000000..ce50719 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/sort_by_alpha.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/av/sort_by_alpha/materialicons/black/res/drawable/baseline_sort_by_alpha_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M14.94,4.66h-4.72l2.36,-2.36zM10.25,19.37h4.66l-2.33,2.33zM6.1,6.27L1.6,17.73h1.84l0.92,-2.45h5.11l0.92,2.45h1.84L7.74,6.27L6.1,6.27zM4.97,13.64l1.94,-5.18 1.94,5.18L4.97,13.64zM15.73,16.14h6.12v1.59h-8.53v-1.29l5.92,-8.56h-5.88v-1.6h8.3v1.26l-5.93,8.6z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/sos.xml b/qqq/android/mobileapp/src/main/res/drawable/sos.xml new file mode 100644 index 0000000..f87b31f --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/sos.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/sos/materialicons/black/res/drawable/baseline_sos_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M13.5,7h-3c-1.1,0 -2,0.9 -2,2v6c0,1.1 0.9,2 2,2h3c1.1,0 2,-0.9 2,-2V9C15.5,7.9 14.6,7 13.5,7zM13.5,15h-3V9h3V15zM1,15h4v-2H3c-1.1,0 -2,-0.9 -2,-2V9c0,-1.1 0.9,-2 2,-2h4v2H3v2h2c1.1,0 2,0.9 2,2v2c0,1.1 -0.9,2 -2,2H1V15zM17,15h4v-2h-2c-1.1,0 -2,-0.9 -2,-2V9c0,-1.1 0.9,-2 2,-2h4v2h-4v2h2c1.1,0 2,0.9 2,2v2c0,1.1 -0.9,2 -2,2h-4V15z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/soup_kitchen.xml b/qqq/android/mobileapp/src/main/res/drawable/soup_kitchen.xml new file mode 100644 index 0000000..c37ed14 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/soup_kitchen.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/soup_kitchen/materialicons/black/res/drawable/baseline_soup_kitchen_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M6.4,7C6.06,7.55 6,7.97 6,8.38C6,9.15 7,11 7,12c0,0.95 -0.4,1.5 -0.4,1.5H5.1c0,0 0.4,-0.55 0.4,-1.5c0,-1 -1,-2.85 -1,-3.62C4.5,7.97 4.56,7.55 4.9,7H6.4zM11.4,7C11.06,7.55 11,7.97 11,8.38C11,9.15 12,11 12,12c0,0.95 -0.4,1.5 -0.4,1.5h1.5c0,0 0.4,-0.55 0.4,-1.5c0,-1 -1,-2.85 -1,-3.62c0,-0.41 0.06,-0.83 0.4,-1.38H11.4zM8.15,7c-0.34,0.55 -0.4,0.97 -0.4,1.38c0,0.77 1,2.63 1,3.62c0,0.95 -0.4,1.5 -0.4,1.5h1.5c0,0 0.4,-0.55 0.4,-1.5c0,-1 -1,-2.85 -1,-3.62c0,-0.41 0.06,-0.83 0.4,-1.38H8.15zM21.47,6.5c0,0 0.13,-1.06 0.13,-1.5c0,-1.65 -1.35,-3 -3,-3c-1.54,0 -2.81,1.16 -2.98,2.65L14.53,15H4.01c-0.6,0 -1.09,0.53 -1,1.13C3.53,19.46 6.39,22 9.75,22c3.48,0 6.34,-2.73 6.71,-6.23l1.15,-10.87C17.66,4.39 18.08,4 18.6,4c0.55,0 1,0.45 1,1c0,0.3 -0.1,1.25 -0.1,1.25L21.47,6.5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/source.xml b/qqq/android/mobileapp/src/main/res/drawable/source.xml new file mode 100644 index 0000000..bbeb6d0 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/source.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/source/materialicons/black/res/drawable/baseline_source_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,6h-8l-2,-2H4C2.9,4 2.01,4.9 2.01,6L2,18c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2V8C22,6.9 21.1,6 20,6zM14,16H6v-2h8V16zM18,12H6v-2h12V12z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/south.xml b/qqq/android/mobileapp/src/main/res/drawable/south.xml new file mode 100644 index 0000000..7b7bd0e --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/south.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/navigation/south/materialicons/black/res/drawable/baseline_south_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19,15l-1.41,-1.41L13,18.17V2H11v16.17l-4.59,-4.59L5,15l7,7L19,15z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/south_america.xml b/qqq/android/mobileapp/src/main/res/drawable/south_america.xml new file mode 100644 index 0000000..ad8a91d --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/south_america.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/south_america/materialicons/black/res/drawable/baseline_south_america_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,2C6.48,2 2,6.48 2,12c0,5.52 4.48,10 10,10s10,-4.48 10,-10C22,6.48 17.52,2 12,2zM4,12c0,-1.95 0.7,-3.74 1.87,-5.13L9,10v1c0,1.1 0.9,2 2,2v5.59c0,0.27 0.11,0.52 0.29,0.71L12,20C7.58,20 4,16.42 4,12zM13,19.94V18l3.75,-5.62c0.16,-0.25 0.25,-0.54 0.25,-0.83V10.5c0,-0.55 -0.45,-1 -1,-1h-1.5l-1.4,-1.75C12.72,7.28 12.15,7 11.54,7H8V5.07C9.18,4.39 10.54,4 12,4c4.41,0 8,3.59 8,8C20,16.07 16.94,19.44 13,19.94z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/south_east.xml b/qqq/android/mobileapp/src/main/res/drawable/south_east.xml new file mode 100644 index 0000000..5867404 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/south_east.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/navigation/south_east/materialicons/black/res/drawable/baseline_south_east_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19,9h-2v6.59L5.41,4L4,5.41L15.59,17H9v2h10V9z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/south_west.xml b/qqq/android/mobileapp/src/main/res/drawable/south_west.xml new file mode 100644 index 0000000..20e054f --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/south_west.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/navigation/south_west/materialicons/black/res/drawable/baseline_south_west_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M15,19v-2H8.41L20,5.41L18.59,4L7,15.59V9H5v10H15z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/spa.xml b/qqq/android/mobileapp/src/main/res/drawable/spa.xml new file mode 100644 index 0000000..5bd3f95 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/spa.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/places/spa/materialicons/black/res/drawable/baseline_spa_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M8.55,12c-1.07,-0.71 -2.25,-1.27 -3.53,-1.61 1.28,0.34 2.46,0.9 3.53,1.61zM18.98,10.39c-1.29,0.34 -2.49,0.91 -3.57,1.64 1.08,-0.73 2.28,-1.3 3.57,-1.64z" /> + <path + android:fillColor="#FF000000" + android:pathData="M15.49,9.63c-0.18,-2.79 -1.31,-5.51 -3.43,-7.63 -2.14,2.14 -3.32,4.86 -3.55,7.63 1.28,0.68 2.46,1.56 3.49,2.63 1.03,-1.06 2.21,-1.94 3.49,-2.63zM8.99,12.28c-0.14,-0.1 -0.3,-0.19 -0.45,-0.29 0.15,0.11 0.31,0.19 0.45,0.29zM15.41,12.03c-0.13,0.09 -0.27,0.16 -0.4,0.26 0.13,-0.1 0.27,-0.17 0.4,-0.26zM12,15.45C9.85,12.17 6.18,10 2,10c0,5.32 3.36,9.82 8.03,11.49 0.63,0.23 1.29,0.4 1.97,0.51 0.68,-0.12 1.33,-0.29 1.97,-0.51C18.64,19.82 22,15.32 22,10c-4.18,0 -7.85,2.17 -10,5.45z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/space_bar.xml b/qqq/android/mobileapp/src/main/res/drawable/space_bar.xml new file mode 100644 index 0000000..df64669 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/space_bar.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/editor/space_bar/materialicons/black/res/drawable/baseline_space_bar_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M18,9v4H6V9H4v6h16V9z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/space_dashboard.xml b/qqq/android/mobileapp/src/main/res/drawable/space_dashboard.xml new file mode 100644 index 0000000..87f7671 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/space_dashboard.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/space_dashboard/materialicons/black/res/drawable/baseline_space_dashboard_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M11,21H5c-1.1,0 -2,-0.9 -2,-2V5c0,-1.1 0.9,-2 2,-2h6V21zM13,21h6c1.1,0 2,-0.9 2,-2v-7h-8V21zM21,10V5c0,-1.1 -0.9,-2 -2,-2h-6v7H21z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/spatial_audio.xml b/qqq/android/mobileapp/src/main/res/drawable/spatial_audio.xml new file mode 100644 index 0000000..f4b8e9f --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/spatial_audio.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/spatial_audio/materialicons/black/res/drawable/baseline_spatial_audio_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M10,9m-4,0a4,4 0,1 1,8 0a4,4 0,1 1,-8 0" /> + <path + android:fillColor="#FF000000" + android:pathData="M16.39,15.56C14.71,14.7 12.53,14 10,14c-2.53,0 -4.71,0.7 -6.39,1.56C2.61,16.07 2,17.1 2,18.22V21h16v-2.78C18,17.1 17.39,16.07 16.39,15.56z" /> + <path + android:fillColor="#FF000000" + android:pathData="M16,1h-2c0,4.97 4.03,9 9,9V8C19.14,8 16,4.86 16,1z" /> + <path + android:fillColor="#FF000000" + android:pathData="M20,1h-2c0,2.76 2.24,5 5,5V4C21.35,4 20,2.65 20,1z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/spatial_audio_off.xml b/qqq/android/mobileapp/src/main/res/drawable/spatial_audio_off.xml new file mode 100644 index 0000000..bf0247c --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/spatial_audio_off.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/spatial_audio_off/materialicons/black/res/drawable/baseline_spatial_audio_off_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M10,9m-4,0a4,4 0,1 1,8 0a4,4 0,1 1,-8 0" /> + <path + android:fillColor="#FF000000" + android:pathData="M16.39,15.56C14.71,14.7 12.53,14 10,14c-2.53,0 -4.71,0.7 -6.39,1.56C2.61,16.07 2,17.1 2,18.22V21h16v-2.78C18,17.1 17.39,16.07 16.39,15.56z" /> + <path + android:fillColor="#FF000000" + android:pathData="M20.36,1l-1.41,1.41c2.73,2.73 2.73,7.17 0,9.9l1.41,1.41C23.88,10.21 23.88,4.51 20.36,1z" /> + <path + android:fillColor="#FF000000" + android:pathData="M17.54,10.9c1.95,-1.95 1.95,-5.12 0,-7.07l-1.41,1.41c1.17,1.17 1.17,3.07 0,4.24L17.54,10.9z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/spatial_tracking.xml b/qqq/android/mobileapp/src/main/res/drawable/spatial_tracking.xml new file mode 100644 index 0000000..4965a39 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/spatial_tracking.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/spatial_tracking/materialicons/black/res/drawable/baseline_spatial_tracking_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M10,9m-4,0a4,4 0,1 1,8 0a4,4 0,1 1,-8 0" /> + <path + android:fillColor="#FF000000" + android:pathData="M16.39,15.56C14.71,14.7 12.53,14 10,14c-2.53,0 -4.71,0.7 -6.39,1.56C2.61,16.07 2,17.1 2,18.22V21h16v-2.78C18,17.1 17.39,16.07 16.39,15.56z" /> + <path + android:fillColor="#FF000000" + android:pathData="M20.05,2.41L18.64,1c-3.51,3.51 -3.51,9.21 0,12.73l1.41,-1.41C17.32,9.58 17.32,5.14 20.05,2.41z" /> + <path + android:fillColor="#FF000000" + android:pathData="M22.88,5.24l-1.41,-1.41c-1.95,1.95 -1.95,5.12 0,7.07l1.41,-1.41C21.71,8.32 21.71,6.41 22.88,5.24z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/speaker.xml b/qqq/android/mobileapp/src/main/res/drawable/speaker.xml new file mode 100644 index 0000000..fdcd3b1 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/speaker.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/hardware/speaker/materialicons/black/res/drawable/baseline_speaker_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M17,2L7,2c-1.1,0 -2,0.9 -2,2v16c0,1.1 0.9,1.99 2,1.99L17,22c1.1,0 2,-0.9 2,-2L19,4c0,-1.1 -0.9,-2 -2,-2zM12,4c1.1,0 2,0.9 2,2s-0.9,2 -2,2c-1.11,0 -2,-0.9 -2,-2s0.89,-2 2,-2zM12,20c-2.76,0 -5,-2.24 -5,-5s2.24,-5 5,-5 5,2.24 5,5 -2.24,5 -5,5zM12,12c-1.66,0 -3,1.34 -3,3s1.34,3 3,3 3,-1.34 3,-3 -1.34,-3 -3,-3z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/speaker_group.xml b/qqq/android/mobileapp/src/main/res/drawable/speaker_group.xml new file mode 100644 index 0000000..5bea499 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/speaker_group.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/hardware/speaker_group/materialicons/black/res/drawable/baseline_speaker_group_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M18.2,1L9.8,1C8.81,1 8,1.81 8,2.8v14.4c0,0.99 0.81,1.79 1.8,1.79l8.4,0.01c0.99,0 1.8,-0.81 1.8,-1.8L20,2.8c0,-0.99 -0.81,-1.8 -1.8,-1.8zM14,3c1.1,0 2,0.89 2,2s-0.9,2 -2,2 -2,-0.89 -2,-2 0.9,-2 2,-2zM14,16.5c-2.21,0 -4,-1.79 -4,-4s1.79,-4 4,-4 4,1.79 4,4 -1.79,4 -4,4z" /> + <path + android:fillColor="#FF000000" + android:pathData="M14,12.5m-2.5,0a2.5,2.5 0,1 1,5 0a2.5,2.5 0,1 1,-5 0" /> + <path + android:fillColor="#FF000000" + android:pathData="M6,5H4v16c0,1.1 0.89,2 2,2h10v-2H6V5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/speaker_notes.xml b/qqq/android/mobileapp/src/main/res/drawable/speaker_notes.xml new file mode 100644 index 0000000..b479ebe --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/speaker_notes.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/speaker_notes/materialicons/black/res/drawable/baseline_speaker_notes_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,2L4,2c-1.1,0 -1.99,0.9 -1.99,2L2,22l4,-4h14c1.1,0 2,-0.9 2,-2L22,4c0,-1.1 -0.9,-2 -2,-2zM8,14L6,14v-2h2v2zM8,11L6,11L6,9h2v2zM8,8L6,8L6,6h2v2zM15,14h-5v-2h5v2zM18,11h-8L10,9h8v2zM18,8h-8L10,6h8v2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/speaker_notes_off.xml b/qqq/android/mobileapp/src/main/res/drawable/speaker_notes_off.xml new file mode 100644 index 0000000..d3a278d --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/speaker_notes_off.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/speaker_notes_off/materialicons/black/res/drawable/baseline_speaker_notes_off_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M10.54,11l-0.54,-0.54L7.54,8 6,6.46 2.38,2.84 1.27,1.73 0,3l2.01,2.01L2,22l4,-4h9l5.73,5.73L22,22.46 17.54,18l-7,-7zM8,14L6,14v-2h2v2zM6,11L6,9l2,2L6,11zM20,2L4.08,2L10,7.92L10,6h8v2h-7.92l1,1L18,9v2h-4.92l6.99,6.99C21.14,17.95 22,17.08 22,16L22,4c0,-1.1 -0.9,-2 -2,-2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/speaker_phone.xml b/qqq/android/mobileapp/src/main/res/drawable/speaker_phone.xml new file mode 100644 index 0000000..d669b95 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/speaker_phone.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/communication/speaker_phone/materialicons/black/res/drawable/baseline_speaker_phone_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M7,7.07L8.43,8.5c0.91,-0.91 2.18,-1.48 3.57,-1.48s2.66,0.57 3.57,1.48L17,7.07C15.72,5.79 13.95,5 12,5s-3.72,0.79 -5,2.07zM12,1C8.98,1 6.24,2.23 4.25,4.21l1.41,1.41C7.28,4 9.53,3 12,3s4.72,1 6.34,2.62l1.41,-1.41C17.76,2.23 15.02,1 12,1zM14.86,10.01L9.14,10C8.51,10 8,10.51 8,11.14v9.71c0,0.63 0.51,1.14 1.14,1.14h5.71c0.63,0 1.14,-0.51 1.14,-1.14v-9.71c0.01,-0.63 -0.5,-1.13 -1.13,-1.13zM15,20L9,20v-8h6v8z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/speed.xml b/qqq/android/mobileapp/src/main/res/drawable/speed.xml new file mode 100644 index 0000000..2fd77e5 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/speed.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/av/speed/materialicons/black/res/drawable/baseline_speed_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20.38,8.57l-1.23,1.85a8,8 0,0 1,-0.22 7.58L5.07,18A8,8 0,0 1,15.58 6.85l1.85,-1.23A10,10 0,0 0,3.35 19a2,2 0,0 0,1.72 1h13.85a2,2 0,0 0,1.74 -1,10 10,0 0,0 -0.27,-10.44zM10.59,15.41a2,2 0,0 0,2.83 0l5.66,-8.49 -8.49,5.66a2,2 0,0 0,0 2.83z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/spellcheck.xml b/qqq/android/mobileapp/src/main/res/drawable/spellcheck.xml new file mode 100644 index 0000000..64db2ad --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/spellcheck.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/spellcheck/materialicons/black/res/drawable/baseline_spellcheck_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12.45,16h2.09L9.43,3L7.57,3L2.46,16h2.09l1.12,-3h5.64l1.14,3zM6.43,11L8.5,5.48 10.57,11L6.43,11zM21.59,11.59l-8.09,8.09L9.83,16l-1.41,1.41 5.09,5.09L23,13l-1.41,-1.41z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/splitscreen.xml b/qqq/android/mobileapp/src/main/res/drawable/splitscreen.xml new file mode 100644 index 0000000..7443ca9 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/splitscreen.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/splitscreen/materialicons/black/res/drawable/baseline_splitscreen_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M18,4v5H6V4H18M18,2H6C4.9,2 4,2.9 4,4v5c0,1.1 0.9,2 2,2h12c1.1,0 2,-0.9 2,-2V4C20,2.9 19.1,2 18,2zM18,15v5H6v-5H18M18,13H6c-1.1,0 -2,0.9 -2,2v5c0,1.1 0.9,2 2,2h12c1.1,0 2,-0.9 2,-2v-5C20,13.9 19.1,13 18,13z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/spoke.xml b/qqq/android/mobileapp/src/main/res/drawable/spoke.xml new file mode 100644 index 0000000..01ccac8 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/spoke.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/communication/spoke/materialicons/black/res/drawable/baseline_spoke_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M16,7c0,2.21 -1.79,4 -4,4S8,9.21 8,7s1.79,-4 4,-4S16,4.79 16,7zM7,13c-2.21,0 -4,1.79 -4,4s1.79,4 4,4s4,-1.79 4,-4S9.21,13 7,13zM17,13c-2.21,0 -4,1.79 -4,4s1.79,4 4,4s4,-1.79 4,-4S19.21,13 17,13z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/sports.xml b/qqq/android/mobileapp/src/main/res/drawable/sports.xml new file mode 100644 index 0000000..11364ff --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/sports.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/sports/materialicons/black/res/drawable/baseline_sports_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M11.23,6C9.57,6 8.01,6.66 6.87,7.73C6.54,6.73 5.61,6 4.5,6C3.12,6 2,7.12 2,8.5C2,9.88 3.12,11 4.5,11c0.21,0 0.41,-0.03 0.61,-0.08c-0.05,0.25 -0.09,0.51 -0.1,0.78c-0.18,3.68 2.95,6.68 6.68,6.27c2.55,-0.28 4.68,-2.26 5.19,-4.77c0.15,-0.71 0.15,-1.4 0.06,-2.06c-0.09,-0.6 0.38,-1.13 0.99,-1.13H22V6H11.23zM4.5,9C4.22,9 4,8.78 4,8.5C4,8.22 4.22,8 4.5,8S5,8.22 5,8.5C5,8.78 4.78,9 4.5,9zM11,15c-1.66,0 -3,-1.34 -3,-3s1.34,-3 3,-3s3,1.34 3,3S12.66,15 11,15z" /> + <path + android:fillColor="#FF000000" + android:pathData="M11,12m-2,0a2,2 0,1 1,4 0a2,2 0,1 1,-4 0" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/sports_bar.xml b/qqq/android/mobileapp/src/main/res/drawable/sports_bar.xml new file mode 100644 index 0000000..f5896af --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/sports_bar.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/places/sports_bar/materialicons/black/res/drawable/baseline_sports_bar_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19,9h-1.56C17.79,8.41 18,7.73 18,7c0,-2.21 -1.79,-4 -4,-4c-0.34,0 -0.66,0.05 -0.98,0.13C12.2,2.45 11.16,2.02 10,2.02c-1.89,0 -3.51,1.11 -4.27,2.71C4.15,5.26 3,6.74 3,8.5c0,1.86 1.28,3.41 3,3.86L6,21h11v-2h2c1.1,0 2,-0.9 2,-2v-6C21,9.9 20.1,9 19,9zM7,10.5c-1.1,0 -2,-0.9 -2,-2c0,-0.85 0.55,-1.6 1.37,-1.88l0.8,-0.27l0.36,-0.76C8,4.62 8.94,4.02 10,4.02c0.79,0 1.39,0.35 1.74,0.65l0.78,0.65c0,0 0.64,-0.32 1.47,-0.32c1.1,0 2,0.9 2,2c0,0 -3,0 -3,0C9.67,7 9.15,10.5 7,10.5zM19,17h-2v-6h2V17z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/sports_baseball.xml b/qqq/android/mobileapp/src/main/res/drawable/sports_baseball.xml new file mode 100644 index 0000000..79b6e2a --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/sports_baseball.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/sports_baseball/materialicons/black/res/drawable/baseline_sports_baseball_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M3.81,6.28C2.67,7.9 2,9.87 2,12s0.67,4.1 1.81,5.72C6.23,16.95 8,14.68 8,12S6.23,7.05 3.81,6.28z" /> + <path + android:fillColor="#FF000000" + android:pathData="M20.19,6.28C17.77,7.05 16,9.32 16,12s1.77,4.95 4.19,5.72C21.33,16.1 22,14.13 22,12S21.33,7.9 20.19,6.28z" /> + <path + android:fillColor="#FF000000" + android:pathData="M14,12c0,-3.28 1.97,-6.09 4.79,-7.33C17.01,3.02 14.63,2 12,2S6.99,3.02 5.21,4.67C8.03,5.91 10,8.72 10,12s-1.97,6.09 -4.79,7.33C6.99,20.98 9.37,22 12,22s5.01,-1.02 6.79,-2.67C15.97,18.09 14,15.28 14,12z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/sports_basketball.xml b/qqq/android/mobileapp/src/main/res/drawable/sports_basketball.xml new file mode 100644 index 0000000..4edeba7 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/sports_basketball.xml @@ -0,0 +1,40 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/sports_basketball/materialicons/black/res/drawable/baseline_sports_basketball_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M17.09,11h4.86c-0.16,-1.61 -0.71,-3.11 -1.54,-4.4C18.68,7.43 17.42,9.05 17.09,11z" /> + <path + android:fillColor="#FF000000" + android:pathData="M6.91,11C6.58,9.05 5.32,7.43 3.59,6.6C2.76,7.89 2.21,9.39 2.05,11H6.91z" /> + <path + android:fillColor="#FF000000" + android:pathData="M15.07,11c0.32,-2.59 1.88,-4.79 4.06,-6c-1.6,-1.63 -3.74,-2.71 -6.13,-2.95V11H15.07z" /> + <path + android:fillColor="#FF000000" + android:pathData="M8.93,11H11V2.05C8.61,2.29 6.46,3.37 4.87,5C7.05,6.21 8.61,8.41 8.93,11z" /> + <path + android:fillColor="#FF000000" + android:pathData="M15.07,13H13v8.95c2.39,-0.24 4.54,-1.32 6.13,-2.95C16.95,17.79 15.39,15.59 15.07,13z" /> + <path + android:fillColor="#FF000000" + android:pathData="M3.59,17.4c1.72,-0.83 2.99,-2.46 3.32,-4.4H2.05C2.21,14.61 2.76,16.11 3.59,17.4z" /> + <path + android:fillColor="#FF000000" + android:pathData="M17.09,13c0.33,1.95 1.59,3.57 3.32,4.4c0.83,-1.29 1.38,-2.79 1.54,-4.4H17.09z" /> + <path + android:fillColor="#FF000000" + android:pathData="M8.93,13c-0.32,2.59 -1.88,4.79 -4.06,6c1.6,1.63 3.74,2.71 6.13,2.95V13H8.93z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/sports_cricket.xml b/qqq/android/mobileapp/src/main/res/drawable/sports_cricket.xml new file mode 100644 index 0000000..b73f17e --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/sports_cricket.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/sports_cricket/materialicons/black/res/drawable/baseline_sports_cricket_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M15.05,12.81L6.56,4.32c-0.39,-0.39 -1.02,-0.39 -1.41,0L2.32,7.15c-0.39,0.39 -0.39,1.02 0,1.41l8.49,8.49c0.39,0.39 1.02,0.39 1.41,0l2.83,-2.83C15.44,13.83 15.44,13.2 15.05,12.81z" /> + <path + android:fillColor="#FF000000" + android:pathData="M14.3412,17.7562l1.4142,-1.4142l4.2426,4.2426l-1.4142,1.4142z" /> + <path + android:fillColor="#FF000000" + android:pathData="M18.5,5.5m-3.5,0a3.5,3.5 0,1 1,7 0a3.5,3.5 0,1 1,-7 0" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/sports_esports.xml b/qqq/android/mobileapp/src/main/res/drawable/sports_esports.xml new file mode 100644 index 0000000..e689f94 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/sports_esports.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/sports_esports/materialicons/black/res/drawable/baseline_sports_esports_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M21.58,16.09l-1.09,-7.66C20.21,6.46 18.52,5 16.53,5H7.47C5.48,5 3.79,6.46 3.51,8.43l-1.09,7.66C2.2,17.63 3.39,19 4.94,19h0c0.68,0 1.32,-0.27 1.8,-0.75L9,16h6l2.25,2.25c0.48,0.48 1.13,0.75 1.8,0.75h0C20.61,19 21.8,17.63 21.58,16.09zM11,11H9v2H8v-2H6v-1h2V8h1v2h2V11zM15,10c-0.55,0 -1,-0.45 -1,-1c0,-0.55 0.45,-1 1,-1s1,0.45 1,1C16,9.55 15.55,10 15,10zM17,13c-0.55,0 -1,-0.45 -1,-1c0,-0.55 0.45,-1 1,-1s1,0.45 1,1C18,12.55 17.55,13 17,13z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/sports_football.xml b/qqq/android/mobileapp/src/main/res/drawable/sports_football.xml new file mode 100644 index 0000000..901faa8 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/sports_football.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/sports_football/materialicons/black/res/drawable/baseline_sports_football_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M3.02,15.62c-0.08,2.42 0.32,4.34 0.67,4.69s2.28,0.76 4.69,0.67L3.02,15.62z" /> + <path + android:fillColor="#FF000000" + android:pathData="M13.08,3.28C10.75,3.7 8.29,4.62 6.46,6.46s-2.76,4.29 -3.18,6.62l7.63,7.63c2.34,-0.41 4.79,-1.34 6.62,-3.18s2.76,-4.29 3.18,-6.62L13.08,3.28zM9.9,15.5l-1.4,-1.4l5.6,-5.6l1.4,1.4L9.9,15.5z" /> + <path + android:fillColor="#FF000000" + android:pathData="M20.98,8.38c0.08,-2.42 -0.32,-4.34 -0.67,-4.69s-2.28,-0.76 -4.69,-0.67L20.98,8.38z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/sports_golf.xml b/qqq/android/mobileapp/src/main/res/drawable/sports_golf.xml new file mode 100644 index 0000000..83a7536 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/sports_golf.xml @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/sports_golf/materialicons/black/res/drawable/baseline_sports_golf_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,16c3.87,0 7,-3.13 7,-7c0,-3.87 -3.13,-7 -7,-7S5,5.13 5,9C5,12.87 8.13,16 12,16zM12,4c2.76,0 5,2.24 5,5s-2.24,5 -5,5s-5,-2.24 -5,-5S9.24,4 12,4z" /> + <path + android:fillColor="#FF000000" + android:pathData="M10,8m-1,0a1,1 0,1 1,2 0a1,1 0,1 1,-2 0" /> + <path + android:fillColor="#FF000000" + android:pathData="M14,8m-1,0a1,1 0,1 1,2 0a1,1 0,1 1,-2 0" /> + <path + android:fillColor="#FF000000" + android:pathData="M12,6m-1,0a1,1 0,1 1,2 0a1,1 0,1 1,-2 0" /> + <path + android:fillColor="#FF000000" + android:pathData="M7,19h2c1.1,0 2,0.9 2,2v1h2v-1c0,-1.1 0.9,-2 2,-2h2v-2H7V19z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/sports_gymnastics.xml b/qqq/android/mobileapp/src/main/res/drawable/sports_gymnastics.xml new file mode 100644 index 0000000..9504af2 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/sports_gymnastics.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/sports_gymnastics/materialicons/black/res/drawable/baseline_sports_gymnastics_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M4,6c0,-1.1 0.9,-2 2,-2s2,0.9 2,2S7.1,8 6,8S4,7.1 4,6zM1,9h6l7,-5l1.31,1.52L11.14,8.5H14L21.8,4L23,5.4L14.5,12L14,22h-2l-0.5,-10L8,11H1V9z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/sports_handball.xml b/qqq/android/mobileapp/src/main/res/drawable/sports_handball.xml new file mode 100644 index 0000000..73aeed5 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/sports_handball.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/sports_handball/materialicons/black/res/drawable/baseline_sports_handball_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M14.27,6C13.72,6.95 14.05,8.18 15,8.73c0.95,0.55 2.18,0.22 2.73,-0.73c0.55,-0.95 0.22,-2.18 -0.73,-2.73C16.05,4.72 14.82,5.05 14.27,6z" /> + <path + android:fillColor="#FF000000" + android:pathData="M15.84,10.41c0,0 -1.63,-0.94 -2.6,-1.5c-2.38,-1.38 -3.2,-4.44 -1.82,-6.82l-1.73,-1C8.1,3.83 8.6,7.21 10.66,9.4l-5.15,8.92l1.73,1l1.5,-2.6l1.73,1l-3,5.2l1.73,1l6.29,-10.89c1.14,1.55 1.33,3.69 0.31,5.46l1.73,1C19.13,16.74 18.81,12.91 15.84,10.41z" /> + <path + android:fillColor="#FF000000" + android:pathData="M12.75,3.8c0.72,0.41 1.63,0.17 2.05,-0.55c0.41,-0.72 0.17,-1.63 -0.55,-2.05c-0.72,-0.41 -1.63,-0.17 -2.05,0.55C11.79,2.47 12.03,3.39 12.75,3.8z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/sports_hockey.xml b/qqq/android/mobileapp/src/main/res/drawable/sports_hockey.xml new file mode 100644 index 0000000..f2adba7 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/sports_hockey.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/sports_hockey/materialicons/black/res/drawable/baseline_sports_hockey_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M2,17v3l2,0v-4H3C2.45,16 2,16.45 2,17z" /> + <path + android:fillColor="#FF000000" + android:pathData="M9,16H5v4l4.69,-0.01c0.38,0 0.72,-0.21 0.89,-0.55l0.87,-1.9l-1.59,-3.48L9,16z" /> + <path + android:fillColor="#FF000000" + android:pathData="M21.71,16.29C21.53,16.11 21.28,16 21,16h-1v4l2,0v-3C22,16.72 21.89,16.47 21.71,16.29z" /> + <path + android:fillColor="#FF000000" + android:pathData="M13.6,12.84L17.65,4H14.3l-1.76,3.97l-0.49,1.1L12,9.21L9.7,4H6.35l4.05,8.84l1.52,3.32L12,16.34l1.42,3.1c0.17,0.34 0.51,0.55 0.89,0.55L19,20v-4h-4L13.6,12.84z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/sports_kabaddi.xml b/qqq/android/mobileapp/src/main/res/drawable/sports_kabaddi.xml new file mode 100644 index 0000000..202aabb --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/sports_kabaddi.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/sports_kabaddi/materialicons/black/res/drawable/baseline_sports_kabaddi_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M16.5,2.38m-2,0a2,2 0,1 1,4 0a2,2 0,1 1,-4 0" /> + <path + android:fillColor="#FF000000" + android:pathData="M24,11.88v-4.7l-5.05,-2.14c-0.97,-0.41 -2.09,-0.06 -2.65,0.84l0,0l-1,1.6c-0.67,1.18 -1.91,2.06 -3.41,2.32l0.06,0.06c0.69,0.69 1.52,1.07 2.46,1.17c0.8,-0.42 1.52,-0.98 2.09,-1.64l0.6,3l-1.16,1.1L15,14.38v0.76v6.74h2v-6l2.1,-2l1.8,8H23l-2.18,-11l-0.62,-3.1l1.8,0.7v3.4H24z" /> + <path + android:fillColor="#FF000000" + android:pathData="M10.29,8.09c0.22,0.15 0.47,0.24 0.72,0.29c0.13,0.02 0.25,0.04 0.38,0.04s0.26,-0.01 0.38,-0.04c0.13,-0.02 0.25,-0.06 0.37,-0.11c0.24,-0.1 0.47,-0.24 0.66,-0.44c0.49,-0.49 0.67,-1.17 0.55,-1.8C13.28,5.66 13.1,5.29 12.8,5c-0.19,-0.19 -0.42,-0.34 -0.66,-0.44c-0.12,-0.05 -0.24,-0.09 -0.37,-0.11s-0.25,-0.04 -0.38,-0.04c-0.12,0 -0.23,0.01 -0.35,0.03c-0.14,0.02 -0.28,0.06 -0.41,0.11C10.4,4.66 10.17,4.81 9.98,5C9.68,5.29 9.5,5.66 9.43,6.03c-0.12,0.63 0.06,1.31 0.55,1.8C10.07,7.93 10.18,8.01 10.29,8.09z" /> + <path + android:fillColor="#FF000000" + android:pathData="M11.24,10.56l-2,-2c-0.1,-0.1 -0.2,-0.18 -0.31,-0.26C8.71,8.16 8.46,8.06 8.21,8.02C8.08,7.99 7.96,7.98 7.83,7.98c-0.51,0 -1.02,0.2 -1.41,0.59l-3.34,3.34c-0.41,0.41 -0.62,0.98 -0.58,1.54C2.5,13.63 2.54,13.82 2.61,14l1.07,2.95l-3.63,3.63L1.46,22l4.24,-4.24v-2.22L7,16.75v5.13h2v-6l-2.12,-2.12l2.36,-2.36l0.71,0.71l0,0c1.29,1.26 2.97,2.04 5.03,2.04l-0.14,-2.07C13.34,12.06 12.14,11.46 11.24,10.56z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/sports_martial_arts.xml b/qqq/android/mobileapp/src/main/res/drawable/sports_martial_arts.xml new file mode 100644 index 0000000..4f528d4 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/sports_martial_arts.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/sports_martial_arts/materialicons/black/res/drawable/baseline_sports_martial_arts_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19.8,2l-8.2,6.7l-1.21,-1.04l3.6,-2.08l-4.58,-4.58l-1.41,1.41l2.74,2.74l-5.74,3.31l-1.19,4.29l2.46,4.25l1.73,-1l-2.03,-3.52l0.35,-1.3l3.18,1.82l0.5,9l2,0l0.5,-10l8.5,-8.6z" /> + <path + android:fillColor="#FF000000" + android:pathData="M5,5m-2,0a2,2 0,1 1,4 0a2,2 0,1 1,-4 0" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/sports_mma.xml b/qqq/android/mobileapp/src/main/res/drawable/sports_mma.xml new file mode 100644 index 0000000..b5b26e4 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/sports_mma.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/sports_mma/materialicons/black/res/drawable/baseline_sports_mma_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M7,20c0,0.55 0.45,1 1,1h8c0.55,0 1,-0.45 1,-1v-3H7V20z" /> + <path + android:fillColor="#FF000000" + android:pathData="M18,7c-0.55,0 -1,0.45 -1,1V5c0,-1.1 -0.9,-2 -2,-2H7C5.9,3 5,3.9 5,5v5.8c0,0.13 0.01,0.26 0.04,0.39l0.8,4c0.09,0.47 0.5,0.8 0.98,0.8h10.36c0.45,0 0.89,-0.36 0.98,-0.8l0.8,-4C18.99,11.06 19,10.93 19,10.8V8C19,7.45 18.55,7 18,7zM15,10H7V7h8V10z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/sports_motorsports.xml b/qqq/android/mobileapp/src/main/res/drawable/sports_motorsports.xml new file mode 100644 index 0000000..be51dfe --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/sports_motorsports.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/sports_motorsports/materialicons/black/res/drawable/baseline_sports_motorsports_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,11.39c0,-0.65 -0.39,-1.23 -0.98,-1.48L5.44,7.55c-1.48,1.68 -2.32,3.7 -2.8,5.45h7.75C11.28,13 12,12.28 12,11.39z" /> + <path + android:fillColor="#FF000000" + android:pathData="M21.96,11.22c-0.41,-4.41 -4.56,-7.49 -8.98,-7.2c-2.51,0.16 -4.44,0.94 -5.93,2.04l4.74,2.01c1.33,0.57 2.2,1.87 2.2,3.32c0,1.99 -1.62,3.61 -3.61,3.61H2.21C2,16.31 2,17.2 2,17.2V18c0,1.1 0.9,2 2,2h10C18.67,20 22.41,15.99 21.96,11.22z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/sports_rugby.xml b/qqq/android/mobileapp/src/main/res/drawable/sports_rugby.xml new file mode 100644 index 0000000..18261fe --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/sports_rugby.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/sports_rugby/materialicons/black/res/drawable/baseline_sports_rugby_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20.49,3.51c-0.56,-0.56 -2.15,-0.97 -4.16,-0.97c-3.08,0 -7.15,0.96 -9.98,3.79C1.66,11.03 2.1,19.07 3.51,20.49c0.56,0.56 2.15,0.97 4.16,0.97c3.08,0 7.15,-0.96 9.98,-3.79C22.34,12.97 21.9,4.93 20.49,3.51zM7.76,7.76c2.64,-2.64 6.35,-3.12 8.03,-3.19c-2.05,0.94 -4.46,2.45 -6.61,4.61c-2.16,2.16 -3.67,4.58 -4.62,6.63C4.66,13.33 5.44,10.07 7.76,7.76zM16.24,16.24c-2.64,2.64 -6.35,3.12 -8.03,3.19c2.05,-0.94 4.46,-2.45 6.61,-4.61c2.16,-2.16 3.67,-4.58 4.62,-6.63C19.34,10.67 18.56,13.93 16.24,16.24z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/sports_score.xml b/qqq/android/mobileapp/src/main/res/drawable/sports_score.xml new file mode 100644 index 0000000..233e8ef --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/sports_score.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/sports_score/materialicons/black/res/drawable/baseline_sports_score_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M11,6H9V4h2V6zM15,4h-2v2h2V4zM9,14h2v-2H9V14zM19,10V8h-2v2H19zM19,14v-2h-2v2H19zM13,14h2v-2h-2V14zM19,4h-2v2h2V4zM13,8V6h-2v2H13zM7,10V8h2V6H7V4H5v16h2v-8h2v-2H7zM15,12h2v-2h-2V12zM11,10v2h2v-2H11zM9,8v2h2V8H9zM13,10h2V8h-2V10zM15,6v2h2V6H15z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/sports_soccer.xml b/qqq/android/mobileapp/src/main/res/drawable/sports_soccer.xml new file mode 100644 index 0000000..801e6d1 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/sports_soccer.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/sports_soccer/materialicons/black/res/drawable/baseline_sports_soccer_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,2C6.48,2 2,6.48 2,12c0,5.52 4.48,10 10,10s10,-4.48 10,-10C22,6.48 17.52,2 12,2zM13,5.3l1.35,-0.95c1.82,0.56 3.37,1.76 4.38,3.34l-0.39,1.34l-1.35,0.46L13,6.7V5.3zM9.65,4.35L11,5.3v1.4L7.01,9.49L5.66,9.03L5.27,7.69C6.28,6.12 7.83,4.92 9.65,4.35zM7.08,17.11l-1.14,0.1C4.73,15.81 4,13.99 4,12c0,-0.12 0.01,-0.23 0.02,-0.35l1,-0.73L6.4,11.4l1.46,4.34L7.08,17.11zM14.5,19.59C13.71,19.85 12.87,20 12,20s-1.71,-0.15 -2.5,-0.41l-0.69,-1.49L9.45,17h5.11l0.64,1.11L14.5,19.59zM14.27,15H9.73l-1.35,-4.02L12,8.44l3.63,2.54L14.27,15zM18.06,17.21l-1.14,-0.1l-0.79,-1.37l1.46,-4.34l1.39,-0.47l1,0.73C19.99,11.77 20,11.88 20,12C20,13.99 19.27,15.81 18.06,17.21z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/sports_tennis.xml b/qqq/android/mobileapp/src/main/res/drawable/sports_tennis.xml new file mode 100644 index 0000000..da3d8be --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/sports_tennis.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/sports_tennis/materialicons/black/res/drawable/baseline_sports_tennis_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19.52,2.49c-2.34,-2.34 -6.62,-1.87 -9.55,1.06c-1.6,1.6 -2.52,3.87 -2.54,5.46c-0.02,1.58 0.26,3.89 -1.35,5.5l-4.24,4.24l1.42,1.42l4.24,-4.24c1.61,-1.61 3.92,-1.33 5.5,-1.35s3.86,-0.94 5.46,-2.54C21.38,9.11 21.86,4.83 19.52,2.49zM10.32,11.68c-1.53,-1.53 -1.05,-4.61 1.06,-6.72s5.18,-2.59 6.72,-1.06c1.53,1.53 1.05,4.61 -1.06,6.72S11.86,13.21 10.32,11.68z" /> + <path + android:fillColor="#FF000000" + android:pathData="M18,17c0.53,0 1.04,0.21 1.41,0.59c0.78,0.78 0.78,2.05 0,2.83C19.04,20.79 18.53,21 18,21s-1.04,-0.21 -1.41,-0.59c-0.78,-0.78 -0.78,-2.05 0,-2.83C16.96,17.21 17.47,17 18,17M18,15c-1.02,0 -2.05,0.39 -2.83,1.17c-1.56,1.56 -1.56,4.09 0,5.66C15.95,22.61 16.98,23 18,23s2.05,-0.39 2.83,-1.17c1.56,-1.56 1.56,-4.09 0,-5.66C20.05,15.39 19.02,15 18,15L18,15z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/sports_volleyball.xml b/qqq/android/mobileapp/src/main/res/drawable/sports_volleyball.xml new file mode 100644 index 0000000..a9187ae --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/sports_volleyball.xml @@ -0,0 +1,34 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/sports_volleyball/materialicons/black/res/drawable/baseline_sports_volleyball_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M6,4.01C3.58,5.84 2,8.73 2,12c0,1.46 0.32,2.85 0.89,4.11L6,14.31V4.01z" /> + <path + android:fillColor="#FF000000" + android:pathData="M11,11.42V2.05C9.94,2.16 8.93,2.43 8,2.84v10.32L11,11.42z" /> + <path + android:fillColor="#FF000000" + android:pathData="M12,13.15l-8.11,4.68c0.61,0.84 1.34,1.59 2.18,2.2L15,14.89L12,13.15z" /> + <path + android:fillColor="#FF000000" + android:pathData="M13,7.96v3.46l8.11,4.68c0.42,-0.93 0.7,-1.93 0.82,-2.98L13,7.96z" /> + <path + android:fillColor="#FF000000" + android:pathData="M8.07,21.2C9.28,21.71 10.6,22 12,22c3.34,0 6.29,-1.65 8.11,-4.16L17,16.04L8.07,21.2z" /> + <path + android:fillColor="#FF000000" + android:pathData="M21.92,10.81c-0.55,-4.63 -4.26,-8.3 -8.92,-8.76v3.6L21.92,10.81z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/square.xml b/qqq/android/mobileapp/src/main/res/drawable/square.xml new file mode 100644 index 0000000..338a27a --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/square.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/editor/square/materialicons/black/res/drawable/baseline_square_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M3,3h18v18h-18z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/square_foot.xml b/qqq/android/mobileapp/src/main/res/drawable/square_foot.xml new file mode 100644 index 0000000..8392d5a --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/square_foot.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/content/square_foot/materialicons/black/res/drawable/baseline_square_foot_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M17.66,17.66l-1.06,1.06l-0.71,-0.71l1.06,-1.06l-1.94,-1.94l-1.06,1.06l-0.71,-0.71l1.06,-1.06l-1.94,-1.94l-1.06,1.06l-0.71,-0.71l1.06,-1.06L9.7,9.7l-1.06,1.06l-0.71,-0.71l1.06,-1.06L7.05,7.05L5.99,8.11L5.28,7.4l1.06,-1.06L4,4v14c0,1.1 0.9,2 2,2h14L17.66,17.66zM7,17v-5.76L12.76,17H7z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/ssid_chart.xml b/qqq/android/mobileapp/src/main/res/drawable/ssid_chart.xml new file mode 100644 index 0000000..9cb187c --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/ssid_chart.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/ssid_chart/materialicons/black/res/drawable/baseline_ssid_chart_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M21,5.47L12,12L7.62,7.62L3,11V8.52L7.83,5l4.38,4.38L21,3L21,5.47zM21,15h-4.7l-4.17,3.34L6,12.41l-3,2.13L3,17l2.8,-2l6.2,6l5,-4h4V15z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/stacked_bar_chart.xml b/qqq/android/mobileapp/src/main/res/drawable/stacked_bar_chart.xml new file mode 100644 index 0000000..5210ccf --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/stacked_bar_chart.xml @@ -0,0 +1,34 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/content/stacked_bar_chart/materialicons/black/res/drawable/baseline_stacked_bar_chart_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M4,9h4v11h-4z" /> + <path + android:fillColor="#FF000000" + android:pathData="M4,4h4v4h-4z" /> + <path + android:fillColor="#FF000000" + android:pathData="M10,7h4v4h-4z" /> + <path + android:fillColor="#FF000000" + android:pathData="M16,10h4v4h-4z" /> + <path + android:fillColor="#FF000000" + android:pathData="M16,15h4v5h-4z" /> + <path + android:fillColor="#FF000000" + android:pathData="M10,12h4v8h-4z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/stacked_line_chart.xml b/qqq/android/mobileapp/src/main/res/drawable/stacked_line_chart.xml new file mode 100644 index 0000000..cd03cde --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/stacked_line_chart.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/editor/stacked_line_chart/materialicons/black/res/drawable/baseline_stacked_line_chart_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M2,19.99l7.5,-7.51l4,4l7.09,-7.97L22,9.92l-8.5,9.56l-4,-4l-6,6.01L2,19.99zM3.5,15.49l6,-6.01l4,4L22,3.92l-1.41,-1.41l-7.09,7.97l-4,-4L2,13.99L3.5,15.49z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/stadium.xml b/qqq/android/mobileapp/src/main/res/drawable/stadium.xml new file mode 100644 index 0000000..00633f6 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/stadium.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/stadium/materialicons/black/res/drawable/baseline_stadium_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M7,5L3,7V3L7,5zM18,3v4l4,-2L18,3zM11,2v4l4,-2L11,2zM5,10.04C6.38,10.53 8.77,11 12,11s5.62,-0.47 7,-0.96C19,9.86 16.22,9 12,9S5,9.86 5,10.04zM15,17H9l0,4.88C4.94,21.49 2,20.34 2,19v-9c0,-1.66 4.48,-3 10,-3s10,1.34 10,3v9c0,1.34 -2.94,2.48 -7,2.87L15,17z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/stairs.xml b/qqq/android/mobileapp/src/main/res/drawable/stairs.xml new file mode 100644 index 0000000..dd9bca4 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/stairs.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/places/stairs/materialicons/black/res/drawable/baseline_stairs_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19,3H5C3.9,3 3,3.9 3,5v14c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2V5C21,3.9 20.1,3 19,3zM18,8h-2.42v3.33H13v3.33h-2.58V18H6v-2h2.42v-3.33H11V9.33h2.58V6H18V8z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/star.xml b/qqq/android/mobileapp/src/main/res/drawable/star.xml new file mode 100644 index 0000000..150fb51 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/star.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/toggle/star/materialicons/black/res/drawable/baseline_star_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,17.27L18.18,21l-1.64,-7.03L22,9.24l-7.19,-0.61L12,2 9.19,8.63 2,9.24l5.46,4.73L5.82,21z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/star_border.xml b/qqq/android/mobileapp/src/main/res/drawable/star_border.xml new file mode 100644 index 0000000..cca2b8a --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/star_border.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/toggle/star_border/materialicons/black/res/drawable/baseline_star_border_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M22,9.24l-7.19,-0.62L12,2 9.19,8.63 2,9.24l5.46,4.73L5.82,21 12,17.27 18.18,21l-1.63,-7.03L22,9.24zM12,15.4l-3.76,2.27 1,-4.28 -3.32,-2.88 4.38,-0.38L12,6.1l1.71,4.04 4.38,0.38 -3.32,2.88 1,4.28L12,15.4z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/star_border_purple500.xml b/qqq/android/mobileapp/src/main/res/drawable/star_border_purple500.xml new file mode 100644 index 0000000..4c8f3fb --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/star_border_purple500.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/toggle/star_border_purple500/materialicons/black/res/drawable/baseline_star_border_purple500_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,8.89L12.94,12h2.82l-2.27,1.62l0.93,3.01L12,14.79l-2.42,1.84l0.93,-3.01L8.24,12h2.82L12,8.89M12,2l-2.42,8H2l6.17,4.41L5.83,22L12,17.31L18.18,22l-2.35,-7.59L22,10h-7.58L12,2L12,2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/star_half.xml b/qqq/android/mobileapp/src/main/res/drawable/star_half.xml new file mode 100644 index 0000000..6a07391 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/star_half.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/toggle/star_half/materialicons/black/res/drawable/baseline_star_half_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M22,9.24l-7.19,-0.62L12,2L9.19,8.63L2,9.24l5.46,4.73L5.82,21L12,17.27L18.18,21l-1.63,-7.03L22,9.24zM12,15.4V6.1l1.71,4.04l4.38,0.38l-3.32,2.88l1,4.28L12,15.4z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/star_outline.xml b/qqq/android/mobileapp/src/main/res/drawable/star_outline.xml new file mode 100644 index 0000000..53bc6ab --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/star_outline.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/toggle/star_outline/materialicons/black/res/drawable/baseline_star_outline_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M22,9.24l-7.19,-0.62L12,2 9.19,8.63 2,9.24l5.46,4.73L5.82,21 12,17.27 18.18,21l-1.63,-7.03L22,9.24zM12,15.4l-3.76,2.27 1,-4.28 -3.32,-2.88 4.38,-0.38L12,6.1l1.71,4.04 4.38,0.38 -3.32,2.88 1,4.28L12,15.4z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/star_purple500.xml b/qqq/android/mobileapp/src/main/res/drawable/star_purple500.xml new file mode 100644 index 0000000..5783c81 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/star_purple500.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/toggle/star_purple500/materialicons/black/res/drawable/baseline_star_purple500_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,8.89L12.94,12h2.82l-2.27,1.62l0.93,3.01L12,14.79l-2.42,1.84l0.93,-3.01L8.24,12h2.82L12,8.89M12,2l-2.42,8H2l6.17,4.41L5.83,22L12,17.31L18.18,22l-2.35,-7.59L22,10h-7.58L12,2L12,2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/star_rate.xml b/qqq/android/mobileapp/src/main/res/drawable/star_rate.xml new file mode 100644 index 0000000..b52cbbd --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/star_rate.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/star_rate/materialicons/black/res/drawable/baseline_star_rate_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M14.43,10l-2.43,-8l-2.43,8l-7.57,0l6.18,4.41l-2.35,7.59l6.17,-4.69l6.18,4.69l-2.35,-7.59l6.17,-4.41z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/stars.xml b/qqq/android/mobileapp/src/main/res/drawable/stars.xml new file mode 100644 index 0000000..a39196c --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/stars.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/stars/materialicons/black/res/drawable/baseline_stars_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M11.99,2C6.47,2 2,6.48 2,12s4.47,10 9.99,10C17.52,22 22,17.52 22,12S17.52,2 11.99,2zM16.23,18L12,15.45 7.77,18l1.12,-4.81 -3.73,-3.23 4.92,-0.42L12,5l1.92,4.53 4.92,0.42 -3.73,3.23L16.23,18z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/start.xml b/qqq/android/mobileapp/src/main/res/drawable/start.xml new file mode 100644 index 0000000..f7327c5 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/start.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/hardware/start/materialicons/black/res/drawable/baseline_start_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M14.59,7.41L18.17,11H6v2h12.17l-3.59,3.59L16,18l6,-6l-6,-6L14.59,7.41zM2,6v12h2V6H2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/stay_current_landscape.xml b/qqq/android/mobileapp/src/main/res/drawable/stay_current_landscape.xml new file mode 100644 index 0000000..d0bd91c --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/stay_current_landscape.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/communication/stay_current_landscape/materialicons/black/res/drawable/baseline_stay_current_landscape_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M1.01,7L1,17c0,1.1 0.9,2 2,2h18c1.1,0 2,-0.9 2,-2V7c0,-1.1 -0.9,-2 -2,-2H3c-1.1,0 -1.99,0.9 -1.99,2zM19,7v10H5V7h14z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/stay_current_portrait.xml b/qqq/android/mobileapp/src/main/res/drawable/stay_current_portrait.xml new file mode 100644 index 0000000..0bd31b5 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/stay_current_portrait.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/communication/stay_current_portrait/materialicons/black/res/drawable/baseline_stay_current_portrait_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M17,1.01L7,1c-1.1,0 -1.99,0.9 -1.99,2v18c0,1.1 0.89,2 1.99,2h10c1.1,0 2,-0.9 2,-2V3c0,-1.1 -0.9,-1.99 -2,-1.99zM17,19H7V5h10v14z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/stay_primary_landscape.xml b/qqq/android/mobileapp/src/main/res/drawable/stay_primary_landscape.xml new file mode 100644 index 0000000..f12cb5f --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/stay_primary_landscape.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/communication/stay_primary_landscape/materialicons/black/res/drawable/baseline_stay_primary_landscape_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M1.01,7L1,17c0,1.1 0.9,2 2,2h18c1.1,0 2,-0.9 2,-2V7c0,-1.1 -0.9,-2 -2,-2H3c-1.1,0 -1.99,0.9 -1.99,2zM19,7v10H5V7h14z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/stay_primary_portrait.xml b/qqq/android/mobileapp/src/main/res/drawable/stay_primary_portrait.xml new file mode 100644 index 0000000..b0d2a0e --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/stay_primary_portrait.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/communication/stay_primary_portrait/materialicons/black/res/drawable/baseline_stay_primary_portrait_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M17,1.01L7,1c-1.1,0 -1.99,0.9 -1.99,2v18c0,1.1 0.89,2 1.99,2h10c1.1,0 2,-0.9 2,-2V3c0,-1.1 -0.9,-1.99 -2,-1.99zM17,19H7V5h10v14z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/sticky_note_2.xml b/qqq/android/mobileapp/src/main/res/drawable/sticky_note_2.xml new file mode 100644 index 0000000..c38ba9f --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/sticky_note_2.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/sticky_note_2/materialicons/black/res/drawable/baseline_sticky_note_2_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19,3H4.99C3.89,3 3,3.9 3,5l0.01,14c0,1.1 0.89,2 1.99,2h10l6,-6V5C21,3.9 20.1,3 19,3zM7,8h10v2H7V8zM12,14H7v-2h5V14zM14,19.5V14h5.5L14,19.5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/stop.xml b/qqq/android/mobileapp/src/main/res/drawable/stop.xml new file mode 100644 index 0000000..a40dbec --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/stop.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/av/stop/materialicons/black/res/drawable/baseline_stop_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M6,6h12v12H6z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/stop_circle.xml b/qqq/android/mobileapp/src/main/res/drawable/stop_circle.xml new file mode 100644 index 0000000..4c28032 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/stop_circle.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/av/stop_circle/materialicons/black/res/drawable/baseline_stop_circle_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,2C6.48,2 2,6.48 2,12c0,5.52 4.48,10 10,10s10,-4.48 10,-10C22,6.48 17.52,2 12,2zM16,16H8V8h8V16z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/stop_screen_share.xml b/qqq/android/mobileapp/src/main/res/drawable/stop_screen_share.xml new file mode 100644 index 0000000..606ec59 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/stop_screen_share.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/communication/stop_screen_share/materialicons/black/res/drawable/baseline_stop_screen_share_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M21.22,18.02l2,2L24,20.02v-2h-2.78zM21.99,16.02l0.01,-10c0,-1.11 -0.9,-2 -2,-2L7.22,4.02l5.23,5.23c0.18,-0.04 0.36,-0.07 0.55,-0.1L13,7.02l4,3.73 -1.58,1.47 5.54,5.54c0.61,-0.33 1.03,-0.99 1.03,-1.74zM2.39,1.73L1.11,3l1.54,1.54c-0.4,0.36 -0.65,0.89 -0.65,1.48v10c0,1.1 0.89,2 2,2L0,18.02v2h18.13l2.71,2.71 1.27,-1.27L2.39,1.73zM7,15.02c0.31,-1.48 0.92,-2.95 2.07,-4.06l1.59,1.59c-1.54,0.38 -2.7,1.18 -3.66,2.47z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/storage.xml b/qqq/android/mobileapp/src/main/res/drawable/storage.xml new file mode 100644 index 0000000..4c1f4c2 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/storage.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/storage/materialicons/black/res/drawable/baseline_storage_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M2,20h20v-4L2,16v4zM4,17h2v2L4,19v-2zM2,4v4h20L22,4L2,4zM6,7L4,7L4,5h2v2zM2,14h20v-4L2,10v4zM4,11h2v2L4,13v-2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/store.xml b/qqq/android/mobileapp/src/main/res/drawable/store.xml new file mode 100644 index 0000000..a62d6f7 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/store.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/store/materialicons/black/res/drawable/baseline_store_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,4L4,4v2h16L20,4zM21,14v-2l-1,-5L4,7l-1,5v2h1v6h10v-6h4v6h2v-6h1zM12,18L6,18v-4h6v4z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/store_mall_directory.xml b/qqq/android/mobileapp/src/main/res/drawable/store_mall_directory.xml new file mode 100644 index 0000000..2f6bf5f --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/store_mall_directory.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/store_mall_directory/materialicons/black/res/drawable/baseline_store_mall_directory_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,4L4,4v2h16L20,4zM21,14v-2l-1,-5L4,7l-1,5v2h1v6h10v-6h4v6h2v-6h1zM12,18L6,18v-4h6v4z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/storefront.xml b/qqq/android/mobileapp/src/main/res/drawable/storefront.xml new file mode 100644 index 0000000..a0d7fae --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/storefront.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/places/storefront/materialicons/black/res/drawable/baseline_storefront_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M21.9,8.89l-1.05,-4.37c-0.22,-0.9 -1,-1.52 -1.91,-1.52H5.05C4.15,3 3.36,3.63 3.15,4.52L2.1,8.89c-0.24,1.02 -0.02,2.06 0.62,2.88C2.8,11.88 2.91,11.96 3,12.06V19c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2v-6.94c0.09,-0.09 0.2,-0.18 0.28,-0.28C21.92,10.96 22.15,9.91 21.9,8.89zM18.91,4.99l1.05,4.37c0.1,0.42 0.01,0.84 -0.25,1.17C19.57,10.71 19.27,11 18.77,11c-0.61,0 -1.14,-0.49 -1.21,-1.14L16.98,5L18.91,4.99zM13,5h1.96l0.54,4.52c0.05,0.39 -0.07,0.78 -0.33,1.07C14.95,10.85 14.63,11 14.22,11C13.55,11 13,10.41 13,9.69V5zM8.49,9.52L9.04,5H11v4.69C11,10.41 10.45,11 9.71,11c-0.34,0 -0.65,-0.15 -0.89,-0.41C8.57,10.3 8.45,9.91 8.49,9.52zM4.04,9.36L5.05,5h1.97L6.44,9.86C6.36,10.51 5.84,11 5.23,11c-0.49,0 -0.8,-0.29 -0.93,-0.47C4.03,10.21 3.94,9.78 4.04,9.36zM5,19v-6.03C5.08,12.98 5.15,13 5.23,13c0.87,0 1.66,-0.36 2.24,-0.95c0.6,0.6 1.4,0.95 2.31,0.95c0.87,0 1.65,-0.36 2.23,-0.93c0.59,0.57 1.39,0.93 2.29,0.93c0.84,0 1.64,-0.35 2.24,-0.95c0.58,0.59 1.37,0.95 2.24,0.95c0.08,0 0.15,-0.02 0.23,-0.03V19H5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/storm.xml b/qqq/android/mobileapp/src/main/res/drawable/storm.xml new file mode 100644 index 0000000..79aa768 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/storm.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/storm/materialicons/black/res/drawable/baseline_storm_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M18.93,8C16.72,4.18 11.82,2.87 8,5.07c-1.41,0.82 -2.48,2 -3.16,3.37C4.71,6.24 5.06,4.04 5.86,2H3.74C2.2,6.49 2.52,11.58 5.07,16c1.1,1.91 2.88,3.19 4.86,3.72c1.98,0.53 4.16,0.31 6.07,-0.79c1.41,-0.82 2.48,-2 3.16,-3.37c0.13,2.2 -0.21,4.4 -1.01,6.44h2.11C21.79,17.51 21.48,12.42 18.93,8zM15,17.2c-2.87,1.65 -6.54,0.67 -8.2,-2.2c-0.11,-0.2 -0.21,-0.4 -0.3,-0.6C5.3,11.64 6.33,8.34 9,6.8c2.86,-1.65 6.54,-0.67 8.2,2.2c0.11,0.2 0.21,0.4 0.3,0.6C18.7,12.36 17.67,15.66 15,17.2zM12,10c1.1,0 2,0.9 2,2s-0.9,2 -2,2s-2,-0.9 -2,-2S10.9,10 12,10M12,8c-2.21,0 -4,1.79 -4,4s1.79,4 4,4s4,-1.79 4,-4S14.21,8 12,8z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/straight.xml b/qqq/android/mobileapp/src/main/res/drawable/straight.xml new file mode 100644 index 0000000..533c5d4 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/straight.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/straight/materialicons/black/res/drawable/baseline_straight_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M11,6.83l-1.59,1.58l-1.41,-1.41l4,-4l4,4l-1.41,1.41l-1.59,-1.58l0,14.17l-2,0z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/straighten.xml b/qqq/android/mobileapp/src/main/res/drawable/straighten.xml new file mode 100644 index 0000000..8fca724 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/straighten.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/straighten/materialicons/black/res/drawable/baseline_straighten_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M21,6L3,6c-1.1,0 -2,0.9 -2,2v8c0,1.1 0.9,2 2,2h18c1.1,0 2,-0.9 2,-2L23,8c0,-1.1 -0.9,-2 -2,-2zM21,16L3,16L3,8h2v4h2L7,8h2v4h2L11,8h2v4h2L15,8h2v4h2L19,8h2v8z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/stream.xml b/qqq/android/mobileapp/src/main/res/drawable/stream.xml new file mode 100644 index 0000000..00cd277 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/stream.xml @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/content/stream/materialicons/black/res/drawable/baseline_stream_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,12m-2,0a2,2 0,1 1,4 0a2,2 0,1 1,-4 0" /> + <path + android:fillColor="#FF000000" + android:pathData="M4,12m-2,0a2,2 0,1 1,4 0a2,2 0,1 1,-4 0" /> + <path + android:fillColor="#FF000000" + android:pathData="M12,20m-2,0a2,2 0,1 1,4 0a2,2 0,1 1,-4 0" /> + <path + android:fillColor="#FF000000" + android:pathData="M10.05,8.59L6.03,4.55h-0.01l-0.31,-0.32 -1.42,1.41 4.02,4.05 0.01,-0.01 0.31,0.32zM13.943,8.617l4.405,-4.392L19.76,5.64l-4.405,4.393zM10.01,15.36l-1.42,-1.41 -4.03,4.01 -0.32,0.33 1.41,1.41 4.03,-4.02zM19.76,18.3l-3.99,-4.01 -0.36,-0.35L14,15.35l3.99,4.01 0.35,0.35z" /> + <path + android:fillColor="#FF000000" + android:pathData="M12,4m-2,0a2,2 0,1 1,4 0a2,2 0,1 1,-4 0" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/streetview.xml b/qqq/android/mobileapp/src/main/res/drawable/streetview.xml new file mode 100644 index 0000000..ac91515 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/streetview.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/streetview/materialicons/black/res/drawable/baseline_streetview_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12.56,14.33c-0.34,0.27 -0.56,0.7 -0.56,1.17V21h7c1.1,0 2,-0.9 2,-2v-5.98c-0.94,-0.33 -1.95,-0.52 -3,-0.52 -2.03,0 -3.93,0.7 -5.44,1.83z" /> + <path + android:fillColor="#FF000000" + android:pathData="M18,6m-5,0a5,5 0,1 1,10 0a5,5 0,1 1,-10 0" /> + <path + android:fillColor="#FF000000" + android:pathData="M11.5,6c0,-1.08 0.27,-2.1 0.74,-3H5c-1.1,0 -2,0.9 -2,2v14c0,0.55 0.23,1.05 0.59,1.41l9.82,-9.82C12.23,9.42 11.5,7.8 11.5,6z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/strikethrough_s.xml b/qqq/android/mobileapp/src/main/res/drawable/strikethrough_s.xml new file mode 100644 index 0000000..6d9a56e --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/strikethrough_s.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/editor/strikethrough_s/materialicons/black/res/drawable/baseline_strikethrough_s_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M6.85,7.08C6.85,4.37 9.45,3 12.24,3c1.64,0 3,0.49 3.9,1.28c0.77,0.65 1.46,1.73 1.46,3.24h-3.01c0,-0.31 -0.05,-0.59 -0.15,-0.85c-0.29,-0.86 -1.2,-1.28 -2.25,-1.28c-1.86,0 -2.34,1.02 -2.34,1.7c0,0.48 0.25,0.88 0.74,1.21C10.97,8.55 11.36,8.78 12,9H7.39C7.18,8.66 6.85,8.11 6.85,7.08zM21,12v-2H3v2h9.62c1.15,0.45 1.96,0.75 1.96,1.97c0,1 -0.81,1.67 -2.28,1.67c-1.54,0 -2.93,-0.54 -2.93,-2.51H6.4c0,0.55 0.08,1.13 0.24,1.58c0.81,2.29 3.29,3.3 5.67,3.3c2.27,0 5.3,-0.89 5.3,-4.05c0,-0.3 -0.01,-1.16 -0.48,-1.94H21V12z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/stroller.xml b/qqq/android/mobileapp/src/main/res/drawable/stroller.xml new file mode 100644 index 0000000..42437d7 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/stroller.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/places/stroller/materialicons/black/res/drawable/baseline_stroller_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M16,20m-2,0a2,2 0,1 1,4 0a2,2 0,1 1,-4 0" /> + <path + android:fillColor="#FF000000" + android:pathData="M6,20m-2,0a2,2 0,1 1,4 0a2,2 0,1 1,-4 0" /> + <path + android:fillColor="#FF000000" + android:pathData="M22,7V6.48C22,4.56 20.52,3 18.65,3c-1.66,0 -2.54,1.27 -3.18,2.03l-8.8,10.32C6.12,16 6.58,17 7.43,17L15,17c1.1,0 2,-0.9 2,-2V6.27C17.58,5.59 17.97,5 18.65,5C19.42,5 20,5.66 20,6.48V7H22z" /> + <path + android:fillColor="#FF000000" + android:pathData="M14.3,4.1C13.03,3.4 11.56,3 10,3C8.03,3 6.21,3.64 4.72,4.72l4.89,4.89L14.3,4.1z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/style.xml b/qqq/android/mobileapp/src/main/res/drawable/style.xml new file mode 100644 index 0000000..90332fb --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/style.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/style/materialicons/black/res/drawable/baseline_style_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M2.53,19.65l1.34,0.56v-9.03l-2.43,5.86c-0.41,1.02 0.08,2.19 1.09,2.61zM22.03,15.95L17.07,3.98c-0.31,-0.75 -1.04,-1.21 -1.81,-1.23 -0.26,0 -0.53,0.04 -0.79,0.15L7.1,5.95c-0.75,0.31 -1.21,1.03 -1.23,1.8 -0.01,0.27 0.04,0.54 0.15,0.8l4.96,11.97c0.31,0.76 1.05,1.22 1.83,1.23 0.26,0 0.52,-0.05 0.77,-0.15l7.36,-3.05c1.02,-0.42 1.51,-1.59 1.09,-2.6zM7.88,8.75c-0.55,0 -1,-0.45 -1,-1s0.45,-1 1,-1 1,0.45 1,1 -0.45,1 -1,1zM5.88,19.75c0,1.1 0.9,2 2,2h1.45l-3.45,-8.34v6.34z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/subdirectory_arrow_left.xml b/qqq/android/mobileapp/src/main/res/drawable/subdirectory_arrow_left.xml new file mode 100644 index 0000000..09071e8 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/subdirectory_arrow_left.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/navigation/subdirectory_arrow_left/materialicons/black/res/drawable/baseline_subdirectory_arrow_left_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M11,9l1.42,1.42L8.83,14H18V4h2v12H8.83l3.59,3.58L11,21l-6,-6 6,-6z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/subdirectory_arrow_right.xml b/qqq/android/mobileapp/src/main/res/drawable/subdirectory_arrow_right.xml new file mode 100644 index 0000000..49730f4 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/subdirectory_arrow_right.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/navigation/subdirectory_arrow_right/materialicons/black/res/drawable/baseline_subdirectory_arrow_right_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19,15l-6,6 -1.42,-1.42L15.17,16H4V4h2v10h9.17l-3.59,-3.58L13,9l6,6z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/subject.xml b/qqq/android/mobileapp/src/main/res/drawable/subject.xml new file mode 100644 index 0000000..4de5a90 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/subject.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/subject/materialicons/black/res/drawable/baseline_subject_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M14,17L4,17v2h10v-2zM20,9L4,9v2h16L20,9zM4,15h16v-2L4,13v2zM4,5v2h16L20,5L4,5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/subscript.xml b/qqq/android/mobileapp/src/main/res/drawable/subscript.xml new file mode 100644 index 0000000..89f144f --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/subscript.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/editor/subscript/materialicons/black/res/drawable/baseline_subscript_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M22,18h-2v1h3v1h-4v-2c0,-0.55 0.45,-1 1,-1h2v-1h-3v-1h3c0.55,0 1,0.45 1,1v1C23,17.55 22.55,18 22,18zM5.88,18h2.66l3.4,-5.42h0.12l3.4,5.42h2.66l-4.65,-7.27L17.81,4h-2.68l-3.07,4.99h-0.12L8.85,4H6.19l4.32,6.73L5.88,18z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/subscriptions.xml b/qqq/android/mobileapp/src/main/res/drawable/subscriptions.xml new file mode 100644 index 0000000..4978bd2 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/subscriptions.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/av/subscriptions/materialicons/black/res/drawable/baseline_subscriptions_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,8L4,8L4,6h16v2zM18,2L6,2v2h12L18,2zM22,12v8c0,1.1 -0.9,2 -2,2L4,22c-1.1,0 -2,-0.9 -2,-2v-8c0,-1.1 0.9,-2 2,-2h16c1.1,0 2,0.9 2,2zM16,16l-6,-3.27v6.53L16,16z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/subtitles.xml b/qqq/android/mobileapp/src/main/res/drawable/subtitles.xml new file mode 100644 index 0000000..4b95ca8 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/subtitles.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/av/subtitles/materialicons/black/res/drawable/baseline_subtitles_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,4L4,4c-1.1,0 -2,0.9 -2,2v12c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2L22,6c0,-1.1 -0.9,-2 -2,-2zM4,12h4v2L4,14v-2zM14,18L4,18v-2h10v2zM20,18h-4v-2h4v2zM20,14L10,14v-2h10v2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/subtitles_off.xml b/qqq/android/mobileapp/src/main/res/drawable/subtitles_off.xml new file mode 100644 index 0000000..bf7b100 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/subtitles_off.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/subtitles_off/materialicons/black/res/drawable/baseline_subtitles_off_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,4H6.83l8,8H20v2h-3.17l4.93,4.93C21.91,18.65 22,18.34 22,18V6C22,4.9 21.1,4 20,4z" /> + <path + android:fillColor="#FF000000" + android:pathData="M1.04,3.87l1.2,1.2C2.09,5.35 2,5.66 2,6v12c0,1.1 0.9,2 2,2h13.17l2.96,2.96l1.41,-1.41L2.45,2.45L1.04,3.87zM8,12v2H4v-2H8zM14,16.83V18H4v-2h9.17L14,16.83z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/subway.xml b/qqq/android/mobileapp/src/main/res/drawable/subway.xml new file mode 100644 index 0000000..d6f4cbb --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/subway.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/subway/materialicons/black/res/drawable/baseline_subway_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M15.5,16m-1,0a1,1 0,1 1,2 0a1,1 0,1 1,-2 0" /> + <path + android:fillColor="#FF000000" + android:pathData="M8.5,16m-1,0a1,1 0,1 1,2 0a1,1 0,1 1,-2 0" /> + <path + android:fillColor="#FF000000" + android:pathData="M7.01,9h10v5h-10zM17.8,2.8C16,2.09 13.86,2 12,2c-1.86,0 -4,0.09 -5.8,0.8C3.53,3.84 2,6.05 2,8.86L2,22h20L22,8.86c0,-2.81 -1.53,-5.02 -4.2,-6.06zM18,15.88c0,1.45 -1.18,2.62 -2.63,2.62l1.13,1.12L16.5,20L15,20l-1.5,-1.5h-2.83L9.17,20L7.5,20v-0.38l1.12,-1.12C7.18,18.5 6,17.32 6,15.88L6,9c0,-2.63 3,-3 6,-3 3.32,0 6,0.38 6,3v6.88z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/summarize.xml b/qqq/android/mobileapp/src/main/res/drawable/summarize.xml new file mode 100644 index 0000000..3fa0816 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/summarize.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/summarize/materialicons/black/res/drawable/baseline_summarize_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M15,3H5C3.9,3 3.01,3.9 3.01,5L3,19c0,1.1 0.89,2 1.99,2H19c1.1,0 2,-0.9 2,-2V9L15,3zM8,17c-0.55,0 -1,-0.45 -1,-1s0.45,-1 1,-1s1,0.45 1,1S8.55,17 8,17zM8,13c-0.55,0 -1,-0.45 -1,-1s0.45,-1 1,-1s1,0.45 1,1S8.55,13 8,13zM8,9C7.45,9 7,8.55 7,8s0.45,-1 1,-1s1,0.45 1,1S8.55,9 8,9zM14,10V4.5l5.5,5.5H14z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/sunny.xml b/qqq/android/mobileapp/src/main/res/drawable/sunny.xml new file mode 100644 index 0000000..430f2ac --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/sunny.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/home/sunny/materialicons/black/res/drawable/baseline_sunny_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M11,4V2c0,-0.55 0.45,-1 1,-1s1,0.45 1,1v2c0,0.55 -0.45,1 -1,1S11,4.55 11,4zM18.36,7.05l1.41,-1.42c0.39,-0.39 0.39,-1.02 0,-1.41c-0.39,-0.39 -1.02,-0.39 -1.41,0l-1.41,1.42c-0.39,0.39 -0.39,1.02 0,1.41C17.34,7.44 17.97,7.44 18.36,7.05zM22,11h-2c-0.55,0 -1,0.45 -1,1s0.45,1 1,1h2c0.55,0 1,-0.45 1,-1S22.55,11 22,11zM12,19c-0.55,0 -1,0.45 -1,1v2c0,0.55 0.45,1 1,1s1,-0.45 1,-1v-2C13,19.45 12.55,19 12,19zM5.64,7.05L4.22,5.64c-0.39,-0.39 -0.39,-1.03 0,-1.41s1.03,-0.39 1.41,0l1.41,1.41c0.39,0.39 0.39,1.03 0,1.41S6.02,7.44 5.64,7.05zM16.95,16.95c-0.39,0.39 -0.39,1.03 0,1.41l1.41,1.41c0.39,0.39 1.03,0.39 1.41,0c0.39,-0.39 0.39,-1.03 0,-1.41l-1.41,-1.41C17.98,16.56 17.34,16.56 16.95,16.95zM2,13h2c0.55,0 1,-0.45 1,-1s-0.45,-1 -1,-1H2c-0.55,0 -1,0.45 -1,1S1.45,13 2,13zM5.64,19.78l1.41,-1.41c0.39,-0.39 0.39,-1.03 0,-1.41s-1.03,-0.39 -1.41,0l-1.41,1.41c-0.39,0.39 -0.39,1.03 0,1.41C4.61,20.17 5.25,20.17 5.64,19.78zM12,6c-3.31,0 -6,2.69 -6,6s2.69,6 6,6s6,-2.69 6,-6S15.31,6 12,6z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/sunny_snowing.xml b/qqq/android/mobileapp/src/main/res/drawable/sunny_snowing.xml new file mode 100644 index 0000000..a8bd2ae --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/sunny_snowing.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/home/sunny_snowing/materialicons/black/res/drawable/baseline_sunny_snowing_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M13,5h-2V1h2V5zM1,11h4v2H1V11zM19,13v-2h4v2H19zM17.66,7.76l-1.41,-1.41l2.83,-2.83l1.41,1.41L17.66,7.76zM3.51,4.93l1.41,-1.41l2.83,2.83L6.34,7.76L3.51,4.93zM4.75,17c0,0.69 0.56,1.25 1.25,1.25S7.25,17.69 7.25,17S6.69,15.75 6,15.75S4.75,16.31 4.75,17zM16.75,17c0,0.69 0.56,1.25 1.25,1.25s1.25,-0.56 1.25,-1.25s-0.56,-1.25 -1.25,-1.25S16.75,16.31 16.75,17zM7.75,21c0,0.69 0.56,1.25 1.25,1.25s1.25,-0.56 1.25,-1.25S9.69,19.75 9,19.75S7.75,20.31 7.75,21zM10.75,17c0,0.69 0.56,1.25 1.25,1.25s1.25,-0.56 1.25,-1.25s-0.56,-1.25 -1.25,-1.25S10.75,16.31 10.75,17zM13.75,21c0,0.69 0.56,1.25 1.25,1.25s1.25,-0.56 1.25,-1.25s-0.56,-1.25 -1.25,-1.25S13.75,20.31 13.75,21zM17,13l0,-1c0,-2.76 -2.24,-5 -5,-5s-5,2.24 -5,5v1H17z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/superscript.xml b/qqq/android/mobileapp/src/main/res/drawable/superscript.xml new file mode 100644 index 0000000..d64ae1d --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/superscript.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/editor/superscript/materialicons/black/res/drawable/baseline_superscript_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M22,7h-2v1h3v1h-4V7c0,-0.55 0.45,-1 1,-1h2V5h-3V4h3c0.55,0 1,0.45 1,1v1C23,6.55 22.55,7 22,7zM5.88,20h2.66l3.4,-5.42h0.12l3.4,5.42h2.66l-4.65,-7.27L17.81,6h-2.68l-3.07,4.99h-0.12L8.85,6H6.19l4.32,6.73L5.88,20z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/supervised_user_circle.xml b/qqq/android/mobileapp/src/main/res/drawable/supervised_user_circle.xml new file mode 100644 index 0000000..a264ba3 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/supervised_user_circle.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/supervised_user_circle/materialicons/black/res/drawable/baseline_supervised_user_circle_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M11.99,2c-5.52,0 -10,4.48 -10,10s4.48,10 10,10 10,-4.48 10,-10 -4.48,-10 -10,-10zM15.6,8.34c1.07,0 1.93,0.86 1.93,1.93 0,1.07 -0.86,1.93 -1.93,1.93 -1.07,0 -1.93,-0.86 -1.93,-1.93 -0.01,-1.07 0.86,-1.93 1.93,-1.93zM9.6,6.76c1.3,0 2.36,1.06 2.36,2.36 0,1.3 -1.06,2.36 -2.36,2.36s-2.36,-1.06 -2.36,-2.36c0,-1.31 1.05,-2.36 2.36,-2.36zM9.6,15.89v3.75c-2.4,-0.75 -4.3,-2.6 -5.14,-4.96 1.05,-1.12 3.67,-1.69 5.14,-1.69 0.53,0 1.2,0.08 1.9,0.22 -1.64,0.87 -1.9,2.02 -1.9,2.68zM11.99,20c-0.27,0 -0.53,-0.01 -0.79,-0.04v-4.07c0,-1.42 2.94,-2.13 4.4,-2.13 1.07,0 2.92,0.39 3.84,1.15 -1.17,2.97 -4.06,5.09 -7.45,5.09z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/supervisor_account.xml b/qqq/android/mobileapp/src/main/res/drawable/supervisor_account.xml new file mode 100644 index 0000000..f05fad0 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/supervisor_account.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/supervisor_account/materialicons/black/res/drawable/baseline_supervisor_account_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M16.5,12c1.38,0 2.49,-1.12 2.49,-2.5S17.88,7 16.5,7C15.12,7 14,8.12 14,9.5s1.12,2.5 2.5,2.5zM9,11c1.66,0 2.99,-1.34 2.99,-3S10.66,5 9,5C7.34,5 6,6.34 6,8s1.34,3 3,3zM16.5,14c-1.83,0 -5.5,0.92 -5.5,2.75L11,19h11v-2.25c0,-1.83 -3.67,-2.75 -5.5,-2.75zM9,13c-2.33,0 -7,1.17 -7,3.5L2,19h7v-2.25c0,-0.85 0.33,-2.34 2.37,-3.47C10.5,13.1 9.66,13 9,13z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/support.xml b/qqq/android/mobileapp/src/main/res/drawable/support.xml new file mode 100644 index 0000000..54a91b0 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/support.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/support/materialicons/black/res/drawable/baseline_support_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,2C6.48,2 2,6.48 2,12c0,5.52 4.48,10 10,10s10,-4.48 10,-10C22,6.48 17.52,2 12,2zM19.46,9.12l-2.78,1.15c-0.51,-1.36 -1.58,-2.44 -2.95,-2.94l1.15,-2.78C16.98,5.35 18.65,7.02 19.46,9.12zM12,15c-1.66,0 -3,-1.34 -3,-3s1.34,-3 3,-3s3,1.34 3,3S13.66,15 12,15zM9.13,4.54l1.17,2.78c-1.38,0.5 -2.47,1.59 -2.98,2.97L4.54,9.13C5.35,7.02 7.02,5.35 9.13,4.54zM4.54,14.87l2.78,-1.15c0.51,1.38 1.59,2.46 2.97,2.96l-1.17,2.78C7.02,18.65 5.35,16.98 4.54,14.87zM14.88,19.46l-1.15,-2.78c1.37,-0.51 2.45,-1.59 2.95,-2.97l2.78,1.17C18.65,16.98 16.98,18.65 14.88,19.46z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/support_agent.xml b/qqq/android/mobileapp/src/main/res/drawable/support_agent.xml new file mode 100644 index 0000000..9242fe5 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/support_agent.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/notification/support_agent/materialicons/black/res/drawable/baseline_support_agent_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M21,12.22C21,6.73 16.74,3 12,3c-4.69,0 -9,3.65 -9,9.28C2.4,12.62 2,13.26 2,14v2c0,1.1 0.9,2 2,2h1v-6.1c0,-3.87 3.13,-7 7,-7s7,3.13 7,7V19h-8v2h8c1.1,0 2,-0.9 2,-2v-1.22c0.59,-0.31 1,-0.92 1,-1.64v-2.3C22,13.14 21.59,12.53 21,12.22z" /> + <path + android:fillColor="#FF000000" + android:pathData="M9,13m-1,0a1,1 0,1 1,2 0a1,1 0,1 1,-2 0" /> + <path + android:fillColor="#FF000000" + android:pathData="M15,13m-1,0a1,1 0,1 1,2 0a1,1 0,1 1,-2 0" /> + <path + android:fillColor="#FF000000" + android:pathData="M18,11.03C17.52,8.18 15.04,6 12.05,6c-3.03,0 -6.29,2.51 -6.03,6.45c2.47,-1.01 4.33,-3.21 4.86,-5.89C12.19,9.19 14.88,11 18,11.03z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/surfing.xml b/qqq/android/mobileapp/src/main/res/drawable/surfing.xml new file mode 100644 index 0000000..fdce689 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/surfing.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/surfing/materialicons/black/res/drawable/baseline_surfing_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M21,23c-1.03,0 -2.06,-0.25 -3,-0.75h0c-1.89,1 -4.11,1 -6,0c-1.89,1 -4.11,1 -6,0C5.05,22.75 4.03,23 3,23H2l0,-2h1c1.04,0 2.08,-0.35 3,-1c1.83,1.3 4.17,1.3 6,0c1.83,1.3 4.17,1.3 6,0c0.91,0.65 1.96,1 3,1h1v2H21zM17,1.5c-1.1,0 -2,0.9 -2,2s0.9,2 2,2s2,-0.9 2,-2S18.1,1.5 17,1.5zM14.43,8.48L12.18,10L16,13v3.84c0.53,0.38 1.03,0.78 1.49,1.17C16.81,18.59 15.94,19 15,19c-1.2,0 -2.27,-0.66 -3,-1.5c-0.73,0.84 -1.8,1.5 -3,1.5c-0.33,0 -0.65,-0.05 -0.96,-0.14C5.19,16.9 3,14.72 3,13.28C3,12.25 4.01,12 4.85,12c0.98,0 2.28,0.31 3.7,0.83l-0.53,-3.1C7.91,9.06 8.2,8.35 8.8,7.94l2.15,-1.45l-2,-0.37L6.13,8.05L5,6.4L8.5,4l5.55,1.03c0.45,0.09 0.93,0.37 1.22,0.89l0.88,1.55C17.01,8.98 18.64,10 20.5,10v2C17.91,12 15.64,10.58 14.43,8.48zM10.3,11.1l0.44,2.65c0.92,0.42 2.48,1.27 3.26,1.75V14L10.3,11.1z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/surround_sound.xml b/qqq/android/mobileapp/src/main/res/drawable/surround_sound.xml new file mode 100644 index 0000000..6e532bd --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/surround_sound.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/av/surround_sound/materialicons/black/res/drawable/baseline_surround_sound_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,4L4,4c-1.1,0 -2,0.9 -2,2v12c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2L22,6c0,-1.1 -0.9,-2 -2,-2zM7.76,16.24l-1.41,1.41C4.78,16.1 4,14.05 4,12c0,-2.05 0.78,-4.1 2.34,-5.66l1.41,1.41C6.59,8.93 6,10.46 6,12s0.59,3.07 1.76,4.24zM12,16c-2.21,0 -4,-1.79 -4,-4s1.79,-4 4,-4 4,1.79 4,4 -1.79,4 -4,4zM17.66,17.66l-1.41,-1.41C17.41,15.07 18,13.54 18,12s-0.59,-3.07 -1.76,-4.24l1.41,-1.41C19.22,7.9 20,9.95 20,12c0,2.05 -0.78,4.1 -2.34,5.66zM12,10c-1.1,0 -2,0.9 -2,2s0.9,2 2,2 2,-0.9 2,-2 -0.9,-2 -2,-2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/swap_calls.xml b/qqq/android/mobileapp/src/main/res/drawable/swap_calls.xml new file mode 100644 index 0000000..10c8e52 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/swap_calls.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/communication/swap_calls/materialicons/black/res/drawable/baseline_swap_calls_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M18,4l-4,4h3v7c0,1.1 -0.9,2 -2,2s-2,-0.9 -2,-2V8c0,-2.21 -1.79,-4 -4,-4S5,5.79 5,8v7H2l4,4 4,-4H7V8c0,-1.1 0.9,-2 2,-2s2,0.9 2,2v7c0,2.21 1.79,4 4,4s4,-1.79 4,-4V8h3l-4,-4z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/swap_horiz.xml b/qqq/android/mobileapp/src/main/res/drawable/swap_horiz.xml new file mode 100644 index 0000000..c43330c --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/swap_horiz.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/swap_horiz/materialicons/black/res/drawable/baseline_swap_horiz_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M6.99,11L3,15l3.99,4v-3H14v-2H6.99v-3zM21,9l-3.99,-4v3H10v2h7.01v3L21,9z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/swap_horizontal_circle.xml b/qqq/android/mobileapp/src/main/res/drawable/swap_horizontal_circle.xml new file mode 100644 index 0000000..5b606c7 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/swap_horizontal_circle.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/swap_horizontal_circle/materialicons/black/res/drawable/baseline_swap_horizontal_circle_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M22,12c0,-5.52 -4.48,-10 -10,-10S2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10zM15,6.5l3.5,3.5 -3.5,3.5L15,11h-4L11,9h4L15,6.5zM9,17.5L5.5,14 9,10.5L9,13h4v2L9,15v2.5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/swap_vert.xml b/qqq/android/mobileapp/src/main/res/drawable/swap_vert.xml new file mode 100644 index 0000000..5b2163d --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/swap_vert.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/swap_vert/materialicons/black/res/drawable/baseline_swap_vert_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M16,17.01V10h-2v7.01h-3L15,21l4,-3.99h-3zM9,3L5,6.99h3V14h2V6.99h3L9,3z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/swap_vertical_circle.xml b/qqq/android/mobileapp/src/main/res/drawable/swap_vertical_circle.xml new file mode 100644 index 0000000..126eeb8 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/swap_vertical_circle.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/swap_vertical_circle/materialicons/black/res/drawable/baseline_swap_vertical_circle_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM6.5,9L10,5.5 13.5,9L11,9v4L9,13L9,9L6.5,9zM17.5,15L14,18.5 10.5,15L13,15v-4h2v4h2.5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/swipe.xml b/qqq/android/mobileapp/src/main/res/drawable/swipe.xml new file mode 100644 index 0000000..3467dea --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/swipe.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/swipe/materialicons/black/res/drawable/baseline_swipe_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M18.89,14.75l-4.09,-2.04c-0.28,-0.14 -0.58,-0.21 -0.89,-0.21H13v-6C13,5.67 12.33,5 11.5,5S10,5.67 10,6.5v10.74L6.75,16.5c-0.33,-0.07 -0.68,0.03 -0.92,0.28L5,17.62l4.54,4.79C9.92,22.79 10.68,23 11.21,23h6.16c1,0 1.84,-0.73 1.98,-1.72l0.63,-4.46C20.1,15.97 19.66,15.14 18.89,14.75z" /> + <path + android:fillColor="#FF000000" + android:pathData="M20.13,3.87C18.69,2.17 15.6,1 12,1S5.31,2.17 3.87,3.87L2,2v5h5L4.93,4.93c1,-1.29 3.7,-2.43 7.07,-2.43s6.07,1.14 7.07,2.43L17,7h5V2L20.13,3.87z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/swipe_down.xml b/qqq/android/mobileapp/src/main/res/drawable/swipe_down.xml new file mode 100644 index 0000000..e8240fd --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/swipe_down.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/swipe_down/materialicons/black/res/drawable/baseline_swipe_down_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M3.8,12.18c-0.2,-0.86 -0.3,-1.76 -0.3,-2.68c0,-2.84 0.99,-5.45 2.63,-7.5L7.2,3.07C5.82,4.85 5,7.08 5,9.5c0,0.88 0.11,1.74 0.32,2.56l1.62,-1.62L8,11.5L4.5,15L1,11.5l1.06,-1.06L3.8,12.18zM13.85,11.62l-2.68,-5.37c-0.37,-0.74 -1.27,-1.04 -2.01,-0.67C8.41,5.96 8.11,6.86 8.48,7.6l4.81,9.6L10.05,18c-0.33,0.09 -0.59,0.33 -0.7,0.66L9,19.78l6.19,2.25c0.5,0.17 1.28,0.02 1.75,-0.22l5.51,-2.75c0.89,-0.45 1.32,-1.48 1,-2.42l-1.43,-4.27c-0.27,-0.82 -1.04,-1.37 -1.9,-1.37h-4.56c-0.31,0 -0.62,0.07 -0.89,0.21L13.85,11.62" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/swipe_down_alt.xml b/qqq/android/mobileapp/src/main/res/drawable/swipe_down_alt.xml new file mode 100644 index 0000000..4c9e23b --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/swipe_down_alt.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/swipe_down_alt/materialicons/black/res/drawable/baseline_swipe_down_alt_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M13,13.9c2.28,-0.46 4,-2.48 4,-4.9c0,-2.76 -2.24,-5 -5,-5S7,6.24 7,9c0,2.42 1.72,4.44 4,4.9v4.27l-1.59,-1.59L8,18l4,4l4,-4l-1.41,-1.41L13,18.17V13.9z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/swipe_left.xml b/qqq/android/mobileapp/src/main/res/drawable/swipe_left.xml new file mode 100644 index 0000000..a6c20f6 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/swipe_left.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/swipe_left/materialicons/black/res/drawable/baseline_swipe_left_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19.98,16.82l-0.63,4.46C19.21,22.27 18.36,23 17.37,23h-6.16c-0.53,0 -1.29,-0.21 -1.66,-0.59L5,17.62l0.83,-0.84c0.24,-0.24 0.58,-0.35 0.92,-0.28L10,17.24V6.5C10,5.67 10.67,5 11.5,5S13,5.67 13,6.5v6h0.91c0.31,0 0.62,0.07 0.89,0.21l4.09,2.04C19.66,15.14 20.1,15.97 19.98,16.82zM12,2.5c4.74,0 7.67,2.52 8.43,4.5H22c-0.73,-2.88 -4.51,-6 -10,-6C8.78,1 5.82,2.13 3.5,4.02V2H2v5h5V5.5H4.09C6.21,3.64 8.97,2.5 12,2.5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/swipe_left_alt.xml b/qqq/android/mobileapp/src/main/res/drawable/swipe_left_alt.xml new file mode 100644 index 0000000..20ef50d --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/swipe_left_alt.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/swipe_left_alt/materialicons/black/res/drawable/baseline_swipe_left_alt_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M10.1,13c0.46,2.28 2.48,4 4.9,4c2.76,0 5,-2.24 5,-5s-2.24,-5 -5,-5c-2.42,0 -4.44,1.72 -4.9,4H5.83l1.59,-1.59L6,8l-4,4l4,4l1.41,-1.41L5.83,13H10.1z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/swipe_right.xml b/qqq/android/mobileapp/src/main/res/drawable/swipe_right.xml new file mode 100644 index 0000000..72d4b3c --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/swipe_right.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/swipe_right/materialicons/black/res/drawable/baseline_swipe_right_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19.98,16.82l-0.63,4.46C19.21,22.27 18.36,23 17.37,23h-6.16c-0.53,0 -1.29,-0.21 -1.66,-0.59L5,17.62l0.83,-0.84c0.24,-0.24 0.58,-0.35 0.92,-0.28L10,17.24V6.5C10,5.67 10.67,5 11.5,5S13,5.67 13,6.5v6h0.91c0.31,0 0.62,0.07 0.89,0.21l4.09,2.04C19.66,15.14 20.1,15.97 19.98,16.82zM19.91,5.5H17V7h5V2h-1.5v2.02C18.18,2.13 15.22,1 12,1C6.51,1 2.73,4.12 2,7h1.57C4.33,5.02 7.26,2.5 12,2.5C15.03,2.5 17.79,3.64 19.91,5.5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/swipe_right_alt.xml b/qqq/android/mobileapp/src/main/res/drawable/swipe_right_alt.xml new file mode 100644 index 0000000..8bd06c4 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/swipe_right_alt.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/swipe_right_alt/materialicons/black/res/drawable/baseline_swipe_right_alt_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M13.9,11C13.44,8.72 11.42,7 9,7c-2.76,0 -5,2.24 -5,5s2.24,5 5,5c2.42,0 4.44,-1.72 4.9,-4h4.27l-1.59,1.59L18,16l4,-4l-4,-4l-1.41,1.41L18.17,11H13.9z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/swipe_up.xml b/qqq/android/mobileapp/src/main/res/drawable/swipe_up.xml new file mode 100644 index 0000000..69ee134 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/swipe_up.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/swipe_up/materialicons/black/res/drawable/baseline_swipe_up_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M2.06,5.56L1,4.5L4.5,1L8,4.5L6.94,5.56L5.32,3.94C5.11,4.76 5,5.62 5,6.5c0,2.42 0.82,4.65 2.2,6.43L6.13,14C4.49,11.95 3.5,9.34 3.5,6.5c0,-0.92 0.1,-1.82 0.3,-2.68L2.06,5.56zM13.85,11.62l-2.68,-5.37c-0.37,-0.74 -1.27,-1.04 -2.01,-0.67C8.41,5.96 8.11,6.86 8.48,7.6l4.81,9.6L10.05,18c-0.33,0.09 -0.59,0.33 -0.7,0.66L9,19.78l6.19,2.25c0.5,0.17 1.28,0.02 1.75,-0.22l5.51,-2.75c0.89,-0.45 1.32,-1.48 1,-2.42l-1.43,-4.27c-0.27,-0.82 -1.04,-1.37 -1.9,-1.37h-4.56c-0.31,0 -0.62,0.07 -0.89,0.21L13.85,11.62" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/swipe_up_alt.xml b/qqq/android/mobileapp/src/main/res/drawable/swipe_up_alt.xml new file mode 100644 index 0000000..6c4d7ba --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/swipe_up_alt.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/swipe_up_alt/materialicons/black/res/drawable/baseline_swipe_up_alt_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M13,5.83l1.59,1.59L16,6l-4,-4L8,6l1.41,1.41L11,5.83v4.27c-2.28,0.46 -4,2.48 -4,4.9c0,2.76 2.24,5 5,5s5,-2.24 5,-5c0,-2.42 -1.72,-4.44 -4,-4.9V5.83z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/swipe_vertical.xml b/qqq/android/mobileapp/src/main/res/drawable/swipe_vertical.xml new file mode 100644 index 0000000..a18f5e6 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/swipe_vertical.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/swipe_vertical/materialicons/black/res/drawable/baseline_swipe_vertical_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M1,3.5h2.02C1.13,5.82 0,8.78 0,12s1.13,6.18 3.02,8.5H1V22h5v-5H4.5v2.91c-1.86,-2.11 -3,-4.88 -3,-7.91s1.14,-5.79 3,-7.91V7H6V2H1V3.5zM13.85,11.62l-2.68,-5.37c-0.37,-0.74 -1.27,-1.04 -2.01,-0.67C8.41,5.96 8.11,6.86 8.48,7.6l4.81,9.6L10.05,18c-0.33,0.09 -0.59,0.33 -0.7,0.66L9,19.78l6.19,2.25c0.5,0.17 1.28,0.02 1.75,-0.22l5.51,-2.75c0.89,-0.45 1.32,-1.48 1,-2.42l-1.43,-4.27c-0.27,-0.82 -1.04,-1.37 -1.9,-1.37h-4.56c-0.31,0 -0.62,0.07 -0.89,0.21L13.85,11.62" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/switch_access_shortcut.xml b/qqq/android/mobileapp/src/main/res/drawable/switch_access_shortcut.xml new file mode 100644 index 0000000..b8b2431 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/switch_access_shortcut.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/switch_access_shortcut/materialicons/black/res/drawable/baseline_switch_access_shortcut_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M7.06,8.94L5,8l2.06,-0.94L8,5l0.94,2.06L11,8L8.94,8.94L8,11L7.06,8.94zM8,21l0.94,-2.06L11,18l-2.06,-0.94L8,15l-0.94,2.06L5,18l2.06,0.94L8,21zM4.37,12.37L3,13l1.37,0.63L5,15l0.63,-1.37L7,13l-1.37,-0.63L5,11L4.37,12.37zM12,12c0,-2.73 1.08,-5.27 2.75,-7.25L12,2h7v7l-2.82,-2.82C14.84,7.82 14,9.88 14,12c0,3.32 2.1,6.36 5,7.82L19,22C14.91,20.41 12,16.35 12,12z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/switch_access_shortcut_add.xml b/qqq/android/mobileapp/src/main/res/drawable/switch_access_shortcut_add.xml new file mode 100644 index 0000000..ef6b535 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/switch_access_shortcut_add.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/switch_access_shortcut_add/materialicons/black/res/drawable/baseline_switch_access_shortcut_add_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M24,14h-2v-2h-2v2h-2v2h2v2h2v-2h2V14zM7.06,8.94L5,8l2.06,-0.94L8,5l0.94,2.06L11,8L8.94,8.94L8,11L7.06,8.94zM8,21l0.94,-2.06L11,18l-2.06,-0.94L8,15l-0.94,2.06L5,18l2.06,0.94L8,21zM4.37,12.37L3,13l1.37,0.63L5,15l0.63,-1.37L7,13l-1.37,-0.63L5,11L4.37,12.37zM12,12c0,-2.73 1.08,-5.27 2.75,-7.25L12,2h7v7l-2.82,-2.82C14.84,7.82 14,9.88 14,12c0,3.32 2.1,6.36 5,7.82L19,22C14.91,20.41 12,16.35 12,12z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/switch_account.xml b/qqq/android/mobileapp/src/main/res/drawable/switch_account.xml new file mode 100644 index 0000000..db15e48 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/switch_account.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/switch_account/materialicons/black/res/drawable/baseline_switch_account_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M4,6L2,6v14c0,1.1 0.9,2 2,2h14v-2L4,20L4,6zM20,2L8,2c-1.1,0 -2,0.9 -2,2v12c0,1.1 0.9,2 2,2h12c1.1,0 2,-0.9 2,-2L22,4c0,-1.1 -0.9,-2 -2,-2zM14,4c1.66,0 3,1.34 3,3s-1.34,3 -3,3 -3,-1.34 -3,-3 1.34,-3 3,-3zM20,16L8,16v-1.5c0,-1.99 4,-3 6,-3s6,1.01 6,3L20,16z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/switch_camera.xml b/qqq/android/mobileapp/src/main/res/drawable/switch_camera.xml new file mode 100644 index 0000000..7e08104 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/switch_camera.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/switch_camera/materialicons/black/res/drawable/baseline_switch_camera_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,4h-3.17L15,2L9,2L7.17,4L4,4c-1.1,0 -2,0.9 -2,2v12c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2L22,6c0,-1.1 -0.9,-2 -2,-2zM15,15.5L15,13L9,13v2.5L5.5,12 9,8.5L9,11h6L15,8.5l3.5,3.5 -3.5,3.5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/switch_left.xml b/qqq/android/mobileapp/src/main/res/drawable/switch_left.xml new file mode 100644 index 0000000..d3f5a05 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/switch_left.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/navigation/switch_left/materialicons/black/res/drawable/baseline_switch_left_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M8.5,8.62v6.76L5.12,12L8.5,8.62M10,5l-7,7l7,7V5L10,5zM14,5v14l7,-7L14,5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/switch_right.xml b/qqq/android/mobileapp/src/main/res/drawable/switch_right.xml new file mode 100644 index 0000000..fe3bb6c --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/switch_right.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/navigation/switch_right/materialicons/black/res/drawable/baseline_switch_right_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M15.5,15.38V8.62L18.88,12L15.5,15.38M14,19l7,-7l-7,-7V19L14,19zM10,19V5l-7,7L10,19z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/switch_video.xml b/qqq/android/mobileapp/src/main/res/drawable/switch_video.xml new file mode 100644 index 0000000..6256e56 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/switch_video.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/switch_video/materialicons/black/res/drawable/baseline_switch_video_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M18,9.5L18,6c0,-0.55 -0.45,-1 -1,-1L3,5c-0.55,0 -1,0.45 -1,1v12c0,0.55 0.45,1 1,1h14c0.55,0 1,-0.45 1,-1v-3.5l4,4v-13l-4,4zM13,15.5L13,13L7,13v2.5L3.5,12 7,8.5L7,11h6L13,8.5l3.5,3.5 -3.5,3.5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/synagogue.xml b/qqq/android/mobileapp/src/main/res/drawable/synagogue.xml new file mode 100644 index 0000000..447f4bc --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/synagogue.xml @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/synagogue/materialicons/black/res/drawable/baseline_synagogue_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M6,8v13h4v-5c0,-1.1 0.9,-2 2,-2s2,0.9 2,2v5h4V8l-6,-5L6,8zM13.5,10c0,0.83 -0.67,1.5 -1.5,1.5s-1.5,-0.67 -1.5,-1.5s0.67,-1.5 1.5,-1.5S13.5,9.17 13.5,10z" /> + <path + android:fillColor="#FF000000" + android:pathData="M3,5C1.9,5 1,5.9 1,7v1h4V7C5,5.9 4.1,5 3,5z" /> + <path + android:fillColor="#FF000000" + android:pathData="M1,9h4v12h-4z" /> + <path + android:fillColor="#FF000000" + android:pathData="M21,5c-1.1,0 -2,0.9 -2,2v1h4V7C23,5.9 22.1,5 21,5z" /> + <path + android:fillColor="#FF000000" + android:pathData="M19,9h4v12h-4z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/sync.xml b/qqq/android/mobileapp/src/main/res/drawable/sync.xml new file mode 100644 index 0000000..058f964 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/sync.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/notification/sync/materialicons/black/res/drawable/baseline_sync_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,4L12,1L8,5l4,4L12,6c3.31,0 6,2.69 6,6 0,1.01 -0.25,1.97 -0.7,2.8l1.46,1.46C19.54,15.03 20,13.57 20,12c0,-4.42 -3.58,-8 -8,-8zM12,18c-3.31,0 -6,-2.69 -6,-6 0,-1.01 0.25,-1.97 0.7,-2.8L5.24,7.74C4.46,8.97 4,10.43 4,12c0,4.42 3.58,8 8,8v3l4,-4 -4,-4v3z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/sync_alt.xml b/qqq/android/mobileapp/src/main/res/drawable/sync_alt.xml new file mode 100644 index 0000000..eb67f2b --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/sync_alt.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/sync_alt/materialicons/black/res/drawable/baseline_sync_alt_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M18,12l4,-4l-4,-4l0,3l-15,0l0,2l15,0z" /> + <path + android:fillColor="#FF000000" + android:pathData="M6,12l-4,4l4,4l0,-3l15,0l0,-2l-15,0z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/sync_disabled.xml b/qqq/android/mobileapp/src/main/res/drawable/sync_disabled.xml new file mode 100644 index 0000000..6bf41d7 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/sync_disabled.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/notification/sync_disabled/materialicons/black/res/drawable/baseline_sync_disabled_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M10,6.35L10,4.26c-0.8,0.21 -1.55,0.54 -2.23,0.96l1.46,1.46c0.25,-0.12 0.5,-0.24 0.77,-0.33zM2.86,5.41l2.36,2.36C4.45,8.99 4,10.44 4,12c0,2.21 0.91,4.2 2.36,5.64L4,20h6v-6l-2.24,2.24C6.68,15.15 6,13.66 6,12c0,-1 0.25,-1.94 0.68,-2.77l8.08,8.08c-0.25,0.13 -0.5,0.25 -0.77,0.34v2.09c0.8,-0.21 1.55,-0.54 2.23,-0.96l2.36,2.36 1.27,-1.27L4.14,4.14 2.86,5.41zM20,4h-6v6l2.24,-2.24C17.32,8.85 18,10.34 18,12c0,1 -0.25,1.94 -0.68,2.77l1.46,1.46C19.55,15.01 20,13.56 20,12c0,-2.21 -0.91,-4.2 -2.36,-5.64L20,4z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/sync_lock.xml b/qqq/android/mobileapp/src/main/res/drawable/sync_lock.xml new file mode 100644 index 0000000..aa3196f --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/sync_lock.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/notification/sync_lock/materialicons/black/res/drawable/baseline_sync_lock_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M10,4.26v2.09C7.67,7.18 6,9.39 6,12c0,1.77 0.78,3.34 2,4.44V14h2v6H4v-2h2.73C5.06,16.54 4,14.4 4,12C4,8.27 6.55,5.15 10,4.26zM20,4h-6v6h2V7.56c1.22,1.1 2,2.67 2,4.44h2c0,-2.4 -1.06,-4.54 -2.73,-6H20V4zM20,17v-1c0,-1.1 -0.9,-2 -2,-2s-2,0.9 -2,2v1c-0.55,0 -1,0.45 -1,1v3c0,0.55 0.45,1 1,1h4c0.55,0 1,-0.45 1,-1v-3C21,17.45 20.55,17 20,17zM19,17h-2v-1c0,-0.55 0.45,-1 1,-1s1,0.45 1,1V17z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/sync_problem.xml b/qqq/android/mobileapp/src/main/res/drawable/sync_problem.xml new file mode 100644 index 0000000..799ac0c --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/sync_problem.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/notification/sync_problem/materialicons/black/res/drawable/baseline_sync_problem_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M3,12c0,2.21 0.91,4.2 2.36,5.64L3,20h6v-6l-2.24,2.24C5.68,15.15 5,13.66 5,12c0,-2.61 1.67,-4.83 4,-5.65L9,4.26C5.55,5.15 3,8.27 3,12zM11,17h2v-2h-2v2zM21,4h-6v6l2.24,-2.24C18.32,8.85 19,10.34 19,12c0,2.61 -1.67,4.83 -4,5.65v2.09c3.45,-0.89 6,-4.01 6,-7.74 0,-2.21 -0.91,-4.2 -2.36,-5.64L21,4zM11,13h2L13,7h-2v6z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/system_security_update.xml b/qqq/android/mobileapp/src/main/res/drawable/system_security_update.xml new file mode 100644 index 0000000..03b8fef --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/system_security_update.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/system_security_update/materialicons/black/res/drawable/baseline_system_security_update_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M5,3v18c0,1.1 0.9,2 2,2h10c1.1,0 2,-0.9 2,-2V3c0,-1.1 -0.9,-2 -2,-2H7C5.9,1 5,1.9 5,3zM17,18H7V6h10V18zM16,12h-3V8h-2v4H8l4,4L16,12z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/system_security_update_good.xml b/qqq/android/mobileapp/src/main/res/drawable/system_security_update_good.xml new file mode 100644 index 0000000..6dae160 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/system_security_update_good.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/system_security_update_good/materialicons/black/res/drawable/baseline_system_security_update_good_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M17,1H7C5.9,1 5,1.9 5,3v18c0,1.1 0.9,2 2,2h10c1.1,0 2,-0.9 2,-2V3C19,1.9 18.1,1 17,1zM17,18H7V6h10V18zM16,10.05l-1.41,-1.41l-3.54,3.54l-1.41,-1.41l-1.41,1.41L11.05,15L16,10.05z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/system_security_update_warning.xml b/qqq/android/mobileapp/src/main/res/drawable/system_security_update_warning.xml new file mode 100644 index 0000000..fbf403a --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/system_security_update_warning.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/system_security_update_warning/materialicons/black/res/drawable/baseline_system_security_update_warning_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M11,15h2v2h-2z" /> + <path + android:fillColor="#FF000000" + android:pathData="M11,7h2v6h-2z" /> + <path + android:fillColor="#FF000000" + android:pathData="M17,1H7C5.9,1 5.01,1.9 5.01,3v18c0,1.1 0.89,2 1.99,2h10c1.1,0 2,-0.9 2,-2V3C19,1.9 18.1,1 17,1zM17,18H7V6h10V18z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/system_update.xml b/qqq/android/mobileapp/src/main/res/drawable/system_update.xml new file mode 100644 index 0000000..b6c37df --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/system_update.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/notification/system_update/materialicons/black/res/drawable/baseline_system_update_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M17,1.01L7,1c-1.1,0 -2,0.9 -2,2v18c0,1.1 0.9,2 2,2h10c1.1,0 2,-0.9 2,-2L19,3c0,-1.1 -0.9,-1.99 -2,-1.99zM17,19L7,19L7,5h10v14zM16,13h-3L13,8h-2v5L8,13l4,4 4,-4z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/system_update_alt.xml b/qqq/android/mobileapp/src/main/res/drawable/system_update_alt.xml new file mode 100644 index 0000000..3124417 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/system_update_alt.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/system_update_alt/materialicons/black/res/drawable/baseline_system_update_alt_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,16.5l4,-4h-3v-9h-2v9L8,12.5l4,4zM21,3.5h-6v1.99h6v14.03L3,19.52L3,5.49h6L9,3.5L3,3.5c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h18c1.1,0 2,-0.9 2,-2v-14c0,-1.1 -0.9,-2 -2,-2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/tab.xml b/qqq/android/mobileapp/src/main/res/drawable/tab.xml new file mode 100644 index 0000000..c8750f7 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/tab.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/tab/materialicons/black/res/drawable/baseline_tab_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M21,3L3,3c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h18c1.1,0 2,-0.9 2,-2L23,5c0,-1.1 -0.9,-2 -2,-2zM21,19L3,19L3,5h10v4h8v10z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/tab_unselected.xml b/qqq/android/mobileapp/src/main/res/drawable/tab_unselected.xml new file mode 100644 index 0000000..496afda --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/tab_unselected.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/tab_unselected/materialicons/black/res/drawable/baseline_tab_unselected_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M1,9h2L3,7L1,7v2zM1,13h2v-2L1,11v2zM1,5h2L3,3c-1.1,0 -2,0.9 -2,2zM9,21h2v-2L9,19v2zM1,17h2v-2L1,15v2zM3,21v-2L1,19c0,1.1 0.9,2 2,2zM21,3h-8v6h10L23,5c0,-1.1 -0.9,-2 -2,-2zM21,17h2v-2h-2v2zM9,5h2L11,3L9,3v2zM5,21h2v-2L5,19v2zM5,5h2L7,3L5,3v2zM21,21c1.1,0 2,-0.9 2,-2h-2v2zM21,13h2v-2h-2v2zM13,21h2v-2h-2v2zM17,21h2v-2h-2v2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/table_bar.xml b/qqq/android/mobileapp/src/main/res/drawable/table_bar.xml new file mode 100644 index 0000000..5dd8f51 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/table_bar.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/search/table_bar/materialicons/black/res/drawable/baseline_table_bar_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M22,7.5C22,5.57 17.52,4 12,4S2,5.57 2,7.5c0,1.81 3.95,3.31 9,3.48V15H9.35c-0.82,0 -1.55,0.5 -1.86,1.26L6,20h2l1.2,-3h5.6l1.2,3h2l-1.5,-3.74C16.2,15.5 15.46,15 14.65,15H13v-4.02C18.05,10.81 22,9.31 22,7.5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/table_chart.xml b/qqq/android/mobileapp/src/main/res/drawable/table_chart.xml new file mode 100644 index 0000000..9b2def4 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/table_chart.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/editor/table_chart/materialicons/black/res/drawable/baseline_table_chart_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M10,10.02h5L15,21h-5zM17,21h3c1.1,0 2,-0.9 2,-2v-9h-5v11zM20,3L5,3c-1.1,0 -2,0.9 -2,2v3h19L22,5c0,-1.1 -0.9,-2 -2,-2zM3,19c0,1.1 0.9,2 2,2h3L8,10L3,10v9z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/table_restaurant.xml b/qqq/android/mobileapp/src/main/res/drawable/table_restaurant.xml new file mode 100644 index 0000000..d7d4e28 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/table_restaurant.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/search/table_restaurant/materialicons/black/res/drawable/baseline_table_restaurant_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M21.96,9.73l-1.43,-5C20.41,4.3 20.02,4 19.57,4H4.43C3.98,4 3.59,4.3 3.47,4.73l-1.43,5C1.86,10.36 2.34,11 3,11h2.2L4,20h2l0.67,-5h10.67L18,20h2l-1.2,-9H21C21.66,11 22.14,10.36 21.96,9.73zM6.93,13l0.27,-2h9.6l0.27,2H6.93z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/table_rows.xml b/qqq/android/mobileapp/src/main/res/drawable/table_rows.xml new file mode 100644 index 0000000..6f36fbb --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/table_rows.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/editor/table_rows/materialicons/black/res/drawable/baseline_table_rows_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M21,8H3V4h18V8zM21,10H3v4h18V10zM21,16H3v4h18V16z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/table_view.xml b/qqq/android/mobileapp/src/main/res/drawable/table_view.xml new file mode 100644 index 0000000..51131d2 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/table_view.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/table_view/materialicons/black/res/drawable/baseline_table_view_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19,7H9C7.9,7 7,7.9 7,9v10c0,1.1 0.9,2 2,2h10c1.1,0 2,-0.9 2,-2V9C21,7.9 20.1,7 19,7zM19,9v2H9V9H19zM13,15v-2h2v2H13zM15,17v2h-2v-2H15zM11,15H9v-2h2V15zM17,13h2v2h-2V13zM9,17h2v2H9V17zM17,19v-2h2v2H17zM6,17H5c-1.1,0 -2,-0.9 -2,-2V5c0,-1.1 0.9,-2 2,-2h10c1.1,0 2,0.9 2,2v1h-2V5H5v10h1V17z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/tablet.xml b/qqq/android/mobileapp/src/main/res/drawable/tablet.xml new file mode 100644 index 0000000..4f1bcd8 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/tablet.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/hardware/tablet/materialicons/black/res/drawable/baseline_tablet_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M21,4L3,4c-1.1,0 -2,0.9 -2,2v12c0,1.1 0.9,2 2,2h18c1.1,0 1.99,-0.9 1.99,-2L23,6c0,-1.1 -0.9,-2 -2,-2zM19,18L5,18L5,6h14v12z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/tablet_android.xml b/qqq/android/mobileapp/src/main/res/drawable/tablet_android.xml new file mode 100644 index 0000000..10a3ab3 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/tablet_android.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/hardware/tablet_android/materialicons/black/res/drawable/baseline_tablet_android_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M18,0H6C4.34,0 3,1.34 3,3v18c0,1.66 1.34,3 3,3h12c1.66,0 3,-1.34 3,-3V3C21,1.34 19.66,0 18,0zM14,22h-4v-1h4V22zM19.25,19H4.75V3h14.5V19z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/tablet_mac.xml b/qqq/android/mobileapp/src/main/res/drawable/tablet_mac.xml new file mode 100644 index 0000000..6034a3a --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/tablet_mac.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/hardware/tablet_mac/materialicons/black/res/drawable/baseline_tablet_mac_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M18.5,0h-14C3.12,0 2,1.12 2,2.5v19C2,22.88 3.12,24 4.5,24h14c1.38,0 2.5,-1.12 2.5,-2.5v-19C21,1.12 19.88,0 18.5,0zM11.5,23c-0.83,0 -1.5,-0.67 -1.5,-1.5s0.67,-1.5 1.5,-1.5 1.5,0.67 1.5,1.5 -0.67,1.5 -1.5,1.5zM19,19L4,19L4,3h15v16z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/tag.xml b/qqq/android/mobileapp/src/main/res/drawable/tag.xml new file mode 100644 index 0000000..b882c9f --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/tag.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/content/tag/materialicons/black/res/drawable/baseline_tag_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,10L20,8h-4L16,4h-2v4h-4L10,4L8,4v4L4,8v2h4v4L4,14v2h4v4h2v-4h4v4h2v-4h4v-2h-4v-4h4zM14,14h-4v-4h4v4z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/tag_faces.xml b/qqq/android/mobileapp/src/main/res/drawable/tag_faces.xml new file mode 100644 index 0000000..b7b0a3c --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/tag_faces.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/tag_faces/materialicons/black/res/drawable/baseline_tag_faces_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M11.99,2C6.47,2 2,6.48 2,12s4.47,10 9.99,10C17.52,22 22,17.52 22,12S17.52,2 11.99,2zM12,20c-4.42,0 -8,-3.58 -8,-8s3.58,-8 8,-8 8,3.58 8,8 -3.58,8 -8,8zM15.5,11c0.83,0 1.5,-0.67 1.5,-1.5S16.33,8 15.5,8 14,8.67 14,9.5s0.67,1.5 1.5,1.5zM8.5,11c0.83,0 1.5,-0.67 1.5,-1.5S9.33,8 8.5,8 7,8.67 7,9.5 7.67,11 8.5,11zM12,17.5c2.33,0 4.31,-1.46 5.11,-3.5L6.89,14c0.8,2.04 2.78,3.5 5.11,3.5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/takeout_dining.xml b/qqq/android/mobileapp/src/main/res/drawable/takeout_dining.xml new file mode 100644 index 0000000..d28237d --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/takeout_dining.xml @@ -0,0 +1,20 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/takeout_dining/materialicons/black/res/drawable/baseline_takeout_dining_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M5.26,11h13.48l-0.67,9H5.93L5.26,11zM9.02,4h5.95L19,7.38l1.59,-1.59L22,7.21L19.21,10H4.79L2,7.21l1.41,-1.41L5,7.38L9.02,4z" + android:fillType="evenOdd" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/tap_and_play.xml b/qqq/android/mobileapp/src/main/res/drawable/tap_and_play.xml new file mode 100644 index 0000000..8ddd082 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/tap_and_play.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/notification/tap_and_play/materialicons/black/res/drawable/baseline_tap_and_play_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M2,16v2c2.76,0 5,2.24 5,5h2c0,-3.87 -3.13,-7 -7,-7zM2,20v3h3c0,-1.66 -1.34,-3 -3,-3zM2,12v2c4.97,0 9,4.03 9,9h2c0,-6.08 -4.92,-11 -11,-11zM17,1.01L7,1c-1.1,0 -2,0.9 -2,2v7.37c0.69,0.16 1.36,0.37 2,0.64L7,5h10v13h-3.03c0.52,1.25 0.84,2.59 0.95,4L17,22c1.1,0 2,-0.9 2,-2L19,3c0,-1.1 -0.9,-1.99 -2,-1.99z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/tapas.xml b/qqq/android/mobileapp/src/main/res/drawable/tapas.xml new file mode 100644 index 0000000..5201864 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/tapas.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/places/tapas/materialicons/black/res/drawable/baseline_tapas_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M22,10V1h-8v9c0,1.86 1.28,3.41 3,3.86V21h-2v2h6v-2h-2v-7.14C20.72,13.41 22,11.86 22,10zM20,3v3h-4V3H20zM12.5,11.5c0,1.38 -1.12,2.5 -2.5,2.5H8v9H6v-9H4c-1.38,0 -2.5,-1.12 -2.5,-2.5C1.5,10.12 2.62,9 4,9h2V8H4C2.62,8 1.5,6.88 1.5,5.5C1.5,4.12 2.62,3 4,3h2V1h2v2h2c1.38,0 2.5,1.12 2.5,2.5C12.5,6.88 11.38,8 10,8H8v1h2C11.38,9 12.5,10.12 12.5,11.5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/task.xml b/qqq/android/mobileapp/src/main/res/drawable/task.xml new file mode 100644 index 0000000..062f00d --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/task.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/task/materialicons/black/res/drawable/baseline_task_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M14,2H6C4.9,2 4.01,2.9 4.01,4L4,20c0,1.1 0.89,2 1.99,2H18c1.1,0 2,-0.9 2,-2V8L14,2zM10.94,18L7.4,14.46l1.41,-1.41l2.12,2.12l4.24,-4.24l1.41,1.41L10.94,18zM13,9V3.5L18.5,9H13z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/task_alt.xml b/qqq/android/mobileapp/src/main/res/drawable/task_alt.xml new file mode 100644 index 0000000..09037be --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/task_alt.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/task_alt/materialicons/black/res/drawable/baseline_task_alt_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M22,5.18L10.59,16.6l-4.24,-4.24l1.41,-1.41l2.83,2.83l10,-10L22,5.18zM19.79,10.22C19.92,10.79 20,11.39 20,12c0,4.42 -3.58,8 -8,8s-8,-3.58 -8,-8c0,-4.42 3.58,-8 8,-8c1.58,0 3.04,0.46 4.28,1.25l1.44,-1.44C16.1,2.67 14.13,2 12,2C6.48,2 2,6.48 2,12c0,5.52 4.48,10 10,10s10,-4.48 10,-10c0,-1.19 -0.22,-2.33 -0.6,-3.39L19.79,10.22z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/taxi_alert.xml b/qqq/android/mobileapp/src/main/res/drawable/taxi_alert.xml new file mode 100644 index 0000000..e61ce98 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/taxi_alert.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/taxi_alert/materialicons/black/res/drawable/baseline_taxi_alert_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M23,8A7,7 0,0 0,9.68 5L7,5v2L4.5,7a1.5,1.5 0,0 0,-1.42 1.01L1,14v8a1,1 0,0 0,1 1h1a1,1 0,0 0,1 -1v-1h12v1a1,1 0,0 0,1 1h1a1,1 0,0 0,1 -1v-7.68A7.01,7.01 0,0 0,23 8zM4.5,8.5h4.53a6.93,6.93 0,0 0,2.08 4.5L3,13l1.5,-4.5zM4.5,18a1.5,1.5 0,1 1,0 -3,1.5 1.5,0 0,1 0,3zM15.5,18a1.5,1.5 0,1 1,0 -3,1.5 1.5,0 0,1 0,3zM18.43,12.37l-0.21,0.11 -0.18,0.09a4.97,4.97 0,0 1,-0.42 0.16l-0.22,0.07 -0.23,0.06 -0.2,0.05a5,5 0,0 1,-5.94 -4.41A4.07,4.07 0,0 1,11 8l0.02,-0.47 0.02,-0.17 0.04,-0.28 0.04,-0.21 0.05,-0.21 0.07,-0.24 0.05,-0.13a4.99,4.99 0,0 1,9.69 1.7,4.96 4.96,0 0,1 -2.55,4.38zM15,4h2v5h-2zM15,10h2v2h-2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/temple_buddhist.xml b/qqq/android/mobileapp/src/main/res/drawable/temple_buddhist.xml new file mode 100644 index 0000000..078bf8e --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/temple_buddhist.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/temple_buddhist/materialicons/black/res/drawable/baseline_temple_buddhist_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M21,9.02c0,1.09 -0.89,1.98 -1.98,1.98H4.98C3.89,11 3,10.11 3,9.02H1c0,1.86 1.28,3.4 3,3.84V22h6v-3c0,-1.1 0.9,-2 2,-2s2,0.9 2,2v3h6v-9.14c0.55,-0.14 3,-1.04 3,-3.86L21,9.02z" /> + <path + android:fillColor="#FF000000" + android:pathData="M6,8.86V10h12V8.86c0.55,-0.14 3,-1.04 3,-3.86l-2,0.02C19,6.11 18.11,7 17.02,7H6.98C5.89,7 5,6.11 5,5.02H3C3,6.87 4.28,8.42 6,8.86z" /> + <path + android:fillColor="#FF000000" + android:pathData="M12,1l-3.75,5l7.5,0z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/temple_hindu.xml b/qqq/android/mobileapp/src/main/res/drawable/temple_hindu.xml new file mode 100644 index 0000000..19aed68 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/temple_hindu.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/temple_hindu/materialicons/black/res/drawable/baseline_temple_hindu_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M6.6,11l10.8,0l-0.9,-3l-9,0z" /> + <path + android:fillColor="#FF000000" + android:pathData="M20,11l0,2l-16,0l0,-2l-2,0l0,11l8,0l0,-5l4,0l0,5l8,0l0,-11z" /> + <path + android:fillColor="#FF000000" + android:pathData="M15.9,6l-0.9,-3l0,-2l-2,0l0,2l-2.03,0l0,-2l-2,0l0,2.12l-0.87,2.88z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/terminal.xml b/qqq/android/mobileapp/src/main/res/drawable/terminal.xml new file mode 100644 index 0000000..35fce87 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/terminal.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/terminal/materialicons/black/res/drawable/baseline_terminal_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,4H4C2.89,4 2,4.9 2,6v12c0,1.1 0.89,2 2,2h16c1.1,0 2,-0.9 2,-2V6C22,4.9 21.11,4 20,4zM20,18H4V8h16V18zM18,17h-6v-2h6V17zM7.5,17l-1.41,-1.41L8.67,13l-2.59,-2.59L7.5,9l4,4L7.5,17z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/terrain.xml b/qqq/android/mobileapp/src/main/res/drawable/terrain.xml new file mode 100644 index 0000000..10acd8b --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/terrain.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/terrain/materialicons/black/res/drawable/baseline_terrain_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M14,6l-3.75,5 2.85,3.8 -1.6,1.2C9.81,13.75 7,10 7,10l-6,8h22L14,6z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/text_decrease.xml b/qqq/android/mobileapp/src/main/res/drawable/text_decrease.xml new file mode 100644 index 0000000..842306e --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/text_decrease.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/editor/text_decrease/materialicons/black/res/drawable/baseline_text_decrease_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M0.99,19h2.42l1.27,-3.58h5.65L11.59,19h2.42L8.75,5h-2.5L0.99,19zM5.41,13.39L7.44,7.6h0.12l2.03,5.79H5.41zM23,11v2h-8v-2H23z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/text_fields.xml b/qqq/android/mobileapp/src/main/res/drawable/text_fields.xml new file mode 100644 index 0000000..0fd091c --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/text_fields.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/editor/text_fields/materialicons/black/res/drawable/baseline_text_fields_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M2.5,4v3h5v12h3V7h5V4H2.5zM21.5,9h-9v3h3v7h3v-7h3V9z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/text_format.xml b/qqq/android/mobileapp/src/main/res/drawable/text_format.xml new file mode 100644 index 0000000..8e6a7ba --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/text_format.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/content/text_format/materialicons/black/res/drawable/baseline_text_format_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M5,17v2h14v-2L5,17zM9.5,12.8h5l0.9,2.2h2.1L12.75,4h-1.5L6.5,15h2.1l0.9,-2.2zM12,5.98L13.87,11h-3.74L12,5.98z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/text_increase.xml b/qqq/android/mobileapp/src/main/res/drawable/text_increase.xml new file mode 100644 index 0000000..5fd8d06 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/text_increase.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/editor/text_increase/materialicons/black/res/drawable/baseline_text_increase_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M0.99,19h2.42l1.27,-3.58h5.65L11.59,19h2.42L8.75,5h-2.5L0.99,19zM5.41,13.39L7.44,7.6h0.12l2.03,5.79H5.41zM20,11h3v2h-3v3h-2v-3h-3v-2h3V8h2V11z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/text_rotate_up.xml b/qqq/android/mobileapp/src/main/res/drawable/text_rotate_up.xml new file mode 100644 index 0000000..74a458a --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/text_rotate_up.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/text_rotate_up/materialicons/black/res/drawable/baseline_text_rotate_up_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M3,12v1.5l11,4.75v-2.1l-2.2,-0.9v-5l2.2,-0.9v-2.1L3,12zM10,14.62l-5.02,-1.87L10,10.88v3.74zM18,4.25l-3,3h2v12.5h2L19,7.25h2l-3,-3z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/text_rotate_vertical.xml b/qqq/android/mobileapp/src/main/res/drawable/text_rotate_vertical.xml new file mode 100644 index 0000000..21ec8d2 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/text_rotate_vertical.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/text_rotate_vertical/materialicons/black/res/drawable/baseline_text_rotate_vertical_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M15.75,5h-1.5L9.5,16h2.1l0.9,-2.2h5l0.9,2.2h2.1L15.75,5zM13.13,12L15,6.98 16.87,12h-3.74zM6,19.75l3,-3L7,16.75L7,4.25L5,4.25v12.5L3,16.75l3,3z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/text_rotation_angledown.xml b/qqq/android/mobileapp/src/main/res/drawable/text_rotation_angledown.xml new file mode 100644 index 0000000..749c6bf --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/text_rotation_angledown.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/text_rotation_angledown/materialicons/black/res/drawable/baseline_text_rotation_angledown_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19.4,4.91l-1.06,-1.06L7.2,8.27l1.48,1.48 2.19,-0.92 3.54,3.54 -0.92,2.19 1.48,1.48L19.4,4.91zM12.59,8.01l4.87,-2.23 -2.23,4.87 -2.64,-2.64zM14.27,21v-4.24l-1.41,1.41 -8.84,-8.84 -1.42,1.42 8.84,8.84L10.03,21h4.24z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/text_rotation_angleup.xml b/qqq/android/mobileapp/src/main/res/drawable/text_rotation_angleup.xml new file mode 100644 index 0000000..83cd6b4 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/text_rotation_angleup.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/text_rotation_angleup/materialicons/black/res/drawable/baseline_text_rotation_angleup_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M4.49,4.21L3.43,5.27 7.85,16.4l1.48,-1.48 -0.92,-2.19 3.54,-3.54 2.19,0.92 1.48,-1.48L4.49,4.21zM7.58,11.01L5.36,6.14l4.87,2.23 -2.65,2.64zM20.57,9.33h-4.24l1.41,1.41 -8.84,8.84L10.32,21l8.84,-8.84 1.41,1.41L20.57,9.33z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/text_rotation_down.xml b/qqq/android/mobileapp/src/main/res/drawable/text_rotation_down.xml new file mode 100644 index 0000000..23a4e98 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/text_rotation_down.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/text_rotation_down/materialicons/black/res/drawable/baseline_text_rotation_down_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M21,12v-1.5L10,5.75v2.1l2.2,0.9v5l-2.2,0.9v2.1L21,12zM14,9.38l5.02,1.87L14,13.12L14,9.38zM6,19.75l3,-3L7,16.75L7,4.25L5,4.25v12.5L3,16.75l3,3z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/text_rotation_none.xml b/qqq/android/mobileapp/src/main/res/drawable/text_rotation_none.xml new file mode 100644 index 0000000..507fdfa --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/text_rotation_none.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/text_rotation_none/materialicons/black/res/drawable/baseline_text_rotation_none_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12.75,3h-1.5L6.5,14h2.1l0.9,-2.2h5l0.9,2.2h2.1L12.75,3zM10.13,10L12,4.98 13.87,10h-3.74zM20.5,18l-3,-3v2L5,17v2h12.5v2l3,-3z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/text_snippet.xml b/qqq/android/mobileapp/src/main/res/drawable/text_snippet.xml new file mode 100644 index 0000000..3ac4a3a --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/text_snippet.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/file/text_snippet/materialicons/black/res/drawable/baseline_text_snippet_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20.41,8.41l-4.83,-4.83C15.21,3.21 14.7,3 14.17,3H5C3.9,3 3,3.9 3,5v14c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2V9.83C21,9.3 20.79,8.79 20.41,8.41zM7,7h7v2H7V7zM17,17H7v-2h10V17zM17,13H7v-2h10V13z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/textsms.xml b/qqq/android/mobileapp/src/main/res/drawable/textsms.xml new file mode 100644 index 0000000..692562c --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/textsms.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/communication/textsms/materialicons/black/res/drawable/baseline_textsms_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,2L4,2c-1.1,0 -1.99,0.9 -1.99,2L2,22l4,-4h14c1.1,0 2,-0.9 2,-2L22,4c0,-1.1 -0.9,-2 -2,-2zM9,11L7,11L7,9h2v2zM13,11h-2L11,9h2v2zM17,11h-2L15,9h2v2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/texture.xml b/qqq/android/mobileapp/src/main/res/drawable/texture.xml new file mode 100644 index 0000000..581c665 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/texture.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/texture/materialicons/black/res/drawable/baseline_texture_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19.51,3.08L3.08,19.51c0.09,0.34 0.27,0.65 0.51,0.9 0.25,0.24 0.56,0.42 0.9,0.51L20.93,4.49c-0.19,-0.69 -0.73,-1.23 -1.42,-1.41zM11.88,3L3,11.88v2.83L14.71,3h-2.83zM5,3c-1.1,0 -2,0.9 -2,2v2l4,-4L5,3zM19,21c0.55,0 1.05,-0.22 1.41,-0.59 0.37,-0.36 0.59,-0.86 0.59,-1.41v-2l-4,4h2zM9.29,21h2.83L21,12.12L21,9.29L9.29,21z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/theater_comedy.xml b/qqq/android/mobileapp/src/main/res/drawable/theater_comedy.xml new file mode 100644 index 0000000..b3aa75d --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/theater_comedy.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/theater_comedy/materialicons/black/res/drawable/baseline_theater_comedy_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M2,16.5C2,19.54 4.46,22 7.5,22s5.5,-2.46 5.5,-5.5V10H2V16.5zM7.5,18.5C6.12,18.5 5,17.83 5,17h5C10,17.83 8.88,18.5 7.5,18.5zM10,13c0.55,0 1,0.45 1,1c0,0.55 -0.45,1 -1,1s-1,-0.45 -1,-1C9,13.45 9.45,13 10,13zM5,13c0.55,0 1,0.45 1,1c0,0.55 -0.45,1 -1,1s-1,-0.45 -1,-1C4,13.45 4.45,13 5,13z" /> + <path + android:fillColor="#FF000000" + android:pathData="M11,3v6h3v2.5c0,-0.83 1.12,-1.5 2.5,-1.5c1.38,0 2.5,0.67 2.5,1.5h-5V14v0.39c0.75,0.38 1.6,0.61 2.5,0.61c3.04,0 5.5,-2.46 5.5,-5.5V3H11zM14,8.08c-0.55,0 -1,-0.45 -1,-1c0,-0.55 0.45,-1 1,-1s1,0.45 1,1C15,7.64 14.55,8.08 14,8.08zM19,8.08c-0.55,0 -1,-0.45 -1,-1c0,-0.55 0.45,-1 1,-1s1,0.45 1,1C20,7.64 19.55,8.08 19,8.08z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/theaters.xml b/qqq/android/mobileapp/src/main/res/drawable/theaters.xml new file mode 100644 index 0000000..3288303 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/theaters.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/theaters/materialicons/black/res/drawable/baseline_theaters_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M18,3v2h-2L16,3L8,3v2L6,5L6,3L4,3v18h2v-2h2v2h8v-2h2v2h2L20,3h-2zM8,17L6,17v-2h2v2zM8,13L6,13v-2h2v2zM8,9L6,9L6,7h2v2zM18,17h-2v-2h2v2zM18,13h-2v-2h2v2zM18,9h-2L16,7h2v2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/thermostat.xml b/qqq/android/mobileapp/src/main/res/drawable/thermostat.xml new file mode 100644 index 0000000..2f7b3ec --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/thermostat.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/thermostat/materialicons/black/res/drawable/baseline_thermostat_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M15,13V5c0,-1.66 -1.34,-3 -3,-3S9,3.34 9,5v8c-1.21,0.91 -2,2.37 -2,4c0,2.76 2.24,5 5,5s5,-2.24 5,-5C17,15.37 16.21,13.91 15,13zM11,11V5c0,-0.55 0.45,-1 1,-1s1,0.45 1,1v1h-1v1h1v1v1h-1v1h1v1H11z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/thermostat_auto.xml b/qqq/android/mobileapp/src/main/res/drawable/thermostat_auto.xml new file mode 100644 index 0000000..c3e5eaa --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/thermostat_auto.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/thermostat_auto/materialicons/black/res/drawable/baseline_thermostat_auto_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M11,12V6c0,-1.66 -1.34,-3 -3,-3S5,4.34 5,6v6c-1.21,0.91 -2,2.37 -2,4c0,1.12 0.38,2.14 1,2.97V19h0.02c0.91,1.21 2.35,2 3.98,2s3.06,-0.79 3.98,-2H12v-0.03c0.62,-0.83 1,-1.85 1,-2.97C13,14.37 12.21,12.91 11,12zM5,16c0,-0.94 0.45,-1.84 1.2,-2.4L7,13V6c0,-0.55 0.45,-1 1,-1s1,0.45 1,1v7l0.8,0.6c0.75,0.57 1.2,1.46 1.2,2.4H5zM18.62,4h-1.61l-3.38,9h1.56L16,10.7h3.63l0.8,2.3H22L18.62,4zM16.47,9.39l1.31,-3.72h0.08l1.31,3.72H16.47z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/thumb_down.xml b/qqq/android/mobileapp/src/main/res/drawable/thumb_down.xml new file mode 100644 index 0000000..e2643bb --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/thumb_down.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/thumb_down/materialicons/black/res/drawable/baseline_thumb_down_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M15,3L6,3c-0.83,0 -1.54,0.5 -1.84,1.22l-3.02,7.05c-0.09,0.23 -0.14,0.47 -0.14,0.73v2c0,1.1 0.9,2 2,2h6.31l-0.95,4.57 -0.03,0.32c0,0.41 0.17,0.79 0.44,1.06L9.83,23l6.59,-6.59c0.36,-0.36 0.58,-0.86 0.58,-1.41L17,5c0,-1.1 -0.9,-2 -2,-2zM19,3v12h4L23,3h-4z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/thumb_down_alt.xml b/qqq/android/mobileapp/src/main/res/drawable/thumb_down_alt.xml new file mode 100644 index 0000000..d313a5d --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/thumb_down_alt.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/thumb_down_alt/materialicons/black/res/drawable/baseline_thumb_down_alt_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M22,4h-2c-0.55,0 -1,0.45 -1,1v9c0,0.55 0.45,1 1,1h2V4zM2.17,11.12c-0.11,0.25 -0.17,0.52 -0.17,0.8V13c0,1.1 0.9,2 2,2h5.5l-0.92,4.65c-0.05,0.22 -0.02,0.46 0.08,0.66 0.23,0.45 0.52,0.86 0.88,1.22L10,22l6.41,-6.41c0.38,-0.38 0.59,-0.89 0.59,-1.42V6.34C17,5.05 15.95,4 14.66,4h-8.1c-0.71,0 -1.36,0.37 -1.72,0.97l-2.67,6.15z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/thumb_down_off_alt.xml b/qqq/android/mobileapp/src/main/res/drawable/thumb_down_off_alt.xml new file mode 100644 index 0000000..7d0db4e --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/thumb_down_off_alt.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/thumb_down_off_alt/materialicons/black/res/drawable/baseline_thumb_down_off_alt_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M10.89,18.28l0.57,-2.89c0.12,-0.59 -0.04,-1.2 -0.42,-1.66 -0.38,-0.46 -0.94,-0.73 -1.54,-0.73L4,13v-1.08L6.57,6h8.09c0.18,0 0.34,0.16 0.34,0.34v7.84l-4.11,4.1M10,22l6.41,-6.41c0.38,-0.38 0.59,-0.89 0.59,-1.42L17,6.34C17,5.05 15.95,4 14.66,4h-8.1c-0.71,0 -1.36,0.37 -1.72,0.97l-2.67,6.15c-0.11,0.25 -0.17,0.52 -0.17,0.8L2,13c0,1.1 0.9,2 2,2h5.5l-0.92,4.65c-0.05,0.22 -0.02,0.46 0.08,0.66 0.23,0.45 0.52,0.86 0.88,1.22L10,22zM20,15h2L22,4h-2c-0.55,0 -1,0.45 -1,1v9c0,0.55 0.45,1 1,1z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/thumb_up.xml b/qqq/android/mobileapp/src/main/res/drawable/thumb_up.xml new file mode 100644 index 0000000..94eecf5 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/thumb_up.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/thumb_up/materialicons/black/res/drawable/baseline_thumb_up_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M1,21h4L5,9L1,9v12zM23,10c0,-1.1 -0.9,-2 -2,-2h-6.31l0.95,-4.57 0.03,-0.32c0,-0.41 -0.17,-0.79 -0.44,-1.06L14.17,1 7.59,7.59C7.22,7.95 7,8.45 7,9v10c0,1.1 0.9,2 2,2h9c0.83,0 1.54,-0.5 1.84,-1.22l3.02,-7.05c0.09,-0.23 0.14,-0.47 0.14,-0.73v-2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/thumb_up_alt.xml b/qqq/android/mobileapp/src/main/res/drawable/thumb_up_alt.xml new file mode 100644 index 0000000..a5c61a1 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/thumb_up_alt.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/thumb_up_alt/materialicons/black/res/drawable/baseline_thumb_up_alt_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M2,20h2c0.55,0 1,-0.45 1,-1v-9c0,-0.55 -0.45,-1 -1,-1L2,9v11zM21.83,12.88c0.11,-0.25 0.17,-0.52 0.17,-0.8L22,11c0,-1.1 -0.9,-2 -2,-2h-5.5l0.92,-4.65c0.05,-0.22 0.02,-0.46 -0.08,-0.66 -0.23,-0.45 -0.52,-0.86 -0.88,-1.22L14,2 7.59,8.41C7.21,8.79 7,9.3 7,9.83v7.84C7,18.95 8.05,20 9.34,20h8.11c0.7,0 1.36,-0.37 1.72,-0.97l2.66,-6.15z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/thumb_up_off_alt.xml b/qqq/android/mobileapp/src/main/res/drawable/thumb_up_off_alt.xml new file mode 100644 index 0000000..59edcd1 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/thumb_up_off_alt.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/thumb_up_off_alt/materialicons/black/res/drawable/baseline_thumb_up_off_alt_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M13.11,5.72l-0.57,2.89c-0.12,0.59 0.04,1.2 0.42,1.66 0.38,0.46 0.94,0.73 1.54,0.73H20v1.08L17.43,18H9.34c-0.18,0 -0.34,-0.16 -0.34,-0.34V9.82l4.11,-4.1M14,2L7.59,8.41C7.21,8.79 7,9.3 7,9.83v7.83C7,18.95 8.05,20 9.34,20h8.1c0.71,0 1.36,-0.37 1.72,-0.97l2.67,-6.15c0.11,-0.25 0.17,-0.52 0.17,-0.8V11c0,-1.1 -0.9,-2 -2,-2h-5.5l0.92,-4.65c0.05,-0.22 0.02,-0.46 -0.08,-0.66 -0.23,-0.45 -0.52,-0.86 -0.88,-1.22L14,2zM4,9H2v11h2c0.55,0 1,-0.45 1,-1v-9c0,-0.55 -0.45,-1 -1,-1z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/thumbs_up_down.xml b/qqq/android/mobileapp/src/main/res/drawable/thumbs_up_down.xml new file mode 100644 index 0000000..823850b --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/thumbs_up_down.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/thumbs_up_down/materialicons/black/res/drawable/baseline_thumbs_up_down_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,6c0,-0.55 -0.45,-1 -1,-1L5.82,5l0.66,-3.18 0.02,-0.23c0,-0.31 -0.13,-0.59 -0.33,-0.8L5.38,0 0.44,4.94C0.17,5.21 0,5.59 0,6v6.5c0,0.83 0.67,1.5 1.5,1.5h6.75c0.62,0 1.15,-0.38 1.38,-0.91l2.26,-5.29c0.07,-0.17 0.11,-0.36 0.11,-0.55L12,6zM22.5,10h-6.75c-0.62,0 -1.15,0.38 -1.38,0.91l-2.26,5.29c-0.07,0.17 -0.11,0.36 -0.11,0.55L12,18c0,0.55 0.45,1 1,1h5.18l-0.66,3.18 -0.02,0.24c0,0.31 0.13,0.59 0.33,0.8l0.79,0.78 4.94,-4.94c0.27,-0.27 0.44,-0.65 0.44,-1.06v-6.5c0,-0.83 -0.67,-1.5 -1.5,-1.5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/thunderstorm.xml b/qqq/android/mobileapp/src/main/res/drawable/thunderstorm.xml new file mode 100644 index 0000000..ba983c6 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/thunderstorm.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/thunderstorm/materialicons/black/res/drawable/baseline_thunderstorm_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M17.92,7.02C17.45,4.18 14.97,2 12,2C9.82,2 7.83,3.18 6.78,5.06C4.09,5.41 2,7.74 2,10.5C2,13.53 4.47,16 7.5,16h10c2.48,0 4.5,-2.02 4.5,-4.5C22,9.16 20.21,7.23 17.92,7.02z" /> + <path + android:fillColor="#FF000000" + android:pathData="M14.8,17l-2.9,3.32l2,1l-2.35,2.68l2.65,0l2.9,-3.32l-2,-1l2.35,-2.68z" /> + <path + android:fillColor="#FF000000" + android:pathData="M8.8,17l-2.9,3.32l2,1l-2.35,2.68l2.65,0l2.9,-3.32l-2,-1l2.35,-2.68z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/time_to_leave.xml b/qqq/android/mobileapp/src/main/res/drawable/time_to_leave.xml new file mode 100644 index 0000000..c0ca9b4 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/time_to_leave.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/notification/time_to_leave/materialicons/black/res/drawable/baseline_time_to_leave_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M18.92,5.01C18.72,4.42 18.16,4 17.5,4h-11c-0.66,0 -1.21,0.42 -1.42,1.01L3,11v8c0,0.55 0.45,1 1,1h1c0.55,0 1,-0.45 1,-1v-1h12v1c0,0.55 0.45,1 1,1h1c0.55,0 1,-0.45 1,-1v-8l-2.08,-5.99zM6.5,15c-0.83,0 -1.5,-0.67 -1.5,-1.5S5.67,12 6.5,12s1.5,0.67 1.5,1.5S7.33,15 6.5,15zM17.5,15c-0.83,0 -1.5,-0.67 -1.5,-1.5s0.67,-1.5 1.5,-1.5 1.5,0.67 1.5,1.5 -0.67,1.5 -1.5,1.5zM5,10l1.5,-4.5h11L19,10L5,10z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/timelapse.xml b/qqq/android/mobileapp/src/main/res/drawable/timelapse.xml new file mode 100644 index 0000000..68cdcb5 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/timelapse.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/timelapse/materialicons/black/res/drawable/baseline_timelapse_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M16.24,7.76C15.07,6.59 13.54,6 12,6v6l-4.24,4.24c2.34,2.34 6.14,2.34 8.49,0 2.34,-2.34 2.34,-6.14 -0.01,-8.48zM12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM12,20c-4.42,0 -8,-3.58 -8,-8s3.58,-8 8,-8 8,3.58 8,8 -3.58,8 -8,8z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/timeline.xml b/qqq/android/mobileapp/src/main/res/drawable/timeline.xml new file mode 100644 index 0000000..840910c --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/timeline.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/timeline/materialicons/black/res/drawable/baseline_timeline_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M23,8c0,1.1 -0.9,2 -2,2c-0.18,0 -0.35,-0.02 -0.51,-0.07l-3.56,3.55C16.98,13.64 17,13.82 17,14c0,1.1 -0.9,2 -2,2s-2,-0.9 -2,-2c0,-0.18 0.02,-0.36 0.07,-0.52l-2.55,-2.55C10.36,10.98 10.18,11 10,11s-0.36,-0.02 -0.52,-0.07l-4.55,4.56C4.98,15.65 5,15.82 5,16c0,1.1 -0.9,2 -2,2s-2,-0.9 -2,-2s0.9,-2 2,-2c0.18,0 0.35,0.02 0.51,0.07l4.56,-4.55C8.02,9.36 8,9.18 8,9c0,-1.1 0.9,-2 2,-2s2,0.9 2,2c0,0.18 -0.02,0.36 -0.07,0.52l2.55,2.55C14.64,12.02 14.82,12 15,12s0.36,0.02 0.52,0.07l3.55,-3.56C19.02,8.35 19,8.18 19,8c0,-1.1 0.9,-2 2,-2S23,6.9 23,8z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/timer.xml b/qqq/android/mobileapp/src/main/res/drawable/timer.xml new file mode 100644 index 0000000..5c06dfe --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/timer.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/timer/materialicons/black/res/drawable/baseline_timer_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M9,1h6v2h-6z" /> + <path + android:fillColor="#FF000000" + android:pathData="M19.03,7.39l1.42,-1.42c-0.43,-0.51 -0.9,-0.99 -1.41,-1.41l-1.42,1.42C16.07,4.74 14.12,4 12,4c-4.97,0 -9,4.03 -9,9c0,4.97 4.02,9 9,9s9,-4.03 9,-9C21,10.88 20.26,8.93 19.03,7.39zM13,14h-2V8h2V14z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/timer_10.xml b/qqq/android/mobileapp/src/main/res/drawable/timer_10.xml new file mode 100644 index 0000000..0fc866c --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/timer_10.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/timer_10/materialicons/black/res/drawable/baseline_timer_10_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M0,7.72L0,9.4l3,-1L3,18h2L5,6h-0.25L0,7.72zM23.78,14.37c-0.14,-0.28 -0.35,-0.53 -0.63,-0.74 -0.28,-0.21 -0.61,-0.39 -1.01,-0.53s-0.85,-0.27 -1.35,-0.38c-0.35,-0.07 -0.64,-0.15 -0.87,-0.23 -0.23,-0.08 -0.41,-0.16 -0.55,-0.25 -0.14,-0.09 -0.23,-0.19 -0.28,-0.3 -0.05,-0.11 -0.08,-0.24 -0.08,-0.39 0,-0.14 0.03,-0.28 0.09,-0.41 0.06,-0.13 0.15,-0.25 0.27,-0.34 0.12,-0.1 0.27,-0.18 0.45,-0.24s0.4,-0.09 0.64,-0.09c0.25,0 0.47,0.04 0.66,0.11 0.19,0.07 0.35,0.17 0.48,0.29 0.13,0.12 0.22,0.26 0.29,0.42 0.06,0.16 0.1,0.32 0.1,0.49h1.95c0,-0.39 -0.08,-0.75 -0.24,-1.09 -0.16,-0.34 -0.39,-0.63 -0.69,-0.88 -0.3,-0.25 -0.66,-0.44 -1.09,-0.59C21.49,9.07 21,9 20.46,9c-0.51,0 -0.98,0.07 -1.39,0.21 -0.41,0.14 -0.77,0.33 -1.06,0.57 -0.29,0.24 -0.51,0.52 -0.67,0.84 -0.16,0.32 -0.23,0.65 -0.23,1.01s0.08,0.69 0.23,0.96c0.15,0.28 0.36,0.52 0.64,0.73 0.27,0.21 0.6,0.38 0.98,0.53 0.38,0.14 0.81,0.26 1.27,0.36 0.39,0.08 0.71,0.17 0.95,0.26s0.43,0.19 0.57,0.29c0.13,0.1 0.22,0.22 0.27,0.34 0.05,0.12 0.07,0.25 0.07,0.39 0,0.32 -0.13,0.57 -0.4,0.77 -0.27,0.2 -0.66,0.29 -1.17,0.29 -0.22,0 -0.43,-0.02 -0.64,-0.08 -0.21,-0.05 -0.4,-0.13 -0.56,-0.24 -0.17,-0.11 -0.3,-0.26 -0.41,-0.44 -0.11,-0.18 -0.17,-0.41 -0.18,-0.67h-1.89c0,0.36 0.08,0.71 0.24,1.05 0.16,0.34 0.39,0.65 0.7,0.93 0.31,0.27 0.69,0.49 1.15,0.66 0.46,0.17 0.98,0.25 1.58,0.25 0.53,0 1.01,-0.06 1.44,-0.19 0.43,-0.13 0.8,-0.31 1.11,-0.54 0.31,-0.23 0.54,-0.51 0.71,-0.83 0.17,-0.32 0.25,-0.67 0.25,-1.06 -0.02,-0.4 -0.09,-0.74 -0.24,-1.02zM13.82,7.05c-0.34,-0.4 -0.75,-0.7 -1.23,-0.88 -0.47,-0.18 -1.01,-0.27 -1.59,-0.27 -0.58,0 -1.11,0.09 -1.59,0.27 -0.48,0.18 -0.89,0.47 -1.23,0.88 -0.34,0.41 -0.6,0.93 -0.79,1.59 -0.18,0.65 -0.28,1.45 -0.28,2.39v1.92c0,0.94 0.09,1.74 0.28,2.39 0.19,0.66 0.45,1.19 0.8,1.6 0.34,0.41 0.75,0.71 1.23,0.89 0.48,0.18 1.01,0.28 1.59,0.28 0.59,0 1.12,-0.09 1.59,-0.28 0.48,-0.18 0.88,-0.48 1.22,-0.89 0.34,-0.41 0.6,-0.94 0.78,-1.6 0.18,-0.65 0.28,-1.45 0.28,-2.39v-1.92c0,-0.94 -0.09,-1.74 -0.28,-2.39 -0.18,-0.66 -0.44,-1.19 -0.78,-1.59zM12.9,13.22c0,0.6 -0.04,1.11 -0.12,1.53 -0.08,0.42 -0.2,0.76 -0.36,1.02 -0.16,0.26 -0.36,0.45 -0.59,0.57 -0.23,0.12 -0.51,0.18 -0.82,0.18 -0.3,0 -0.58,-0.06 -0.82,-0.18s-0.44,-0.31 -0.6,-0.57c-0.16,-0.26 -0.29,-0.6 -0.38,-1.02 -0.09,-0.42 -0.13,-0.93 -0.13,-1.53v-2.5c0,-0.6 0.04,-1.11 0.13,-1.52 0.09,-0.41 0.21,-0.74 0.38,-1 0.16,-0.25 0.36,-0.43 0.6,-0.55 0.24,-0.11 0.51,-0.17 0.81,-0.17 0.31,0 0.58,0.06 0.81,0.17 0.24,0.11 0.44,0.29 0.6,0.55 0.16,0.25 0.29,0.58 0.37,0.99 0.08,0.41 0.13,0.92 0.13,1.52v2.51z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/timer_10_select.xml b/qqq/android/mobileapp/src/main/res/drawable/timer_10_select.xml new file mode 100644 index 0000000..14e692d --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/timer_10_select.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/timer_10_select/materialicons/black/res/drawable/baseline_timer_10_select_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M13,8v8h-3V8H13M13,5h-3C8.34,5 7,6.34 7,8v8c0,1.66 1.34,3 3,3h3c1.66,0 3,-1.34 3,-3V8C16,6.34 14.66,5 13,5zM1,8h2v11h3V5H1V8zM18.5,11c-0.83,0 -1.5,0.68 -1.5,1.5v2c0,0.82 0.67,1.5 1.5,1.5H21v1h-4v2h4.5c0.83,0 1.5,-0.67 1.5,-1.5v-2c0,-0.83 -0.67,-1.5 -1.5,-1.5H19v-1h4v-2H18.5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/timer_3.xml b/qqq/android/mobileapp/src/main/res/drawable/timer_3.xml new file mode 100644 index 0000000..dffe07f --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/timer_3.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/timer_3/materialicons/black/res/drawable/baseline_timer_3_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M11.61,12.97c-0.16,-0.24 -0.36,-0.46 -0.62,-0.65 -0.25,-0.19 -0.56,-0.35 -0.93,-0.48 0.3,-0.14 0.57,-0.3 0.8,-0.5 0.23,-0.2 0.42,-0.41 0.57,-0.64 0.15,-0.23 0.27,-0.46 0.34,-0.71 0.08,-0.24 0.11,-0.49 0.11,-0.73 0,-0.55 -0.09,-1.04 -0.28,-1.46 -0.18,-0.42 -0.44,-0.77 -0.78,-1.06 -0.33,-0.28 -0.73,-0.5 -1.2,-0.64 -0.45,-0.13 -0.97,-0.2 -1.53,-0.2 -0.55,0 -1.06,0.08 -1.52,0.24 -0.47,0.17 -0.87,0.4 -1.2,0.69 -0.33,0.29 -0.6,0.63 -0.78,1.03 -0.2,0.39 -0.29,0.83 -0.29,1.29h1.98c0,-0.26 0.05,-0.49 0.14,-0.69 0.09,-0.2 0.22,-0.38 0.38,-0.52 0.17,-0.14 0.36,-0.25 0.58,-0.33 0.22,-0.08 0.46,-0.12 0.73,-0.12 0.61,0 1.06,0.16 1.36,0.47 0.3,0.31 0.44,0.75 0.44,1.32 0,0.27 -0.04,0.52 -0.12,0.74 -0.08,0.22 -0.21,0.41 -0.38,0.57 -0.17,0.16 -0.38,0.28 -0.63,0.37 -0.25,0.09 -0.55,0.13 -0.89,0.13L6.72,11.09v1.57L7.9,12.66c0.34,0 0.64,0.04 0.91,0.11 0.27,0.08 0.5,0.19 0.69,0.35 0.19,0.16 0.34,0.36 0.44,0.61 0.1,0.24 0.16,0.54 0.16,0.87 0,0.62 -0.18,1.09 -0.53,1.42 -0.35,0.33 -0.84,0.49 -1.45,0.49 -0.29,0 -0.56,-0.04 -0.8,-0.13 -0.24,-0.08 -0.44,-0.2 -0.61,-0.36 -0.17,-0.16 -0.3,-0.34 -0.39,-0.56 -0.09,-0.22 -0.14,-0.46 -0.14,-0.72L4.19,14.74c0,0.55 0.11,1.03 0.32,1.45 0.21,0.42 0.5,0.77 0.86,1.05s0.77,0.49 1.24,0.63 0.96,0.21 1.48,0.21c0.57,0 1.09,-0.08 1.58,-0.23 0.49,-0.15 0.91,-0.38 1.26,-0.68 0.36,-0.3 0.64,-0.66 0.84,-1.1 0.2,-0.43 0.3,-0.93 0.3,-1.48 0,-0.29 -0.04,-0.58 -0.11,-0.86 -0.08,-0.25 -0.19,-0.51 -0.35,-0.76zM20.87,14.37c-0.14,-0.28 -0.35,-0.53 -0.63,-0.74 -0.28,-0.21 -0.61,-0.39 -1.01,-0.53s-0.85,-0.27 -1.35,-0.38c-0.35,-0.07 -0.64,-0.15 -0.87,-0.23 -0.23,-0.08 -0.41,-0.16 -0.55,-0.25 -0.14,-0.09 -0.23,-0.19 -0.28,-0.3 -0.05,-0.11 -0.08,-0.24 -0.08,-0.39s0.03,-0.28 0.09,-0.41c0.06,-0.13 0.15,-0.25 0.27,-0.34 0.12,-0.1 0.27,-0.18 0.45,-0.24s0.4,-0.09 0.64,-0.09c0.25,0 0.47,0.04 0.66,0.11 0.19,0.07 0.35,0.17 0.48,0.29 0.13,0.12 0.22,0.26 0.29,0.42 0.06,0.16 0.1,0.32 0.1,0.49h1.95c0,-0.39 -0.08,-0.75 -0.24,-1.09 -0.16,-0.34 -0.39,-0.63 -0.69,-0.88 -0.3,-0.25 -0.66,-0.44 -1.09,-0.59 -0.43,-0.15 -0.92,-0.22 -1.46,-0.22 -0.51,0 -0.98,0.07 -1.39,0.21 -0.41,0.14 -0.77,0.33 -1.06,0.57 -0.29,0.24 -0.51,0.52 -0.67,0.84 -0.16,0.32 -0.23,0.65 -0.23,1.01s0.08,0.68 0.23,0.96c0.15,0.28 0.37,0.52 0.64,0.73 0.27,0.21 0.6,0.38 0.98,0.53 0.38,0.14 0.81,0.26 1.27,0.36 0.39,0.08 0.71,0.17 0.95,0.26s0.43,0.19 0.57,0.29c0.13,0.1 0.22,0.22 0.27,0.34 0.05,0.12 0.07,0.25 0.07,0.39 0,0.32 -0.13,0.57 -0.4,0.77 -0.27,0.2 -0.66,0.29 -1.17,0.29 -0.22,0 -0.43,-0.02 -0.64,-0.08 -0.21,-0.05 -0.4,-0.13 -0.56,-0.24 -0.17,-0.11 -0.3,-0.26 -0.41,-0.44 -0.11,-0.18 -0.17,-0.41 -0.18,-0.67h-1.89c0,0.36 0.08,0.71 0.24,1.05 0.16,0.34 0.39,0.65 0.7,0.93 0.31,0.27 0.69,0.49 1.15,0.66 0.46,0.17 0.98,0.25 1.58,0.25 0.53,0 1.01,-0.06 1.44,-0.19 0.43,-0.13 0.8,-0.31 1.11,-0.54 0.31,-0.23 0.54,-0.51 0.71,-0.83 0.17,-0.32 0.25,-0.67 0.25,-1.06 -0.02,-0.4 -0.09,-0.74 -0.24,-1.02z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/timer_3_select.xml b/qqq/android/mobileapp/src/main/res/drawable/timer_3_select.xml new file mode 100644 index 0000000..bfe407c --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/timer_3_select.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/timer_3_select/materialicons/black/res/drawable/baseline_timer_3_select_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M21,11v2h-4v1h2.5c0.83,0 1.5,0.68 1.5,1.5v2c0,0.83 -0.67,1.5 -1.5,1.5H15v-2h4v-1h-2.5c-0.82,0 -1.5,-0.68 -1.5,-1.5v-2c0,-0.82 0.68,-1.5 1.5,-1.5H21zM4,5v3h6v2.5H4v3h6V16H4v3h6c1.66,0 3,-1.34 3,-3v-1.9c0,-1.16 -0.94,-2.1 -2.1,-2.1c1.16,0 2.1,-0.94 2.1,-2.1V8c0,-1.66 -1.34,-3 -3,-3H4z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/timer_off.xml b/qqq/android/mobileapp/src/main/res/drawable/timer_off.xml new file mode 100644 index 0000000..333f7ea --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/timer_off.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/timer_off/materialicons/black/res/drawable/baseline_timer_off_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M9,1h6v2h-6z" /> + <path + android:fillColor="#FF000000" + android:pathData="M13,8v2.17l6.98,6.98C20.63,15.91 21,14.5 21,13c0,-2.12 -0.74,-4.07 -1.97,-5.61l1.42,-1.42c-0.43,-0.51 -0.9,-0.99 -1.41,-1.41l-1.42,1.42C16.07,4.74 14.12,4 12,4c-1.5,0 -2.91,0.37 -4.15,1.02L10.83,8H13z" /> + <path + android:fillColor="#FF000000" + android:pathData="M2.81,2.81L1.39,4.22l3.4,3.4C3.67,9.12 3,10.98 3,13c0,4.97 4.02,9 9,9c2.02,0 3.88,-0.67 5.38,-1.79l2.4,2.4l1.41,-1.41L2.81,2.81z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/tips_and_updates.xml b/qqq/android/mobileapp/src/main/res/drawable/tips_and_updates.xml new file mode 100644 index 0000000..12bdccf --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/tips_and_updates.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/tips_and_updates/materialicons/black/res/drawable/baseline_tips_and_updates_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M7,20h4c0,1.1 -0.9,2 -2,2S7,21.1 7,20zM5,19h8v-2H5V19zM16.5,9.5c0,3.82 -2.66,5.86 -3.77,6.5H5.27C4.16,15.36 1.5,13.32 1.5,9.5C1.5,5.36 4.86,2 9,2S16.5,5.36 16.5,9.5zM21.37,7.37L20,8l1.37,0.63L22,10l0.63,-1.37L24,8l-1.37,-0.63L22,6L21.37,7.37zM19,6l0.94,-2.06L22,3l-2.06,-0.94L19,0l-0.94,2.06L16,3l2.06,0.94L19,6z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/tire_repair.xml b/qqq/android/mobileapp/src/main/res/drawable/tire_repair.xml new file mode 100644 index 0000000..b74a641 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/tire_repair.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/tire_repair/materialicons/black/res/drawable/baseline_tire_repair_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M18,7c0,0.55 0.45,1 1,1c0.28,0 0.53,-0.11 0.71,-0.29c0.4,-0.4 1.04,-2.46 1.04,-2.46s-2.06,0.64 -2.46,1.04C18.11,6.47 18,6.72 18,7z" /> + <path + android:fillColor="#FF000000" + android:pathData="M19,2c-2.76,0 -5,2.24 -5,5c0,2.05 1.23,3.81 3,4.58V13h1v5c0,0.55 -0.45,1 -1,1s-1,-0.45 -1,-1v-2c0,-1.65 -1.35,-3 -3,-3c-0.35,0 -0.69,0.06 -1,0.17V5c0,-1.1 -0.9,-2 -2,-2H4C2.9,3 2,3.9 2,5v14c0,1.1 0.9,2 2,2h6c1.1,0 2,-0.9 2,-2v-3c0,-0.55 0.45,-1 1,-1s1,0.45 1,1v2c0,1.65 1.35,3 3,3s3,-1.35 3,-3v-5h1v-1.42c1.77,-0.77 3,-2.53 3,-4.58C24,4.24 21.76,2 19,2zM6,19.5l-2,-2v-2.83l2,2V19.5zM6,14.5l-2,-2V9.67l2,2V14.5zM6,9.5l-2,-2V4.67l2,2V9.5zM10,17.5l-2,2v-2.83l2,-2V17.5zM10,12.5l-2,2v-2.83l2,-2V12.5zM10,7.5l-2,2V6.67l2,-2V7.5zM19,10c-1.66,0 -3,-1.34 -3,-3s1.34,-3 3,-3s3,1.34 3,3S20.66,10 19,10z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/title.xml b/qqq/android/mobileapp/src/main/res/drawable/title.xml new file mode 100644 index 0000000..ac1235f --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/title.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/editor/title/materialicons/black/res/drawable/baseline_title_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M5,4v3h5.5v12h3V7H19V4z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/toc.xml b/qqq/android/mobileapp/src/main/res/drawable/toc.xml new file mode 100644 index 0000000..5220dcb --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/toc.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/toc/materialicons/black/res/drawable/baseline_toc_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M3,9h14L17,7L3,7v2zM3,13h14v-2L3,11v2zM3,17h14v-2L3,15v2zM19,17h2v-2h-2v2zM19,7v2h2L21,7h-2zM19,13h2v-2h-2v2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/today.xml b/qqq/android/mobileapp/src/main/res/drawable/today.xml new file mode 100644 index 0000000..a735782 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/today.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/today/materialicons/black/res/drawable/baseline_today_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19,3h-1L18,1h-2v2L8,3L8,1L6,1v2L5,3c-1.11,0 -1.99,0.9 -1.99,2L3,19c0,1.1 0.89,2 2,2h14c1.1,0 2,-0.9 2,-2L21,5c0,-1.1 -0.9,-2 -2,-2zM19,19L5,19L5,8h14v11zM7,10h5v5L7,15z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/toggle_off.xml b/qqq/android/mobileapp/src/main/res/drawable/toggle_off.xml new file mode 100644 index 0000000..a5a7641 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/toggle_off.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/toggle/toggle_off/materialicons/black/res/drawable/baseline_toggle_off_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M17,7H7c-2.76,0 -5,2.24 -5,5s2.24,5 5,5h10c2.76,0 5,-2.24 5,-5s-2.24,-5 -5,-5zM7,15c-1.66,0 -3,-1.34 -3,-3s1.34,-3 3,-3 3,1.34 3,3 -1.34,3 -3,3z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/toggle_on.xml b/qqq/android/mobileapp/src/main/res/drawable/toggle_on.xml new file mode 100644 index 0000000..141d0c6 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/toggle_on.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/toggle/toggle_on/materialicons/black/res/drawable/baseline_toggle_on_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M17,7L7,7c-2.76,0 -5,2.24 -5,5s2.24,5 5,5h10c2.76,0 5,-2.24 5,-5s-2.24,-5 -5,-5zM17,15c-1.66,0 -3,-1.34 -3,-3s1.34,-3 3,-3 3,1.34 3,3 -1.34,3 -3,3z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/token.xml b/qqq/android/mobileapp/src/main/res/drawable/token.xml new file mode 100644 index 0000000..4402c22 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/token.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/token/materialicons/black/res/drawable/baseline_token_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19.97,6.43L12,2L4.03,6.43L9.1,9.24C9.83,8.48 10.86,8 12,8s2.17,0.48 2.9,1.24L19.97,6.43zM10,12c0,-1.1 0.9,-2 2,-2s2,0.9 2,2s-0.9,2 -2,2S10,13.1 10,12zM11,21.44L3,17V8.14l5.13,2.85C8.04,11.31 8,11.65 8,12c0,1.86 1.27,3.43 3,3.87V21.44zM13,21.44v-5.57c1.73,-0.44 3,-2.01 3,-3.87c0,-0.35 -0.04,-0.69 -0.13,-1.01L21,8.14L21,17L13,21.44z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/toll.xml b/qqq/android/mobileapp/src/main/res/drawable/toll.xml new file mode 100644 index 0000000..226b5cb --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/toll.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/toll/materialicons/black/res/drawable/baseline_toll_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M15,4c-4.42,0 -8,3.58 -8,8s3.58,8 8,8 8,-3.58 8,-8 -3.58,-8 -8,-8zM15,18c-3.31,0 -6,-2.69 -6,-6s2.69,-6 6,-6 6,2.69 6,6 -2.69,6 -6,6z" /> + <path + android:fillColor="#FF000000" + android:pathData="M3,12c0,-2.61 1.67,-4.83 4,-5.65V4.26C3.55,5.15 1,8.27 1,12s2.55,6.85 6,7.74v-2.09c-2.33,-0.82 -4,-3.04 -4,-5.65z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/tonality.xml b/qqq/android/mobileapp/src/main/res/drawable/tonality.xml new file mode 100644 index 0000000..f94bfad --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/tonality.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/tonality/materialicons/black/res/drawable/baseline_tonality_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM11,19.93c-3.94,-0.49 -7,-3.85 -7,-7.93s3.05,-7.44 7,-7.93v15.86zM13,4.07c1.03,0.13 2,0.45 2.87,0.93L13,5v-0.93zM13,7h5.24c0.25,0.31 0.48,0.65 0.68,1L13,8L13,7zM13,10h6.74c0.08,0.33 0.15,0.66 0.19,1L13,11v-1zM13,19.93L13,19h2.87c-0.87,0.48 -1.84,0.8 -2.87,0.93zM18.24,17L13,17v-1h5.92c-0.2,0.35 -0.43,0.69 -0.68,1zM19.74,14L13,14v-1h6.93c-0.04,0.34 -0.11,0.67 -0.19,1z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/topic.xml b/qqq/android/mobileapp/src/main/res/drawable/topic.xml new file mode 100644 index 0000000..8d4cc56 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/topic.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/file/topic/materialicons/black/res/drawable/baseline_topic_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,6h-8l-2,-2H4C2.9,4 2.01,4.9 2.01,6L2,18c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2V8C22,6.9 21.1,6 20,6zM14,16H6v-2h8V16zM18,12H6v-2h12V12z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/tornado.xml b/qqq/android/mobileapp/src/main/res/drawable/tornado.xml new file mode 100644 index 0000000..2a82f75 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/tornado.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/tornado/materialicons/black/res/drawable/baseline_tornado_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20.11,8l2.89,-5l-22,0l2.89,5z" /> + <path + android:fillColor="#FF000000" + android:pathData="M7.95,15l4.05,7l4.05,-7z" /> + <path + android:fillColor="#FF000000" + android:pathData="M18.95,10l-13.9,0l1.74,3l10.42,0z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/touch_app.xml b/qqq/android/mobileapp/src/main/res/drawable/touch_app.xml new file mode 100644 index 0000000..1061030 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/touch_app.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/touch_app/materialicons/black/res/drawable/baseline_touch_app_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M9,11.24V7.5C9,6.12 10.12,5 11.5,5S14,6.12 14,7.5v3.74c1.21,-0.81 2,-2.18 2,-3.74C16,5.01 13.99,3 11.5,3S7,5.01 7,7.5C7,9.06 7.79,10.43 9,11.24zM18.84,15.87l-4.54,-2.26c-0.17,-0.07 -0.35,-0.11 -0.54,-0.11H13v-6C13,6.67 12.33,6 11.5,6S10,6.67 10,7.5v10.74c-3.6,-0.76 -3.54,-0.75 -3.67,-0.75c-0.31,0 -0.59,0.13 -0.79,0.33l-0.79,0.8l4.94,4.94C9.96,23.83 10.34,24 10.75,24h6.79c0.75,0 1.33,-0.55 1.44,-1.28l0.75,-5.27c0.01,-0.07 0.02,-0.14 0.02,-0.2C19.75,16.63 19.37,16.09 18.84,15.87z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/tour.xml b/qqq/android/mobileapp/src/main/res/drawable/tour.xml new file mode 100644 index 0000000..2fcae6e --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/tour.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/tour/materialicons/black/res/drawable/baseline_tour_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M21,4L7,4L7,2L5,2v20h2v-8h14l-2,-5 2,-5zM15,9c0,1.1 -0.9,2 -2,2s-2,-0.9 -2,-2 0.9,-2 2,-2 2,0.9 2,2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/toys.xml b/qqq/android/mobileapp/src/main/res/drawable/toys.xml new file mode 100644 index 0000000..cfc539b --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/toys.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/hardware/toys/materialicons/black/res/drawable/baseline_toys_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M22,14c0,-1.95 -1.4,-3.57 -3.25,-3.92L17.4,6.05C17,4.82 15.85,4 14.56,4H9.44C8.15,4 7,4.82 6.6,6.05L5.81,8.4L4.41,7l0.29,-0.29c0.39,-0.39 0.39,-1.02 0,-1.41c-0.39,-0.39 -1.02,-0.39 -1.41,0l-2,2c-0.39,0.39 -0.39,1.02 0,1.41c0.39,0.39 1.02,0.39 1.41,0L3,8.41l1.79,1.79C3.18,10.72 2,12.22 2,14c0,1.5 0.83,2.79 2.05,3.48C4.28,18.9 5.51,20 7,20c1.3,0 2.4,-0.84 2.82,-2h4.37c0.41,1.16 1.51,2 2.82,2c1.49,0 2.72,-1.1 2.95,-2.52C21.17,16.79 22,15.5 22,14zM7,18c-0.55,0 -1,-0.45 -1,-1s0.45,-1 1,-1s1,0.45 1,1S7.55,18 7,18zM11,10H7.41L7.39,9.98l1.1,-3.3C8.63,6.27 9.01,6 9.44,6H11V10zM13,6h1.56c0.43,0 0.81,0.27 0.95,0.68L16.61,10H13V6zM17,18c-0.55,0 -1,-0.45 -1,-1s0.45,-1 1,-1s1,0.45 1,1S17.55,18 17,18z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/track_changes.xml b/qqq/android/mobileapp/src/main/res/drawable/track_changes.xml new file mode 100644 index 0000000..7ed4f84 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/track_changes.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/track_changes/materialicons/black/res/drawable/baseline_track_changes_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19.07,4.93l-1.41,1.41C19.1,7.79 20,9.79 20,12c0,4.42 -3.58,8 -8,8s-8,-3.58 -8,-8c0,-4.08 3.05,-7.44 7,-7.93v2.02C8.16,6.57 6,9.03 6,12c0,3.31 2.69,6 6,6s6,-2.69 6,-6c0,-1.66 -0.67,-3.16 -1.76,-4.24l-1.41,1.41C15.55,9.9 16,10.9 16,12c0,2.21 -1.79,4 -4,4s-4,-1.79 -4,-4c0,-1.86 1.28,-3.41 3,-3.86v2.14c-0.6,0.35 -1,0.98 -1,1.72 0,1.1 0.9,2 2,2s2,-0.9 2,-2c0,-0.74 -0.4,-1.38 -1,-1.72V2h-1C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10c0,-2.76 -1.12,-5.26 -2.93,-7.07z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/traffic.xml b/qqq/android/mobileapp/src/main/res/drawable/traffic.xml new file mode 100644 index 0000000..fbb3bf0 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/traffic.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/traffic/materialicons/black/res/drawable/baseline_traffic_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,10h-3L17,8.86c1.72,-0.45 3,-2 3,-3.86h-3L17,4c0,-0.55 -0.45,-1 -1,-1L8,3c-0.55,0 -1,0.45 -1,1v1L4,5c0,1.86 1.28,3.41 3,3.86L7,10L4,10c0,1.86 1.28,3.41 3,3.86L7,15L4,15c0,1.86 1.28,3.41 3,3.86L7,20c0,0.55 0.45,1 1,1h8c0.55,0 1,-0.45 1,-1v-1.14c1.72,-0.45 3,-2 3,-3.86h-3v-1.14c1.72,-0.45 3,-2 3,-3.86zM12,19c-1.11,0 -2,-0.9 -2,-2s0.89,-2 2,-2c1.1,0 2,0.9 2,2s-0.89,2 -2,2zM12,14c-1.11,0 -2,-0.9 -2,-2s0.89,-2 2,-2c1.1,0 2,0.9 2,2s-0.89,2 -2,2zM12,9c-1.11,0 -2,-0.9 -2,-2 0,-1.11 0.89,-2 2,-2 1.1,0 2,0.89 2,2 0,1.1 -0.89,2 -2,2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/train.xml b/qqq/android/mobileapp/src/main/res/drawable/train.xml new file mode 100644 index 0000000..ceb6059 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/train.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/train/materialicons/black/res/drawable/baseline_train_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,2c-4,0 -8,0.5 -8,4v9.5C4,17.43 5.57,19 7.5,19L6,20.5v0.5h2.23l2,-2L14,19l2,2h2v-0.5L16.5,19c1.93,0 3.5,-1.57 3.5,-3.5L20,6c0,-3.5 -3.58,-4 -8,-4zM7.5,17c-0.83,0 -1.5,-0.67 -1.5,-1.5S6.67,14 7.5,14s1.5,0.67 1.5,1.5S8.33,17 7.5,17zM11,10L6,10L6,6h5v4zM13,10L13,6h5v4h-5zM16.5,17c-0.83,0 -1.5,-0.67 -1.5,-1.5s0.67,-1.5 1.5,-1.5 1.5,0.67 1.5,1.5 -0.67,1.5 -1.5,1.5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/tram.xml b/qqq/android/mobileapp/src/main/res/drawable/tram.xml new file mode 100644 index 0000000..4363c72 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/tram.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/tram/materialicons/black/res/drawable/baseline_tram_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19,16.94L19,8.5c0,-2.79 -2.61,-3.4 -6.01,-3.49l0.76,-1.51L17,3.5L17,2L7,2v1.5h4.75l-0.76,1.52C7.86,5.11 5,5.73 5,8.5v8.44c0,1.45 1.19,2.66 2.59,2.97L6,21.5v0.5h2.23l2,-2L14,20l2,2h2v-0.5L16.5,20h-0.08c1.69,0 2.58,-1.37 2.58,-3.06zM12,18.5c-0.83,0 -1.5,-0.67 -1.5,-1.5s0.67,-1.5 1.5,-1.5 1.5,0.67 1.5,1.5 -0.67,1.5 -1.5,1.5zM17,14L7,14L7,9h10v5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/transcribe.xml b/qqq/android/mobileapp/src/main/res/drawable/transcribe.xml new file mode 100644 index 0000000..59ca15b --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/transcribe.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/transcribe/materialicons/black/res/drawable/baseline_transcribe_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M17.93,16l1.63,-1.63c-2.77,-3.02 -2.77,-7.56 0,-10.74L17.93,2C14.03,5.89 14.02,11.95 17.93,16zM22.92,10.95c-0.84,-1.18 -0.84,-2.71 0,-3.89l-1.68,-1.69c-2.02,2.02 -2.02,5.07 0,7.27L22.92,10.95zM9,13c2.21,0 4,-1.79 4,-4c0,-2.21 -1.79,-4 -4,-4S5,6.79 5,9C5,11.21 6.79,13 9,13zM15.39,15.56C13.71,14.7 11.53,14 9,14c-2.53,0 -4.71,0.7 -6.39,1.56C1.61,16.07 1,17.1 1,18.22V21h16v-2.78C17,17.1 16.39,16.07 15.39,15.56z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/transfer_within_a_station.xml b/qqq/android/mobileapp/src/main/res/drawable/transfer_within_a_station.xml new file mode 100644 index 0000000..91b373d --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/transfer_within_a_station.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/transfer_within_a_station/materialicons/black/res/drawable/baseline_transfer_within_a_station_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M16.49,15.5v-1.75L14,16.25l2.49,2.5L16.49,17L22,17v-1.5zM19.51,19.75L14,19.75v1.5h5.51L19.51,23L22,20.5 19.51,18zM9.5,5.5c1.1,0 2,-0.9 2,-2s-0.9,-2 -2,-2 -2,0.9 -2,2 0.9,2 2,2zM5.75,8.9L3,23h2.1l1.75,-8L9,17v6h2v-7.55L8.95,13.4l0.6,-3C10.85,12 12.8,13 15,13v-2c-1.85,0 -3.45,-1 -4.35,-2.45l-0.95,-1.6C9.35,6.35 8.7,6 8,6c-0.25,0 -0.5,0.05 -0.75,0.15L2,8.3L2,13h2L4,9.65l1.75,-0.75" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/transform.xml b/qqq/android/mobileapp/src/main/res/drawable/transform.xml new file mode 100644 index 0000000..8ce0ed2 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/transform.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/transform/materialicons/black/res/drawable/baseline_transform_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M22,18v-2H8V4h2L7,1 4,4h2v2H2v2h4v8c0,1.1 0.9,2 2,2h8v2h-2l3,3 3,-3h-2v-2h4zM10,8h6v6h2V8c0,-1.1 -0.9,-2 -2,-2h-6v2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/transgender.xml b/qqq/android/mobileapp/src/main/res/drawable/transgender.xml new file mode 100644 index 0000000..c2a5c88 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/transgender.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/transgender/materialicons/black/res/drawable/baseline_transgender_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,8c1.93,0 3.5,1.57 3.5,3.5S13.93,15 12,15s-3.5,-1.57 -3.5,-3.5S10.07,8 12,8zM16.53,8.38l3.97,-3.96V7h2V1h-6v2h2.58l-3.97,3.97C14.23,6.36 13.16,6 12,6c-1.16,0 -2.23,0.36 -3.11,0.97L8.24,6.32l1.41,-1.41L8.24,3.49L6.82,4.9L4.92,3H7.5V1h-6v6h2V4.42l1.91,1.9L3.99,7.74l1.41,1.41l1.41,-1.41l0.65,0.65C6.86,9.27 6.5,10.34 6.5,11.5c0,2.7 1.94,4.94 4.5,5.41L11,19H9v2h2v2h2v-2h2v-2h-2l0,-2.09c2.56,-0.47 4.5,-2.71 4.5,-5.41C17.5,10.34 17.14,9.27 16.53,8.38z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/transit_enterexit.xml b/qqq/android/mobileapp/src/main/res/drawable/transit_enterexit.xml new file mode 100644 index 0000000..ca0a25e --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/transit_enterexit.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/transit_enterexit/materialicons/black/res/drawable/baseline_transit_enterexit_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M16,18H6V8h3v4.77L15.98,6 18,8.03 11.15,15H16v3z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/translate.xml b/qqq/android/mobileapp/src/main/res/drawable/translate.xml new file mode 100644 index 0000000..120c328 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/translate.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/translate/materialicons/black/res/drawable/baseline_translate_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12.87,15.07l-2.54,-2.51 0.03,-0.03c1.74,-1.94 2.98,-4.17 3.71,-6.53L17,6L17,4h-7L10,2L8,2v2L1,4v1.99h11.17C11.5,7.92 10.44,9.75 9,11.35 8.07,10.32 7.3,9.19 6.69,8h-2c0.73,1.63 1.73,3.17 2.98,4.56l-5.09,5.02L4,19l5,-5 3.11,3.11 0.76,-2.04zM18.5,10h-2L12,22h2l1.12,-3h4.75L21,22h2l-4.5,-12zM15.88,17l1.62,-4.33L19.12,17h-3.24z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/travel_explore.xml b/qqq/android/mobileapp/src/main/res/drawable/travel_explore.xml new file mode 100644 index 0000000..e900195 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/travel_explore.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/travel_explore/materialicons/black/res/drawable/baseline_travel_explore_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19.3,16.9c0.4,-0.7 0.7,-1.5 0.7,-2.4c0,-2.5 -2,-4.5 -4.5,-4.5S11,12 11,14.5s2,4.5 4.5,4.5c0.9,0 1.7,-0.3 2.4,-0.7l3.2,3.2l1.4,-1.4L19.3,16.9zM15.5,17c-1.4,0 -2.5,-1.1 -2.5,-2.5s1.1,-2.5 2.5,-2.5s2.5,1.1 2.5,2.5S16.9,17 15.5,17zM12,20v2C6.48,22 2,17.52 2,12C2,6.48 6.48,2 12,2c4.84,0 8.87,3.44 9.8,8h-2.07c-0.64,-2.46 -2.4,-4.47 -4.73,-5.41V5c0,1.1 -0.9,2 -2,2h-2v2c0,0.55 -0.45,1 -1,1H8v2h2v3H9l-4.79,-4.79C4.08,10.79 4,11.38 4,12C4,16.41 7.59,20 12,20z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/trending_down.xml b/qqq/android/mobileapp/src/main/res/drawable/trending_down.xml new file mode 100644 index 0000000..8ecaee0 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/trending_down.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/trending_down/materialicons/black/res/drawable/baseline_trending_down_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M16,18l2.29,-2.29 -4.88,-4.88 -4,4L2,7.41 3.41,6l6,6 4,-4 6.3,6.29L22,12v6z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/trending_flat.xml b/qqq/android/mobileapp/src/main/res/drawable/trending_flat.xml new file mode 100644 index 0000000..720dd25 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/trending_flat.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/trending_flat/materialicons/black/res/drawable/baseline_trending_flat_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M22,12l-4,-4v3H3v2h15v3z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/trending_up.xml b/qqq/android/mobileapp/src/main/res/drawable/trending_up.xml new file mode 100644 index 0000000..5706b16 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/trending_up.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/trending_up/materialicons/black/res/drawable/baseline_trending_up_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M16,6l2.29,2.29 -4.88,4.88 -4,-4L2,16.59 3.41,18l6,-6 4,4 6.3,-6.29L22,12V6z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/trip_origin.xml b/qqq/android/mobileapp/src/main/res/drawable/trip_origin.xml new file mode 100644 index 0000000..96b8f04 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/trip_origin.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/trip_origin/materialicons/black/res/drawable/baseline_trip_origin_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M2,12C2,6.48 6.48,2 12,2s10,4.48 10,10 -4.48,10 -10,10S2,17.52 2,12zM12,18c3.31,0 6,-2.69 6,-6s-2.69,-6 -6,-6 -6,2.69 -6,6 2.69,6 6,6z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/trolley.xml b/qqq/android/mobileapp/src/main/res/drawable/trolley.xml new file mode 100644 index 0000000..fea7622 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/trolley.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/hardware/trolley/materialicons/black/res/drawable/baseline_trolley_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M21,14v2H4V4H2V2h4v12H21zM5.99,17C4.89,17 4,17.9 4,19c0,1.1 0.89,2 1.99,2C7.1,21 8,20.1 8,19C8,17.9 7.1,17 5.99,17zM18.99,17c-1.1,0 -1.99,0.9 -1.99,2c0,1.1 0.89,2 1.99,2c1.1,0 2.01,-0.9 2.01,-2C21,17.9 20.1,17 18.99,17zM13,13H7V7h6V13zM20,13h-6V7h6V13z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/troubleshoot.xml b/qqq/android/mobileapp/src/main/res/drawable/troubleshoot.xml new file mode 100644 index 0000000..e32d6ab --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/troubleshoot.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/troubleshoot/materialicons/black/res/drawable/baseline_troubleshoot_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M22,20.59l-4.69,-4.69C18.37,14.55 19,12.85 19,11c0,-4.42 -3.58,-8 -8,-8c-4.08,0 -7.44,3.05 -7.93,7h2.02C5.57,7.17 8.03,5 11,5c3.31,0 6,2.69 6,6s-2.69,6 -6,6c-2.42,0 -4.5,-1.44 -5.45,-3.5H3.4C4.45,16.69 7.46,19 11,19c1.85,0 3.55,-0.63 4.9,-1.69L20.59,22L22,20.59z" /> + <path + android:fillColor="#FF000000" + android:pathData="M8.43,9.69l1.22,5.31l1.64,0l1.26,-3.78l0.95,2.28l2,0l0,-1.5l-1,0l-1.25,-3l-1.54,0l-1.12,3.37l-1.24,-5.37l-1.65,0l-1.25,4l-5.45,0l0,1.5l6.55,0z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/tsunami.xml b/qqq/android/mobileapp/src/main/res/drawable/tsunami.xml new file mode 100644 index 0000000..72d6d21 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/tsunami.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/tsunami/materialicons/black/res/drawable/baseline_tsunami_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M18.67,17.63c-3.8,2.8 -6.12,0.4 -6.67,0c-0.66,0.49 -2.92,2.76 -6.67,0C3.43,19.03 2.65,19 2,19v2c1.16,0 2.3,-0.32 3.33,-0.93c2.06,1.22 4.61,1.22 6.67,0c2.06,1.22 4.61,1.22 6.67,0C19.7,20.68 20.84,21 22,21v-2C21.34,19 20.5,18.98 18.67,17.63z" /> + <path + android:fillColor="#FF000000" + android:pathData="M19.33,12H22v-2h-2.67C17.5,10 16,8.5 16,6.67c0,-1.02 0.38,-1.74 1.09,-3.34C15.72,3.12 15.09,3 14,3C7.36,3 2.15,8.03 2.01,14.5c0,0 -0.01,2 -0.01,2c1.16,0 2.3,-0.32 3.33,-0.93c2.06,1.22 4.61,1.22 6.67,0c2.06,1.22 4.61,1.22 6.67,0c1.03,0.61 2.17,0.93 3.33,0.93v-2c-0.66,0 -1.5,-0.02 -3.33,-1.37c-3.8,2.8 -6.12,0.4 -6.67,0c-0.9,0.67 -0.54,0.41 -0.91,0.63C10.39,12.82 10,11.7 10,10.5c0,-2.58 1.77,-4.74 4.21,-5.33C14.08,5.68 14,6.19 14,6.67C14,9.61 16.39,12 19.33,12z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/tty.xml b/qqq/android/mobileapp/src/main/res/drawable/tty.xml new file mode 100644 index 0000000..f6fb376 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/tty.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/places/tty/materialicons/black/res/drawable/baseline_tty_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M14,4h2v2h-2V4zM13,7h2v2h-2V7zM11,4h2v2h-2V4zM18,9h-2V7h2V9zM19,6h-2V4h2V6zM21,9h-2V7h2V9zM22,6h-2V4h2V6zM14.62,14.38L12.1,16.9c-2.5,-1.43 -4.57,-3.5 -6,-6l2.52,-2.52C8.86,8.14 8.96,7.8 8.9,7.48L8.16,3.8C8.07,3.34 7.66,3 7.18,3H3.03C2.47,3 2,3.47 2.03,4.03C2.2,6.92 3.05,9.63 4.43,12c1.58,2.73 3.85,4.99 6.57,6.57c2.37,1.37 5.08,2.23 7.97,2.4c0.56,0.03 1.03,-0.44 1.03,-1v-4.15c0,-0.48 -0.34,-0.89 -0.8,-0.98l-3.67,-0.73C15.2,14.04 14.86,14.14 14.62,14.38zM14,10h2v2h-2V10zM11,10h2v2h-2V10zM19,12h-2v-2h2V12zM22,12h-2v-2h2V12z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/tune.xml b/qqq/android/mobileapp/src/main/res/drawable/tune.xml new file mode 100644 index 0000000..95dcb82 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/tune.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/tune/materialicons/black/res/drawable/baseline_tune_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M3,17v2h6v-2L3,17zM3,5v2h10L13,5L3,5zM13,21v-2h8v-2h-8v-2h-2v6h2zM7,9v2L3,11v2h4v2h2L9,9L7,9zM21,13v-2L11,11v2h10zM15,9h2L17,7h4L21,5h-4L17,3h-2v6z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/tungsten.xml b/qqq/android/mobileapp/src/main/res/drawable/tungsten.xml new file mode 100644 index 0000000..266848b --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/tungsten.xml @@ -0,0 +1,34 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/tungsten/materialicons/black/res/drawable/baseline_tungsten_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M11,19h2v3h-2z" /> + <path + android:fillColor="#FF000000" + android:pathData="M2,11h3v2h-3z" /> + <path + android:fillColor="#FF000000" + android:pathData="M19,11h3v2h-3z" /> + <path + android:fillColor="#FF000000" + android:pathData="M15.8941,17.8014l1.4071,-1.4071l2.1213,2.1213l-1.4071,1.4071z" /> + <path + android:fillColor="#FF000000" + android:pathData="M4.5842,18.5085l2.1213,-2.1213l1.4071,1.4071l-2.1213,2.1213z" /> + <path + android:fillColor="#FF000000" + android:pathData="M15,8.02V3H9v5.02C7.79,8.94 7,10.37 7,12c0,2.76 2.24,5 5,5s5,-2.24 5,-5C17,10.37 16.21,8.94 15,8.02zM11,5h2v2.1C12.68,7.04 12.34,7 12,7s-0.68,0.04 -1,0.1V5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/turn_left.xml b/qqq/android/mobileapp/src/main/res/drawable/turn_left.xml new file mode 100644 index 0000000..5608560 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/turn_left.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/turn_left/materialicons/black/res/drawable/baseline_turn_left_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M6.83,11l1.59,1.59L7,14l-4,-4l4,-4l1.41,1.41L6.83,9L15,9c1.1,0 2,0.9 2,2v9h-2v-9L6.83,11z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/turn_right.xml b/qqq/android/mobileapp/src/main/res/drawable/turn_right.xml new file mode 100644 index 0000000..8f50259 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/turn_right.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/turn_right/materialicons/black/res/drawable/baseline_turn_right_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M17.17,11l-1.59,1.59L17,14l4,-4l-4,-4l-1.41,1.41L17.17,9L9,9c-1.1,0 -2,0.9 -2,2v9h2v-9L17.17,11z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/turn_sharp_left.xml b/qqq/android/mobileapp/src/main/res/drawable/turn_sharp_left.xml new file mode 100644 index 0000000..0e00b3c --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/turn_sharp_left.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/turn_sharp_left/materialicons/black/res/drawable/baseline_turn_sharp_left_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M6,6.83L4.41,8.41L3,7l4,-4l4,4L9.59,8.41L8,6.83V13h8c1.1,0 2,0.9 2,2v6h-2v-6H8c-1.1,0 -2,-0.9 -2,-2V6.83z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/turn_sharp_right.xml b/qqq/android/mobileapp/src/main/res/drawable/turn_sharp_right.xml new file mode 100644 index 0000000..55e55f9 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/turn_sharp_right.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/turn_sharp_right/materialicons/black/res/drawable/baseline_turn_sharp_right_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M18,6.83l1.59,1.59L21,7l-4,-4l-4,4l1.41,1.41L16,6.83V13H8c-1.1,0 -2,0.9 -2,2v6h2v-6h8c1.1,0 2,-0.9 2,-2V6.83z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/turn_slight_left.xml b/qqq/android/mobileapp/src/main/res/drawable/turn_slight_left.xml new file mode 100644 index 0000000..25c84a2 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/turn_slight_left.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/turn_slight_left/materialicons/black/res/drawable/baseline_turn_slight_left_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M11.66,6V4H6v5.66h2V7.41l5,5V20h2v-7.58c0,-0.53 -0.21,-1.04 -0.59,-1.41l-5,-5H11.66z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/turn_slight_right.xml b/qqq/android/mobileapp/src/main/res/drawable/turn_slight_right.xml new file mode 100644 index 0000000..113d33d --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/turn_slight_right.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/turn_slight_right/materialicons/black/res/drawable/baseline_turn_slight_right_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12.34,6V4H18v5.66h-2V7.41l-5,5V20H9v-7.58c0,-0.53 0.21,-1.04 0.59,-1.41l5,-5H12.34z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/turned_in.xml b/qqq/android/mobileapp/src/main/res/drawable/turned_in.xml new file mode 100644 index 0000000..f9e2b07 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/turned_in.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/turned_in/materialicons/black/res/drawable/baseline_turned_in_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M17,3H7c-1.1,0 -1.99,0.9 -1.99,2L5,21l7,-3 7,3V5c0,-1.1 -0.9,-2 -2,-2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/turned_in_not.xml b/qqq/android/mobileapp/src/main/res/drawable/turned_in_not.xml new file mode 100644 index 0000000..06b952b --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/turned_in_not.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/turned_in_not/materialicons/black/res/drawable/baseline_turned_in_not_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M17,3L7,3c-1.1,0 -1.99,0.9 -1.99,2L5,21l7,-3 7,3L19,5c0,-1.1 -0.9,-2 -2,-2zM17,18l-5,-2.18L7,18L7,5h10v13z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/tv.xml b/qqq/android/mobileapp/src/main/res/drawable/tv.xml new file mode 100644 index 0000000..a7f933e --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/tv.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/hardware/tv/materialicons/black/res/drawable/baseline_tv_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M21,3L3,3c-1.1,0 -2,0.9 -2,2v12c0,1.1 0.9,2 2,2h5v2h8v-2h5c1.1,0 1.99,-0.9 1.99,-2L23,5c0,-1.1 -0.9,-2 -2,-2zM21,17L3,17L3,5h18v12z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/tv_off.xml b/qqq/android/mobileapp/src/main/res/drawable/tv_off.xml new file mode 100644 index 0000000..f5967d0 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/tv_off.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/notification/tv_off/materialicons/black/res/drawable/baseline_tv_off_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M1,3.54l1.53,1.53C1.65,5.28 1,6.06 1,7v12c0,1.1 0.9,2 2,2h15.46l2,2 1.26,-1.27L2.27,2.27 1,3.54zM3,19V7h1.46l12,12H3zM21,5h-7.58l3.29,-3.3L16,1l-4,4 -4,-4 -0.7,0.7L10.58,5H7.52l2,2H21v11.48l1.65,1.65c0.22,-0.32 0.35,-0.71 0.35,-1.13V7c0,-1.11 -0.89,-2 -2,-2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/two_wheeler.xml b/qqq/android/mobileapp/src/main/res/drawable/two_wheeler.xml new file mode 100644 index 0000000..db7b112 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/two_wheeler.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/two_wheeler/materialicons/black/res/drawable/baseline_two_wheeler_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,11c-0.18,0 -0.36,0.03 -0.53,0.05L17.41,9H20V6l-3.72,1.86L13.41,5H9v2h3.59l2,2H11l-4,2L5,9H0v2h4c-2.21,0 -4,1.79 -4,4c0,2.21 1.79,4 4,4c2.21,0 4,-1.79 4,-4l2,2h3l3.49,-6.1l1.01,1.01C16.59,12.64 16,13.75 16,15c0,2.21 1.79,4 4,4c2.21,0 4,-1.79 4,-4C24,12.79 22.21,11 20,11zM4,17c-1.1,0 -2,-0.9 -2,-2c0,-1.1 0.9,-2 2,-2c1.1,0 2,0.9 2,2C6,16.1 5.1,17 4,17zM20,17c-1.1,0 -2,-0.9 -2,-2c0,-1.1 0.9,-2 2,-2s2,0.9 2,2C22,16.1 21.1,17 20,17z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/type_specimen.xml b/qqq/android/mobileapp/src/main/res/drawable/type_specimen.xml new file mode 100644 index 0000000..6f2ce9c --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/type_specimen.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/editor/type_specimen/materialicons/black/res/drawable/baseline_type_specimen_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M4,6H2v14c0,1.1 0.9,2 2,2h14v-2H4V6z" /> + <path + android:fillColor="#FF000000" + android:pathData="M20,2H8C6.9,2 6,2.9 6,4v12c0,1.1 0.9,2 2,2h12c1.1,0 2,-0.9 2,-2V4C22,2.9 21.1,2 20,2zM16.63,14.5l-0.8,-2.3h-3.63l-0.82,2.3H9.81l3.38,-9h1.61l3.38,9H16.63z" /> + <path + android:fillColor="#FF000000" + android:pathData="M13.96,7.17l-1.31,3.72l2.69,0l-1.3,-3.72z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/u_turn_left.xml b/qqq/android/mobileapp/src/main/res/drawable/u_turn_left.xml new file mode 100644 index 0000000..9437053 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/u_turn_left.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/u_turn_left/materialicons/black/res/drawable/baseline_u_turn_left_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M18,9v12h-2V9c0,-2.21 -1.79,-4 -4,-4S8,6.79 8,9v4.17l1.59,-1.59L11,13l-4,4l-4,-4l1.41,-1.41L6,13.17V9c0,-3.31 2.69,-6 6,-6S18,5.69 18,9z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/u_turn_right.xml b/qqq/android/mobileapp/src/main/res/drawable/u_turn_right.xml new file mode 100644 index 0000000..ed29320 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/u_turn_right.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/u_turn_right/materialicons/black/res/drawable/baseline_u_turn_right_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M6,9v12h2V9c0,-2.21 1.79,-4 4,-4s4,1.79 4,4v4.17l-1.59,-1.59L13,13l4,4l4,-4l-1.41,-1.41L18,13.17V9c0,-3.31 -2.69,-6 -6,-6S6,5.69 6,9z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/umbrella.xml b/qqq/android/mobileapp/src/main/res/drawable/umbrella.xml new file mode 100644 index 0000000..9d78409 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/umbrella.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/places/umbrella/materialicons/black/res/drawable/baseline_umbrella_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M14.5,6.92L13,5.77V3.88V3.4c0,-0.26 0.22,-0.48 0.5,-0.48c0.28,0 0.5,0.21 0.5,0.48V4h2V3.4C16,2.07 14.88,1 13.5,1C12.12,1 11,2.07 11,3.4v0.48v1.89L9.5,6.92L6,6.07l5.05,15.25C11.2,21.77 11.6,22 12,22s0.8,-0.23 0.95,-0.69L18,6.07L14.5,6.92zM13.28,8.5l0.76,0.58l0.92,-0.23L13,14.8V8.29L13.28,8.5zM9.96,9.09l0.76,-0.58L11,8.29v6.51L9.03,8.86L9.96,9.09z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/unarchive.xml b/qqq/android/mobileapp/src/main/res/drawable/unarchive.xml new file mode 100644 index 0000000..b7e6177 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/unarchive.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/content/unarchive/materialicons/black/res/drawable/baseline_unarchive_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20.55,5.22l-1.39,-1.68C18.88,3.21 18.47,3 18,3H6C5.53,3 5.12,3.21 4.85,3.55L3.46,5.22C3.17,5.57 3,6.01 3,6.5V19c0,1.1 0.89,2 2,2h14c1.1,0 2,-0.9 2,-2V6.5C21,6.01 20.83,5.57 20.55,5.22zM12,9.5l5.5,5.5H14v2h-4v-2H6.5L12,9.5zM5.12,5l0.82,-1h12l0.93,1H5.12z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/undo.xml b/qqq/android/mobileapp/src/main/res/drawable/undo.xml new file mode 100644 index 0000000..c23b408 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/undo.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/content/undo/materialicons/black/res/drawable/baseline_undo_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12.5,8c-2.65,0 -5.05,0.99 -6.9,2.6L2,7v9h9l-3.62,-3.62c1.39,-1.16 3.16,-1.88 5.12,-1.88 3.54,0 6.55,2.31 7.6,5.5l2.37,-0.78C21.08,11.03 17.15,8 12.5,8z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/unfold_less.xml b/qqq/android/mobileapp/src/main/res/drawable/unfold_less.xml new file mode 100644 index 0000000..840ecd8 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/unfold_less.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/navigation/unfold_less/materialicons/black/res/drawable/baseline_unfold_less_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M7.41,18.59L8.83,20 12,16.83 15.17,20l1.41,-1.41L12,14l-4.59,4.59zM16.59,5.41L15.17,4 12,7.17 8.83,4 7.41,5.41 12,10l4.59,-4.59z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/unfold_less_double.xml b/qqq/android/mobileapp/src/main/res/drawable/unfold_less_double.xml new file mode 100644 index 0000000..082acba --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/unfold_less_double.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/unfold_less_double/materialicons/black/res/drawable/baseline_unfold_less_double_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M16.58,1.41l-1.42,-1.41l-3.17,3.17l-3.17,-3.17l-1.41,1.41l4.58,4.59z" /> + <path + android:fillColor="#FF000000" + android:pathData="M16.58,6.41l-1.42,-1.41l-3.17,3.17l-3.17,-3.17l-1.41,1.41l4.58,4.59z" /> + <path + android:fillColor="#FF000000" + android:pathData="M7.42,17.59l1.42,1.41l3.17,-3.17l3.17,3.17l1.41,-1.41l-4.58,-4.59z" /> + <path + android:fillColor="#FF000000" + android:pathData="M7.42,22.59l1.42,1.41l3.17,-3.17l3.17,3.17l1.41,-1.41l-4.58,-4.59z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/unfold_more.xml b/qqq/android/mobileapp/src/main/res/drawable/unfold_more.xml new file mode 100644 index 0000000..f8bfabb --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/unfold_more.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/navigation/unfold_more/materialicons/black/res/drawable/baseline_unfold_more_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,5.83L15.17,9l1.41,-1.41L12,3 7.41,7.59 8.83,9 12,5.83zM12,18.17L8.83,15l-1.41,1.41L12,21l4.59,-4.59L15.17,15 12,18.17z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/unfold_more_double.xml b/qqq/android/mobileapp/src/main/res/drawable/unfold_more_double.xml new file mode 100644 index 0000000..4036822 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/unfold_more_double.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/unfold_more_double/materialicons/black/res/drawable/baseline_unfold_more_double_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,7.83L15.17,11l1.41,-1.41L12,5L7.41,9.59L8.83,11L12,7.83zM12,2.83L15.17,6l1.41,-1.41L12,0L7.41,4.59L8.83,6L12,2.83zM12,21.17L8.83,18l-1.41,1.41L12,24l4.59,-4.59L15.17,18L12,21.17zM12,16.17L8.83,13l-1.41,1.41L12,19l4.59,-4.59L15.17,13L12,16.17z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/unpublished.xml b/qqq/android/mobileapp/src/main/res/drawable/unpublished.xml new file mode 100644 index 0000000..4bbfd92 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/unpublished.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/unpublished/materialicons/black/res/drawable/baseline_unpublished_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M21.19,21.19L2.81,2.81L1.39,4.22l2.27,2.27C2.61,8.07 2,9.96 2,12c0,5.52 4.48,10 10,10c2.04,0 3.93,-0.61 5.51,-1.66l2.27,2.27L21.19,21.19zM10.59,16.6l-4.24,-4.24l1.41,-1.41l2.83,2.83l0.18,-0.18l1.41,1.41L10.59,16.6zM13.59,10.76l-7.1,-7.1C8.07,2.61 9.96,2 12,2c5.52,0 10,4.48 10,10c0,2.04 -0.61,3.93 -1.66,5.51l-5.34,-5.34l2.65,-2.65l-1.41,-1.41L13.59,10.76z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/unsubscribe.xml b/qqq/android/mobileapp/src/main/res/drawable/unsubscribe.xml new file mode 100644 index 0000000..b899c6c --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/unsubscribe.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/communication/unsubscribe/materialicons/black/res/drawable/baseline_unsubscribe_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M18.5,13c-1.93,0 -3.5,1.57 -3.5,3.5s1.57,3.5 3.5,3.5 3.5,-1.57 3.5,-3.5 -1.57,-3.5 -3.5,-3.5zM20.5,17h-4v-1h4v1zM13.55,17c-0.02,-0.17 -0.05,-0.33 -0.05,-0.5 0,-2.76 2.24,-5 5,-5 0.92,0 1.76,0.26 2.5,0.69L21,5c0,-1.1 -0.9,-2 -2,-2L5,3c-1.1,0 -2,0.9 -2,2v10c0,1.1 0.9,2 2,2h8.55zM12,10.5L5,7L5,5l7,3.5L19,5v2l-7,3.5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/upcoming.xml b/qqq/android/mobileapp/src/main/res/drawable/upcoming.xml new file mode 100644 index 0000000..8496807 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/upcoming.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/content/upcoming/materialicons/black/res/drawable/baseline_upcoming_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M21.16,7.26l-1.41,-1.41L16.19,9.4l1.41,1.41C17.6,10.81 21.05,7.29 21.16,7.26z" /> + <path + android:fillColor="#FF000000" + android:pathData="M11,3h2v5h-2z" /> + <path + android:fillColor="#FF000000" + android:pathData="M6.4,10.81L7.81,9.4L4.26,5.84L2.84,7.26C2.95,7.29 6.4,10.81 6.4,10.81z" /> + <path + android:fillColor="#FF000000" + android:pathData="M20,12h-5c0,1.66 -1.34,3 -3,3s-3,-1.34 -3,-3H4c-1.1,0 -2,0.9 -2,2v5c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2v-5C22,12.9 21.1,12 20,12z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/update.xml b/qqq/android/mobileapp/src/main/res/drawable/update.xml new file mode 100644 index 0000000..b30065c --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/update.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/update/materialicons/black/res/drawable/baseline_update_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M21,10.12h-6.78l2.74,-2.82c-2.73,-2.7 -7.15,-2.8 -9.88,-0.1c-2.73,2.71 -2.73,7.08 0,9.79s7.15,2.71 9.88,0C18.32,15.65 19,14.08 19,12.1h2c0,1.98 -0.88,4.55 -2.64,6.29c-3.51,3.48 -9.21,3.48 -12.72,0c-3.5,-3.47 -3.53,-9.11 -0.02,-12.58s9.14,-3.47 12.65,0L21,3V10.12zM12.5,8v4.25l3.5,2.08l-0.72,1.21L11,13V8H12.5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/update_disabled.xml b/qqq/android/mobileapp/src/main/res/drawable/update_disabled.xml new file mode 100644 index 0000000..40d3fc6 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/update_disabled.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/update_disabled/materialicons/black/res/drawable/baseline_update_disabled_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M8.67,5.84L7.22,4.39C8.6,3.51 10.24,3 12,3c2.74,0 5.19,1.23 6.84,3.16L21,4v6h-6l2.41,-2.41C16.12,6.02 14.18,5 12,5C10.8,5 9.66,5.31 8.67,5.84zM13,7h-2v1.17l2,2V7zM19.78,22.61l-3,-3C15.39,20.48 13.76,21 12,21c-4.97,0 -9,-4.03 -9,-9c0,-1.76 0.51,-3.4 1.39,-4.78L1.39,4.22l1.41,-1.41l18.38,18.38L19.78,22.61zM15.32,18.15L5.84,8.67C5.31,9.66 5,10.8 5,12c0,3.86 3.14,7 7,7C13.2,19 14.34,18.69 15.32,18.15zM20.94,13h-2.02c-0.12,0.83 -0.39,1.61 -0.77,2.32l1.47,1.47C20.32,15.67 20.79,14.38 20.94,13z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/upgrade.xml b/qqq/android/mobileapp/src/main/res/drawable/upgrade.xml new file mode 100644 index 0000000..905b13b --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/upgrade.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/upgrade/materialicons/black/res/drawable/baseline_upgrade_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M16,18v2H8v-2H16zM11,7.99V16h2V7.99h3L12,4L8,7.99H11z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/upload.xml b/qqq/android/mobileapp/src/main/res/drawable/upload.xml new file mode 100644 index 0000000..a5a1c29 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/upload.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/file/upload/materialicons/black/res/drawable/baseline_upload_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M5,20h14v-2H5V20zM5,10h4v6h6v-6h4l-7,-7L5,10z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/upload_file.xml b/qqq/android/mobileapp/src/main/res/drawable/upload_file.xml new file mode 100644 index 0000000..148406c --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/upload_file.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/file/upload_file/materialicons/black/res/drawable/baseline_upload_file_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M14,2L6,2c-1.1,0 -1.99,0.9 -1.99,2L4,20c0,1.1 0.89,2 1.99,2L18,22c1.1,0 2,-0.9 2,-2L20,8l-6,-6zM18,20L6,20L6,4h7v5h5v11zM8,15.01l1.41,1.41L11,14.84L11,19h2v-4.16l1.59,1.59L16,15.01 12.01,11z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/usb.xml b/qqq/android/mobileapp/src/main/res/drawable/usb.xml new file mode 100644 index 0000000..e35104a --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/usb.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/usb/materialicons/black/res/drawable/baseline_usb_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M15,7v4h1v2h-3V5h2l-3,-4 -3,4h2v8H8v-2.07c0.7,-0.37 1.2,-1.08 1.2,-1.93 0,-1.21 -0.99,-2.2 -2.2,-2.2 -1.21,0 -2.2,0.99 -2.2,2.2 0,0.85 0.5,1.56 1.2,1.93V13c0,1.11 0.89,2 2,2h3v3.05c-0.71,0.37 -1.2,1.1 -1.2,1.95 0,1.22 0.99,2.2 2.2,2.2 1.21,0 2.2,-0.98 2.2,-2.2 0,-0.85 -0.49,-1.58 -1.2,-1.95V15h3c1.11,0 2,-0.89 2,-2v-2h1V7h-4z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/usb_off.xml b/qqq/android/mobileapp/src/main/res/drawable/usb_off.xml new file mode 100644 index 0000000..1759a24 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/usb_off.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/usb_off/materialicons/black/res/drawable/baseline_usb_off_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M15,8h4v4h-1v2c0,0.34 -0.08,0.66 -0.23,0.94L16,13.17V12h-1V8zM11,8.17l2,2V6h2l-3,-4L9,6h2V8.17zM13,16v2.28c0.6,0.34 1,0.98 1,1.72c0,1.1 -0.9,2 -2,2s-2,-0.9 -2,-2c0,-0.74 0.4,-1.37 1,-1.72V16H8c-1.11,0 -2,-0.89 -2,-2v-2.28C5.4,11.38 5,10.74 5,10c0,-0.59 0.26,-1.13 0.68,-1.49L1.39,4.22l1.41,-1.41l18.38,18.38l-1.41,1.41L13.17,16H13zM11,14v-0.17l-2.51,-2.51c-0.14,0.16 -0.31,0.29 -0.49,0.4V14H11z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/vaccines.xml b/qqq/android/mobileapp/src/main/res/drawable/vaccines.xml new file mode 100644 index 0000000..141cd38 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/vaccines.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/vaccines/materialicons/black/res/drawable/baseline_vaccines_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M11,5.5H8V4h0.5c0.55,0 1,-0.45 1,-1c0,-0.55 -0.45,-1 -1,-1h-3c-0.55,0 -1,0.45 -1,1c0,0.55 0.45,1 1,1H6v1.5H3c-0.55,0 -1,0.45 -1,1c0,0.55 0.45,1 1,1V15c0,1.1 0.9,2 2,2h1v4l2,1.5V17h1c1.1,0 2,-0.9 2,-2V7.5c0.55,0 1,-0.45 1,-1C12,5.95 11.55,5.5 11,5.5zM9,9H7.25C6.84,9 6.5,9.34 6.5,9.75c0,0.41 0.34,0.75 0.75,0.75H9V12H7.25c-0.41,0 -0.75,0.34 -0.75,0.75c0,0.41 0.34,0.75 0.75,0.75H9L9,15H5V7.5h4V9zM19.5,10.5V10c0.55,0 1,-0.45 1,-1c0,-0.55 -0.45,-1 -1,-1h-5c-0.55,0 -1,0.45 -1,1c0,0.55 0.45,1 1,1v0.5c0,0.5 -1.5,1.16 -1.5,3V20c0,1.1 0.9,2 2,2h4c1.1,0 2,-0.9 2,-2v-6.5C21,11.66 19.5,11 19.5,10.5zM16.5,10.5V10h1v0.5c0,1.6 1.5,2 1.5,3V14h-4c0,-0.21 0,-0.39 0,-0.5C15,12.5 16.5,12.1 16.5,10.5zM15,20c0,0 0,-0.63 0,-1.5h4V20H15z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/vape_free.xml b/qqq/android/mobileapp/src/main/res/drawable/vape_free.xml new file mode 100644 index 0000000..aa29021 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/vape_free.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/places/vape_free/materialicons/black/res/drawable/baseline_vape_free_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M2,16.5h1c1.33,0 2.71,-0.18 4,-0.5v3c-1.29,-0.32 -2.67,-0.5 -4,-0.5H2V16.5zM16.17,19H8v-3h5.17L1.39,4.22l1.41,-1.41l18.38,18.38l-1.41,1.41L16.17,19zM18.83,16H22v3h-0.17L18.83,16zM11,17.5c0,-0.28 -0.22,-0.5 -0.5,-0.5S10,17.22 10,17.5c0,0.28 0.22,0.5 0.5,0.5S11,17.78 11,17.5zM22,12.76V15h-1.5v-2.23c0,-2.24 -1.76,-4.07 -4,-4.07V7.2c1.02,0 1.85,-0.83 1.85,-1.85S17.52,3.5 16.5,3.5V2c1.85,0 3.35,1.5 3.35,3.35c0,0.93 -0.38,1.77 -1,2.38C20.72,8.62 22,10.54 22,12.76zM11.15,8.32c0,-0.01 0,-0.01 0,-0.02c0,-1.85 1.5,-3.35 3.35,-3.35v1.5c-1.02,0 -1.85,0.73 -1.85,1.75s0.83,2 1.85,2h1.53c1.87,0 3.47,1.35 3.47,3.16V15H18v-1.3c0,-1.31 -0.92,-2.05 -1.97,-2.05H14.5c-0.01,0 -0.01,0 -0.02,0L11.15,8.32z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/vaping_rooms.xml b/qqq/android/mobileapp/src/main/res/drawable/vaping_rooms.xml new file mode 100644 index 0000000..0d53bfd --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/vaping_rooms.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/places/vaping_rooms/materialicons/black/res/drawable/baseline_vaping_rooms_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M2,16.5h1c1.33,0 2.71,-0.18 4,-0.5v3c-1.29,-0.32 -2.67,-0.5 -4,-0.5H2V16.5zM22,16v3H8v-3H22zM11,17.5c0,-0.28 -0.22,-0.5 -0.5,-0.5S10,17.22 10,17.5c0,0.28 0.22,0.5 0.5,0.5S11,17.78 11,17.5zM22,12.76V15h-1.5v-2.23c0,-2.24 -1.76,-4.07 -4,-4.07V7.2c1.02,0 1.85,-0.83 1.85,-1.85S17.52,3.5 16.5,3.5V2c1.85,0 3.35,1.5 3.35,3.35c0,0.93 -0.38,1.77 -1,2.38C20.72,8.62 22,10.54 22,12.76zM19.5,13.36V15H18v-1.3c0,-1.31 -0.92,-2.05 -1.97,-2.05H14.5c-1.85,0 -3.35,-1.5 -3.35,-3.35s1.5,-3.35 3.35,-3.35v1.5c-1.02,0 -1.85,0.73 -1.85,1.75s0.83,2 1.85,2h1.53C17.9,10.2 19.5,11.55 19.5,13.36z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/verified.xml b/qqq/android/mobileapp/src/main/res/drawable/verified.xml new file mode 100644 index 0000000..1e512c0 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/verified.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/verified/materialicons/black/res/drawable/baseline_verified_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M23,12l-2.44,-2.79l0.34,-3.69l-3.61,-0.82L15.4,1.5L12,2.96L8.6,1.5L6.71,4.69L3.1,5.5L3.44,9.2L1,12l2.44,2.79l-0.34,3.7l3.61,0.82L8.6,22.5l3.4,-1.47l3.4,1.46l1.89,-3.19l3.61,-0.82l-0.34,-3.69L23,12zM10.09,16.72l-3.8,-3.81l1.48,-1.48l2.32,2.33l5.85,-5.87l1.48,1.48L10.09,16.72z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/verified_user.xml b/qqq/android/mobileapp/src/main/res/drawable/verified_user.xml new file mode 100644 index 0000000..415c5a5 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/verified_user.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/verified_user/materialicons/black/res/drawable/baseline_verified_user_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,1L3,5v6c0,5.55 3.84,10.74 9,12 5.16,-1.26 9,-6.45 9,-12L21,5l-9,-4zM10,17l-4,-4 1.41,-1.41L10,14.17l6.59,-6.59L18,9l-8,8z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/vertical_align_bottom.xml b/qqq/android/mobileapp/src/main/res/drawable/vertical_align_bottom.xml new file mode 100644 index 0000000..e86c262 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/vertical_align_bottom.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/editor/vertical_align_bottom/materialicons/black/res/drawable/baseline_vertical_align_bottom_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M16,13h-3V3h-2v10H8l4,4 4,-4zM4,19v2h16v-2H4z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/vertical_align_center.xml b/qqq/android/mobileapp/src/main/res/drawable/vertical_align_center.xml new file mode 100644 index 0000000..2d03f31 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/vertical_align_center.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/editor/vertical_align_center/materialicons/black/res/drawable/baseline_vertical_align_center_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M8,19h3v4h2v-4h3l-4,-4 -4,4zM16,5h-3L13,1h-2v4L8,5l4,4 4,-4zM4,11v2h16v-2L4,11z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/vertical_align_top.xml b/qqq/android/mobileapp/src/main/res/drawable/vertical_align_top.xml new file mode 100644 index 0000000..ca56d1f --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/vertical_align_top.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/editor/vertical_align_top/materialicons/black/res/drawable/baseline_vertical_align_top_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M8,11h3v10h2V11h3l-4,-4 -4,4zM4,3v2h16V3H4z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/vertical_distribute.xml b/qqq/android/mobileapp/src/main/res/drawable/vertical_distribute.xml new file mode 100644 index 0000000..f5bdd3b --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/vertical_distribute.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/editor/vertical_distribute/materialicons/black/res/drawable/baseline_vertical_distribute_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M22,2v2H2V2H22zM7,10.5v3h10v-3H7zM2,20v2h20v-2H2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/vertical_shades.xml b/qqq/android/mobileapp/src/main/res/drawable/vertical_shades.xml new file mode 100644 index 0000000..9acb817 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/vertical_shades.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/home/vertical_shades/materialicons/black/res/drawable/baseline_vertical_shades_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,19V3H4v16H2v2h20v-2H20zM10,19V5h4v14H10z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/vertical_shades_closed.xml b/qqq/android/mobileapp/src/main/res/drawable/vertical_shades_closed.xml new file mode 100644 index 0000000..f6b77dd --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/vertical_shades_closed.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/home/vertical_shades_closed/materialicons/black/res/drawable/baseline_vertical_shades_closed_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,19V3H4v16H2v2h20v-2H20zM13,5h1.5v14H13V5zM11,19H9.5V5H11V19zM6,5h1.5v14H6V5zM16.5,19V5H18v14H16.5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/vertical_split.xml b/qqq/android/mobileapp/src/main/res/drawable/vertical_split.xml new file mode 100644 index 0000000..05f21af --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/vertical_split.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/vertical_split/materialicons/black/res/drawable/baseline_vertical_split_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M3,15h8v-2L3,13v2zM3,19h8v-2L3,17v2zM3,11h8L11,9L3,9v2zM3,5v2h8L11,5L3,5zM13,5h8v14h-8L13,5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/vibration.xml b/qqq/android/mobileapp/src/main/res/drawable/vibration.xml new file mode 100644 index 0000000..6833244 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/vibration.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/notification/vibration/materialicons/black/res/drawable/baseline_vibration_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M0,15h2L2,9L0,9v6zM3,17h2L5,7L3,7v10zM22,9v6h2L24,9h-2zM19,17h2L21,7h-2v10zM16.5,3h-9C6.67,3 6,3.67 6,4.5v15c0,0.83 0.67,1.5 1.5,1.5h9c0.83,0 1.5,-0.67 1.5,-1.5v-15c0,-0.83 -0.67,-1.5 -1.5,-1.5zM16,19L8,19L8,5h8v14z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/video_call.xml b/qqq/android/mobileapp/src/main/res/drawable/video_call.xml new file mode 100644 index 0000000..42fdea1 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/video_call.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/av/video_call/materialicons/black/res/drawable/baseline_video_call_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M17,10.5V7c0,-0.55 -0.45,-1 -1,-1H4c-0.55,0 -1,0.45 -1,1v10c0,0.55 0.45,1 1,1h12c0.55,0 1,-0.45 1,-1v-3.5l4,4v-11l-4,4zM14,13h-3v3H9v-3H6v-2h3V8h2v3h3v2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/video_camera_back.xml b/qqq/android/mobileapp/src/main/res/drawable/video_camera_back.xml new file mode 100644 index 0000000..8dbd5e7 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/video_camera_back.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/video_camera_back/materialicons/black/res/drawable/baseline_video_camera_back_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M18,10.48V6c0,-1.1 -0.9,-2 -2,-2H4C2.9,4 2,4.9 2,6v12c0,1.1 0.9,2 2,2h12c1.1,0 2,-0.9 2,-2v-4.48l4,3.98v-11L18,10.48zM5,16l2.38,-3.17L9,15l2.62,-3.5L15,16H5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/video_camera_front.xml b/qqq/android/mobileapp/src/main/res/drawable/video_camera_front.xml new file mode 100644 index 0000000..8e07c62 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/video_camera_front.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/video_camera_front/materialicons/black/res/drawable/baseline_video_camera_front_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M18,10.48V6c0,-1.1 -0.9,-2 -2,-2H4C2.9,4 2,4.9 2,6v12c0,1.1 0.9,2 2,2h12c1.1,0 2,-0.9 2,-2v-4.48l4,3.98v-11L18,10.48zM10,8c1.1,0 2,0.9 2,2s-0.9,2 -2,2s-2,-0.9 -2,-2S8.9,8 10,8zM14,16H6v-0.57c0,-0.81 0.48,-1.53 1.22,-1.85C8.07,13.21 9.01,13 10,13c0.99,0 1.93,0.21 2.78,0.58C13.52,13.9 14,14.62 14,15.43V16z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/video_chat.xml b/qqq/android/mobileapp/src/main/res/drawable/video_chat.xml new file mode 100644 index 0000000..0e396e3 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/video_chat.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/notification/video_chat/materialicons/black/res/drawable/baseline_video_chat_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,2H4C2.9,2 2.01,2.9 2.01,4L2,22l4,-4h14c1.1,0 2,-0.9 2,-2V4C22,2.9 21.1,2 20,2zM17,13l-2,-1.99V13c0,0.55 -0.45,1 -1,1H8c-0.55,0 -1,-0.45 -1,-1V7c0,-0.55 0.45,-1 1,-1h6c0.55,0 1,0.45 1,1v1.99L17,7V13z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/video_file.xml b/qqq/android/mobileapp/src/main/res/drawable/video_file.xml new file mode 100644 index 0000000..0af3fe2 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/video_file.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/av/video_file/materialicons/black/res/drawable/baseline_video_file_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M14,2H6.01c-1.1,0 -2,0.89 -2,2L4,20c0,1.1 0.9,2 2,2h12c1.1,0 2,-0.9 2,-2V8L14,2zM13,9V3.5L18.5,9H13zM14,14l2,-1.06v4.12L14,16v1c0,0.55 -0.45,1 -1,1H9c-0.55,0 -1,-0.45 -1,-1v-4c0,-0.55 0.45,-1 1,-1h4c0.55,0 1,0.45 1,1V14z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/video_label.xml b/qqq/android/mobileapp/src/main/res/drawable/video_label.xml new file mode 100644 index 0000000..33546c0 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/video_label.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/av/video_label/materialicons/black/res/drawable/baseline_video_label_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M21,3L3,3c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h18c1.1,0 2,-0.9 2,-2L23,5c0,-1.1 -0.9,-2 -2,-2zM21,16L3,16L3,5h18v11z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/video_library.xml b/qqq/android/mobileapp/src/main/res/drawable/video_library.xml new file mode 100644 index 0000000..2019334 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/video_library.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/av/video_library/materialicons/black/res/drawable/baseline_video_library_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M4,6L2,6v14c0,1.1 0.9,2 2,2h14v-2L4,20L4,6zM20,2L8,2c-1.1,0 -2,0.9 -2,2v12c0,1.1 0.9,2 2,2h12c1.1,0 2,-0.9 2,-2L22,4c0,-1.1 -0.9,-2 -2,-2zM12,14.5v-9l6,4.5 -6,4.5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/video_settings.xml b/qqq/android/mobileapp/src/main/res/drawable/video_settings.xml new file mode 100644 index 0000000..265432c --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/video_settings.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/av/video_settings/materialicons/black/res/drawable/baseline_video_settings_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M3,6h18v5h2V6c0,-1.1 -0.9,-2 -2,-2H3C1.9,4 1,4.9 1,6v12c0,1.1 0.9,2 2,2h9v-2H3V6z" /> + <path + android:fillColor="#FF000000" + android:pathData="M15,12l-6,-4l0,8z" /> + <path + android:fillColor="#FF000000" + android:pathData="M22.71,18.43c0.03,-0.29 0.04,-0.58 0.01,-0.86l1.07,-0.85c0.1,-0.08 0.12,-0.21 0.06,-0.32l-1.03,-1.79c-0.06,-0.11 -0.19,-0.15 -0.31,-0.11L21.23,15c-0.23,-0.17 -0.48,-0.31 -0.75,-0.42l-0.2,-1.36C20.26,13.09 20.16,13 20.03,13h-2.07c-0.12,0 -0.23,0.09 -0.25,0.21l-0.2,1.36c-0.26,0.11 -0.51,0.26 -0.74,0.42l-1.28,-0.5c-0.12,-0.05 -0.25,0 -0.31,0.11l-1.03,1.79c-0.06,0.11 -0.04,0.24 0.06,0.32l1.07,0.86c-0.03,0.29 -0.04,0.58 -0.01,0.86l-1.07,0.85c-0.1,0.08 -0.12,0.21 -0.06,0.32l1.03,1.79c0.06,0.11 0.19,0.15 0.31,0.11l1.27,-0.5c0.23,0.17 0.48,0.31 0.75,0.42l0.2,1.36c0.02,0.12 0.12,0.21 0.25,0.21h2.07c0.12,0 0.23,-0.09 0.25,-0.21l0.2,-1.36c0.26,-0.11 0.51,-0.26 0.74,-0.42l1.28,0.5c0.12,0.05 0.25,0 0.31,-0.11l1.03,-1.79c0.06,-0.11 0.04,-0.24 -0.06,-0.32L22.71,18.43zM19,19.5c-0.83,0 -1.5,-0.67 -1.5,-1.5s0.67,-1.5 1.5,-1.5s1.5,0.67 1.5,1.5S19.83,19.5 19,19.5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/video_stable.xml b/qqq/android/mobileapp/src/main/res/drawable/video_stable.xml new file mode 100644 index 0000000..47abd47 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/video_stable.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/video_stable/materialicons/black/res/drawable/baseline_video_stable_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,4H4C2.9,4 2,4.9 2,6v12c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2V6C22,4.9 21.1,4 20,4zM4,18V6h2.95l-2.33,8.73L16.82,18H4zM20,18h-2.95l2.34,-8.73L7.18,6H20V18z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/videocam.xml b/qqq/android/mobileapp/src/main/res/drawable/videocam.xml new file mode 100644 index 0000000..dbf7632 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/videocam.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/av/videocam/materialicons/black/res/drawable/baseline_videocam_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M17,10.5V7c0,-0.55 -0.45,-1 -1,-1H4c-0.55,0 -1,0.45 -1,1v10c0,0.55 0.45,1 1,1h12c0.55,0 1,-0.45 1,-1v-3.5l4,4v-11l-4,4z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/videocam_off.xml b/qqq/android/mobileapp/src/main/res/drawable/videocam_off.xml new file mode 100644 index 0000000..de7be10 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/videocam_off.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/av/videocam_off/materialicons/black/res/drawable/baseline_videocam_off_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M21,6.5l-4,4V7c0,-0.55 -0.45,-1 -1,-1H9.82L21,17.18V6.5zM3.27,2L2,3.27 4.73,6H4c-0.55,0 -1,0.45 -1,1v10c0,0.55 0.45,1 1,1h12c0.21,0 0.39,-0.08 0.54,-0.18L19.73,21 21,19.73 3.27,2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/videogame_asset.xml b/qqq/android/mobileapp/src/main/res/drawable/videogame_asset.xml new file mode 100644 index 0000000..4796c06 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/videogame_asset.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/hardware/videogame_asset/materialicons/black/res/drawable/baseline_videogame_asset_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M21,6L3,6c-1.1,0 -2,0.9 -2,2v8c0,1.1 0.9,2 2,2h18c1.1,0 2,-0.9 2,-2L23,8c0,-1.1 -0.9,-2 -2,-2zM11,13L8,13v3L6,16v-3L3,13v-2h3L6,8h2v3h3v2zM15.5,15c-0.83,0 -1.5,-0.67 -1.5,-1.5s0.67,-1.5 1.5,-1.5 1.5,0.67 1.5,1.5 -0.67,1.5 -1.5,1.5zM19.5,12c-0.83,0 -1.5,-0.67 -1.5,-1.5S18.67,9 19.5,9s1.5,0.67 1.5,1.5 -0.67,1.5 -1.5,1.5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/videogame_asset_off.xml b/qqq/android/mobileapp/src/main/res/drawable/videogame_asset_off.xml new file mode 100644 index 0000000..598d7d6 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/videogame_asset_off.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/hardware/videogame_asset_off/materialicons/black/res/drawable/baseline_videogame_asset_off_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M21.19,21.19L2.81,2.81L1.39,4.22L3.3,6.13C2.54,6.41 2,7.15 2,8v8c0,1.1 0.9,2 2,2h11.17l4.61,4.61L21.19,21.19zM9,13v2H7v-2H5v-2h2V9.83L10.17,13H9zM20.7,17.87C21.46,17.59 22,16.85 22,16V8c0,-1.1 -0.9,-2 -2,-2H8.83L20.7,17.87zM17.5,9c0.83,0 1.5,0.67 1.5,1.5S18.33,12 17.5,12S16,11.33 16,10.5S16.67,9 17.5,9z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/view_agenda.xml b/qqq/android/mobileapp/src/main/res/drawable/view_agenda.xml new file mode 100644 index 0000000..6cf8526 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/view_agenda.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/view_agenda/materialicons/black/res/drawable/baseline_view_agenda_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19,13H5c-1.1,0 -2,0.9 -2,2v4c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2v-4C21,13.9 20.1,13 19,13z" /> + <path + android:fillColor="#FF000000" + android:pathData="M19,3H5C3.9,3 3,3.9 3,5v4c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2V5C21,3.9 20.1,3 19,3z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/view_array.xml b/qqq/android/mobileapp/src/main/res/drawable/view_array.xml new file mode 100644 index 0000000..06fb81e --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/view_array.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/view_array/materialicons/black/res/drawable/baseline_view_array_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M21,5h-3v14h3V5zM17,5H7v14h10V5zM6,5H3v14h3V5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/view_carousel.xml b/qqq/android/mobileapp/src/main/res/drawable/view_carousel.xml new file mode 100644 index 0000000..d029a40 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/view_carousel.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/view_carousel/materialicons/black/res/drawable/baseline_view_carousel_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M2,7h4v10H2V7zM7,19h10V5H7V19zM18,7h4v10h-4V7z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/view_column.xml b/qqq/android/mobileapp/src/main/res/drawable/view_column.xml new file mode 100644 index 0000000..a7476e7 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/view_column.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/view_column/materialicons/black/res/drawable/baseline_view_column_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M14.67,5v14H9.33V5H14.67zM15.67,19H21V5h-5.33V19zM8.33,19V5H3v14H8.33z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/view_comfy.xml b/qqq/android/mobileapp/src/main/res/drawable/view_comfy.xml new file mode 100644 index 0000000..bc53603 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/view_comfy.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/view_comfy/materialicons/black/res/drawable/baseline_view_comfy_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M2,4v7h20V4H2zM10,20h12v-7H10V20zM2,20h6v-7H2V20z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/view_comfy_alt.xml b/qqq/android/mobileapp/src/main/res/drawable/view_comfy_alt.xml new file mode 100644 index 0000000..634331d --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/view_comfy_alt.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/view_comfy_alt/materialicons/black/res/drawable/baseline_view_comfy_alt_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,4H4C2.9,4 2,4.9 2,6v12c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2V6C22,4.9 21.1,4 20,4zM11,17H7v-4h4V17zM11,11H7V7h4V11zM17,17h-4v-4h4V17zM17,11h-4V7h4V11z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/view_compact.xml b/qqq/android/mobileapp/src/main/res/drawable/view_compact.xml new file mode 100644 index 0000000..3e4e837 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/view_compact.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/view_compact/materialicons/black/res/drawable/baseline_view_compact_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M4,18h2.5v-2.5H4V18zM4,13.25h2.5v-2.5H4V13.25zM4,8.5h2.5V6H4V8.5zM17.5,6v2.5H20V6H17.5zM13,8.5h2.5V6H13V8.5zM17.5,18H20v-2.5h-2.5V18zM17.5,13.25H20v-2.5h-2.5V13.25zM8.5,18H11v-2.5H8.5V18zM13,18h2.5v-2.5H13V18zM8.5,8.5H11V6H8.5V8.5zM13,13.25h2.5v-2.5H13V13.25zM8.5,13.25H11v-2.5H8.5V13.25z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/view_compact_alt.xml b/qqq/android/mobileapp/src/main/res/drawable/view_compact_alt.xml new file mode 100644 index 0000000..e4e33a9 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/view_compact_alt.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/view_compact_alt/materialicons/black/res/drawable/baseline_view_compact_alt_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,4H4C2.9,4 2,4.9 2,6v12c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2V6C22,4.9 21.1,4 20,4zM11.5,16.5h-4v-4h4V16.5zM11.5,11.5h-4v-4h4V11.5zM16.5,16.5h-4v-4h4V16.5zM16.5,11.5h-4v-4h4V11.5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/view_cozy.xml b/qqq/android/mobileapp/src/main/res/drawable/view_cozy.xml new file mode 100644 index 0000000..02b1675 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/view_cozy.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/view_cozy/materialicons/black/res/drawable/baseline_view_cozy_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,4H4C2.9,4 2,4.9 2,6v12c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2V6C22,4.9 21.1,4 20,4zM11.25,16.75h-4v-4h4V16.75zM11.25,11.25h-4v-4h4V11.25zM16.75,16.75h-4v-4h4V16.75zM16.75,11.25h-4v-4h4V11.25z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/view_day.xml b/qqq/android/mobileapp/src/main/res/drawable/view_day.xml new file mode 100644 index 0000000..b62e190 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/view_day.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/view_day/materialicons/black/res/drawable/baseline_view_day_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M2,21h19v-3H2v3zM20,8H3c-0.55,0 -1,0.45 -1,1v6c0,0.55 0.45,1 1,1h17c0.55,0 1,-0.45 1,-1V9c0,-0.55 -0.45,-1 -1,-1zM2,3v3h19V3H2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/view_headline.xml b/qqq/android/mobileapp/src/main/res/drawable/view_headline.xml new file mode 100644 index 0000000..e36d4f6 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/view_headline.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/view_headline/materialicons/black/res/drawable/baseline_view_headline_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M4,15h16v-2L4,13v2zM4,19h16v-2L4,17v2zM4,11h16L20,9L4,9v2zM4,5v2h16L20,5L4,5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/view_in_ar.xml b/qqq/android/mobileapp/src/main/res/drawable/view_in_ar.xml new file mode 100644 index 0000000..81f8c91 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/view_in_ar.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/view_in_ar/materialicons/black/res/drawable/baseline_view_in_ar_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M18.25,7.6l-5.5,-3.18c-0.46,-0.27 -1.04,-0.27 -1.5,0L5.75,7.6c-0.46,0.27 -0.75,0.76 -0.75,1.3v6.35c0,0.54 0.29,1.03 0.75,1.3l5.5,3.18c0.46,0.27 1.04,0.27 1.5,0l5.5,-3.18c0.46,-0.27 0.75,-0.76 0.75,-1.3L19,8.9c0,-0.54 -0.29,-1.03 -0.75,-1.3zM7,14.96v-4.62l4,2.32v4.61l-4,-2.31zM12,10.93L8,8.61l4,-2.31 4,2.31 -4,2.32zM13,17.27v-4.61l4,-2.32v4.62l-4,2.31zM7,2L3.5,2C2.67,2 2,2.67 2,3.5L2,7h2L4,4h3L7,2zM17,2h3.5c0.83,0 1.5,0.67 1.5,1.5L22,7h-2L20,4h-3L17,2zM7,22L3.5,22c-0.83,0 -1.5,-0.67 -1.5,-1.5L2,17h2v3h3v2zM17,22h3.5c0.83,0 1.5,-0.67 1.5,-1.5L22,17h-2v3h-3v2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/view_kanban.xml b/qqq/android/mobileapp/src/main/res/drawable/view_kanban.xml new file mode 100644 index 0000000..571bb76 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/view_kanban.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/view_kanban/materialicons/black/res/drawable/baseline_view_kanban_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19,3H5C3.9,3 3,3.9 3,5v14c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2V5C21,3.9 20.1,3 19,3zM9,17H7V7h2V17zM13,12h-2V7h2V12zM17,15h-2V7h2V15z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/view_list.xml b/qqq/android/mobileapp/src/main/res/drawable/view_list.xml new file mode 100644 index 0000000..b9f8142 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/view_list.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/view_list/materialicons/black/res/drawable/baseline_view_list_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M3,14h4v-4H3V14zM3,19h4v-4H3V19zM3,9h4V5H3V9zM8,14h13v-4H8V14zM8,19h13v-4H8V19zM8,5v4h13V5H8z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/view_module.xml b/qqq/android/mobileapp/src/main/res/drawable/view_module.xml new file mode 100644 index 0000000..12aa24f --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/view_module.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/view_module/materialicons/black/res/drawable/baseline_view_module_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M14.67,5v6.5H9.33V5H14.67zM15.67,11.5H21V5h-5.33V11.5zM14.67,19v-6.5H9.33V19H14.67zM15.67,12.5V19H21v-6.5H15.67zM8.33,12.5H3V19h5.33V12.5zM8.33,11.5V5H3v6.5H8.33z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/view_quilt.xml b/qqq/android/mobileapp/src/main/res/drawable/view_quilt.xml new file mode 100644 index 0000000..d301df4 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/view_quilt.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/view_quilt/materialicons/black/res/drawable/baseline_view_quilt_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M21,5v6.5H9.33V5H21zM14.67,19v-6.5H9.33V19H14.67zM15.67,12.5V19H21v-6.5H15.67zM8.33,19V5H3v14H8.33z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/view_sidebar.xml b/qqq/android/mobileapp/src/main/res/drawable/view_sidebar.xml new file mode 100644 index 0000000..4cc92be --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/view_sidebar.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/view_sidebar/materialicons/black/res/drawable/baseline_view_sidebar_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M16,20H2V4h14V20zM18,8h4V4h-4V8zM18,20h4v-4h-4V20zM18,14h4v-4h-4V14z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/view_stream.xml b/qqq/android/mobileapp/src/main/res/drawable/view_stream.xml new file mode 100644 index 0000000..a938d77 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/view_stream.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/view_stream/materialicons/black/res/drawable/baseline_view_stream_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M3,17v-2c0,-1.1 0.9,-2 2,-2h14c1.1,0 2,0.9 2,2v2c0,1.1 -0.9,2 -2,2H5C3.9,19 3,18.1 3,17zM3,7v2c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2V7c0,-1.1 -0.9,-2 -2,-2H5C3.9,5 3,5.9 3,7z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/view_timeline.xml b/qqq/android/mobileapp/src/main/res/drawable/view_timeline.xml new file mode 100644 index 0000000..c58b325 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/view_timeline.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/view_timeline/materialicons/black/res/drawable/baseline_view_timeline_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19,3H5C3.9,3 3,3.9 3,5v14c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2V5C21,3.9 20.1,3 19,3zM12,17H6v-2h6V17zM15,13H9v-2h6V13zM18,9h-6V7h6V9z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/view_week.xml b/qqq/android/mobileapp/src/main/res/drawable/view_week.xml new file mode 100644 index 0000000..506ba53 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/view_week.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/view_week/materialicons/black/res/drawable/baseline_view_week_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M5.33,20H4c-1.1,0 -2,-0.9 -2,-2V6c0,-1.1 0.9,-2 2,-2h1.33c1.1,0 2,0.9 2,2v12C7.33,19.1 6.44,20 5.33,20zM22,18V6c0,-1.1 -0.9,-2 -2,-2h-1.33c-1.1,0 -2,0.9 -2,2v12c0,1.1 0.9,2 2,2H20C21.11,20 22,19.1 22,18zM14.67,18V6c0,-1.1 -0.9,-2 -2,-2h-1.33c-1.1,0 -2,0.9 -2,2v12c0,1.1 0.9,2 2,2h1.33C13.77,20 14.67,19.1 14.67,18z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/vignette.xml b/qqq/android/mobileapp/src/main/res/drawable/vignette.xml new file mode 100644 index 0000000..d765b7e --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/vignette.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/vignette/materialicons/black/res/drawable/baseline_vignette_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M21,3L3,3c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h18c1.1,0 2,-0.9 2,-2L23,5c0,-1.1 -0.9,-2 -2,-2zM12,18c-4.42,0 -8,-2.69 -8,-6s3.58,-6 8,-6 8,2.69 8,6 -3.58,6 -8,6z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/villa.xml b/qqq/android/mobileapp/src/main/res/drawable/villa.xml new file mode 100644 index 0000000..3f9ba09 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/villa.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/places/villa/materialicons/black/res/drawable/baseline_villa_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M7,21H3V8l13,-5v7H7V21zM19,10c-1.1,0 -2,0.9 -2,2H9v9h5v-5h2v5h5v-9C21,10.9 20.1,10 19,10z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/visibility.xml b/qqq/android/mobileapp/src/main/res/drawable/visibility.xml new file mode 100644 index 0000000..7a887bc --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/visibility.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/visibility/materialicons/black/res/drawable/baseline_visibility_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,4.5C7,4.5 2.73,7.61 1,12c1.73,4.39 6,7.5 11,7.5s9.27,-3.11 11,-7.5c-1.73,-4.39 -6,-7.5 -11,-7.5zM12,17c-2.76,0 -5,-2.24 -5,-5s2.24,-5 5,-5 5,2.24 5,5 -2.24,5 -5,5zM12,9c-1.66,0 -3,1.34 -3,3s1.34,3 3,3 3,-1.34 3,-3 -1.34,-3 -3,-3z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/visibility_off.xml b/qqq/android/mobileapp/src/main/res/drawable/visibility_off.xml new file mode 100644 index 0000000..d650662 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/visibility_off.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/visibility_off/materialicons/black/res/drawable/baseline_visibility_off_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,7c2.76,0 5,2.24 5,5 0,0.65 -0.13,1.26 -0.36,1.83l2.92,2.92c1.51,-1.26 2.7,-2.89 3.43,-4.75 -1.73,-4.39 -6,-7.5 -11,-7.5 -1.4,0 -2.74,0.25 -3.98,0.7l2.16,2.16C10.74,7.13 11.35,7 12,7zM2,4.27l2.28,2.28 0.46,0.46C3.08,8.3 1.78,10.02 1,12c1.73,4.39 6,7.5 11,7.5 1.55,0 3.03,-0.3 4.38,-0.84l0.42,0.42L19.73,22 21,20.73 3.27,3 2,4.27zM7.53,9.8l1.55,1.55c-0.05,0.21 -0.08,0.43 -0.08,0.65 0,1.66 1.34,3 3,3 0.22,0 0.44,-0.03 0.65,-0.08l1.55,1.55c-0.67,0.33 -1.41,0.53 -2.2,0.53 -2.76,0 -5,-2.24 -5,-5 0,-0.79 0.2,-1.53 0.53,-2.2zM11.84,9.02l3.15,3.15 0.02,-0.16c0,-1.66 -1.34,-3 -3,-3l-0.17,0.01z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/voice_chat.xml b/qqq/android/mobileapp/src/main/res/drawable/voice_chat.xml new file mode 100644 index 0000000..25d14f0 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/voice_chat.xml @@ -0,0 +1,34 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/notification/voice_chat/materialicons/black/res/drawable/baseline_voice_chat_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,2H4C2.9,2 2,2.9 2,4v18l4,-4h14c1.1,0 2,-0.9 2,-2V4C22,2.9 21.1,2 20,2zM20,16H6l-2,2V4h16V16z" /> + <path + android:fillColor="#FF000000" + android:pathData="M11.25,5h1.5v10h-1.5z" /> + <path + android:fillColor="#FF000000" + android:pathData="M8.5,7h1.5v6h-1.5z" /> + <path + android:fillColor="#FF000000" + android:pathData="M6,9h1.5v2h-1.5z" /> + <path + android:fillColor="#FF000000" + android:pathData="M14,7h1.5v6h-1.5z" /> + <path + android:fillColor="#FF000000" + android:pathData="M16.5,9h1.5v2h-1.5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/voice_over_off.xml b/qqq/android/mobileapp/src/main/res/drawable/voice_over_off.xml new file mode 100644 index 0000000..c4a4c14 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/voice_over_off.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/voice_over_off/materialicons/black/res/drawable/baseline_voice_over_off_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12.99,9.18c0,-0.06 0.01,-0.12 0.01,-0.18 0,-2.21 -1.79,-4 -4,-4 -0.06,0 -0.12,0.01 -0.18,0.01l4.17,4.17zM6.89,5.62L4.27,3 3,4.27l2.62,2.62C5.23,7.5 5,8.22 5,9c0,2.21 1.79,4 4,4 0.78,0 1.5,-0.23 2.11,-0.62L19.73,21 21,19.73l-8.62,-8.62 -5.49,-5.49zM9,15c-2.67,0 -8,1.34 -8,4v2h16v-2c0,-2.66 -5.33,-4 -8,-4zM16.76,5.36l-1.68,1.69c0.84,1.18 0.84,2.71 0,3.89l1.68,1.69c2.02,-2.02 2.02,-5.07 0,-7.27zM20.07,2l-1.63,1.63c2.77,3.02 2.77,7.56 0,10.74L20.07,16c3.9,-3.89 3.91,-9.95 0,-14z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/voicemail.xml b/qqq/android/mobileapp/src/main/res/drawable/voicemail.xml new file mode 100644 index 0000000..5840c6d --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/voicemail.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/communication/voicemail/materialicons/black/res/drawable/baseline_voicemail_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M18.5,6C15.46,6 13,8.46 13,11.5c0,1.33 0.47,2.55 1.26,3.5L9.74,15c0.79,-0.95 1.26,-2.17 1.26,-3.5C11,8.46 8.54,6 5.5,6S0,8.46 0,11.5 2.46,17 5.5,17h13c3.04,0 5.5,-2.46 5.5,-5.5S21.54,6 18.5,6zM5.5,15C3.57,15 2,13.43 2,11.5S3.57,8 5.5,8 9,9.57 9,11.5 7.43,15 5.5,15zM18.5,15c-1.93,0 -3.5,-1.57 -3.5,-3.5S16.57,8 18.5,8 22,9.57 22,11.5 20.43,15 18.5,15z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/volcano.xml b/qqq/android/mobileapp/src/main/res/drawable/volcano.xml new file mode 100644 index 0000000..c15cdae --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/volcano.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/volcano/materialicons/black/res/drawable/baseline_volcano_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M18,8l-7,0l-2,5l-3,0l-4,9l20,0z" /> + <path + android:fillColor="#FF000000" + android:pathData="M13,1h2v4h-2z" /> + <path + android:fillColor="#FF000000" + android:pathData="M16.121,5.468l2.828,-2.828l1.414,1.414l-2.828,2.828z" /> + <path + android:fillColor="#FF000000" + android:pathData="M7.64,4.05l1.414,-1.414l2.828,2.828l-1.414,1.414z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/volume_down.xml b/qqq/android/mobileapp/src/main/res/drawable/volume_down.xml new file mode 100644 index 0000000..91b5920 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/volume_down.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/av/volume_down/materialicons/black/res/drawable/baseline_volume_down_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M18.5,12c0,-1.77 -1.02,-3.29 -2.5,-4.03v8.05c1.48,-0.73 2.5,-2.25 2.5,-4.02zM5,9v6h4l5,5V4L9,9H5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/volume_down_alt.xml b/qqq/android/mobileapp/src/main/res/drawable/volume_down_alt.xml new file mode 100644 index 0000000..5bc3625 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/volume_down_alt.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/av/volume_down_alt/materialicons/black/res/drawable/baseline_volume_down_alt_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M14,7.97v8.05c1.48,-0.73 2.5,-2.25 2.5,-4.02S15.48,8.71 14,7.97zM3,9v6h4l5,5V4L7,9H3z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/volume_mute.xml b/qqq/android/mobileapp/src/main/res/drawable/volume_mute.xml new file mode 100644 index 0000000..04c35ae --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/volume_mute.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/av/volume_mute/materialicons/black/res/drawable/baseline_volume_mute_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M7,9v6h4l5,5V4l-5,5H7z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/volume_off.xml b/qqq/android/mobileapp/src/main/res/drawable/volume_off.xml new file mode 100644 index 0000000..79c999b --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/volume_off.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/av/volume_off/materialicons/black/res/drawable/baseline_volume_off_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M16.5,12c0,-1.77 -1.02,-3.29 -2.5,-4.03v2.21l2.45,2.45c0.03,-0.2 0.05,-0.41 0.05,-0.63zM19,12c0,0.94 -0.2,1.82 -0.54,2.64l1.51,1.51C20.63,14.91 21,13.5 21,12c0,-4.28 -2.99,-7.86 -7,-8.77v2.06c2.89,0.86 5,3.54 5,6.71zM4.27,3L3,4.27 7.73,9L3,9v6h4l5,5v-6.73l4.25,4.25c-0.67,0.52 -1.42,0.93 -2.25,1.18v2.06c1.38,-0.31 2.63,-0.95 3.69,-1.81L19.73,21 21,19.73l-9,-9L4.27,3zM12,4L9.91,6.09 12,8.18L12,4z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/volume_up.xml b/qqq/android/mobileapp/src/main/res/drawable/volume_up.xml new file mode 100644 index 0000000..7d28fb3 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/volume_up.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/av/volume_up/materialicons/black/res/drawable/baseline_volume_up_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M3,9v6h4l5,5L12,4L7,9L3,9zM16.5,12c0,-1.77 -1.02,-3.29 -2.5,-4.03v8.05c1.48,-0.73 2.5,-2.25 2.5,-4.02zM14,3.23v2.06c2.89,0.86 5,3.54 5,6.71s-2.11,5.85 -5,6.71v2.06c4.01,-0.91 7,-4.49 7,-8.77s-2.99,-7.86 -7,-8.77z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/volunteer_activism.xml b/qqq/android/mobileapp/src/main/res/drawable/volunteer_activism.xml new file mode 100644 index 0000000..9b96151 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/volunteer_activism.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/volunteer_activism/materialicons/black/res/drawable/baseline_volunteer_activism_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M1,11h4v11h-4z" /> + <path + android:fillColor="#FF000000" + android:pathData="M16,3.25C16.65,2.49 17.66,2 18.7,2C20.55,2 22,3.45 22,5.3c0,2.27 -2.91,4.9 -6,7.7c-3.09,-2.81 -6,-5.44 -6,-7.7C10,3.45 11.45,2 13.3,2C14.34,2 15.35,2.49 16,3.25z" /> + <path + android:fillColor="#FF000000" + android:pathData="M20,17h-7l-2.09,-0.73l0.33,-0.94L13,16h2.82c0.65,0 1.18,-0.53 1.18,-1.18v0c0,-0.49 -0.31,-0.93 -0.77,-1.11L8.97,11H7v9.02L14,22l8.01,-3v0C22,17.9 21.11,17 20,17z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/vpn_key.xml b/qqq/android/mobileapp/src/main/res/drawable/vpn_key.xml new file mode 100644 index 0000000..d12d28c --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/vpn_key.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/communication/vpn_key/materialicons/black/res/drawable/baseline_vpn_key_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12.65,10C11.83,7.67 9.61,6 7,6c-3.31,0 -6,2.69 -6,6s2.69,6 6,6c2.61,0 4.83,-1.67 5.65,-4H17v4h4v-4h2v-4H12.65zM7,14c-1.1,0 -2,-0.9 -2,-2s0.9,-2 2,-2 2,0.9 2,2 -0.9,2 -2,2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/vpn_key_off.xml b/qqq/android/mobileapp/src/main/res/drawable/vpn_key_off.xml new file mode 100644 index 0000000..643f588 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/vpn_key_off.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/communication/vpn_key_off/materialicons/black/res/drawable/baseline_vpn_key_off_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20.83,18H21v-4h2v-4H12.83L20.83,18zM19.78,22.61l1.41,-1.41L2.81,2.81L1.39,4.22l2.59,2.59C2.2,7.85 1,9.79 1,12c0,3.31 2.69,6 6,6c2.21,0 4.15,-1.2 5.18,-2.99L19.78,22.61zM8.99,11.82C9,11.88 9,11.94 9,12c0,1.1 -0.9,2 -2,2s-2,-0.9 -2,-2s0.9,-2 2,-2c0.06,0 0.12,0 0.18,0.01L8.99,11.82z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/vpn_lock.xml b/qqq/android/mobileapp/src/main/res/drawable/vpn_lock.xml new file mode 100644 index 0000000..5de56b3 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/vpn_lock.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/notification/vpn_lock/materialicons/black/res/drawable/baseline_vpn_lock_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M22,4v-0.5C22,2.12 20.88,1 19.5,1S17,2.12 17,3.5L17,4c-0.55,0 -1,0.45 -1,1v4c0,0.55 0.45,1 1,1h5c0.55,0 1,-0.45 1,-1L23,5c0,-0.55 -0.45,-1 -1,-1zM21.2,4h-3.4v-0.5c0,-0.94 0.76,-1.7 1.7,-1.7s1.7,0.76 1.7,1.7L21.2,4zM18.92,12c0.04,0.33 0.08,0.66 0.08,1 0,2.08 -0.8,3.97 -2.1,5.39 -0.26,-0.81 -1,-1.39 -1.9,-1.39h-1v-3c0,-0.55 -0.45,-1 -1,-1L7,13v-2h2c0.55,0 1,-0.45 1,-1L10,8h2c1.1,0 2,-0.9 2,-2L14,3.46c-0.95,-0.3 -1.95,-0.46 -3,-0.46C5.48,3 1,7.48 1,13s4.48,10 10,10 10,-4.48 10,-10c0,-0.34 -0.02,-0.67 -0.05,-1h-2.03zM10,20.93c-3.95,-0.49 -7,-3.85 -7,-7.93 0,-0.62 0.08,-1.21 0.21,-1.79L8,16v1c0,1.1 0.9,2 2,2v1.93z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/vrpano.xml b/qqq/android/mobileapp/src/main/res/drawable/vrpano.xml new file mode 100644 index 0000000..7c001f4 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/vrpano.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/vrpano/materialicons/black/res/drawable/baseline_vrpano_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20.69,4.05C18.66,4.73 15.86,5.5 12,5.5c-3.89,0 -6.95,-0.84 -8.69,-1.43C2.67,3.85 2,4.33 2,5.02V19c0,0.68 0.66,1.17 1.31,0.95C5.36,19.26 8.1,18.5 12,18.5c3.87,0 6.66,0.76 8.69,1.45C21.34,20.16 22,19.68 22,19V5C22,4.32 21.34,3.84 20.69,4.05zM12,15c-2.34,0 -4.52,0.15 -6.52,0.41l3.69,-4.42l2,2.4L14,10l4.51,5.4C16.52,15.15 14.3,15 12,15z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/wallet.xml b/qqq/android/mobileapp/src/main/res/drawable/wallet.xml new file mode 100644 index 0000000..846c022 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/wallet.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/wallet/materialicons/black/res/drawable/baseline_wallet_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M18,4H6C3.79,4 2,5.79 2,8v8c0,2.21 1.79,4 4,4h12c2.21,0 4,-1.79 4,-4V8C22,5.79 20.21,4 18,4zM16.14,13.77c-0.24,0.2 -0.57,0.28 -0.88,0.2L4.15,11.25C4.45,10.52 5.16,10 6,10h12c0.67,0 1.26,0.34 1.63,0.84L16.14,13.77zM6,6h12c1.1,0 2,0.9 2,2v0.55C19.41,8.21 18.73,8 18,8H6C5.27,8 4.59,8.21 4,8.55V8C4,6.9 4.9,6 6,6z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/wallpaper.xml b/qqq/android/mobileapp/src/main/res/drawable/wallpaper.xml new file mode 100644 index 0000000..90e1079 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/wallpaper.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/wallpaper/materialicons/black/res/drawable/baseline_wallpaper_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M4,4h7L11,2L4,2c-1.1,0 -2,0.9 -2,2v7h2L4,4zM10,13l-4,5h12l-3,-4 -2.03,2.71L10,13zM17,8.5c0,-0.83 -0.67,-1.5 -1.5,-1.5S14,7.67 14,8.5s0.67,1.5 1.5,1.5S17,9.33 17,8.5zM20,2h-7v2h7v7h2L22,4c0,-1.1 -0.9,-2 -2,-2zM20,20h-7v2h7c1.1,0 2,-0.9 2,-2v-7h-2v7zM4,13L2,13v7c0,1.1 0.9,2 2,2h7v-2L4,20v-7z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/warehouse.xml b/qqq/android/mobileapp/src/main/res/drawable/warehouse.xml new file mode 100644 index 0000000..79b6fd5 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/warehouse.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/warehouse/materialicons/black/res/drawable/baseline_warehouse_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M22,21V7L12,3L2,7v14h5v-9h10v9H22zM11,19H9v2h2V19zM13,16h-2v2h2V16zM15,19h-2v2h2V19z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/warning.xml b/qqq/android/mobileapp/src/main/res/drawable/warning.xml new file mode 100644 index 0000000..9e95fa5 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/warning.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/alert/warning/materialicons/black/res/drawable/baseline_warning_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M1,21h22L12,2 1,21zM13,18h-2v-2h2v2zM13,14h-2v-4h2v4z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/warning_amber.xml b/qqq/android/mobileapp/src/main/res/drawable/warning_amber.xml new file mode 100644 index 0000000..b163f81 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/warning_amber.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/alert/warning_amber/materialicons/black/res/drawable/baseline_warning_amber_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,5.99L19.53,19H4.47L12,5.99M12,2L1,21h22L12,2L12,2z" /> + <path + android:fillColor="#FF000000" + android:pathData="M13,16l-2,0l0,2l2,0z" /> + <path + android:fillColor="#FF000000" + android:pathData="M13,10l-2,0l0,5l2,0z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/wash.xml b/qqq/android/mobileapp/src/main/res/drawable/wash.xml new file mode 100644 index 0000000..d4eed3b --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/wash.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/places/wash/materialicons/black/res/drawable/baseline_wash_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M18.5,8C19.88,8 21,6.88 21,5.5C21,3.83 18.5,1 18.5,1S16,3.83 16,5.5C16,6.88 17.12,8 18.5,8zM13.5,9C14.33,9 15,8.33 15,7.5C15,6.66 13.5,5 13.5,5S12,6.66 12,7.5C12,8.33 12.67,9 13.5,9zM9.12,5l-7.18,6.79C1.34,12.35 1,13.14 1,13.97V20c0,1.66 1.34,3 3,3h6.25H12h5.75c0.69,0 1.25,-0.56 1.25,-1.25s-0.56,-1.25 -1.25,-1.25H12v-1h7.75c0.69,0 1.25,-0.56 1.25,-1.25S20.44,17 19.75,17H12v-1h8.75c0.69,0 1.25,-0.56 1.25,-1.25s-0.56,-1.25 -1.25,-1.25H12v-1h6.75c0.69,0 1.25,-0.56 1.25,-1.25S19.44,10 18.75,10H8.86c0.64,-1.11 1.48,-2.58 1.49,-2.61c0.09,-0.16 0.14,-0.33 0.14,-0.53c0,-0.26 -0.09,-0.5 -0.26,-0.7C10.22,6.12 9.12,5 9.12,5L9.12,5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/watch.xml b/qqq/android/mobileapp/src/main/res/drawable/watch.xml new file mode 100644 index 0000000..1c7fff9 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/watch.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/hardware/watch/materialicons/black/res/drawable/baseline_watch_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,12c0,-2.54 -1.19,-4.81 -3.04,-6.27L16,0H8l-0.95,5.73C5.19,7.19 4,9.45 4,12s1.19,4.81 3.05,6.27L8,24h8l0.96,-5.73C18.81,16.81 20,14.54 20,12zM6,12c0,-3.31 2.69,-6 6,-6s6,2.69 6,6 -2.69,6 -6,6 -6,-2.69 -6,-6z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/watch_later.xml b/qqq/android/mobileapp/src/main/res/drawable/watch_later.xml new file mode 100644 index 0000000..b96220c --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/watch_later.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/watch_later/materialicons/black/res/drawable/baseline_watch_later_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,2C6.5,2 2,6.5 2,12s4.5,10 10,10s10,-4.5 10,-10S17.5,2 12,2zM16.2,16.2L11,13V7h1.5v5.2l4.5,2.7L16.2,16.2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/watch_off.xml b/qqq/android/mobileapp/src/main/res/drawable/watch_off.xml new file mode 100644 index 0000000..762d36e --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/watch_off.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/hardware/watch_off/materialicons/black/res/drawable/baseline_watch_off_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,7c2.76,0 5,2.24 5,5c0,0.64 -0.13,1.25 -0.35,1.82l1.5,1.5C18.69,14.33 19,13.2 19,12c0,-2.22 -1.03,-4.19 -2.64,-5.47L15,2H9L8.04,5.21l2.14,2.14C10.75,7.13 11.36,7 12,7z" /> + <path + android:fillColor="#FF000000" + android:pathData="M2.81,2.81L1.39,4.22l4.46,4.46C5.31,9.67 5,10.8 5,12c0,2.22 1.03,4.19 2.64,5.47L9,22h6l0.96,-3.21l3.82,3.82l1.41,-1.41L2.81,2.81zM12,17c-2.76,0 -5,-2.24 -5,-5c0,-0.64 0.13,-1.25 0.35,-1.82l6.47,6.47C13.25,16.87 12.64,17 12,17z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/water.xml b/qqq/android/mobileapp/src/main/res/drawable/water.xml new file mode 100644 index 0000000..96b5c33 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/water.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/water/materialicons/black/res/drawable/baseline_water_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M21.98,14H22H21.98zM5.35,13c1.19,0 1.42,1 3.33,1c1.95,0 2.09,-1 3.33,-1c1.19,0 1.42,1 3.33,1c1.95,0 2.09,-1 3.33,-1c1.19,0 1.4,0.98 3.31,1v-2c-1.19,0 -1.42,-1 -3.33,-1c-1.95,0 -2.09,1 -3.33,1c-1.19,0 -1.42,-1 -3.33,-1c-1.95,0 -2.09,1 -3.33,1c-1.19,0 -1.42,-1 -3.33,-1C3.38,11 3.24,12 2,12v2C3.9,14 4.17,13 5.35,13zM18.67,15c-1.95,0 -2.09,1 -3.33,1c-1.19,0 -1.42,-1 -3.33,-1c-1.95,0 -2.1,1 -3.34,1c-1.24,0 -1.38,-1 -3.33,-1c-1.95,0 -2.1,1 -3.34,1v2c1.95,0 2.11,-1 3.34,-1c1.24,0 1.38,1 3.33,1c1.95,0 2.1,-1 3.34,-1c1.19,0 1.42,1 3.33,1c1.94,0 2.09,-1 3.33,-1c1.19,0 1.42,1 3.33,1v-2C20.76,16 20.62,15 18.67,15zM5.35,9c1.19,0 1.42,1 3.33,1c1.95,0 2.09,-1 3.33,-1c1.19,0 1.42,1 3.33,1c1.95,0 2.09,-1 3.33,-1c1.19,0 1.4,0.98 3.31,1V8c-1.19,0 -1.42,-1 -3.33,-1c-1.95,0 -2.09,1 -3.33,1c-1.19,0 -1.42,-1 -3.33,-1C10.04,7 9.9,8 8.66,8C7.47,8 7.24,7 5.33,7C3.38,7 3.24,8 2,8v2C3.9,10 4.17,9 5.35,9z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/water_damage.xml b/qqq/android/mobileapp/src/main/res/drawable/water_damage.xml new file mode 100644 index 0000000..6023190 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/water_damage.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/places/water_damage/materialicons/black/res/drawable/baseline_water_damage_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,3L2,12h3v8h14v-8h3L12,3zM12,16c-1.1,0 -2,-0.9 -2,-2c0,-1.1 2,-4 2,-4s2,2.9 2,4C14,15.1 13.1,16 12,16z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/water_drop.xml b/qqq/android/mobileapp/src/main/res/drawable/water_drop.xml new file mode 100644 index 0000000..c03f871 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/water_drop.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/water_drop/materialicons/black/res/drawable/baseline_water_drop_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,2c-5.33,4.55 -8,8.48 -8,11.8c0,4.98 3.8,8.2 8,8.2s8,-3.22 8,-8.2C20,10.48 17.33,6.55 12,2zM7.83,14c0.37,0 0.67,0.26 0.74,0.62c0.41,2.22 2.28,2.98 3.64,2.87c0.43,-0.02 0.79,0.32 0.79,0.75c0,0.4 -0.32,0.73 -0.72,0.75c-2.13,0.13 -4.62,-1.09 -5.19,-4.12C7.01,14.42 7.37,14 7.83,14z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/waterfall_chart.xml b/qqq/android/mobileapp/src/main/res/drawable/waterfall_chart.xml new file mode 100644 index 0000000..2ba8b45 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/waterfall_chart.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/navigation/waterfall_chart/materialicons/black/res/drawable/baseline_waterfall_chart_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M18,4h3v16h-3zM3,13h3v7L3,20zM14,4h3v3h-3zM10,5h3v4h-3zM7,10h3v4L7,14z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/waves.xml b/qqq/android/mobileapp/src/main/res/drawable/waves.xml new file mode 100644 index 0000000..587e75a --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/waves.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/content/waves/materialicons/black/res/drawable/baseline_waves_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M17,16.99c-1.35,0 -2.2,0.42 -2.95,0.8 -0.65,0.33 -1.18,0.6 -2.05,0.6 -0.9,0 -1.4,-0.25 -2.05,-0.6 -0.75,-0.38 -1.57,-0.8 -2.95,-0.8s-2.2,0.42 -2.95,0.8c-0.65,0.33 -1.17,0.6 -2.05,0.6v1.95c1.35,0 2.2,-0.42 2.95,-0.8 0.65,-0.33 1.17,-0.6 2.05,-0.6s1.4,0.25 2.05,0.6c0.75,0.38 1.57,0.8 2.95,0.8s2.2,-0.42 2.95,-0.8c0.65,-0.33 1.18,-0.6 2.05,-0.6 0.9,0 1.4,0.25 2.05,0.6 0.75,0.38 1.58,0.8 2.95,0.8v-1.95c-0.9,0 -1.4,-0.25 -2.05,-0.6 -0.75,-0.38 -1.6,-0.8 -2.95,-0.8zM17,12.54c-1.35,0 -2.2,0.43 -2.95,0.8 -0.65,0.32 -1.18,0.6 -2.05,0.6 -0.9,0 -1.4,-0.25 -2.05,-0.6 -0.75,-0.38 -1.57,-0.8 -2.95,-0.8s-2.2,0.43 -2.95,0.8c-0.65,0.32 -1.17,0.6 -2.05,0.6v1.95c1.35,0 2.2,-0.43 2.95,-0.8 0.65,-0.35 1.15,-0.6 2.05,-0.6s1.4,0.25 2.05,0.6c0.75,0.38 1.57,0.8 2.95,0.8s2.2,-0.43 2.95,-0.8c0.65,-0.35 1.15,-0.6 2.05,-0.6s1.4,0.25 2.05,0.6c0.75,0.38 1.58,0.8 2.95,0.8v-1.95c-0.9,0 -1.4,-0.25 -2.05,-0.6 -0.75,-0.38 -1.6,-0.8 -2.95,-0.8zM19.95,4.46c-0.75,-0.38 -1.58,-0.8 -2.95,-0.8s-2.2,0.42 -2.95,0.8c-0.65,0.32 -1.18,0.6 -2.05,0.6 -0.9,0 -1.4,-0.25 -2.05,-0.6 -0.75,-0.37 -1.57,-0.8 -2.95,-0.8s-2.2,0.42 -2.95,0.8c-0.65,0.33 -1.17,0.6 -2.05,0.6v1.93c1.35,0 2.2,-0.43 2.95,-0.8 0.65,-0.33 1.17,-0.6 2.05,-0.6s1.4,0.25 2.05,0.6c0.75,0.38 1.57,0.8 2.95,0.8s2.2,-0.43 2.95,-0.8c0.65,-0.32 1.18,-0.6 2.05,-0.6 0.9,0 1.4,0.25 2.05,0.6 0.75,0.38 1.58,0.8 2.95,0.8L22,5.04c-0.9,0 -1.4,-0.25 -2.05,-0.58zM17,8.09c-1.35,0 -2.2,0.43 -2.95,0.8 -0.65,0.35 -1.15,0.6 -2.05,0.6s-1.4,-0.25 -2.05,-0.6c-0.75,-0.38 -1.57,-0.8 -2.95,-0.8s-2.2,0.43 -2.95,0.8c-0.65,0.35 -1.15,0.6 -2.05,0.6v1.95c1.35,0 2.2,-0.43 2.95,-0.8 0.65,-0.32 1.18,-0.6 2.05,-0.6s1.4,0.25 2.05,0.6c0.75,0.38 1.57,0.8 2.95,0.8s2.2,-0.43 2.95,-0.8c0.65,-0.32 1.18,-0.6 2.05,-0.6 0.9,0 1.4,0.25 2.05,0.6 0.75,0.38 1.58,0.8 2.95,0.8L22,9.49c-0.9,0 -1.4,-0.25 -2.05,-0.6 -0.75,-0.38 -1.6,-0.8 -2.95,-0.8z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/waving_hand.xml b/qqq/android/mobileapp/src/main/res/drawable/waving_hand.xml new file mode 100644 index 0000000..79ae053 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/waving_hand.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/waving_hand/materialicons/black/res/drawable/baseline_waving_hand_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M23,17c0,3.31 -2.69,6 -6,6v-1.5c2.48,0 4.5,-2.02 4.5,-4.5H23zM1,7c0,-3.31 2.69,-6 6,-6v1.5C4.52,2.5 2.5,4.52 2.5,7H1zM8.01,4.32l-4.6,4.6c-3.22,3.22 -3.22,8.45 0,11.67s8.45,3.22 11.67,0l7.07,-7.07c0.49,-0.49 0.49,-1.28 0,-1.77c-0.49,-0.49 -1.28,-0.49 -1.77,0l-4.42,4.42l-0.71,-0.71l6.54,-6.54c0.49,-0.49 0.49,-1.28 0,-1.77s-1.28,-0.49 -1.77,0l-5.83,5.83l-0.71,-0.71l6.89,-6.89c0.49,-0.49 0.49,-1.28 0,-1.77s-1.28,-0.49 -1.77,0l-6.89,6.89L11.02,9.8l5.48,-5.48c0.49,-0.49 0.49,-1.28 0,-1.77s-1.28,-0.49 -1.77,0l-7.62,7.62c1.22,1.57 1.11,3.84 -0.33,5.28l-0.71,-0.71c1.17,-1.17 1.17,-3.07 0,-4.24l-0.35,-0.35l4.07,-4.07c0.49,-0.49 0.49,-1.28 0,-1.77C9.29,3.83 8.5,3.83 8.01,4.32z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/wb_auto.xml b/qqq/android/mobileapp/src/main/res/drawable/wb_auto.xml new file mode 100644 index 0000000..64f9455 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/wb_auto.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/wb_auto/materialicons/black/res/drawable/baseline_wb_auto_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M6.85,12.65h2.3L8,9l-1.15,3.65zM22,7l-1.2,6.29L19.3,7h-1.6l-1.49,6.29L15,7h-0.76C12.77,5.17 10.53,4 8,4c-4.42,0 -8,3.58 -8,8s3.58,8 8,8c3.13,0 5.84,-1.81 7.15,-4.43l0.1,0.43L17,16l1.5,-6.1L20,16h1.75l2.05,-9L22,7zM10.3,16l-0.7,-2L6.4,14l-0.7,2L3.8,16L7,7h2l3.2,9h-1.9z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/wb_cloudy.xml b/qqq/android/mobileapp/src/main/res/drawable/wb_cloudy.xml new file mode 100644 index 0000000..f0e9660 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/wb_cloudy.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/wb_cloudy/materialicons/black/res/drawable/baseline_wb_cloudy_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19.36,10.04C18.67,6.59 15.64,4 12,4 9.11,4 6.6,5.64 5.35,8.04 2.34,8.36 0,10.91 0,14c0,3.31 2.69,6 6,6h13c2.76,0 5,-2.24 5,-5 0,-2.64 -2.05,-4.78 -4.64,-4.96z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/wb_incandescent.xml b/qqq/android/mobileapp/src/main/res/drawable/wb_incandescent.xml new file mode 100644 index 0000000..9861cbf --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/wb_incandescent.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/wb_incandescent/materialicons/black/res/drawable/baseline_wb_incandescent_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M3.55,18.54l1.41,1.41 1.79,-1.8 -1.41,-1.41 -1.79,1.8zM11,22.45h2L13,19.5h-2v2.95zM4,10.5L1,10.5v2h3v-2zM15,6.31L15,1.5L9,1.5v4.81C7.21,7.35 6,9.28 6,11.5c0,3.31 2.69,6 6,6s6,-2.69 6,-6c0,-2.22 -1.21,-4.15 -3,-5.19zM20,10.5v2h3v-2h-3zM17.24,18.16l1.79,1.8 1.41,-1.41 -1.8,-1.79 -1.4,1.4z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/wb_iridescent.xml b/qqq/android/mobileapp/src/main/res/drawable/wb_iridescent.xml new file mode 100644 index 0000000..f89c1b8 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/wb_iridescent.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/wb_iridescent/materialicons/black/res/drawable/baseline_wb_iridescent_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M5,14.5h14v-6L5,8.5v6zM11,0.55L11,3.5h2L13,0.55h-2zM19.04,3.05l-1.79,1.79 1.41,1.41 1.8,-1.79 -1.42,-1.41zM13,22.45L13,19.5h-2v2.95h2zM20.45,18.54l-1.8,-1.79 -1.41,1.41 1.79,1.8 1.42,-1.42zM3.55,4.46l1.79,1.79 1.41,-1.41 -1.79,-1.79 -1.41,1.41zM4.96,19.95l1.79,-1.8 -1.41,-1.41 -1.79,1.79 1.41,1.42z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/wb_shade.xml b/qqq/android/mobileapp/src/main/res/drawable/wb_shade.xml new file mode 100644 index 0000000..5b871c0 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/wb_shade.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/wb_shade/materialicons/black/res/drawable/baseline_wb_shade_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M14,12v2.5l5.5,5.5L22,20zM14,20h3l-3,-3zM8,4l-6,6h2v10h8L12,10h2L8,4zM9,14L7,14v-4h2v4z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/wb_sunny.xml b/qqq/android/mobileapp/src/main/res/drawable/wb_sunny.xml new file mode 100644 index 0000000..fdf7c98 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/wb_sunny.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/wb_sunny/materialicons/black/res/drawable/baseline_wb_sunny_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M6.76,4.84l-1.8,-1.79 -1.41,1.41 1.79,1.79 1.42,-1.41zM4,10.5L1,10.5v2h3v-2zM13,0.55h-2L11,3.5h2L13,0.55zM20.45,4.46l-1.41,-1.41 -1.79,1.79 1.41,1.41 1.79,-1.79zM17.24,18.16l1.79,1.8 1.41,-1.41 -1.8,-1.79 -1.4,1.4zM20,10.5v2h3v-2h-3zM12,5.5c-3.31,0 -6,2.69 -6,6s2.69,6 6,6 6,-2.69 6,-6 -2.69,-6 -6,-6zM11,22.45h2L13,19.5h-2v2.95zM3.55,18.54l1.41,1.41 1.79,-1.8 -1.41,-1.41 -1.79,1.8z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/wb_twighlight.xml b/qqq/android/mobileapp/src/main/res/drawable/wb_twighlight.xml new file mode 100644 index 0000000..e5a8916 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/wb_twighlight.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/wb_twighlight/materialicons/black/res/drawable/baseline_wb_twighlight_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M16.954,8.66l2.12,-2.12 1.415,1.414 -2.13,2.12zM17.9,14c-0.5,-2.85 -2.95,-5 -5.9,-5s-5.45,2.15 -5.9,5h11.8zM2,16h20v4L2,20zM11,4h2v3h-2zM3.54,7.925L4.954,6.51l2.122,2.122 -1.415,1.415z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/wb_twilight.xml b/qqq/android/mobileapp/src/main/res/drawable/wb_twilight.xml new file mode 100644 index 0000000..86c2edd --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/wb_twilight.xml @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/image/wb_twilight/materialicons/black/res/drawable/baseline_wb_twilight_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M16.9552,8.662l2.1207,-2.1222l1.4148,1.4138l-2.1207,2.1222z" /> + <path + android:fillColor="#FF000000" + android:pathData="M2,18h20v2h-20z" /> + <path + android:fillColor="#FF000000" + android:pathData="M11,4h2v3h-2z" /> + <path + android:fillColor="#FF000000" + android:pathData="M3.5425,7.9248l1.4142,-1.4142l2.1213,2.1213l-1.4142,1.4142z" /> + <path + android:fillColor="#FF000000" + android:pathData="M5,16h14c0,-3.87 -3.13,-7 -7,-7S5,12.13 5,16z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/wc.xml b/qqq/android/mobileapp/src/main/res/drawable/wc.xml new file mode 100644 index 0000000..8131eb9 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/wc.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/notification/wc/materialicons/black/res/drawable/baseline_wc_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M5.5,22v-7.5L4,14.5L4,9c0,-1.1 0.9,-2 2,-2h3c1.1,0 2,0.9 2,2v5.5L9.5,14.5L9.5,22h-4zM18,22v-6h3l-2.54,-7.63C18.18,7.55 17.42,7 16.56,7h-0.12c-0.86,0 -1.63,0.55 -1.9,1.37L12,16h3v6h3zM7.5,6c1.11,0 2,-0.89 2,-2s-0.89,-2 -2,-2 -2,0.89 -2,2 0.89,2 2,2zM16.5,6c1.11,0 2,-0.89 2,-2s-0.89,-2 -2,-2 -2,0.89 -2,2 0.89,2 2,2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/web.xml b/qqq/android/mobileapp/src/main/res/drawable/web.xml new file mode 100644 index 0000000..4c7230c --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/web.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/av/web/materialicons/black/res/drawable/baseline_web_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,4L4,4c-1.1,0 -1.99,0.9 -1.99,2L2,18c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2L22,6c0,-1.1 -0.9,-2 -2,-2zM15,18L4,18v-4h11v4zM15,13L4,13L4,9h11v4zM20,18h-4L16,9h4v9z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/web_asset.xml b/qqq/android/mobileapp/src/main/res/drawable/web_asset.xml new file mode 100644 index 0000000..4719c33 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/web_asset.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/av/web_asset/materialicons/black/res/drawable/baseline_web_asset_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19,4L5,4c-1.11,0 -2,0.9 -2,2v12c0,1.1 0.89,2 2,2h14c1.1,0 2,-0.9 2,-2L21,6c0,-1.1 -0.89,-2 -2,-2zM19,18L5,18L5,8h14v10z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/web_asset_off.xml b/qqq/android/mobileapp/src/main/res/drawable/web_asset_off.xml new file mode 100644 index 0000000..d42e21f --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/web_asset_off.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/av/web_asset_off/materialicons/black/res/drawable/baseline_web_asset_off_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M6.83,4H20c1.11,0 2,0.9 2,2v12c0,0.34 -0.09,0.66 -0.23,0.94L20,17.17V8h-9.17L6.83,4zM20.49,23.31L17.17,20H4c-1.11,0 -2,-0.9 -2,-2V6c0,-0.34 0.08,-0.66 0.23,-0.94L0.69,3.51L2.1,2.1l19.8,19.8L20.49,23.31zM15.17,18l-10,-10H4v10H15.17z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/web_stories.xml b/qqq/android/mobileapp/src/main/res/drawable/web_stories.xml new file mode 100644 index 0000000..22eac18 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/web_stories.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/content/web_stories/materialicons/black/res/drawable/baseline_web_stories_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M17,4c1.1,0 2,0.9 2,2v12c0,1.1 -0.9,2 -2,2V4zM2,20c0,1.1 0.9,2 2,2h9c1.1,0 2,-0.9 2,-2V4c0,-1.1 -0.9,-2 -2,-2H4C2.9,2 2,2.9 2,4V20zM21,18c0.83,0 1.5,-0.67 1.5,-1.5v-9C22.5,6.67 21.83,6 21,6V18z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/webhook.xml b/qqq/android/mobileapp/src/main/res/drawable/webhook.xml new file mode 100644 index 0000000..4450676 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/webhook.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/webhook/materialicons/black/res/drawable/baseline_webhook_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M10,15l5.88,0c0.27,-0.31 0.67,-0.5 1.12,-0.5c0.83,0 1.5,0.67 1.5,1.5c0,0.83 -0.67,1.5 -1.5,1.5c-0.44,0 -0.84,-0.19 -1.12,-0.5l-3.98,0c-0.46,2.28 -2.48,4 -4.9,4c-2.76,0 -5,-2.24 -5,-5c0,-2.42 1.72,-4.44 4,-4.9l0,2.07C4.84,13.58 4,14.7 4,16c0,1.65 1.35,3 3,3s3,-1.35 3,-3V15zM12.5,4c1.65,0 3,1.35 3,3h2c0,-2.76 -2.24,-5 -5,-5l0,0c-2.76,0 -5,2.24 -5,5c0,1.43 0.6,2.71 1.55,3.62l-2.35,3.9C6.02,14.66 5.5,15.27 5.5,16c0,0.83 0.67,1.5 1.5,1.5s1.5,-0.67 1.5,-1.5c0,-0.16 -0.02,-0.31 -0.07,-0.45l3.38,-5.63C10.49,9.61 9.5,8.42 9.5,7C9.5,5.35 10.85,4 12.5,4zM17,13c-0.64,0 -1.23,0.2 -1.72,0.54l-3.05,-5.07C11.53,8.35 11,7.74 11,7c0,-0.83 0.67,-1.5 1.5,-1.5S14,6.17 14,7c0,0.15 -0.02,0.29 -0.06,0.43l2.19,3.65C16.41,11.03 16.7,11 17,11l0,0c2.76,0 5,2.24 5,5c0,2.76 -2.24,5 -5,5c-1.85,0 -3.47,-1.01 -4.33,-2.5l2.67,0C15.82,18.82 16.39,19 17,19c1.65,0 3,-1.35 3,-3S18.65,13 17,13z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/weekend.xml b/qqq/android/mobileapp/src/main/res/drawable/weekend.xml new file mode 100644 index 0000000..f69faf1 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/weekend.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/content/weekend/materialicons/black/res/drawable/baseline_weekend_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M21,10c-1.1,0 -2,0.9 -2,2v3H5v-3c0,-1.1 -0.89,-2 -2,-2s-2,0.9 -2,2v5c0,1.1 0.9,2 2,2h18c1.1,0 2,-0.9 2,-2v-5C23,10.9 22.1,10 21,10zM18,5H6C4.9,5 4,5.9 4,7v2.15c1.16,0.41 2,1.52 2,2.81V14h12v-2.03c0,-1.3 0.84,-2.4 2,-2.81V7C20,5.9 19.1,5 18,5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/west.xml b/qqq/android/mobileapp/src/main/res/drawable/west.xml new file mode 100644 index 0000000..62445ee --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/west.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/navigation/west/materialicons/black/res/drawable/baseline_west_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M9,19l1.41,-1.41L5.83,13H22V11H5.83l4.59,-4.59L9,5l-7,7L9,19z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/whatsapp.xml b/qqq/android/mobileapp/src/main/res/drawable/whatsapp.xml new file mode 100644 index 0000000..c4880e8 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/whatsapp.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/whatsapp/materialicons/black/res/drawable/baseline_whatsapp_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19.05,4.91C17.18,3.03 14.69,2 12.04,2c-5.46,0 -9.91,4.45 -9.91,9.91c0,1.75 0.46,3.45 1.32,4.95L2.05,22l5.25,-1.38c1.45,0.79 3.08,1.21 4.74,1.21h0c0,0 0,0 0,0c5.46,0 9.91,-4.45 9.91,-9.91C21.95,9.27 20.92,6.78 19.05,4.91zM12.04,20.15L12.04,20.15c-1.48,0 -2.93,-0.4 -4.2,-1.15l-0.3,-0.18l-3.12,0.82l0.83,-3.04l-0.2,-0.31c-0.82,-1.31 -1.26,-2.83 -1.26,-4.38c0,-4.54 3.7,-8.24 8.24,-8.24c2.2,0 4.27,0.86 5.82,2.42c1.56,1.56 2.41,3.63 2.41,5.83C20.28,16.46 16.58,20.15 12.04,20.15zM16.56,13.99c-0.25,-0.12 -1.47,-0.72 -1.69,-0.81c-0.23,-0.08 -0.39,-0.12 -0.56,0.12c-0.17,0.25 -0.64,0.81 -0.78,0.97c-0.14,0.17 -0.29,0.19 -0.54,0.06c-0.25,-0.12 -1.05,-0.39 -1.99,-1.23c-0.74,-0.66 -1.23,-1.47 -1.38,-1.72c-0.14,-0.25 -0.02,-0.38 0.11,-0.51c0.11,-0.11 0.25,-0.29 0.37,-0.43c0.12,-0.14 0.17,-0.25 0.25,-0.41c0.08,-0.17 0.04,-0.31 -0.02,-0.43c-0.06,-0.12 -0.56,-1.34 -0.76,-1.84c-0.2,-0.48 -0.41,-0.42 -0.56,-0.43C8.86,7.33 8.7,7.33 8.53,7.33c-0.17,0 -0.43,0.06 -0.66,0.31C7.65,7.89 7.01,8.49 7.01,9.71c0,1.22 0.89,2.4 1.01,2.56c0.12,0.17 1.75,2.67 4.23,3.74c0.59,0.26 1.05,0.41 1.41,0.52c0.59,0.19 1.13,0.16 1.56,0.1c0.48,-0.07 1.47,-0.6 1.67,-1.18c0.21,-0.58 0.21,-1.07 0.14,-1.18S16.81,14.11 16.56,13.99z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/whatshot.xml b/qqq/android/mobileapp/src/main/res/drawable/whatshot.xml new file mode 100644 index 0000000..36fdf2d --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/whatshot.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/whatshot/materialicons/black/res/drawable/baseline_whatshot_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M13.5,0.67s0.74,2.65 0.74,4.8c0,2.06 -1.35,3.73 -3.41,3.73 -2.07,0 -3.63,-1.67 -3.63,-3.73l0.03,-0.36C5.21,7.51 4,10.62 4,14c0,4.42 3.58,8 8,8s8,-3.58 8,-8C20,8.61 17.41,3.8 13.5,0.67zM11.71,19c-1.78,0 -3.22,-1.4 -3.22,-3.14 0,-1.62 1.05,-2.76 2.81,-3.12 1.77,-0.36 3.6,-1.21 4.62,-2.58 0.39,1.29 0.59,2.65 0.59,4.04 0,2.65 -2.15,4.8 -4.8,4.8z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/wheelchair_pickup.xml b/qqq/android/mobileapp/src/main/res/drawable/wheelchair_pickup.xml new file mode 100644 index 0000000..2659fad --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/wheelchair_pickup.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/places/wheelchair_pickup/materialicons/black/res/drawable/baseline_wheelchair_pickup_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M4.5,4c0,-1.11 0.89,-2 2,-2s2,0.89 2,2s-0.89,2 -2,2S4.5,5.11 4.5,4zM10,10.95V9c0,-1.1 -0.9,-2 -2,-2H5C3.9,7 3,7.9 3,9v6h2v7h3.5v-0.11c-1.24,-1.26 -2,-2.99 -2,-4.89C6.5,14.42 7.91,12.16 10,10.95zM16.5,17c0,1.65 -1.35,3 -3,3s-3,-1.35 -3,-3c0,-1.11 0.61,-2.06 1.5,-2.58v-2.16C9.98,12.9 8.5,14.77 8.5,17c0,2.76 2.24,5 5,5s5,-2.24 5,-5H16.5zM19.54,14H15V8h-2v8h5.46l2.47,3.71l1.66,-1.11L19.54,14z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/where_to_vote.xml b/qqq/android/mobileapp/src/main/res/drawable/where_to_vote.xml new file mode 100644 index 0000000..b810312 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/where_to_vote.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/content/where_to_vote/materialicons/black/res/drawable/baseline_where_to_vote_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,2c3.86,0 7,3.14 7,7 0,5.25 -7,13 -7,13S5,14.25 5,9c0,-3.86 3.14,-7 7,-7zM10.47,14L17,7.41 15.6,6l-5.13,5.18L8.4,9.09 7,10.5l3.47,3.5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/widgets.xml b/qqq/android/mobileapp/src/main/res/drawable/widgets.xml new file mode 100644 index 0000000..72627d8 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/widgets.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/widgets/materialicons/black/res/drawable/baseline_widgets_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M13,13v8h8v-8h-8zM3,21h8v-8L3,13v8zM3,3v8h8L11,3L3,3zM16.66,1.69L11,7.34 16.66,13l5.66,-5.66 -5.66,-5.65z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/width_full.xml b/qqq/android/mobileapp/src/main/res/drawable/width_full.xml new file mode 100644 index 0000000..4cf2897 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/width_full.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/width_full/materialicons/black/res/drawable/baseline_width_full_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,4H4C2.9,4 2,4.9 2,6v12c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2V6C22,4.9 21.1,4 20,4zM4,6h1v12H4V6zM20,18h-1V6h1V18z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/width_normal.xml b/qqq/android/mobileapp/src/main/res/drawable/width_normal.xml new file mode 100644 index 0000000..1a2ee6f --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/width_normal.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/width_normal/materialicons/black/res/drawable/baseline_width_normal_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,4H4C2.9,4 2,4.9 2,6v12c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2V6C22,4.9 21.1,4 20,4zM4,6h4v12H4V6zM20,18h-4V6h4V18z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/width_wide.xml b/qqq/android/mobileapp/src/main/res/drawable/width_wide.xml new file mode 100644 index 0000000..aa5ba38 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/width_wide.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/width_wide/materialicons/black/res/drawable/baseline_width_wide_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,4H4C2.9,4 2,4.9 2,6v12c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2V6C22,4.9 21.1,4 20,4zM4,6h2v12H4V6zM20,18h-2V6h2V18z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/wifi.xml b/qqq/android/mobileapp/src/main/res/drawable/wifi.xml new file mode 100644 index 0000000..43f0c2f --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/wifi.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/notification/wifi/materialicons/black/res/drawable/baseline_wifi_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M1,9l2,2c4.97,-4.97 13.03,-4.97 18,0l2,-2C16.93,2.93 7.08,2.93 1,9zM9,17l3,3 3,-3c-1.65,-1.66 -4.34,-1.66 -6,0zM5,13l2,2c2.76,-2.76 7.24,-2.76 10,0l2,-2C15.14,9.14 8.87,9.14 5,13z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/wifi_1_bar.xml b/qqq/android/mobileapp/src/main/res/drawable/wifi_1_bar.xml new file mode 100644 index 0000000..408a84a --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/wifi_1_bar.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/wifi_1_bar/materialicons/black/res/drawable/baseline_wifi_1_bar_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M15.53,17.46L12,21l-3.53,-3.54C9.37,16.56 10.62,16 12,16S14.63,16.56 15.53,17.46z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/wifi_2_bar.xml b/qqq/android/mobileapp/src/main/res/drawable/wifi_2_bar.xml new file mode 100644 index 0000000..b42a82d --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/wifi_2_bar.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/wifi_2_bar/materialicons/black/res/drawable/baseline_wifi_2_bar_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,10c3.03,0 5.78,1.23 7.76,3.22l-2.12,2.12C16.2,13.9 14.2,13 12,13c-2.2,0 -4.2,0.9 -5.64,2.35l-2.12,-2.12C6.22,11.23 8.97,10 12,10zM12,16c-1.38,0 -2.63,0.56 -3.53,1.46L12,21l3.53,-3.54C14.63,16.56 13.38,16 12,16z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/wifi_calling.xml b/qqq/android/mobileapp/src/main/res/drawable/wifi_calling.xml new file mode 100644 index 0000000..98031fd --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/wifi_calling.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/communication/wifi_calling/materialicons/black/res/drawable/baseline_wifi_calling_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M22,4.95C21.79,4.78 19.67,3 16.5,3c-3.18,0 -5.29,1.78 -5.5,1.95L16.5,12L22,4.95z" /> + <path + android:fillColor="#FF000000" + android:pathData="M20,15.51c-1.24,0 -2.45,-0.2 -3.57,-0.57c-0.35,-0.12 -0.75,-0.03 -1.02,0.24l-2.2,2.2c-2.83,-1.45 -5.15,-3.76 -6.59,-6.59l2.2,-2.2C9.1,8.31 9.18,7.92 9.07,7.57C8.7,6.45 8.5,5.25 8.5,4c0,-0.55 -0.45,-1 -1,-1H4C3.45,3 3,3.45 3,4c0,9.39 7.61,17 17,17c0.55,0 1,-0.45 1,-1v-3.49C21,15.96 20.55,15.51 20,15.51z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/wifi_calling_3.xml b/qqq/android/mobileapp/src/main/res/drawable/wifi_calling_3.xml new file mode 100644 index 0000000..2d4f1cc --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/wifi_calling_3.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/wifi_calling_3/materialicons/black/res/drawable/baseline_wifi_calling_3_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M16.49,3c-2.21,0 -4.21,0.9 -5.66,2.34l1.06,1.06c1.18,-1.18 2.8,-1.91 4.59,-1.91s3.42,0.73 4.59,1.91l1.06,-1.06C20.7,3.9 18.7,3 16.49,3z" /> + <path + android:fillColor="#FF000000" + android:pathData="M20.03,7.46C19.12,6.56 17.87,6 16.49,6s-2.63,0.56 -3.54,1.46l1.06,1.06c0.63,-0.63 1.51,-1.03 2.47,-1.03s1.84,0.39 2.47,1.03L20.03,7.46z" /> + <path + android:fillColor="#FF000000" + android:pathData="M15.08,9.59L16.49,11l1.41,-1.41C17.54,9.22 17.04,9 16.49,9S15.44,9.22 15.08,9.59z" /> + <path + android:fillColor="#FF000000" + android:pathData="M15.63,14.4l-2.52,2.5c-2.5,-1.43 -4.57,-3.5 -6,-6l2.5,-2.52c0.23,-0.24 0.33,-0.57 0.27,-0.9L9.13,3.8C9.04,3.34 8.63,3 8.15,3L4,3C3.44,3 2.97,3.47 3,4.03C3.17,6.92 4.05,9.63 5.43,12c1.58,2.73 3.85,4.99 6.57,6.57c2.37,1.37 5.08,2.26 7.97,2.43c0.56,0.03 1.03,-0.44 1.03,-1l0,-4.15c0,-0.48 -0.34,-0.89 -0.8,-0.98l-3.67,-0.73C16.2,14.07 15.86,14.17 15.63,14.4z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/wifi_channel.xml b/qqq/android/mobileapp/src/main/res/drawable/wifi_channel.xml new file mode 100644 index 0000000..8fb84b3 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/wifi_channel.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/wifi_channel/materialicons/black/res/drawable/baseline_wifi_channel_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M16,3c-2.51,0 -3.77,5.61 -4.4,10.57C10.79,10.66 9.61,8 8,8C4.43,8 3,21 3,21h2.01c0.61,-5.27 2,-9.82 2.99,-10.87c0.98,1.05 2.38,5.61 2.99,10.87H13c0.5,-2.53 2,-6 3,-6s2.5,3.53 3,6h2C21,21 20.5,3 16,3zM16,13c-0.99,0 -1.82,0.62 -2.5,1.5c0.57,-4.77 1.54,-8.62 2.5,-9.44c0.97,0.81 1.91,4.67 2.49,9.43C17.81,13.62 16.98,13 16,13z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/wifi_find.xml b/qqq/android/mobileapp/src/main/res/drawable/wifi_find.xml new file mode 100644 index 0000000..d53449f --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/wifi_find.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/wifi_find/materialicons/black/res/drawable/baseline_wifi_find_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M11,14c0,-3.36 2.64,-6 6,-6c2.2,0 4.08,1.13 5.13,2.86L24,8.98C20.93,5.9 16.69,4 12,4C7.31,4 3.07,5.9 0,8.98L12,21l1.86,-1.87C12.14,18.09 11,16.2 11,14z" /> + <path + android:fillColor="#FF000000" + android:pathData="M21,14c0,-2.24 -1.76,-4 -4,-4s-4,1.76 -4,4c0,2.24 1.76,4 4,4c0.75,0 1.44,-0.21 2.03,-0.56L21.59,20L23,18.59l-2.56,-2.56C20.79,15.44 21,14.75 21,14zM15,14c0,-1.12 0.88,-2 2,-2s2,0.88 2,2c0,1.12 -0.88,2 -2,2S15,15.12 15,14z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/wifi_lock.xml b/qqq/android/mobileapp/src/main/res/drawable/wifi_lock.xml new file mode 100644 index 0000000..c330c74 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/wifi_lock.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/wifi_lock/materialicons/black/res/drawable/baseline_wifi_lock_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M21.98,11L24,8.98C20.93,5.9 16.69,4 12,4C7.31,4 3.07,5.9 0,8.98l6.35,6.36L12,21l3.05,-3.05V15c0,-0.45 0.09,-0.88 0.23,-1.29c0.54,-1.57 2.01,-2.71 3.77,-2.71H21.98z" /> + <path + android:fillColor="#FF000000" + android:pathData="M22,16v-1c0,-1.1 -0.9,-2 -2,-2s-2,0.9 -2,2v1c-0.55,0 -1,0.45 -1,1v3c0,0.55 0.45,1 1,1h4c0.55,0 1,-0.45 1,-1v-3C23,16.45 22.55,16 22,16zM21,16h-2v-1c0,-0.55 0.45,-1 1,-1s1,0.45 1,1V16z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/wifi_off.xml b/qqq/android/mobileapp/src/main/res/drawable/wifi_off.xml new file mode 100644 index 0000000..08d5107 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/wifi_off.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/notification/wifi_off/materialicons/black/res/drawable/baseline_wifi_off_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M22.99,9C19.15,5.16 13.8,3.76 8.84,4.78l2.52,2.52c3.47,-0.17 6.99,1.05 9.63,3.7l2,-2zM18.99,13c-1.29,-1.29 -2.84,-2.13 -4.49,-2.56l3.53,3.53 0.96,-0.97zM2,3.05L5.07,6.1C3.6,6.82 2.22,7.78 1,9l1.99,2c1.24,-1.24 2.67,-2.16 4.2,-2.77l2.24,2.24C7.81,10.89 6.27,11.73 5,13v0.01L6.99,15c1.36,-1.36 3.14,-2.04 4.92,-2.06L18.98,20l1.27,-1.26L3.29,1.79 2,3.05zM9,17l3,3 3,-3c-1.65,-1.66 -4.34,-1.66 -6,0z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/wifi_password.xml b/qqq/android/mobileapp/src/main/res/drawable/wifi_password.xml new file mode 100644 index 0000000..55ed959 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/wifi_password.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/wifi_password/materialicons/black/res/drawable/baseline_wifi_password_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M23,19v-1c0,-1.1 -0.9,-2 -2,-2s-2,0.9 -2,2v1c-0.55,0 -1,0.45 -1,1v3c0,0.55 0.45,1 1,1h4c0.55,0 1,-0.45 1,-1v-3C24,19.45 23.55,19 23,19zM22,19h-2v-1c0,-0.55 0.45,-1 1,-1s1,0.45 1,1V19zM24,8.98l-2.12,2.13C19.35,8.57 15.85,7 12,7s-7.35,1.57 -9.88,4.11L0,8.98C3.07,5.9 7.31,4 12,4S20.93,5.9 24,8.98zM12,10c3.03,0 5.78,1.23 7.76,3.22l-2.12,2.12C16.2,13.9 14.2,13 12,13c-2.2,0 -4.2,0.9 -5.64,2.35l-2.12,-2.12C6.22,11.23 8.97,10 12,10zM15.53,17.46L12,21l-3.53,-3.54C9.37,16.56 10.62,16 12,16S14.63,16.56 15.53,17.46z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/wifi_protected_setup.xml b/qqq/android/mobileapp/src/main/res/drawable/wifi_protected_setup.xml new file mode 100644 index 0000000..9917be7 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/wifi_protected_setup.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/wifi_protected_setup/materialicons/black/res/drawable/baseline_wifi_protected_setup_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M16.71,5.29L19,3h-8v8l2.3,-2.3c1.97,1.46 3.25,3.78 3.25,6.42c0,1.31 -0.32,2.54 -0.88,3.63c2.33,-1.52 3.88,-4.14 3.88,-7.13C19.55,9.1 18.44,6.85 16.71,5.29z" /> + <path + android:fillColor="#FF000000" + android:pathData="M7.46,8.88c0,-1.31 0.32,-2.54 0.88,-3.63C6,6.77 4.46,9.39 4.46,12.38c0,2.52 1.1,4.77 2.84,6.33L5,21h8v-8l-2.3,2.3C8.74,13.84 7.46,11.52 7.46,8.88z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/wifi_tethering.xml b/qqq/android/mobileapp/src/main/res/drawable/wifi_tethering.xml new file mode 100644 index 0000000..88cae26 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/wifi_tethering.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/wifi_tethering/materialicons/black/res/drawable/baseline_wifi_tethering_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,11c-1.1,0 -2,0.9 -2,2s0.9,2 2,2 2,-0.9 2,-2 -0.9,-2 -2,-2zM18,13c0,-3.31 -2.69,-6 -6,-6s-6,2.69 -6,6c0,2.22 1.21,4.15 3,5.19l1,-1.74c-1.19,-0.7 -2,-1.97 -2,-3.45 0,-2.21 1.79,-4 4,-4s4,1.79 4,4c0,1.48 -0.81,2.75 -2,3.45l1,1.74c1.79,-1.04 3,-2.97 3,-5.19zM12,3C6.48,3 2,7.48 2,13c0,3.7 2.01,6.92 4.99,8.65l1,-1.73C5.61,18.53 4,15.96 4,13c0,-4.42 3.58,-8 8,-8s8,3.58 8,8c0,2.96 -1.61,5.53 -4,6.92l1,1.73c2.99,-1.73 5,-4.95 5,-8.65 0,-5.52 -4.48,-10 -10,-10z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/wifi_tethering_error.xml b/qqq/android/mobileapp/src/main/res/drawable/wifi_tethering_error.xml new file mode 100644 index 0000000..906693b --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/wifi_tethering_error.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/wifi_tethering_error/materialicons/black/res/drawable/baseline_wifi_tethering_error_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,7c-3.31,0 -6,2.69 -6,6c0,1.66 0.68,3.15 1.76,4.24l1.42,-1.42C8.45,15.1 8,14.11 8,13c0,-2.21 1.79,-4 4,-4s4,1.79 4,4c0,1.11 -0.45,2.1 -1.18,2.82l1.42,1.42C17.32,16.15 18,14.66 18,13C18,9.69 15.31,7 12,7zM12,3C6.48,3 2,7.48 2,13c0,2.76 1.12,5.26 2.93,7.07l1.42,-1.42C4.9,17.21 4,15.21 4,13c0,-4.42 3.58,-8 8,-8c2.53,0 4.78,1.17 6.24,3h2.42C18.93,5.01 15.7,3 12,3zM12,11c-1.1,0 -2,0.9 -2,2c0,0.55 0.23,1.05 0.59,1.41C10.95,14.77 11.45,15 12,15s1.05,-0.23 1.41,-0.59C13.77,14.05 14,13.55 14,13C14,11.9 13.1,11 12,11zM20,10h2v6h-2V10zM20,18h2v2h-2V18z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/wifi_tethering_error_rounded.xml b/qqq/android/mobileapp/src/main/res/drawable/wifi_tethering_error_rounded.xml new file mode 100644 index 0000000..94870e1 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/wifi_tethering_error_rounded.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/wifi_tethering_error_rounded/materialicons/black/res/drawable/baseline_wifi_tethering_error_rounded_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M12,7c-3.31,0 -6,2.69 -6,6c0,1.66 0.68,3.15 1.76,4.24l1.42,-1.42C8.45,15.1 8,14.11 8,13c0,-2.21 1.79,-4 4,-4s4,1.79 4,4c0,1.11 -0.45,2.1 -1.18,2.82l1.42,1.42C17.32,16.15 18,14.66 18,13C18,9.69 15.31,7 12,7zM12,3C6.48,3 2,7.48 2,13c0,2.76 1.12,5.26 2.93,7.07l1.42,-1.42C4.9,17.21 4,15.21 4,13c0,-4.42 3.58,-8 8,-8c2.53,0 4.78,1.17 6.24,3h2.42C18.93,5.01 15.7,3 12,3zM12,11c-1.1,0 -2,0.9 -2,2c0,0.55 0.23,1.05 0.59,1.41C10.95,14.77 11.45,15 12,15s1.05,-0.23 1.41,-0.59C13.77,14.05 14,13.55 14,13C14,11.9 13.1,11 12,11zM20,10h2v6h-2V10zM20,18h2v2h-2V18z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/wifi_tethering_off.xml b/qqq/android/mobileapp/src/main/res/drawable/wifi_tethering_off.xml new file mode 100644 index 0000000..152b47e --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/wifi_tethering_off.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/device/wifi_tethering_off/materialicons/black/res/drawable/baseline_wifi_tethering_off_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M2.81,2.81L1.39,4.22l2.69,2.69C2.78,8.6 2,10.71 2,13c0,2.76 1.12,5.26 2.93,7.07l1.42,-1.42C4.9,17.21 4,15.21 4,13c0,-1.75 0.57,-3.35 1.51,-4.66l1.43,1.43C6.35,10.7 6,11.81 6,13c0,1.66 0.68,3.15 1.76,4.24l1.42,-1.42C8.45,15.1 8,14.11 8,13c0,-0.63 0.15,-1.23 0.41,-1.76l1.61,1.61c0,0.05 -0.02,0.1 -0.02,0.15c0,0.55 0.23,1.05 0.59,1.41C10.95,14.77 11.45,15 12,15c0.05,0 0.1,-0.01 0.16,-0.02l7.62,7.62l1.41,-1.41L2.81,2.81zM17.7,14.87C17.89,14.28 18,13.65 18,13c0,-3.31 -2.69,-6 -6,-6c-0.65,0 -1.28,0.1 -1.87,0.3l1.71,1.71C11.89,9 11.95,9 12,9c2.21,0 4,1.79 4,4c0,0.05 0,0.11 -0.01,0.16L17.7,14.87zM12,5c4.42,0 8,3.58 8,8c0,1.22 -0.27,2.37 -0.77,3.4l1.49,1.49C21.53,16.45 22,14.78 22,13c0,-5.52 -4.48,-10 -10,-10c-1.78,0 -3.44,0.46 -4.89,1.28l1.48,1.48C9.63,5.27 10.78,5 12,5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/wind_power.xml b/qqq/android/mobileapp/src/main/res/drawable/wind_power.xml new file mode 100644 index 0000000..4a15dc6 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/wind_power.xml @@ -0,0 +1,37 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/home/wind_power/materialicons/black/res/drawable/baseline_wind_power_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M4,3h6v2h-6z" /> + <path + android:fillColor="#FF000000" + android:pathData="M1,7h5v2h-5z" /> + <path + android:fillColor="#FF000000" + android:pathData="M3,19h5v2h-5z" /> + <path + android:fillColor="#FF000000" + android:pathData="M13.73,10.61c0.75,0.23 1.3,0.78 1.57,1.46l4.27,-7.11c0.65,-1.08 0.3,-2.48 -0.78,-3.13c-0.87,-0.52 -1.99,-0.41 -2.73,0.29l-3.43,3.21C12.23,5.7 12,6.23 12,6.78v3.93C12.36,10.56 12.98,10.38 13.73,10.61z" /> + <path + android:fillColor="#FF000000" + android:pathData="M10.61,12.27c0.16,-0.52 0.48,-0.96 0.89,-1.27H3.28C2.02,11 1,12.02 1,13.28c0,1.02 0.67,1.91 1.65,2.19l4.51,1.29c0.53,0.15 1.1,0.08 1.58,-0.21l2.69,-1.61C10.66,14.32 10.3,13.27 10.61,12.27z" /> + <path + android:fillColor="#FF000000" + android:pathData="M22.21,18.61l-2.28,-4.1c-0.27,-0.48 -0.73,-0.83 -1.26,-0.97l-3.18,-0.8c0.03,0.32 0,0.66 -0.1,0.99c-0.32,1.06 -1.28,1.77 -2.39,1.77c-0.61,0 -0.99,-0.22 -1,-0.22V21c-1.1,0 -2,0.9 -2,2h6c0,-1.1 -0.9,-2 -2,-2v-4.28l4.61,4.61c0.89,0.89 2.33,0.89 3.22,0C22.55,20.61 22.71,19.5 22.21,18.61z" /> + <path + android:fillColor="#FF000000" + android:pathData="M12.56,14.43c0.79,0.24 1.63,-0.2 1.87,-1c0.24,-0.79 -0.2,-1.63 -1,-1.87c-0.79,-0.24 -1.63,0.2 -1.87,1C11.32,13.35 11.77,14.19 12.56,14.43z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/window.xml b/qqq/android/mobileapp/src/main/res/drawable/window.xml new file mode 100644 index 0000000..428bbb6 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/window.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/search/window/materialicons/black/res/drawable/baseline_window_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M11,11V3H5C3.9,3 3,3.9 3,5v6H11z" /> + <path + android:fillColor="#FF000000" + android:pathData="M13,11h8V5c0,-1.1 -0.9,-2 -2,-2h-6V11z" /> + <path + android:fillColor="#FF000000" + android:pathData="M11,13H3v6c0,1.1 0.9,2 2,2h6V13z" /> + <path + android:fillColor="#FF000000" + android:pathData="M13,13v8h6c1.1,0 2,-0.9 2,-2v-6H13z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/wine_bar.xml b/qqq/android/mobileapp/src/main/res/drawable/wine_bar.xml new file mode 100644 index 0000000..1bb9133 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/wine_bar.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/wine_bar/materialicons/black/res/drawable/baseline_wine_bar_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M6,3l0,6c0,2.97 2.16,5.43 5,5.91V19H8v2h8v-2h-3v-4.09c2.84,-0.48 5,-2.94 5,-5.91l0,-6H6zM16,8H8l0,-3h8C16,5 16,8 16,8z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/woman.xml b/qqq/android/mobileapp/src/main/res/drawable/woman.xml new file mode 100644 index 0000000..b39b263 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/woman.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/woman/materialicons/black/res/drawable/baseline_woman_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M13.94,8.31C13.62,7.52 12.85,7 12,7s-1.62,0.52 -1.94,1.31L7,16h3v6h4v-6h3L13.94,8.31z" /> + <path + android:fillColor="#FF000000" + android:pathData="M12,4m-2,0a2,2 0,1 1,4 0a2,2 0,1 1,-4 0" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/woman_2.xml b/qqq/android/mobileapp/src/main/res/drawable/woman_2.xml new file mode 100644 index 0000000..0a2c40e --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/woman_2.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/woman_2/materialicons/black/res/drawable/baseline_woman_2_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M13.94,8.31C13.62,7.52 12.85,7 12,7s-1.62,0.52 -1.94,1.31L7,16h3.5v6h3v-6H17L13.94,8.31z" /> + <path + android:fillColor="#FF000000" + android:pathData="M12,4m-2,0a2,2 0,1 1,4 0a2,2 0,1 1,-4 0" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/work.xml b/qqq/android/mobileapp/src/main/res/drawable/work.xml new file mode 100644 index 0000000..7cb0914 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/work.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/work/materialicons/black/res/drawable/baseline_work_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,6h-4L16,4c0,-1.11 -0.89,-2 -2,-2h-4c-1.11,0 -2,0.89 -2,2v2L4,6c-1.11,0 -1.99,0.89 -1.99,2L2,19c0,1.11 0.89,2 2,2h16c1.11,0 2,-0.89 2,-2L22,8c0,-1.11 -0.89,-2 -2,-2zM14,6h-4L10,4h4v2z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/work_history.xml b/qqq/android/mobileapp/src/main/res/drawable/work_history.xml new file mode 100644 index 0000000..1918f80 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/work_history.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/work_history/materialicons/black/res/drawable/baseline_work_history_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M18,11c1.49,0 2.87,0.47 4,1.26V8c0,-1.11 -0.89,-2 -2,-2h-4V4c0,-1.11 -0.89,-2 -2,-2h-4C8.89,2 8,2.89 8,4v2H4C2.89,6 2.01,6.89 2.01,8L2,19c0,1.11 0.89,2 2,2h7.68C11.25,20.09 11,19.08 11,18C11,14.13 14.13,11 18,11zM10,4h4v2h-4V4z" /> + <path + android:fillColor="#FF000000" + android:pathData="M18,13c-2.76,0 -5,2.24 -5,5s2.24,5 5,5s5,-2.24 5,-5S20.76,13 18,13zM19.65,20.35l-2.15,-2.15V15h1v2.79l1.85,1.85L19.65,20.35z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/work_off.xml b/qqq/android/mobileapp/src/main/res/drawable/work_off.xml new file mode 100644 index 0000000..c0a2306 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/work_off.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/work_off/materialicons/black/res/drawable/baseline_work_off_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M23,21.74l-1.46,-1.46L7.21,5.95 3.25,1.99 1.99,3.25l2.7,2.7h-0.64c-1.11,0 -1.99,0.89 -1.99,2l-0.01,11c0,1.11 0.89,2 2,2h15.64L21.74,23 23,21.74zM22,7.95c0.05,-1.11 -0.84,-2 -1.95,-1.95h-4V3.95c0,-1.11 -0.89,-2 -2,-1.95h-4c-1.11,-0.05 -2,0.84 -2,1.95v0.32l13.95,14V7.95zM14.05,6H10V3.95h4.05V6z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/work_outline.xml b/qqq/android/mobileapp/src/main/res/drawable/work_outline.xml new file mode 100644 index 0000000..49209a5 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/work_outline.xml @@ -0,0 +1,20 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/work_outline/materialicons/black/res/drawable/baseline_work_outline_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M14,6L14,4h-4v2h4zM4,8v11h16L20,8L4,8zM20,6c1.11,0 2,0.89 2,2v11c0,1.11 -0.89,2 -2,2L4,21c-1.11,0 -2,-0.89 -2,-2l0.01,-11c0,-1.11 0.88,-2 1.99,-2h4L8,4c0,-1.11 0.89,-2 2,-2h4c1.11,0 2,0.89 2,2v2h4z" + android:fillType="evenOdd" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/workspace_premium.xml b/qqq/android/mobileapp/src/main/res/drawable/workspace_premium.xml new file mode 100644 index 0000000..8c6972e --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/workspace_premium.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/social/workspace_premium/materialicons/black/res/drawable/baseline_workspace_premium_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M9.68,13.69L12,11.93l2.31,1.76l-0.88,-2.85L15.75,9h-2.84L12,6.19L11.09,9H8.25l2.31,1.84L9.68,13.69zM20,10c0,-4.42 -3.58,-8 -8,-8s-8,3.58 -8,8c0,2.03 0.76,3.87 2,5.28V23l6,-2l6,2v-7.72C19.24,13.87 20,12.03 20,10zM12,4c3.31,0 6,2.69 6,6s-2.69,6 -6,6s-6,-2.69 -6,-6S8.69,4 12,4z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/workspaces.xml b/qqq/android/mobileapp/src/main/res/drawable/workspaces.xml new file mode 100644 index 0000000..d14dd27 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/workspaces.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/file/workspaces/materialicons/black/res/drawable/baseline_workspaces_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M6,13c-2.2,0 -4,1.8 -4,4s1.8,4 4,4s4,-1.8 4,-4S8.2,13 6,13zM12,3C9.8,3 8,4.8 8,7s1.8,4 4,4s4,-1.8 4,-4S14.2,3 12,3zM18,13c-2.2,0 -4,1.8 -4,4s1.8,4 4,4s4,-1.8 4,-4S20.2,13 18,13z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/workspaces_filled.xml b/qqq/android/mobileapp/src/main/res/drawable/workspaces_filled.xml new file mode 100644 index 0000000..3530840 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/workspaces_filled.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/file/workspaces_filled/materialicons/black/res/drawable/baseline_workspaces_filled_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M6,13c-2.2,0 -4,1.8 -4,4s1.8,4 4,4 4,-1.8 4,-4 -1.8,-4 -4,-4zM12,3C9.8,3 8,4.8 8,7s1.8,4 4,4 4,-1.8 4,-4 -1.8,-4 -4,-4zM18,13c-2.2,0 -4,1.8 -4,4s1.8,4 4,4 4,-1.8 4,-4 -1.8,-4 -4,-4z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/workspaces_outline.xml b/qqq/android/mobileapp/src/main/res/drawable/workspaces_outline.xml new file mode 100644 index 0000000..6b9a585 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/workspaces_outline.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/file/workspaces_outline/materialicons/black/res/drawable/baseline_workspaces_outline_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M6,15c1.1,0 2,0.9 2,2s-0.9,2 -2,2 -2,-0.9 -2,-2 0.9,-2 2,-2m0,-2c-2.2,0 -4,1.8 -4,4s1.8,4 4,4 4,-1.8 4,-4 -1.8,-4 -4,-4zM12,5c1.1,0 2,0.9 2,2s-0.9,2 -2,2 -2,-0.9 -2,-2 0.9,-2 2,-2m0,-2C9.8,3 8,4.8 8,7s1.8,4 4,4 4,-1.8 4,-4 -1.8,-4 -4,-4zM18,15c1.1,0 2,0.9 2,2s-0.9,2 -2,2 -2,-0.9 -2,-2 0.9,-2 2,-2m0,-2c-2.2,0 -4,1.8 -4,4s1.8,4 4,4 4,-1.8 4,-4 -1.8,-4 -4,-4z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/wrap_text.xml b/qqq/android/mobileapp/src/main/res/drawable/wrap_text.xml new file mode 100644 index 0000000..a6557e2 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/wrap_text.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/editor/wrap_text/materialicons/black/res/drawable/baseline_wrap_text_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M4,19h6v-2L4,17v2zM20,5L4,5v2h16L20,5zM17,11L4,11v2h13.25c1.1,0 2,0.9 2,2s-0.9,2 -2,2L15,17v-2l-3,3 3,3v-2h2c2.21,0 4,-1.79 4,-4s-1.79,-4 -4,-4z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/wrong_location.xml b/qqq/android/mobileapp/src/main/res/drawable/wrong_location.xml new file mode 100644 index 0000000..1875dff --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/wrong_location.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/wrong_location/materialicons/black/res/drawable/baseline_wrong_location_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M14,10V3.26C13.35,3.09 12.68,3 12,3c-4.2,0 -8,3.22 -8,8.2c0,3.32 2.67,7.25 8,11.8c5.33,-4.55 8,-8.48 8,-11.8c0,-0.41 -0.04,-0.81 -0.09,-1.2H14zM12,13c-1.1,0 -2,-0.9 -2,-2c0,-1.1 0.9,-2 2,-2s2,0.9 2,2C14,12.1 13.1,13 12,13z" /> + <path + android:fillColor="#FF000000" + android:pathData="M22.54,2.88l-1.42,-1.42l-2.12,2.13l-2.12,-2.13l-1.42,1.42l2.13,2.12l-2.13,2.12l1.42,1.42l2.12,-2.13l2.12,2.13l1.42,-1.42l-2.13,-2.12z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/wysiwyg.xml b/qqq/android/mobileapp/src/main/res/drawable/wysiwyg.xml new file mode 100644 index 0000000..e6c218a --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/wysiwyg.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/wysiwyg/materialicons/black/res/drawable/baseline_wysiwyg_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M19,3H5C3.89,3 3,3.9 3,5v14c0,1.1 0.89,2 2,2h14c1.1,0 2,-0.9 2,-2V5C21,3.9 20.11,3 19,3zM19,19H5V7h14V19zM17,12H7v-2h10V12zM13,16H7v-2h6V16z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/yard.xml b/qqq/android/mobileapp/src/main/res/drawable/yard.xml new file mode 100644 index 0000000..d11523d --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/yard.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/search/yard/materialicons/black/res/drawable/baseline_yard_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,2H4C2.9,2 2,2.9 2,4v16c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2V4C22,2.9 21.1,2 20,2zM8,8.22c0,-0.86 0.7,-1.56 1.56,-1.56c0.33,0 0.64,0.1 0.89,0.28l-0.01,-0.12c0,-0.86 0.7,-1.56 1.56,-1.56s1.56,0.7 1.56,1.56l-0.01,0.12c0.26,-0.18 0.56,-0.28 0.89,-0.28c0.86,0 1.56,0.7 1.56,1.56c0,0.62 -0.37,1.16 -0.89,1.4C15.63,9.87 16,10.41 16,11.03c0,0.86 -0.7,1.56 -1.56,1.56c-0.33,0 -0.64,-0.11 -0.89,-0.28l0.01,0.12c0,0.86 -0.7,1.56 -1.56,1.56s-1.56,-0.7 -1.56,-1.56l0.01,-0.12c-0.26,0.18 -0.56,0.28 -0.89,0.28C8.7,12.59 8,11.89 8,11.03c0,-0.62 0.37,-1.16 0.89,-1.4C8.37,9.38 8,8.84 8,8.22zM12,19c-3.31,0 -6,-2.69 -6,-6C9.31,13 12,15.69 12,19c0,-3.31 2.69,-6 6,-6C18,16.31 15.31,19 12,19z" /> + <path + android:fillColor="#FF000000" + android:pathData="M12,9.62m-1.56,0a1.56,1.56 0,1 1,3.12 0a1.56,1.56 0,1 1,-3.12 0" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/youtube_searched_for.xml b/qqq/android/mobileapp/src/main/res/drawable/youtube_searched_for.xml new file mode 100644 index 0000000..da8d2c5 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/youtube_searched_for.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/youtube_searched_for/materialicons/black/res/drawable/baseline_youtube_searched_for_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M17.01,14h-0.8l-0.27,-0.27c0.98,-1.14 1.57,-2.61 1.57,-4.23 0,-3.59 -2.91,-6.5 -6.5,-6.5s-6.5,3 -6.5,6.5H2l3.84,4 4.16,-4H6.51C6.51,7 8.53,5 11.01,5s4.5,2.01 4.5,4.5c0,2.48 -2.02,4.5 -4.5,4.5 -0.65,0 -1.26,-0.14 -1.82,-0.38L7.71,15.1c0.97,0.57 2.09,0.9 3.3,0.9 1.61,0 3.08,-0.59 4.22,-1.57l0.27,0.27v0.79l5.01,4.99L22,19l-4.99,-5z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/zoom_in.xml b/qqq/android/mobileapp/src/main/res/drawable/zoom_in.xml new file mode 100644 index 0000000..11888ee --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/zoom_in.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/zoom_in/materialicons/black/res/drawable/baseline_zoom_in_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M15.5,14h-0.79l-0.28,-0.27C15.41,12.59 16,11.11 16,9.5 16,5.91 13.09,3 9.5,3S3,5.91 3,9.5 5.91,16 9.5,16c1.61,0 3.09,-0.59 4.23,-1.57l0.27,0.28v0.79l5,4.99L20.49,19l-4.99,-5zM9.5,14C7.01,14 5,11.99 5,9.5S7.01,5 9.5,5 14,7.01 14,9.5 11.99,14 9.5,14z" /> + <path + android:fillColor="#FF000000" + android:pathData="M12,10h-2v2H9v-2H7V9h2V7h1v2h2v1z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/zoom_in_map.xml b/qqq/android/mobileapp/src/main/res/drawable/zoom_in_map.xml new file mode 100644 index 0000000..0a4aa72 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/zoom_in_map.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/zoom_in_map/materialicons/black/res/drawable/baseline_zoom_in_map_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M9,9l0,-6L7,3l0,2.59L3.91,2.5L2.5,3.91L5.59,7L3,7l0,2L9,9zM21,9V7l-2.59,0l3.09,-3.09L20.09,2.5L17,5.59V3l-2,0l0,6L21,9zM3,15l0,2h2.59L2.5,20.09l1.41,1.41L7,18.41L7,21h2l0,-6L3,15zM15,15l0,6h2v-2.59l3.09,3.09l1.41,-1.41L18.41,17H21v-2L15,15z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/zoom_out.xml b/qqq/android/mobileapp/src/main/res/drawable/zoom_out.xml new file mode 100644 index 0000000..6967fd5 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/zoom_out.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/action/zoom_out/materialicons/black/res/drawable/baseline_zoom_out_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M15.5,14h-0.79l-0.28,-0.27C15.41,12.59 16,11.11 16,9.5 16,5.91 13.09,3 9.5,3S3,5.91 3,9.5 5.91,16 9.5,16c1.61,0 3.09,-0.59 4.23,-1.57l0.27,0.28v0.79l5,4.99L20.49,19l-4.99,-5zM9.5,14C7.01,14 5,11.99 5,9.5S7.01,5 9.5,5 14,7.01 14,9.5 11.99,14 9.5,14zM7,9h5v1L7,10z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/drawable/zoom_out_map.xml b/qqq/android/mobileapp/src/main/res/drawable/zoom_out_map.xml new file mode 100644 index 0000000..35dbe79 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/drawable/zoom_out_map.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Original artwork: Material Design icons by Google, Apache-2.0. + Pinned source: https://raw.githubusercontent.com/google/material-design-icons/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b/android/maps/zoom_out_map/materialicons/black/res/drawable/baseline_zoom_out_map_24.xml + QQQ Android integration/modifications: Copyright (C) 2004-2024 Kingsrook, LLC. + Modified resource naming and Android dimensions/color/tint as recorded in + docs/material-icons-provenance.json. Drawing path data matches the pinned source. + See NOTICE and docs/third-party/material-design-icons-LICENSE.txt. +--> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M15,3l2.3,2.3l-2.89,2.87l1.42,1.42L18.7,6.7L21,9V3H15zM3,9l2.3,-2.3l2.87,2.89l1.42,-1.42L6.7,5.3L9,3H3V9zM9,21l-2.3,-2.3l2.89,-2.87l-1.42,-1.42L5.3,17.3L3,15v6H9zM21,15l-2.3,2.3l-2.87,-2.89l-1.42,1.42l2.89,2.87L15,21h6V15z" /> +</vector> diff --git a/qqq/android/mobileapp/src/main/res/values/strings.xml b/qqq/android/mobileapp/src/main/res/values/strings.xml new file mode 100644 index 0000000..4d0e1b8 --- /dev/null +++ b/qqq/android/mobileapp/src/main/res/values/strings.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="utf-8"?><!-- + ~ QQQ - Low-code Application Framework for Engineers. + ~ Copyright (C) 2004-2024. Kingsrook, LLC + ~ 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + ~ contact@kingsrook.com + ~ https://github.com/Kingsrook/ + ~ + ~ Licensed under the Apache License, Version 2.0 (the "License"); + ~ you may not use this file except in compliance with the License. + ~ You may obtain a copy of the License at + ~ + ~ https://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, software + ~ distributed under the License is distributed on an "AS IS" BASIS, + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ~ See the License for the specific language governing permissions and + ~ limitations under the License. + ~ + --> + +<resources> + <string name="qqq_android_version">0.0</string> +</resources> \ No newline at end of file diff --git a/qqq/android/mobileapp/src/test/java/com/kingsrook/qqq/frontend/android/mobileapp/ExampleUnitTest.kt b/qqq/android/mobileapp/src/test/java/com/kingsrook/qqq/frontend/android/mobileapp/ExampleUnitTest.kt new file mode 100644 index 0000000..86504df --- /dev/null +++ b/qqq/android/mobileapp/src/test/java/com/kingsrook/qqq/frontend/android/mobileapp/ExampleUnitTest.kt @@ -0,0 +1,40 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2024-2024. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.kingsrook.qqq.frontend.android.mobileapp + +import org.junit.Test + +import org.junit.Assert.assertEquals + +/******************************************************************************* + ** Example local unit test, which will execute on the development machine (host). + ** See [testing documentation](http://d.android.com/tools/testing). + *******************************************************************************/ +class ExampleUnitTest { + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun addition_isCorrect() { + assertEquals(4, 2 + 2) + } +} diff --git a/qqq/android/mobileapp/src/test/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/authentication/OAuth2LoginAttemptTest.kt b/qqq/android/mobileapp/src/test/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/authentication/OAuth2LoginAttemptTest.kt new file mode 100644 index 0000000..01db56c --- /dev/null +++ b/qqq/android/mobileapp/src/test/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/authentication/OAuth2LoginAttemptTest.kt @@ -0,0 +1,174 @@ +/* Copyright (c) 2026 QRunIO. SPDX-License-Identifier: Apache-2.0 */ +package com.kingsrook.qqq.frontend.android.mobileapp.ui.authentication + +import com.kingsrook.qqq.frontend.android.core.model.metadata.authentication.OAuth2AuthenticationMetaData +import org.junit.Assert.assertEquals +import org.junit.Assert.assertFalse +import org.junit.Assert.assertNull +import org.junit.Assert.assertTrue +import org.junit.Test + +/******************************************************************************* + ** + *******************************************************************************/ +class OAuth2LoginAttemptTest { + private val binding = OAuth2LoginBinding( + "https://qqq.example/", "company", "https://id.example/application/o/scanner/", + "https://id.example/application/o/scanner/.well-known/openid-configuration", "server-client", "openid profile", oauth2RedirectUri("io.qrun.mobile.scanner"), "login", "REQUIRED" + ) + private val state = "state-random-at-least-sixteen" + private val nonce = "nonce-random-at-least-sixteen" + private val verifier = "v".repeat(64) + + /******************************************************************************* + ** + *******************************************************************************/ + private fun consume( + attempt: OAuth2LoginAttempt, context: OAuth2LoginBinding = binding, returnedState: String? = state, + requestState: String? = state, requestNonce: String? = nonce, client: String = binding.clientId, + redirect: String = binding.redirectUri, prompt: String? = binding.prompt, code: String? = "authorization-code" + ) = + attempt.consume(context, returnedState, requestState, requestNonce, client, redirect, prompt, code) + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun successfulResponseUsesOriginalVerifierExactlyOnce() { + val attempt = OAuth2LoginAttempt() + attempt.begin(binding, state, nonce, verifier) + val exchange = requireNotNull(consume(attempt)) + assertEquals(verifier, exchange.verifier) + assertEquals(binding.redirectUri, exchange.redirectUri) + assertEquals(nonce, exchange.expectedNonce) + assertFalse(exchange.toString().contains(verifier)) + assertFalse(exchange.toString().contains(nonce)) + assertNull(consume(attempt)) + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun staleServerProviderClientScopesAndRedirectNeverExchange() { + for (context in listOf( + binding.copy(server = "https://other.example/"), binding.copy(providerName = "other"), + binding.copy(issuer = "https://other.example/"), binding.copy(discoveryUrl = "https://other.example/discovery"), binding.copy(clientId = "other"), + binding.copy(scopes = "openid admin"), binding.copy(redirectUri = "other:/callback"), binding.copy(prompt = "none"), + binding.copy(nonceValidation = ""), binding.copy(nonceValidation = "OPTIONAL") + )) { + val attempt = OAuth2LoginAttempt() + attempt.begin(binding, state, nonce, verifier) + assertNull(consume(attempt, context)) + assertNull(consume(attempt)) + } + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun mismatchMissingCodeAndCancelledAttemptAreTerminal() { + val checks: List<(OAuth2LoginAttempt) -> OAuth2LoginAttempt.Exchange?> = listOf( + { consume(it, returnedState = "wrong") }, { consume(it, requestState = "wrong") }, + { consume(it, requestNonce = "wrong") }, { consume(it, client = "wrong") }, + { consume(it, redirect = "wrong:/callback") }, { consume(it, prompt = null) }, { consume(it, prompt = "none") }, + { consume(it, code = null) }, { consume(it, code = " ") }) + for (check in checks) { + val attempt = OAuth2LoginAttempt() + attempt.begin(binding, state, nonce, verifier) + assertNull(check(attempt)) + assertNull(consume(attempt)) + } + val attempt = OAuth2LoginAttempt() + attempt.begin(binding, state, nonce, verifier) + attempt.cancel() + assertNull(consume(attempt)) + assertNull("Process death has no retained attempt", consume(OAuth2LoginAttempt())) + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun expiredAttemptFailsClosed() { + var now = 100L + val attempt = OAuth2LoginAttempt { now } + attempt.begin(binding, state, nonce, verifier) + now += 300_001 + assertNull(consume(attempt)) + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun callbackHasExactPackageHostPathAndNoFragment() { + val packageName = "io.qrun.mobile.scanner" + assertTrue(isOAuth2Callback(binding.redirectUri + "?code=opaque&state=opaque", packageName)) + for (uri in listOf( + "io.qrun.mobile.scanner.e2e.oauth://callback/oauth2redirect", binding.redirectUri + "/", + binding.redirectUri + "#code=opaque", "io.qrun.mobile.scanner.oauth://user@callback/oauth2redirect", + "io.qrun.mobile.scanner.oauth://callback:80/oauth2redirect", "io.qrun.mobile.scanner.oauth://callback/%6fauth2redirect", + "io.qrun.mobile.scanner.oauth://elsewhere/oauth2redirect", "https://callback/oauth2redirect" + )) + assertFalse(uri, isOAuth2Callback(uri, packageName)) + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun configuredUrlsRequireTlsAndRejectEmbeddedCredentialsAndResponseData() { + assertTrue(isOAuth2HttpsUrl(binding.issuer)) + for (uri in listOf( + "http://id.example/", "javascript:alert(1)", "https://user:password@id.example/", + "https://id.example/?code=opaque", "https://id.example/#fragment", "https:///missing", "https://id.example:0/", + "https://id.example:65536/" + )) assertFalse(uri, isOAuth2HttpsUrl(uri)) + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun onlyAnExplicitSupportedSessionGrantForThisPackageEnablesLogin() { + val grant = OAuth2AuthenticationMetaData.NativeSessionLogin( + OAuth2AuthenticationMetaData.SESSION_FLOW, "S256", + binding.issuer, binding.discoveryUrl, listOf(binding.redirectUri), prompt = "login", nonceValidation = "REQUIRED" + ) + val metadata = OAuth2AuthenticationMetaData( + binding.providerName, values = OAuth2AuthenticationMetaData.Values( + clientId = binding.clientId, scopes = binding.scopes, nativeClientId = "different-public-client", nativeSessionLogin = grant + ) + ) + assertEquals(binding, oauth2LoginBinding(metadata, binding.server, "io.qrun.mobile.scanner")) + for (invalid in listOf( + null, grant.copy(flow = "BEARER"), grant.copy(codeChallengeMethod = "plain"), + grant.copy(prompt = ""), grant.copy(prompt = "none"), grant.copy(prompt = "select_account"), grant.copy(prompt = "login consent"), + grant.copy(nonceValidation = ""), grant.copy(nonceValidation = "OPTIONAL"), grant.copy(nonceValidation = "required"), + grant.copy(issuer = "http://id.example/"), grant.copy(discoveryUrl = "https://user@id.example/"), + grant.copy(redirectUris = listOf("io.qrun.mobile.scanner.e2e.oauth://callback/oauth2redirect")) + )) + assertNull(oauth2LoginBinding(metadata.copy(values = metadata.values.copy(nativeSessionLogin = invalid)), binding.server, "io.qrun.mobile.scanner")) + assertNull(oauth2LoginBinding(metadata, "http://qqq.example/", "io.qrun.mobile.scanner")) + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun nonceShapeIsBoundedAndCallbackCannotReplaceTheOriginal() { + for (invalid in listOf("n".repeat(15), "n".repeat(513), "invalid nonce value", "n".repeat(20) + "=", "n".repeat(20) + "+")) + assertTrue(runCatching { OAuth2LoginAttempt().begin(binding, state, invalid, verifier) }.isFailure) + for (valid in listOf("n".repeat(16), "n".repeat(512), "A_z-0123456789abc")) { + val attempt = OAuth2LoginAttempt() + attempt.begin(binding, state, valid, verifier) + assertEquals(valid, consume(attempt, requestNonce = valid)?.expectedNonce) + } + val replaced = OAuth2LoginAttempt() + replaced.begin(binding, state, nonce, verifier) + assertNull(consume(replaced, requestNonce = "different-valid-nonce")) + assertNull(consume(replaced)) + } +} diff --git a/qqq/android/mobileapp/src/test/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/authentication/OAuth2LogoutAttemptTest.kt b/qqq/android/mobileapp/src/test/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/authentication/OAuth2LogoutAttemptTest.kt new file mode 100644 index 0000000..0515aed --- /dev/null +++ b/qqq/android/mobileapp/src/test/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/authentication/OAuth2LogoutAttemptTest.kt @@ -0,0 +1,122 @@ +/* Copyright (c) 2026 QRunIO. SPDX-License-Identifier: Apache-2.0 */ +package com.kingsrook.qqq.frontend.android.mobileapp.ui.authentication + +import com.kingsrook.qqq.frontend.android.core.model.metadata.authentication.NativeLogoutData +import com.kingsrook.qqq.frontend.android.core.model.metadata.authentication.OAuth2AuthenticationMetaData +import org.junit.Assert.assertEquals +import org.junit.Assert.assertFalse +import org.junit.Assert.assertNull +import org.junit.Assert.assertTrue +import org.junit.Test + +/******************************************************************************* + ** Public binding validation and single-use completion do not need Android or a fake provider. + *******************************************************************************/ +class OAuth2LogoutAttemptTest { + private val callback = "io.qrun.test.oauth://callback/oauth2redirect" + private val endpoint = "https://identity.example/end-session" + private val state = "synthetic-single-use-state" + private val login = OAuth2LoginBinding( + "https://qqq.example/", "company", "https://identity.example", + "https://identity.example/discovery", "client", "openid", callback, "login", "REQUIRED" + ) + private val binding = OAuth2LogoutBinding(login, callback) + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun completionIsBoundToOriginProviderCallbackEndpointAndConsumesEvenRejectedResponses() { + val alternatives = listOf( + binding.copy(login = login.copy(server = "https://other.example/")), + binding.copy(login = login.copy(providerName = "other")), binding.copy(postLogoutRedirectUri = "$callback/other") + ) + for (other in alternatives) { + val attempt = OAuth2LogoutAttempt() + attempt.begin(binding, endpoint, state) + assertFalse(attempt.consume(other, state, state, endpoint, callback)) + assertFalse(attempt.consume(binding, state, state, endpoint, callback)) + } + for (values in listOf( + listOf("wrong", state, endpoint, callback), listOf(state, "wrong", endpoint, callback), + listOf(state, state, "https://other.example/logout", callback), listOf(state, state, endpoint, "$callback/other") + )) { + val attempt = OAuth2LogoutAttempt() + attempt.begin(binding, endpoint, state) + assertFalse(attempt.consume(binding, values[0], values[1], values[2], values[3])) + assertFalse(attempt.consume(binding, state, state, endpoint, callback)) + } + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun stateOnlySuccessIsSingleUseAndCancellationOrExpiryCannotBeRevived() { + var now = 0L + val attempt = OAuth2LogoutAttempt { now } + attempt.begin(binding, endpoint, state) + assertTrue(attempt.consume(binding, state, state, endpoint, callback)) + assertFalse(attempt.consume(binding, state, state, endpoint, callback)) + attempt.begin(binding, endpoint, state) + attempt.cancel() + assertFalse(attempt.consume(binding, state, state, endpoint, callback)) + attempt.begin(binding, endpoint, state) + now = 300001 + assertFalse(attempt.consume(binding, state, state, endpoint, callback)) + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun materialMustMatchIndependentDiscoveryAndCannotRedirectHintElsewhere() { + /******************************************************************************* + ** + *******************************************************************************/ + fun data(issuer: String = login.issuer, url: String = endpoint, redirect: String = callback, hint: String = "synthetic.hint.canary") = + NativeLogoutData(issuer, url, redirect, hint) + assertTrue(validOAuth2LogoutData(data(), binding, login.issuer, endpoint)) + assertFalse(validOAuth2LogoutData(data(), binding, "https://other.example", endpoint)) + assertFalse(validOAuth2LogoutData(data(url = "https://other.example/logout"), binding, login.issuer, endpoint)) + assertFalse(validOAuth2LogoutData(data(redirect = "$callback/other"), binding, login.issuer, endpoint)) + for (url in listOf("http://identity.example/logout", "https://user@identity.example/logout", "$endpoint#secret", "$endpoint?unexpected=value")) + assertFalse(validOAuth2LogoutData(data(url = url), binding, login.issuer, url)) + assertFalse(validOAuth2LogoutData(data(hint = " "), binding, login.issuer, endpoint)) + assertFalse(data().toString().contains("canary")) + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun loginCallbackRegistrationDoesNotEnableProviderLogout() { + val metadata = OAuth2AuthenticationMetaData( + "company", values = OAuth2AuthenticationMetaData.Values( + clientId = "client", scopes = "openid", + nativeSessionLogin = OAuth2AuthenticationMetaData.NativeSessionLogin( + OAuth2AuthenticationMetaData.SESSION_FLOW, "S256", + login.issuer, login.discoveryUrl, listOf(callback), "login", "REQUIRED" + ) + ) + ) + assertNull(oauth2LogoutBinding(metadata, login.server, "io.qrun.test")) + val configured = metadata.copy( + values = metadata.values.copy( + nativeSessionLogout = + OAuth2AuthenticationMetaData.NativeSessionLogout(OAuth2AuthenticationMetaData.LOGOUT_FLOW, listOf(callback)) + ) + ) + assertEquals(binding, oauth2LogoutBinding(configured, login.server, "io.qrun.test")) + assertNull( + oauth2LogoutBinding( + configured.copy( + values = configured.values.copy( + nativeSessionLogout = + OAuth2AuthenticationMetaData.NativeSessionLogout("UNKNOWN", listOf(callback)) + ) + ), login.server, "io.qrun.test" + ) + ) + } +} diff --git a/qqq/android/mobileapp/src/test/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/horseshoe/NetworkPresenceTest.kt b/qqq/android/mobileapp/src/test/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/horseshoe/NetworkPresenceTest.kt new file mode 100644 index 0000000..f384461 --- /dev/null +++ b/qqq/android/mobileapp/src/test/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/horseshoe/NetworkPresenceTest.kt @@ -0,0 +1,57 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2004-2026. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.kingsrook.qqq.frontend.android.mobileapp.ui.horseshoe + +import org.junit.Assert.assertFalse +import org.junit.Assert.assertTrue +import org.junit.Test + +/******************************************************************************* + ** + *******************************************************************************/ +class NetworkPresenceTest { + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun losingCellularDoesNotHideAnAvailableWifiNetwork() { + val networks = NetworkPresence() + assertTrue(networks.onAvailable(100)) + assertTrue(networks.onAvailable(101)) + assertTrue(networks.onLost(100)) + assertFalse(networks.onLost(101)) + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun duplicateAndStaleCallbacksDoNotInvalidateTheRemainingNetwork() { + val networks = NetworkPresence() + assertTrue(networks.onAvailable(100)) + assertTrue(networks.onAvailable(100)) + assertTrue(networks.onLost(999)) + assertFalse(networks.onLost(100)) + assertTrue(networks.onAvailable(101)) + assertTrue(networks.onLost(100)) + } +} diff --git a/qqq/android/mobileapp/src/test/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/processes/ProcessSoundTest.kt b/qqq/android/mobileapp/src/test/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/processes/ProcessSoundTest.kt new file mode 100644 index 0000000..1574a21 --- /dev/null +++ b/qqq/android/mobileapp/src/test/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/processes/ProcessSoundTest.kt @@ -0,0 +1,81 @@ +/* Copyright (c) 2026 QRunIO. SPDX-License-Identifier: Apache-2.0 */ +package com.kingsrook.qqq.frontend.android.mobileapp.ui.processes + +import org.junit.Assert.assertEquals +import org.junit.Test + +/******************************************************************************* + ** Verify repeated sound playback and background/disposal do not leak or reuse a released player. + *******************************************************************************/ +class ProcessSoundTest { + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun unavailableAudioDoesNotFailProcessActionsAndCanRecover() { + var attempts = 0 + var released = 0 + var played = 0 + val sound = ProcessSound { + val attempt = ++attempts + if (attempt == 1) throw IllegalStateException("Audio service unavailable") + object : ProcessSound.Playback { + /******************************************************************************* + ** + *******************************************************************************/ + override fun start() { + if (attempt == 2) throw IllegalStateException("Audio device disconnected") + played++ + } + + /******************************************************************************* + ** + *******************************************************************************/ + override fun release() { + released++ + if (attempt == 2) throw IllegalStateException("Already reclaimed") + } + } + } + repeat(3) { sound.play() } + sound.release() + sound.release() + assertEquals(3, attempts) + assertEquals(1, played) + assertEquals(2, released) + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun repeatedPlaybackReusesAndLifecycleReleaseIsIdempotent() { + val events = mutableListOf<String>() + var created = 0 + val sound = ProcessSound { + val id = ++created + events.add("create$id") + object : ProcessSound.Playback { + /******************************************************************************* + ** + *******************************************************************************/ + override fun start() { + events.add("play$id") + } + + /******************************************************************************* + ** + *******************************************************************************/ + override fun release() { + events.add("release$id") + } + } + } + repeat(3) { sound.play() } + sound.release() + sound.release() + sound.play() + sound.release() + assertEquals(listOf("create1", "play1", "play1", "play1", "release1", "create2", "play2", "release2"), events) + } +} diff --git a/qqq/android/mobileapp/src/test/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/utils/BlockStyleUtilsTest.kt b/qqq/android/mobileapp/src/test/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/utils/BlockStyleUtilsTest.kt new file mode 100644 index 0000000..3287733 --- /dev/null +++ b/qqq/android/mobileapp/src/test/java/com/kingsrook/qqq/frontend/android/mobileapp/ui/utils/BlockStyleUtilsTest.kt @@ -0,0 +1,91 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2004-2024. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package com.kingsrook.qqq.frontend.android.mobileapp.ui.utils + +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.unit.Dp +import androidx.compose.ui.unit.DpSize +import androidx.compose.ui.unit.dp +import org.junit.Assert.assertEquals +import org.junit.Assert.assertNull +import org.junit.Test + +/******************************************************************************* + ** + *******************************************************************************/ +class BlockStyleUtilsTest { + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun testGetPaddingValuesFromStyleMap() { + /******************************************************************************* + ** + *******************************************************************************/ + fun doGetPaddingValues(map: Map<*, *>) = BlockStyleUtils.getPaddingValuesFromStyleMap(mapOf("padding" to map)) + + assertEquals(PaddingValues(1.dp, 2.dp, 3.dp, 4.dp), doGetPaddingValues(mapOf("left" to 1, "top" to 2, "right" to 3, "bottom" to 4))) + assertEquals(PaddingValues(), doGetPaddingValues(emptyMap<String, Any?>())) + assertEquals(PaddingValues(10.dp, 20.dp, 30.dp, 0.dp), doGetPaddingValues(mapOf("left" to "10", "top" to "20", "right" to "30"))) + assertEquals(PaddingValues(0.dp, 0.dp, 0.dp, 0.dp), doGetPaddingValues(mapOf("left" to "left", "top" to "0x12", "right" to mapOf("a" to "b")))) + } + + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun testGetSizeValuesFromStyleMap() { + /******************************************************************************* + ** + *******************************************************************************/ + fun doGetSizeValues(map: Map<*, *>) = BlockStyleUtils.getSizeFromStyleMap(map) + + assertEquals(DpSize(1.dp, 2.dp), doGetSizeValues(mapOf("width" to 1, "height" to 2))) + assertEquals(DpSize(Dp.Unspecified, 2.dp), doGetSizeValues(mapOf("height" to 2))) + assertEquals(DpSize(1.dp, Dp.Unspecified), doGetSizeValues(mapOf("width" to 1))) + assertEquals(DpSize(Dp.Unspecified, Dp.Unspecified), doGetSizeValues(emptyMap<String, Any?>())) + assertEquals(DpSize(Dp.Unspecified, Dp.Unspecified), doGetSizeValues(mapOf("width" to "a", "height" to mapOf("a" to "z")))) + } + + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun testGetColorFromString() { + assertEquals(Color(1, 2, 3), BlockStyleUtils.getColorFromString("010203")) + assertEquals(Color(10, 11, 12), BlockStyleUtils.getColorFromString("#0A0B0C")) + assertEquals(Color(0xFF, 0xFE, 0xFD, 0xFC), BlockStyleUtils.getColorFromString("#FFFEFDFC")) + assertEquals(Color(0x80, 0x80, 0x80, 0x80), BlockStyleUtils.getColorFromString("80808080")) + assertEquals(Colors.SUCCESS, BlockStyleUtils.getColorFromString("SUCCESS")) + assertEquals(Colors.WARNING, BlockStyleUtils.getColorFromString("Warning")) + assertEquals(Colors.ERROR, BlockStyleUtils.getColorFromString("error")) + assertEquals(Colors.ERROR, BlockStyleUtils.getColorFromString("error")) + assertNull(BlockStyleUtils.getColorFromString("123")) + assertNull(BlockStyleUtils.getColorFromString("red")) + } + +} diff --git a/qqq/android/mobileapp/src/test/java/com/kingsrook/qqq/frontend/android/mobileapp/viewmodel/ProcessSubmissionTest.kt b/qqq/android/mobileapp/src/test/java/com/kingsrook/qqq/frontend/android/mobileapp/viewmodel/ProcessSubmissionTest.kt new file mode 100644 index 0000000..261a1f3 --- /dev/null +++ b/qqq/android/mobileapp/src/test/java/com/kingsrook/qqq/frontend/android/mobileapp/viewmodel/ProcessSubmissionTest.kt @@ -0,0 +1,899 @@ +/* Copyright (c) 2026 QRunIO. SPDX-License-Identifier: Apache-2.0 */ +package com.kingsrook.qqq.frontend.android.mobileapp.viewmodel + +import com.kingsrook.qqq.frontend.android.core.controllers.QQQRepository +import com.kingsrook.qqq.frontend.android.core.model.Environment +import com.kingsrook.qqq.frontend.android.core.model.metadata.QComponentType +import com.kingsrook.qqq.frontend.android.core.model.metadata.QFieldMetaData +import com.kingsrook.qqq.frontend.android.core.model.metadata.QFieldType +import com.kingsrook.qqq.frontend.android.core.model.metadata.QFrontendComponent +import com.kingsrook.qqq.frontend.android.core.model.metadata.QFrontendStepMetaData +import com.kingsrook.qqq.frontend.android.core.model.metadata.QInstance +import com.kingsrook.qqq.frontend.android.core.model.metadata.QProcessMetaData +import com.kingsrook.qqq.frontend.android.core.model.metadata.authentication.BaseAuthenticationMetaData +import com.kingsrook.qqq.frontend.android.core.model.metadata.authentication.ManageSessionRequest +import com.kingsrook.qqq.frontend.android.core.model.metadata.authentication.ManageSessionResponse +import com.kingsrook.qqq.frontend.android.core.model.processes.ProcessStepResult +import com.kingsrook.qqq.frontend.android.core.model.processes.QJobComplete +import com.kingsrook.qqq.frontend.android.core.model.processes.QJobStarted +import com.kingsrook.qqq.frontend.android.mobileapp.data.MockPreferencesDataStore +import com.kingsrook.qqq.frontend.android.mobileapp.container.QAppContainer +import androidx.lifecycle.viewModelScope +import kotlinx.coroutines.cancelChildren +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.CompletableDeferred +import kotlinx.coroutines.test.StandardTestDispatcher +import kotlinx.coroutines.test.advanceUntilIdle +import kotlinx.coroutines.test.resetMain +import kotlinx.coroutines.test.runCurrent +import kotlinx.coroutines.test.runTest +import kotlinx.coroutines.test.setMain +import org.junit.Assert.assertEquals +import org.junit.Assert.assertFalse +import org.junit.Assert.assertNotNull +import org.junit.Assert.assertNull +import org.junit.Assert.assertTrue +import org.junit.Test + +/******************************************************************************* + ** + *******************************************************************************/ +@OptIn(ExperimentalCoroutinesApi::class) +class ProcessSubmissionTest { + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun navigationWaitsForMutationAndNeverReplaysUnknownOrdinaryResult() = runTest() + { + Dispatchers.setMain(StandardTestDispatcher(testScheduler)) + try { + val gate = CompletableDeferred<Unit>() + val repository = SubmissionRepository().apply { stepGate = gate; stepFailures = 1 } + val model = model(repository) + model.doInit() + advanceUntilIdle() + model.runStep(mapOf("eventId" to "ordinary")) + runCurrent() + assertNotNull(model.navigationBlockReason()) + gate.complete(Unit) + advanceUntilIdle() + assertTrue(model.unconfirmedSubmission) + assertEquals("process", model.processUUID) + assertNull(model.retryLabel()) + model.retryPendingStep() + model.runStep(mapOf("eventId" to "ordinary")) + advanceUntilIdle() + assertEquals(1, repository.submissions.size) + assertTrue((model.topLevelErrorState as LoadState.Error).message.contains("Do not submit it again")) + } finally { + Dispatchers.resetMain() + } + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun settledMissingScanReceiptAllowsConfirmedLeaveWithoutDiscardingRetry() = runTest() + { + Dispatchers.setMain(StandardTestDispatcher(testScheduler)) + try { + val repository = SubmissionRepository() + val model = model(repository) + model.doInit() + advanceUntilIdle() + assertNull(model.navigationBlockReason()) + assertNull(model.navigationWarning()) + model.runStep(mapOf("eventId" to "scan"), ProcessAcknowledgment("acknowledgedEventId", "scan")) + advanceUntilIdle() + assertNull(model.navigationBlockReason()) + assertEquals("scan", model.pendingStepValues?.get("eventId")) + assertTrue(model.navigationWarning()!!.contains("may already be saved")) + repository.responseValues = mapOf("acknowledgedEventId" to "scan") + model.retryPendingStep() + advanceUntilIdle() + assertNull(model.navigationBlockReason()) + assertNull(model.pendingStepValues) + assertNull(model.navigationWarning()) + } finally { + Dispatchers.resetMain() + } + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun lostScanResponseAllowsLeaveOnlyAfterRequestSettlesAndPreservesPendingPhotos() = runTest() + { + Dispatchers.setMain(StandardTestDispatcher(testScheduler)) + try { + val gate = CompletableDeferred<Unit>() + val repository = SubmissionRepository().apply { stepGate = gate; stepFailures = 1 } + val model = model(repository) + model.doInit() + advanceUntilIdle() + model.runStep(mapOf("eventId" to "scan"), ProcessAcknowledgment("acknowledgedEventId", "scan")) + runCurrent() + assertNotNull(model.navigationBlockReason()) + gate.complete(Unit) + advanceUntilIdle() + assertNull(model.navigationBlockReason()) + assertNotNull(model.navigationWarning()) + assertEquals("scan", model.pendingStepValues?.get("eventId")) + model.setClientWork("photo", "Finish the pending photo first.") + assertEquals("Finish the pending photo first.", model.navigationBlockReason()) + model.setClientWork("photo", null) + assertNull(model.navigationBlockReason()) + assertEquals(1, repository.submissions.size) + } finally { + Dispatchers.resetMain() + } + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun confirmedLeaveKeepsOriginalScanUntilCancellationSucceedsAndNeverResubmits() = runTest() + { + Dispatchers.setMain(StandardTestDispatcher(testScheduler)) + try { + val gate = CompletableDeferred<Unit>() + val repository = SubmissionRepository().apply { cancelGate = gate; cancelFailures = 1 } + val model = model(repository) + var closes = 0 + model.closeProcessCallback = { closes++ } + model.doInit() + advanceUntilIdle() + model.runStep(mapOf("eventId" to "scan"), ProcessAcknowledgment("acknowledgedEventId", "scan")) + advanceUntilIdle() + model.cancel() + runCurrent() + model.cancel() + assertEquals(1, repository.cancellations) + assertEquals("scan", model.pendingStepValues?.get("eventId")) + gate.complete(Unit) + advanceUntilIdle() + assertEquals(0, closes) + assertTrue(model.cancellationFailed) + assertEquals("scan", model.pendingStepValues?.get("eventId")) + assertNotNull(model.navigationWarning()) + model.cancel() + assertFalse(model.cancellationFailed) + advanceUntilIdle() + assertEquals(1, closes) + assertEquals(2, repository.cancellations) + assertEquals(1, repository.submissions.size) + assertNull(model.pendingStepValues) + assertNull(model.navigationWarning()) + } finally { + Dispatchers.resetMain() + } + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun widgetInputsAreValidatedConvertedAndProtectedAtSubmission() { + runTest { + Dispatchers.setMain(StandardTestDispatcher(testScheduler)) + try { + /******************************************************************************* + ** + *******************************************************************************/ + fun block(name: String, type: String, hidden: Boolean = false) = mapOf( + "blockType" to "INPUT_FIELD", "values" to mapOf( + "fieldMetaData" to mapOf("name" to name, "label" to name, "type" to type, "isRequired" to true, "isHidden" to hidden) + ) + ) + + val repository = SubmissionRepository().apply { + inputOverride = QFrontendStepMetaData( + "input", "Widget", components = listOf( + QFrontendComponent( + QComponentType.WIDGET, + mapOf("isAdHocWidget" to true, "blocks" to listOf(block("quantity", "INTEGER"), block("secret", "STRING", true))) + ) + ) + ) + } + val model = model(repository) + model.doInit() + advanceUntilIdle() + model.runStep(mapOf("quantity" to "invalid")) + advanceUntilIdle() + assertTrue(repository.submissions.isEmpty()) + assertTrue(model.fieldErrors.containsKey("quantity")) + model.runStep(mapOf("quantity" to "12", "secret" to "must-not-submit")) + advanceUntilIdle() + assertEquals(mapOf("quantity" to 12), repository.submissions.single()) + } finally { + Dispatchers.resetMain() + } + } + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun ordinaryAsyncJobCanRetryItsStatusWithoutResubmittingTheAction() = runTest() + { + Dispatchers.setMain(StandardTestDispatcher(testScheduler)) + try { + val repository = SubmissionRepository().apply { asynchronous = true; statusFailures = 1 } + val model = model(repository) + model.doInit() + advanceUntilIdle() + model.runStep(mapOf("eventId" to "ordinary")) + advanceUntilIdle() + model.checkIn() + advanceUntilIdle() + assertEquals("Check result again", model.retryLabel()) + assertTrue(model.topLevelErrorState is LoadState.Error) + model.retryPendingStep() + advanceUntilIdle() + assertEquals(1, repository.submissions.size) + assertEquals(2, repository.statusCalls) + assertEquals("result", model.activeStepName) + assertNull(model.retryLabel()) + } finally { + Dispatchers.resetMain() + } + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun cancellingBeforeMetadataReturnsPreventsInitialization() = runTest() + { + Dispatchers.setMain(StandardTestDispatcher(testScheduler)) + try { + val gate = CompletableDeferred<Unit>() + val repository = SubmissionRepository().apply { metadataGate = gate } + val model = model(repository) + var closes = 0 + model.closeProcessCallback = { closes++ } + model.doInit() + runCurrent() + model.cancel() + gate.complete(Unit) + advanceUntilIdle() + assertEquals(1, closes) + assertEquals(0, repository.initializations) + assertEquals(0, repository.cancellations) + } finally { + Dispatchers.resetMain() + } + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun cancellingDuringInitializationWaitsForItsIdentityAndCancelsTheServer() = runTest() + { + Dispatchers.setMain(StandardTestDispatcher(testScheduler)) + try { + val gate = CompletableDeferred<Unit>() + val repository = SubmissionRepository().apply { initGate = gate } + val model = model(repository) + var closes = 0 + model.closeProcessCallback = { closes++ } + model.doInit() + runCurrent() + assertEquals(1, repository.initializations) + model.cancel() + assertTrue(model.cancelling) + assertEquals(0, closes) + gate.complete(Unit) + advanceUntilIdle() + assertEquals(1, repository.cancellations) + assertEquals(1, closes) + assertFalse(model.cancelling) + } finally { + Dispatchers.resetMain() + } + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun completeScannerReceiptIsRequiredBeforeDiscardingTheOriginalEvent() = runTest() + { + Dispatchers.setMain(StandardTestDispatcher(testScheduler)) + try { + val repository = SubmissionRepository().apply { responseValues = mapOf("acknowledgedEventId" to "scan-1", "scanSaved" to false) } + val model = model(repository) + model.doInit() + advanceUntilIdle() + model.runStep( + mapOf("eventId" to "scan-1", "barcode" to "00123"), + ProcessAcknowledgment("acknowledgedEventId", "scan-1", mapOf("scanSaved" to true), setOf("scanId")) + ) + advanceUntilIdle() + assertEquals("scan-1", model.pendingStepValues?.get("eventId")) + assertEquals("input", model.activeStepName) + repository.responseValues = mapOf("acknowledgedEventId" to "scan-1", "scanSaved" to true, "scanId" to "receipt") + model.retryPendingStep() + advanceUntilIdle() + assertNull(model.pendingStepValues) + assertEquals(repository.submissions.first(), repository.submissions.last()) + } finally { + Dispatchers.resetMain() + } + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun omittedNextStepCompletesTheProcessAndCloseDoesNotCancelIt() = runTest() + { + Dispatchers.setMain(StandardTestDispatcher(testScheduler)) + try { + val repository = SubmissionRepository() + val model = model(repository) + var closed = false + model.closeProcessCallback = { closed = true } + model.doInit() + advanceUntilIdle() + model.processValues["eventId"] = "ordinary-business-id" + model.runStep() + advanceUntilIdle() + assertEquals("result", model.activeStepName) + assertFalse("A final display step must still be submitted", model.getNoMoreSteps()) + repository.nextStep = "" + model.runStep() + advanceUntilIdle() + assertTrue("The server omitted nextStep, so there is nothing left to run", model.getNoMoreSteps()) + assertTrue(model.topLevelErrorState is LoadState.Success) + assertNull(model.activeStep) + model.cancel() + advanceUntilIdle() + assertTrue(closed) + assertEquals(0, repository.cancellations) + } finally { + Dispatchers.resetMain() + } + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun ordinaryEventIdFieldAdvancesWithoutScannerAcknowledgment() = runTest() + { + Dispatchers.setMain(StandardTestDispatcher(testScheduler)) + try { + val repository = SubmissionRepository() + val model = model(repository) + model.doInit() + advanceUntilIdle() + model.processValues["eventId"] = "ordinary-business-id" + model.runStep() + advanceUntilIdle() + assertEquals("ordinary-business-id", repository.submissions.single()["eventId"]) + assertEquals("result", model.activeStepName) + assertNull(model.pendingStepValues) + assertTrue(model.topLevelErrorState is LoadState.Success) + } finally { + Dispatchers.resetMain() + } + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun explicitScanAcknowledgmentRetainsIdentityUntilMatchingRetry() = runTest() + { + Dispatchers.setMain(StandardTestDispatcher(testScheduler)) + try { + val repository = SubmissionRepository() + val model = model(repository) + model.doInit() + advanceUntilIdle() + val values = mapOf("eventId" to "scan-1", "barcode" to "000123") + model.runStep(values, ProcessAcknowledgment("acknowledgedEventId", "scan-1")) + advanceUntilIdle() + assertEquals("input", model.activeStepName) + assertEquals("scan-1", model.pendingStepValues?.get("eventId")) + repository.responseValues = mapOf("acknowledgedEventId" to "scan-1") + model.retryPendingStep() + advanceUntilIdle() + assertEquals(2, repository.submissions.size) + assertEquals(repository.submissions.first(), repository.submissions.last()) + assertEquals("result", model.activeStepName) + assertNull(model.pendingStepValues) + assertTrue(model.topLevelErrorState is LoadState.Success) + } finally { + Dispatchers.resetMain() + } + } + + /******************************************************************************* + ** The optional fidelity keys are ordinary undeclared event values; a lost response must resend all of them. + *******************************************************************************/ + @Test + fun failedScanSubmissionResendsTheSameEntireEventMapIncludingFidelityValues() = runTest() + { + Dispatchers.setMain(StandardTestDispatcher(testScheduler)) + try { + val repository = SubmissionRepository().apply { stepFailures = 1 } + val model = model(repository) + model.doInit() + advanceUntilIdle() + val event = mapOf( + "barcode" to "000123", "symbology" to "LABEL-TYPE-QRCODE", "scanSource" to "zebra-emdk", + "eventId" to "scan-1", "capturedAt" to "2026-01-01T00:00:00Z", + "aimIdentifier" to "]Q1", "rawDataBase64" to "AAECAw==" + ) + model.runStep(event, ProcessAcknowledgment("acknowledgedEventId", "scan-1")) + advanceUntilIdle() + assertTrue(model.unconfirmedSubmission) + assertEquals(event, model.pendingStepValues) + repository.responseValues = mapOf("acknowledgedEventId" to "scan-1") + model.retryPendingStep() + advanceUntilIdle() + assertEquals(listOf(event, event), repository.submissions) + assertNull(model.pendingStepValues) + } finally { + Dispatchers.resetMain() + } + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun hiddenRequiredFieldsAreNeitherValidatedNorResubmitted() = runTest() + { + Dispatchers.setMain(StandardTestDispatcher(testScheduler)) + try { + val repository = SubmissionRepository(hiddenEventId = true) + val model = model(repository) + model.doInit() + advanceUntilIdle() + model.runStep() + advanceUntilIdle() + assertTrue(model.fieldErrors.isEmpty()) + assertFalse(repository.submissions.single().containsKey("eventId")) + assertEquals("result", model.activeStepName) + } finally { + Dispatchers.resetMain() + } + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun explicitLocalLeaveRequiresFailedCancellationAndHonorsWorkGuards() = runTest() + { + Dispatchers.setMain(StandardTestDispatcher(testScheduler)) + try { + val repository = SubmissionRepository().apply { cancelFailures = 2 } + val process = model(repository) + QAppContainer.availableEnvironments = listOf(Environment("Test", "https://example.invalid")) + val host = QViewModel(repository, MockPreferencesDataStore()) + // This policy fixture owns only navigation; skip Android-backed startup/authentication work. + host.viewModelScope.coroutineContext.cancelChildren() + host.activeProcessViewModel = process + process.doInit() + advanceUntilIdle() + process.runStep(mapOf("eventId" to "scan"), ProcessAcknowledgment("acknowledgedEventId", "scan")) + advanceUntilIdle() + var destinations = 0 + host.qNavigator.requestLeave("Leave?") { destinations++ } + host.qNavigator.leaveAnyway() + assertEquals(0, destinations) + host.qNavigator.confirmLeave() + advanceUntilIdle() + assertTrue(process.cancellationFailed) + host.qNavigator.dismissLeave() + assertEquals("scan", process.pendingStepValues?.get("eventId")) + assertEquals(0, destinations) + host.qNavigator.requestLeave("Leave?") { destinations++ } + host.qNavigator.confirmLeave() + assertFalse(process.cancellationFailed) + host.qNavigator.leaveAnyway() + assertEquals(0, destinations) + advanceUntilIdle() + process.setClientWork("photo", "Pending photo") + host.qNavigator.leaveAnyway() + assertEquals(0, destinations) + process.setClientWork("photo", null) + val stepGate = CompletableDeferred<Unit>() + repository.stepGate = stepGate + process.retryPendingStep() + runCurrent() + host.qNavigator.leaveAnyway() + assertEquals(0, destinations) + stepGate.complete(Unit) + advanceUntilIdle() + host.qNavigator.leaveAnyway() + host.qNavigator.leaveAnyway() + assertEquals(1, destinations) + assertEquals(2, repository.cancellations) + assertEquals(2, repository.submissions.size) + assertEquals(repository.submissions.first(), repository.submissions.last()) + assertNull(process.pendingStepValues) + assertNull(host.activeProcessViewModel) + assertFalse(process.cancellationFailed) + } finally { + Dispatchers.resetMain() + } + } + + /******************************************************************************* + ** Erased callback return types are discarded while once-per-step controls retain their identity. + *******************************************************************************/ + @Test + fun controlCallbacksValidateArityAndKeepOncePerStepBehavior() { + val process = ProcessViewModel() + var calls = 0 + val callback: () -> String = { calls++; "ignored" } + process.actionCallback(mapOf("registerControlCallbackName" to "audio", "registerControlCallbackFunction" to callback)) + process.actionCallback(mapOf("controlCode" to "invokeControlCallbackOnlyOnce:audio")) + process.actionCallback(mapOf("controlCode" to "invokeControlCallbackOnlyOnce:audio")) + assertEquals(1, calls) + } + + + /******************************************************************************* + ** Malformed callback registrations must fail before entering the control registry. + *******************************************************************************/ + @Test(expected = IllegalArgumentException::class) + fun nonCallableControlRegistrationIsRejected() { + ProcessViewModel().actionCallback(mapOf("registerControlCallbackName" to "audio", "registerControlCallbackFunction" to "invalid")) + } + + + /******************************************************************************* + ** Echo-style setup: named possible-value sources are resolved through the repository, and dependent + ** choices are requested with the current parent value rather than being rendered as free text. + *******************************************************************************/ + @Test + fun namedPossibleValueSourcesLoadWithDependentValuesAndReportFailures() = runTest() + { + Dispatchers.setMain(StandardTestDispatcher(testScheduler)) + try { + // As published by the server: media declares its explicit dependency on printerId (default DISABLE_UNTIL_SET). + val printer = QFieldMetaData("printerId", "Printer", type = QFieldType.STRING, isRequired = true, possibleValueSourceName = "printers") + val media = QFieldMetaData( + "mediaId", "Paper or label size", type = QFieldType.STRING, isRequired = true, possibleValueSourceName = "media", + possibleValueSourceDependsOn = listOf("printerId"), possibleValueSourceDependencyBehavior = "DISABLE_UNTIL_SET" + ) + val repository = SubmissionRepository().apply { + inputOverride = QFrontendStepMetaData("input", "Input", components = listOf(QFrontendComponent(QComponentType.EDIT_FORM)), formFields = listOf(printer, media)) + } + val model = model(repository) + model.doInit() + advanceUntilIdle() + assertNull("Remote choices are supported, not an unsupported control", model.unsupportedReason()) + + model.loadRemoteOptions(printer) + model.loadRemoteOptions(media) + advanceUntilIdle() + assertEquals(listOf("Simulated printer"), model.remoteOptions["printerId"]?.map { it.label }) + assertEquals("Choose Printer first.", model.remoteOptionsBlockedReason(media)) + assertEquals("A blocked dependent field is not searched", listOf("printerId"), repository.possibleValueRequests.map { it.first }) + + model.processValues["printerId"] = "printer" + model.fieldChanged("printerId") + advanceUntilIdle() + assertNull(model.remoteOptionsBlockedReason(media)) + assertEquals(listOf("4 x 6 in"), model.remoteOptions["mediaId"]?.map { it.label }) + assertEquals("printer", repository.possibleValueRequests.last().second["printerId"]) + assertFalse("The requested field's own value is not sent as a dependency", repository.possibleValueRequests.last().second.containsKey("mediaId")) + + // Changing the parent drops the dependent selection immediately, and a late reply for the old parent is ignored. + model.processValues["mediaId"] = "4x6" + val gate = CompletableDeferred<Unit>() + repository.possibleValueGate = gate + model.loadRemoteOptions(media) + runCurrent() + model.processValues["printerId"] = "other" + model.fieldChanged("printerId") + assertNull("Stale child selection is cleared when its parent changes", model.processValues["mediaId"]) + assertEquals(1, model.fieldResets["mediaId"]) + assertNull(model.remoteOptions["mediaId"]) + repository.possibleValueGate = null + gate.complete(Unit) + advanceUntilIdle() + assertEquals("Only the newest request may publish", emptyList<String>(), model.remoteOptions["mediaId"]?.map { it.label }) + + // A failed load is reported without blocking Cancel, and can be retried. + repository.possibleValueFailure = true + model.loadRemoteOptions(media) + advanceUntilIdle() + assertNull(model.remoteOptions["mediaId"]) + assertNotNull(model.remoteOptionErrors["mediaId"]) + assertNull(model.clientWorkBlockReason) + repository.possibleValueFailure = false + model.processValues["printerId"] = "printer" + model.loadRemoteOptions(media) + advanceUntilIdle() + assertNull(model.remoteOptionErrors["mediaId"]) + assertEquals(listOf("4 x 6 in"), model.remoteOptions["mediaId"]?.map { it.label }) + } finally { + Dispatchers.resetMain() + } + } + + /******************************************************************************* + ** Setup chain printer -> media -> document, where the document is an INTEGER-keyed choice depending on both parents. + ** Ancestor changes must clear the whole stale suffix, block Next until reselection, keep the integer id typed on + ** submission, and never let a late reply for the old parents restore the old document. + *******************************************************************************/ + @Test + fun integerDocumentChoiceDependsOnPrinterAndMediaAndNeverSurvivesAParentChange() = runTest() + { + Dispatchers.setMain(StandardTestDispatcher(testScheduler)) + try { + fun choice(id: Int, label: String) = com.kingsrook.qqq.frontend.android.core.model.QPossibleValue(id, label) + val printer = QFieldMetaData("printerId", "Printer", type = QFieldType.STRING, isRequired = true, possibleValueSourceName = "printers") + val media = QFieldMetaData( + "mediaId", "Paper or label size", type = QFieldType.STRING, isRequired = true, possibleValueSourceName = "media", + possibleValueSourceDependsOn = listOf("printerId"), possibleValueSourceDependencyBehavior = "DISABLE_UNTIL_SET" + ) + val document = QFieldMetaData( + "templateId", "Document", type = QFieldType.INTEGER, isRequired = true, possibleValueSourceName = "documents", + possibleValueSourceDependsOn = listOf("printerId", "mediaId"), possibleValueSourceDependencyBehavior = "DISABLE_UNTIL_SET" + ) + val repository = SubmissionRepository().apply { + inputOverride = QFrontendStepMetaData("input", "Input", components = listOf(QFrontendComponent(QComponentType.EDIT_FORM)), formFields = listOf(printer, media, document)) + possibleValueResolver = { field, values -> + when (field) { + "printerId" -> listOf(choice(1, "P1")) + "mediaId" -> if (values["printerId"] == "p1") listOf(choice(2, "M1")) else if (values["printerId"] == "p2") listOf(choice(3, "M2")) else emptyList() + else -> when (values["printerId"] to values["mediaId"]) { + "p1" to "m1" -> listOf(choice(7, "Seven"), choice(9, "Nine")) + "p1" to "m1b" -> listOf(choice(11, "Eleven")) + "p2" to "m2" -> listOf(choice(13, "Thirteen")) + else -> emptyList() + } + } + } + } + val model = model(repository) + model.doInit() + advanceUntilIdle() + listOf(printer, media, document).forEach { model.loadRemoteOptions(it) } + advanceUntilIdle() + assertEquals("Choose Printer and Paper or label size first.", model.remoteOptionsBlockedReason(document)) + + fun choose(name: String, value: Any?) { model.processValues[name] = value; model.fieldChanged(name); } + choose("printerId", "p1") + advanceUntilIdle() + assertEquals("Choose Paper or label size first.", model.remoteOptionsBlockedReason(document)) + choose("mediaId", "m1") + advanceUntilIdle() + assertNull(model.remoteOptionsBlockedReason(document)) + val requested = repository.possibleValueRequests.last() + assertEquals("documents is searched with both parent values", mapOf("printerId" to "p1", "mediaId" to "m1"), requested.second.filterKeys { it != "templateId" }.filterValues { it != null }) + assertEquals(listOf(7, 9), model.remoteOptions["templateId"]?.map { it.id }) + assertTrue("Choice ids stay true integers", model.remoteOptions["templateId"]!!.all { it.id is Int }) + + // Required: nothing selected means Next must not submit. + model.runStep() + advanceUntilIdle() + assertEquals("Document is required.", model.fieldErrors["templateId"]) + assertTrue(repository.submissions.isEmpty()) + + // Changing media clears the document and Next stays blocked until it is chosen again. + choose("templateId", 7) + choose("mediaId", "m1b") + assertNull("Document chosen for the old media is cleared", model.processValues["templateId"]) + assertEquals(1, model.fieldResets["templateId"]) + advanceUntilIdle() + assertEquals(listOf(11), model.remoteOptions["templateId"]?.map { it.id }) + model.runStep() + advanceUntilIdle() + assertEquals("Document is required.", model.fieldErrors["templateId"]) + assertTrue(repository.submissions.isEmpty()) + + // Changing the printer clears media and the document; the old document id is not an offered choice. + choose("mediaId", "m1") + advanceUntilIdle() + choose("templateId", 9) + val gate = CompletableDeferred<Unit>() + repository.possibleValueGate = gate + model.loadRemoteOptions(document) + runCurrent() + choose("printerId", "p2") + assertNull(model.processValues["mediaId"]) + assertNull(model.processValues["templateId"]) + assertEquals(2, model.fieldResets["templateId"]) + assertEquals("Choose Paper or label size first.", model.remoteOptionsBlockedReason(document)) + // A reply for the old printer/media that was already in flight is discarded, not republished. + repository.possibleValueGate = null + gate.complete(Unit) + advanceUntilIdle() + assertNull("Late old-parent reply cannot restore choices", model.remoteOptions["templateId"]) + assertNull("Late old-parent reply cannot restore the old document", model.processValues["templateId"]) + model.runStep() + advanceUntilIdle() + assertTrue(model.fieldErrors.containsKey("mediaId") && model.fieldErrors.containsKey("templateId")) + assertTrue(repository.submissions.isEmpty()) + + // After reselection the typed integer id is what is submitted. + choose("mediaId", "m2") + advanceUntilIdle() + assertEquals(listOf(13), model.remoteOptions["templateId"]?.map { it.id }) + choose("templateId", model.remoteOptions["templateId"]!!.single().id) + model.runStep() + advanceUntilIdle() + val submitted = repository.submissions.single() + assertEquals("p2", submitted["printerId"]) + assertEquals("m2", submitted["mediaId"]) + assertEquals(13, submitted["templateId"]) + assertTrue("Document is submitted as an integer, not text or a decimal", submitted["templateId"] is Int) + assertEquals("result", model.activeStepName) + } finally { + Dispatchers.resetMain() + } + } + + /******************************************************************************* + ** Last scanner feedback is per run: ordinary step updates keep it, a reset (new run) drops it. + *******************************************************************************/ + @Test + fun widgetStateSurvivesStepUpdatesButIsClearedOnReset() = runTest() + { + Dispatchers.setMain(StandardTestDispatcher(testScheduler)) + try { + val repository = SubmissionRepository() + val model = model(repository) + model.doInit() + advanceUntilIdle() + model.widgetState["scanner.lastScan"] = "000123" + model.processValues["eventId"] = "ordinary-business-id" + model.runStep() + advanceUntilIdle() + assertEquals("result", model.activeStepName) + assertEquals("000123", model.widgetState["scanner.lastScan"]) + model.reset() + assertTrue(model.widgetState.isEmpty()) + } finally { + Dispatchers.resetMain() + } + } + + /******************************************************************************* + ** + *******************************************************************************/ + private fun model(repository: SubmissionRepository) = ProcessViewModel().apply() + { + qqqRepository = repository + processName = "edit" + qInstance = QInstance() + } + + /******************************************************************************* + ** + *******************************************************************************/ + private class SubmissionRepository(hiddenEventId: Boolean = false) : QQQRepository { + val submissions = mutableListOf<Map<String, Any?>>() + var responseValues: Map<String, Any?> = emptyMap() + var nextStep = "result" + var cancellations = 0 + var initializations = 0 + var metadataGate: CompletableDeferred<Unit>? = null + var initGate: CompletableDeferred<Unit>? = null + var stepGate: CompletableDeferred<Unit>? = null + var stepFailures = 0 + var cancelGate: CompletableDeferred<Unit>? = null + var cancelFailures = 0 + var asynchronous = false + var statusFailures = 0 + var statusCalls = 0 + var inputOverride: QFrontendStepMetaData? = null + val possibleValueRequests = mutableListOf<Pair<String, Map<String, Any?>>>() + var possibleValueFailure = false + var possibleValueGate: CompletableDeferred<Unit>? = null + var possibleValueResolver: ((String, Map<String, Any?>) -> List<com.kingsrook.qqq.frontend.android.core.model.QPossibleValue>)? = null + private val input = QFrontendStepMetaData( + "input", "Input", components = listOf(QFrontendComponent(QComponentType.EDIT_FORM)), + formFields = listOf(QFieldMetaData("eventId", "Event", type = QFieldType.STRING, isRequired = true, isHidden = hiddenEventId)) + ) + private val result = QFrontendStepMetaData("result", "Result", components = emptyList()) + + /******************************************************************************* + ** + *******************************************************************************/ + override suspend fun getProcessMetaData(processName: String): QProcessMetaData { + metadataGate?.await() + return QProcessMetaData("edit", "Edit", frontendSteps = listOf(inputOverride ?: input, result)) + } + + /******************************************************************************* + ** + *******************************************************************************/ + override suspend fun processInit(processName: String, values: Map<String, Any?>, recordsParam: String?, recordIds: String?, filterJSON: String?, stepTimeoutMillis: Int?): ProcessStepResult { + initializations++ + initGate?.await() + return QJobComplete("process", nextStep = "input") + } + + /******************************************************************************* + ** + *******************************************************************************/ + override suspend fun processStep(processName: String, processUUID: String, stepName: String, values: Map<String, Any?>, stepTimeoutMillis: Int?): ProcessStepResult { + submissions.add(values.toMap()) + stepGate?.await() + if (stepFailures-- > 0) throw java.io.IOException("Response lost") + return if (asynchronous) QJobStarted("process", "job") else QJobComplete("process", responseValues, nextStep) + } + + /******************************************************************************* + ** Printer choices are independent; media choices depend on the supplied printer. + *******************************************************************************/ + override suspend fun processPossibleValues(processName: String, fieldName: String, values: Map<String, Any?>, processValues: Map<String, Any?>): List<com.kingsrook.qqq.frontend.android.core.model.QPossibleValue> { + possibleValueRequests.add(fieldName to values.toMap()) + possibleValueGate?.await() + if (possibleValueFailure) throw java.io.IOException("Choices unavailable") + possibleValueResolver?.let { return it(fieldName, values.toMap()) } + return when { + fieldName == "printerId" -> listOf(com.kingsrook.qqq.frontend.android.core.model.QPossibleValue("printer", "Simulated printer")) + values["printerId"] == "printer" -> listOf(com.kingsrook.qqq.frontend.android.core.model.QPossibleValue("4x6", "4 x 6 in")) + else -> emptyList() + } + } + + /******************************************************************************* + ** + *******************************************************************************/ + override suspend fun processCancel(processName: String, processUUID: String) { + cancellations++ + cancelGate?.await() + if (cancelFailures-- > 0) throw java.io.IOException("Cancellation response lost") + } + + /******************************************************************************* + ** + *******************************************************************************/ + override suspend fun processJobStatus(processName: String, processUUID: String, jobUUID: String): ProcessStepResult { + statusCalls++ + if (statusFailures-- > 0) throw java.io.IOException("Unavailable") + return QJobComplete("process", responseValues, nextStep) + } + + /******************************************************************************* + ** + *******************************************************************************/ + override suspend fun getAuthenticationMetaData(): BaseAuthenticationMetaData = error("Not used") + + /******************************************************************************* + ** + *******************************************************************************/ + override suspend fun manageSession(body: ManageSessionRequest): ManageSessionResponse = error("Not used") + + /******************************************************************************* + ** + *******************************************************************************/ + override suspend fun getMetaData(frontendName: String, frontendVersion: String, applicationName: String, applicationVersion: String): QInstance = error("Not used") + + /******************************************************************************* + ** + *******************************************************************************/ + override fun setEnvironment(environment: Environment) {} + + /******************************************************************************* + ** + *******************************************************************************/ + override fun setSessionUUID(sessionUUID: String) {} + + /******************************************************************************* + ** + *******************************************************************************/ + override fun getURI(path: String): String = error("Not used") + } +} diff --git a/qqq/android/mobileapp/src/test/java/com/kingsrook/qqq/frontend/android/mobileapp/viewmodel/QViewModelLogoutTest.kt b/qqq/android/mobileapp/src/test/java/com/kingsrook/qqq/frontend/android/mobileapp/viewmodel/QViewModelLogoutTest.kt new file mode 100644 index 0000000..f942eda --- /dev/null +++ b/qqq/android/mobileapp/src/test/java/com/kingsrook/qqq/frontend/android/mobileapp/viewmodel/QViewModelLogoutTest.kt @@ -0,0 +1,224 @@ +/* Copyright (c) 2026 QRunIO. SPDX-License-Identifier: Apache-2.0 */ +package com.kingsrook.qqq.frontend.android.mobileapp.viewmodel + +import com.kingsrook.qqq.frontend.android.core.controllers.QQQRepository +import com.kingsrook.qqq.frontend.android.core.model.Environment +import com.kingsrook.qqq.frontend.android.core.model.metadata.QInstance +import com.kingsrook.qqq.frontend.android.core.model.metadata.QProcessMetaData +import com.kingsrook.qqq.frontend.android.core.model.metadata.authentication.BaseAuthenticationMetaData +import com.kingsrook.qqq.frontend.android.core.model.metadata.authentication.ManageSessionRequest +import com.kingsrook.qqq.frontend.android.core.model.metadata.authentication.ManageSessionResponse +import com.kingsrook.qqq.frontend.android.core.model.metadata.authentication.NativeLogoutData +import com.kingsrook.qqq.frontend.android.core.model.metadata.authentication.OAuth2AuthenticationMetaData +import com.kingsrook.qqq.frontend.android.core.model.processes.ProcessStepResult +import com.kingsrook.qqq.frontend.android.mobileapp.container.QAppContainer +import com.kingsrook.qqq.frontend.android.mobileapp.data.MockPreferencesDataStore +import com.kingsrook.qqq.frontend.android.mobileapp.ui.authentication.OAuth2LoginBinding +import com.kingsrook.qqq.frontend.android.mobileapp.ui.authentication.OAuth2LogoutBinding +import com.kingsrook.qqq.frontend.android.mobileapp.ui.authentication.OAuth2LogoutPhase +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.test.StandardTestDispatcher +import kotlinx.coroutines.test.TestScope +import kotlinx.coroutines.test.advanceUntilIdle +import kotlinx.coroutines.test.resetMain +import kotlinx.coroutines.test.runTest +import kotlinx.coroutines.test.setMain +import kotlinx.serialization.json.Json +import org.junit.Assert.assertEquals +import org.junit.Assert.assertFalse +import org.junit.Assert.assertNotNull +import org.junit.Assert.assertNull +import org.junit.Assert.assertTrue +import org.junit.Test + +private const val SERVER = "https://example.invalid" +private const val ISSUER = "https://idp.example.invalid" +private const val REDIRECT = "io.qrun.test.oauth://callback/oauth2redirect" +private const val STATE = "state-0123456789abcdef" +private const val NONCE = "nonce-0123456789abcdef" +private const val VERIFIER = "verifier-0123456789abcdefghijklmnopqrstuvwxyz0123456789" + +/******************************************************************************* + ** Ordering of host session end, provider logout and local clearing; identity adoption after browser login. + *******************************************************************************/ +@OptIn(ExperimentalCoroutinesApi::class) +class QViewModelLogoutTest { + /******************************************************************************* + ** (a) Provider logout must read the hint before the host ends its device session (which ends the QQQ session). + *******************************************************************************/ + @Test + fun companyLogoutRequestsProviderMaterialBeforeHostSessionEnd() = runTest() + { + Dispatchers.setMain(StandardTestDispatcher(testScheduler)) + try { + val repository = LogoutRepository() + val model = signedInModel(repository) + model.beforeLogout = { repository.calls += "beforeLogout" } + val material = companyLogout(model) + assertNotNull(material) + assertEquals(listOf("logoutWithProvider", "beforeLogout"), repository.calls) + assertEquals("Signed out.", model.logoutMessage) + assertFalse(model.isAuthenticated) + assertEquals("", model.sessionUUID) + assertEquals("", model.sessionUserFullName) + } finally { + Dispatchers.resetMain() + } + } + + /******************************************************************************* + ** (b) A failing host session end after the provider logout neither loses the hint nor leaves local state. + *******************************************************************************/ + @Test + fun failingHostSessionEndAfterProviderLogoutKeepsMaterialAndClearsLocally() = runTest() + { + Dispatchers.setMain(StandardTestDispatcher(testScheduler)) + try { + val repository = LogoutRepository() + val model = signedInModel(repository) + model.beforeLogout = { repository.calls += "beforeLogout"; throw IllegalStateException("401 Unauthorized") } + val material = companyLogout(model) + assertNotNull(material) + assertEquals(listOf("logoutWithProvider", "beforeLogout"), repository.calls) + assertEquals("Signed out.", model.logoutMessage) + assertFalse(model.isAuthenticated) + assertFalse(model.logoutInProgress) + assertEquals("", model.sessionUUID) + assertEquals("", repository.activeSession) + } finally { + Dispatchers.resetMain() + } + } + + /******************************************************************************* + ** (c) Ordinary sign-out keeps ending host resources before the core logout. + *******************************************************************************/ + @Test + fun ordinaryLogoutEndsHostSessionBeforeCoreLogout() = runTest() + { + Dispatchers.setMain(StandardTestDispatcher(testScheduler)) + try { + val repository = LogoutRepository() + val model = signedInModel(repository) + model.beforeLogout = { repository.calls += "beforeLogout" } + model.requestLogout() + model.logOut().join() + assertEquals(listOf("beforeLogout", "logout"), repository.calls) + assertEquals("Signed out.", model.logoutMessage) + assertFalse(model.isAuthenticated) + assertEquals("", model.sessionUUID) + } finally { + Dispatchers.resetMain() + } + } + + /******************************************************************************* + ** Browser login adopts the server-reported display name, as password login already does. + *******************************************************************************/ + @Test + fun browserLoginAdoptsServerReportedUserName() = runTest() + { + Dispatchers.setMain(StandardTestDispatcher(testScheduler)) + try { + val repository = LogoutRepository() + val model = signedInModel(repository) + assertTrue(model.isAuthenticated) + assertEquals("scanner-b", model.sessionUserFullName) + } finally { + Dispatchers.resetMain() + } + } + + /******************************************************************************* + ** The user object is optional and unknown keys stay tolerated; blank or non-object users yield no name. + *******************************************************************************/ + @Test + fun manageSessionResponseExposesOptionalUserName() { + val json = Json { ignoreUnknownKeys = true } + val full = json.decodeFromString<ManageSessionResponse>( + """{"uuid":"s","values":{"user":{"name":"scanner-b","email":"scanner-b@example.invalid","extra":1},"other":true},"unknown":"x"}""" + ) + assertEquals("scanner-b", full.userName) + assertNull(json.decodeFromString<ManageSessionResponse>("""{"uuid":"s"}""").userName) + assertNull(json.decodeFromString<ManageSessionResponse>("""{"uuid":"s","values":{"user":"scanner-b"}}""").userName) + assertNull(json.decodeFromString<ManageSessionResponse>("""{"uuid":"s","values":{"user":{"name":" "}}}""").userName) + } + + /******************************************************************************* + ** Complete a native browser login against the fake repository so sign-out tests start authenticated. + *******************************************************************************/ + private fun TestScope.signedInModel(repository: LogoutRepository): QViewModel { + QAppContainer.availableEnvironments = listOf(Environment("Test", SERVER)) + val model = QViewModel(repository, MockPreferencesDataStore()) + advanceUntilIdle() + val generation = requireNotNull(model.prepareOAuth2Login(loginBinding)) + assertTrue(model.beginOAuth2Browser(generation, loginBinding, STATE, NONCE, VERIFIER)) + model.completeOAuth2Login(loginBinding, STATE, STATE, NONCE, "client", REDIRECT, "login", "code") + advanceUntilIdle() + assertTrue(model.isAuthenticated) + assertEquals("session-1", model.sessionUUID) + repository.calls.clear() + return model + } + + /******************************************************************************* + ** Run the company sign-out preparation exactly as QOAuth2Logout does before opening the browser. + *******************************************************************************/ + private suspend fun companyLogout(model: QViewModel): NativeLogoutData? { + val binding = OAuth2LogoutBinding(loginBinding, REDIRECT) + model.requestCompanyLogout(binding) + assertEquals(OAuth2LogoutPhase.PREPARING, model.companyLogoutPhase) + return model.logOutWithProvider(model.companyLogoutGeneration, binding) + } + + private val loginBinding = OAuth2LoginBinding( + SERVER, "oauth", ISSUER, "$ISSUER/.well-known/openid-configuration", "client", "openid", REDIRECT, "login", "REQUIRED" + ) + + /******************************************************************************* + ** Records the order of logout-related calls; any call after the session ended returns no provider material. + *******************************************************************************/ + private class LogoutRepository : QQQRepository { + val calls = mutableListOf<String>() + var activeSession = "" + + override suspend fun getAuthenticationMetaData(): BaseAuthenticationMetaData = OAuth2AuthenticationMetaData( + "oauth", values = OAuth2AuthenticationMetaData.Values( + clientId = "client", scopes = "openid", + nativeSessionLogin = OAuth2AuthenticationMetaData.NativeSessionLogin( + OAuth2AuthenticationMetaData.SESSION_FLOW, "S256", ISSUER, "$ISSUER/.well-known/openid-configuration", listOf(REDIRECT), "login", "REQUIRED" + ), + nativeSessionLogout = OAuth2AuthenticationMetaData.NativeSessionLogout(OAuth2AuthenticationMetaData.LOGOUT_FLOW, listOf(REDIRECT)) + ) + ) + + override suspend fun exchangeNativeSession(body: ManageSessionRequest): ManageSessionResponse = + ManageSessionResponse("session-1", mapOf("user" to mapOf("name" to "scanner-b", "email" to "scanner-b@example.invalid"))) + + override suspend fun logout() { + calls += "logout" + activeSession = "" + } + + override suspend fun logoutWithProvider(postLogoutRedirectUri: String): NativeLogoutData? { + calls += "logoutWithProvider" + val material = if (activeSession.isBlank()) null else NativeLogoutData(ISSUER, "$ISSUER/end-session", postLogoutRedirectUri, "hint") + activeSession = "" + return material + } + + override fun setSessionUUID(sessionUUID: String) { + activeSession = sessionUUID + } + + override fun setEnvironment(environment: Environment) {} + override suspend fun manageSession(body: ManageSessionRequest): ManageSessionResponse = error("Not used") + override suspend fun getMetaData(frontendName: String, frontendVersion: String, applicationName: String, applicationVersion: String): QInstance = QInstance() + override suspend fun getProcessMetaData(processName: String): QProcessMetaData = error("Not used") + override suspend fun processInit(processName: String, values: Map<String, Any?>, recordsParam: String?, recordIds: String?, filterJSON: String?, stepTimeoutMillis: Int?): ProcessStepResult = error("Not used") + override suspend fun processStep(processName: String, processUUID: String, stepName: String, values: Map<String, Any?>, stepTimeoutMillis: Int?): ProcessStepResult = error("Not used") + override suspend fun processJobStatus(processName: String, processUUID: String, jobUUID: String): ProcessStepResult = error("Not used") + override fun getURI(path: String): String = error("Not used") + } +} diff --git a/qqq/android/mobileapp/src/test/java/com/kingsrook/qqq/frontend/android/mobileapp/viewmodel/SemanticProcessTest.kt b/qqq/android/mobileapp/src/test/java/com/kingsrook/qqq/frontend/android/mobileapp/viewmodel/SemanticProcessTest.kt new file mode 100644 index 0000000..b15301e --- /dev/null +++ b/qqq/android/mobileapp/src/test/java/com/kingsrook/qqq/frontend/android/mobileapp/viewmodel/SemanticProcessTest.kt @@ -0,0 +1,277 @@ +/* Copyright (c) 2026 QRunIO. SPDX-License-Identifier: Apache-2.0 */ +package com.kingsrook.qqq.frontend.android.mobileapp.viewmodel + +import com.kingsrook.qqq.frontend.android.core.model.metadata.FieldValidation +import com.kingsrook.qqq.frontend.android.core.model.metadata.QComponentType +import com.kingsrook.qqq.frontend.android.core.model.metadata.QFieldMetaData +import com.kingsrook.qqq.frontend.android.core.model.metadata.QFieldType +import com.kingsrook.qqq.frontend.android.core.model.metadata.QFrontendComponent +import com.kingsrook.qqq.frontend.android.core.model.metadata.QFrontendStepMetaData +import com.kingsrook.qqq.frontend.android.core.model.processes.ProcessMetaDataAdjustment +import com.kingsrook.qqq.frontend.android.core.model.processes.QJobComplete +import com.kingsrook.qqq.frontend.android.core.model.widgets.WidgetBlock +import com.kingsrook.qqq.frontend.android.mobileapp.ui.processes.components.evaluateWidgetBlocks +import org.junit.Assert.assertEquals +import org.junit.Assert.assertFalse +import org.junit.Assert.assertNotNull +import org.junit.Assert.assertNull +import org.junit.Assert.assertTrue +import org.junit.Test + +/******************************************************************************* + ** + *******************************************************************************/ +class SemanticProcessTest { + private val field = QFieldMetaData("barcode", "Customer barcode", type = QFieldType.STRING) + private val other = QFieldMetaData("quantity", "Quantity", type = QFieldType.INTEGER) + private val form = QFrontendComponent(QComponentType.EDIT_FORM) + private val step = QFrontendStepMetaData("input", "Capture", components = listOf(form), formFields = listOf(field, other)) + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun completionFollowsServerNextStepAndExplicitTerminalFlag() { + assertFalse(SemanticProcess.terminal(QJobComplete("process", nextStep = "input"))) + assertFalse(SemanticProcess.terminal(QJobComplete("process", mapOf("noMoreSteps" to false), "input"))) + assertFalse(SemanticProcess.terminal(QJobComplete("process", mapOf("noMoreSteps" to "false"), "input"))) + assertTrue(SemanticProcess.terminal(QJobComplete("process", mapOf("noMoreSteps" to true), "input"))) + assertTrue(SemanticProcess.terminal(QJobComplete("process"))) + assertTrue(SemanticProcess.terminal(QJobComplete("process", mapOf("noMoreSteps" to false)))) + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun componentSubsetUsesFieldNamesAndServerOrder() { + val component = form.copy(values = mapOf("includeFieldNames" to listOf("quantity"))) + assertEquals(listOf(other), SemanticProcess.fields(step, component)) + assertEquals(emptyList<QFieldMetaData>(), SemanticProcess.fields(step, form.copy(values = mapOf("includeFieldNames" to emptyList<String>())))) + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun viewFormUsesViewFields() { + assertEquals(listOf(other), SemanticProcess.fields(step.copy(viewFields = listOf(other)), QFrontendComponent(QComponentType.VIEW_FORM))) + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun hiddenFieldAdjustmentsOmitFieldsFromFormsAndValidation() { + val hidden = field.copy(isHidden = true, isRequired = true, type = QFieldType.UNKNOWN) + val adjusted = SemanticProcess.adjust( + listOf(step.copy(viewFields = listOf(field, other))), + ProcessMetaDataAdjustment(updatedFields = mapOf(field.name to hidden)) + ).single() + assertEquals(listOf(other), SemanticProcess.fields(adjusted, form)) + assertEquals(listOf(other), SemanticProcess.fields(adjusted, QFrontendComponent(QComponentType.VIEW_FORM))) + assertNull("A hidden input must not prevent submitting the visible form", SemanticProcess.unsupported(adjusted, emptyMap(), null, emptySet())) + assertTrue(SemanticProcess.fields(adjusted, form.copy(values = mapOf("includeFieldNames" to listOf(field.name)))).isEmpty()) + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun acknowledgmentMatchesOnlyTheExplicitExtensionResponseField() { + val expected = ProcessAcknowledgment("acknowledgedEventId", "scan-1") + assertFalse(expected.matches(emptyMap())) + assertFalse(expected.matches(mapOf("acknowledgedEventId" to "scan-2"))) + assertFalse(expected.matches(mapOf("eventId" to "scan-1"))) + assertTrue(expected.matches(mapOf("acknowledgedEventId" to "scan-1"))) + assertTrue(ProcessAcknowledgment("savedRequest", "request-1").matches(mapOf("savedRequest" to "request-1"))) + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun completeReceiptRequiresSuccessAndANonemptyStringIdentity() { + val policy = ProcessAcknowledgment("acknowledgedEventId", "scan-1", mapOf("scanSaved" to true), setOf("scanId")) + val complete = mapOf("acknowledgedEventId" to "scan-1", "scanSaved" to true, "scanId" to "receipt") + assertTrue(policy.matches(complete)) + for (name in complete.keys) assertFalse(policy.matches(complete - name)) + for (value in listOf(false, "true", null)) assertFalse(policy.matches(complete + ("scanSaved" to value))) + for (value in listOf("", " ", 123, null)) assertFalse(policy.matches(complete + ("scanId" to value))) + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun explicitNullDoesNotUseTheDefault() { + val defaulted = field.copy(defaultValue = "default") + assertEquals("default", semanticInitialValue(defaulted, emptyMap())) + assertNull(semanticInitialValue(defaulted, mapOf(field.name to null))) + assertEquals("entered", semanticInitialValue(defaulted, mapOf(field.name to "entered"))) + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun widgetInputMetadataUsesTypedSupportAndRejectsUnsupportedFields() { + /******************************************************************************* + ** + *******************************************************************************/ + fun screen(metadata: Map<String, Any?>) = step.copy( + components = listOf( + QFrontendComponent( + QComponentType.WIDGET, + mapOf("isAdHocWidget" to true, "blocks" to listOf(mapOf("blockType" to "INPUT_FIELD", "values" to mapOf("fieldMetaData" to metadata)))) + ) + ) + ) + + val metadata = mapOf("name" to "quantity", "label" to "Quantity", "type" to "INTEGER", "isRequired" to true) + assertNull(SemanticProcess.unsupported(screen(metadata), emptyMap(), null, emptySet())) + assertEquals(QFieldType.INTEGER, SemanticProcess.widgetInputFields(screen(metadata), emptyMap()).single().type) + for (type in listOf("FUTURE", "BLOB", "BOOLEAN")) assertNotNull(SemanticProcess.unsupported(screen(metadata + ("type" to type)), emptyMap(), null, emptySet())) + assertNotNull(SemanticProcess.unsupported(screen(metadata - "type"), emptyMap(), null, emptySet())) + assertNotNull(SemanticProcess.unsupported(screen(metadata + ("possibleValueSourceName" to "remote")), emptyMap(), null, emptySet())) + assertNull(SemanticProcess.unsupported(screen(metadata + mapOf("isHidden" to true, "type" to "FUTURE")), emptyMap(), null, emptySet())) + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun conditionalWidgetInputsMatchTheRenderedFields() { + val input = mapOf( + "blockType" to "INPUT_FIELD", "blockId" to "input", "values" to mapOf( + "fieldMetaData" to mapOf("name" to "code", "label" to "Code", "type" to "STRING", "isRequired" to true) + ) + ) + val composite = mapOf("blockType" to "COMPOSITE", "blockId" to "group", "conditional" to "showCode", "subBlocks" to listOf(input)) + val screen = step.copy( + components = listOf( + QFrontendComponent( + QComponentType.WIDGET, + mapOf("isAdHocWidget" to true, "blocks" to listOf(composite)) + ) + ) + ) + for (value in listOf(null, "", false, true, "yes")) { + val values = mutableMapOf<String, Any?>("showCode" to value) + val rendered = mutableListOf(WidgetBlock.fromMap(composite)!!) + evaluateWidgetBlocks(rendered, values) + val expectedCount = if (value == true || value == "yes") 1 else 0 + assertEquals(expectedCount, rendered.size) + assertEquals(expectedCount, SemanticProcess.widgetInputFields(screen, values).size) + val named = screen.copy(components = listOf(QFrontendComponent(QComponentType.WIDGET, mapOf("widgetName" to "named")))) + assertEquals(expectedCount, SemanticProcess.widgetInputFields(named, values + ("named" to mapOf("subBlocks" to listOf(composite)))).size) + } + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun fieldChangesApplyWithoutReplacingStepList() { + val updated = field.copy(label = "Updated barcode", isRequired = true) + val result = SemanticProcess.adjust(listOf(step), ProcessMetaDataAdjustment(updatedFields = mapOf(field.name to updated))) + assertEquals(updated, result.single().formFields!!.first()) + assertEquals(other, result.single().formFields!![1]) + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun stepReplacementAndFieldUpdatesApplyTogether() { + val replacement = step.copy(name = "replacement", label = "New server screen") + val updated = field.copy(label = "New label") + val result = SemanticProcess.adjust(listOf(step), ProcessMetaDataAdjustment(listOf(replacement), mapOf(field.name to updated))) + assertEquals("replacement", result.single().name) + assertEquals("New label", result.single().formFields!!.first().label) + assertTrue(SemanticProcess.adjust(listOf(step), ProcessMetaDataAdjustment(updatedFrontendStepList = emptyList())).isEmpty()) + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun unknownAndUnsupportedComponentsCannotAdvance() { + for (type in listOf(QComponentType.UNKNOWN, QComponentType.RECORD_LIST, QComponentType.BULK_EDIT_FORM)) + assertNotNull(SemanticProcess.unsupported(step.copy(components = listOf(QFrontendComponent(type))), emptyMap(), null, emptySet())) + assertNull(SemanticProcess.unsupported(step, emptyMap(), null, emptySet())) + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun customBlocksRequireRegistrationAndNestedUnknownBlocksBlockScreen() { + /******************************************************************************* + ** + *******************************************************************************/ + fun screen(blocks: List<Map<String, Any>>) = step.copy( + components = listOf( + QFrontendComponent( + QComponentType.WIDGET, + mapOf("isAdHocWidget" to true, "blocks" to blocks) + ) + ) + ) + + val scanner = screen(listOf(mapOf("blockType" to "SCANNER"))) + assertNotNull(SemanticProcess.unsupported(scanner, emptyMap(), null, emptySet())) + assertNull(SemanticProcess.unsupported(scanner, emptyMap(), null, setOf("SCANNER"))) + val unknown = screen(listOf(mapOf("blockType" to "COMPOSITE", "subBlocks" to listOf(mapOf("blockType" to "FUTURE_CONTROL"))))) + assertNotNull(SemanticProcess.unsupported(unknown, emptyMap(), null, setOf("SCANNER"))) + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun unknownInputTypesAreExplicitlyUnavailableButNamedPossibleValueSourcesAreRendered() { + assertNotNull(SemanticProcess.unsupported(step.copy(formFields = listOf(field.copy(type = QFieldType.UNKNOWN))), emptyMap(), null, emptySet())) + // Printer/media style fields load their choices through the semantic possibleValues operation. + assertNull(SemanticProcess.unsupported(step.copy(formFields = listOf(field.copy(possibleValueSourceName = "remote"))), emptyMap(), null, emptySet())) + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun requiredNumericAndLengthValidation() { + assertNotNull(validateSemanticField(field.copy(isRequired = true), "")) + assertNull(validateSemanticField(field, "")) + assertNotNull(validateSemanticField(other, "x")) + assertEquals(12, semanticFieldValue(other, "12")) + assertNotNull(validateSemanticField(field.copy(validation = FieldValidation(maxLength = 3, tooLongBehavior = "ERROR")), "1234")) + assertNull(validateSemanticField(field.copy(validation = FieldValidation(maxLength = 3, tooLongBehavior = "TRUNCATE")), "1234")) + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun patternAndExactNumericBounds() { + assertNotNull(validateSemanticField(field.copy(validation = FieldValidation(pattern = "[A-Z]+")), "ABC1")) + assertNull(validateSemanticField(field.copy(validation = FieldValidation(pattern = "[A-Z]+")), "ABC")) + val bounded = other.copy(validation = FieldValidation(minValue = "1", minInclusive = false, maxValue = "3")) + assertNotNull(validateSemanticField(bounded, "1")) + assertNull(validateSemanticField(bounded, "2")) + assertNotNull(validateSemanticField(bounded, "4")) + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun temporalInputsAreValidatedAsIsoValuesWithExplicitTimezone() { + assertNull(validateSemanticField(field.copy(type = QFieldType.DATE), "2026-10-30")) + assertNotNull(validateSemanticField(field.copy(type = QFieldType.DATE), "2026-02-30")) + assertNull(validateSemanticField(field.copy(type = QFieldType.TIME), "09:30:00")) + assertNotNull(validateSemanticField(field.copy(type = QFieldType.TIME), "25:30")) + assertNull(validateSemanticField(field.copy(type = QFieldType.DATE_TIME), "2026-10-30T09:30:00-05:00")) + assertNotNull(validateSemanticField(field.copy(type = QFieldType.DATE_TIME), "2026-10-30T09:30:00")) + } +} diff --git a/qqqsampleandroidmobileapp/.gitignore b/qqqsampleandroidmobileapp/.gitignore new file mode 100644 index 0000000..42afabf --- /dev/null +++ b/qqqsampleandroidmobileapp/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/qqqsampleandroidmobileapp/build.gradle.kts b/qqqsampleandroidmobileapp/build.gradle.kts new file mode 100644 index 0000000..3cdec18 --- /dev/null +++ b/qqqsampleandroidmobileapp/build.gradle.kts @@ -0,0 +1,95 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2024-2024. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +plugins { + alias(libs.plugins.android.application) + alias(libs.plugins.kotlin.android) +} + +android { + namespace = "com.kingsrook.qqq.sampleandroidmobileapp" + compileSdk = 35 + + defaultConfig { + applicationId = "com.kingsrook.qqq.sampleandroidmobileapp" + minSdk = 26 + targetSdk = 35 + versionCode = 1 + versionName = "1.0" + + testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + vectorDrawables { + useSupportLibrary = true + } + } + + buildTypes { + release { + isMinifyEnabled = false + proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro") + } + } + compileOptions { + sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 + } + kotlinOptions { + jvmTarget = "1.8" + } + buildFeatures { + buildConfig = true + compose = true + } + composeOptions { + kotlinCompilerExtensionVersion = "1.5.1" + } + packaging { + resources { + excludes += "/META-INF/{AL2.0,LGPL2.1}" + } + } +} + +dependencies { + implementation(libs.androidx.core.ktx) + implementation(libs.androidx.lifecycle.runtime.ktx) + implementation(libs.androidx.lifecycle.viewmodel.compose) + implementation(libs.androidx.activity.compose) + implementation(platform(libs.androidx.compose.bom)) + implementation(libs.androidx.ui) + implementation(libs.androidx.ui.graphics) + implementation(libs.androidx.ui.tooling.preview) + implementation(libs.androidx.material3) + implementation(project(":qqq:android:mobileapp")) + implementation(project(":qqq:android:core")) + implementation(libs.auth0) + implementation(libs.androidx.navigation.compose) + testImplementation(libs.junit) + androidTestImplementation(libs.androidx.junit) + androidTestImplementation(libs.androidx.espresso.core) + androidTestImplementation(libs.appauth) + androidTestImplementation(platform(libs.androidx.compose.bom)) + androidTestImplementation(libs.androidx.ui.test.junit4) + debugImplementation(libs.androidx.ui.tooling) + debugImplementation(libs.androidx.ui.test.manifest) + implementation(libs.androidx.datastore.preferences) + implementation(libs.androidx.datastore) +} diff --git a/qqqsampleandroidmobileapp/proguard-rules.pro b/qqqsampleandroidmobileapp/proguard-rules.pro new file mode 100644 index 0000000..481bb43 --- /dev/null +++ b/qqqsampleandroidmobileapp/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/qqqsampleandroidmobileapp/src/androidTest/java/com/kingsrook/qqq/sampleandroidmobileapp/AuthenticationLifecycleTests.kt b/qqqsampleandroidmobileapp/src/androidTest/java/com/kingsrook/qqq/sampleandroidmobileapp/AuthenticationLifecycleTests.kt new file mode 100644 index 0000000..b62fb80 --- /dev/null +++ b/qqqsampleandroidmobileapp/src/androidTest/java/com/kingsrook/qqq/sampleandroidmobileapp/AuthenticationLifecycleTests.kt @@ -0,0 +1,462 @@ +/* Copyright (c) 2026 QRunIO. SPDX-License-Identifier: Apache-2.0 */ +package com.kingsrook.qqq.sampleandroidmobileapp + +import android.content.Context +import android.util.Base64 +import androidx.activity.ComponentActivity +import androidx.compose.material3.Text +import androidx.compose.runtime.CompositionLocalProvider +import androidx.compose.runtime.mutableStateOf +import androidx.compose.ui.test.junit4.createAndroidComposeRule +import androidx.datastore.core.DataStore +import androidx.datastore.preferences.core.Preferences +import com.auth0.android.Auth0 +import com.auth0.android.authentication.AuthenticationException +import com.auth0.android.callback.Callback +import com.auth0.android.result.Credentials +import com.kingsrook.qqq.frontend.android.core.controllers.QQQRepository +import com.kingsrook.qqq.frontend.android.core.model.Environment +import com.kingsrook.qqq.frontend.android.core.model.metadata.authentication.Auth0AuthenticationMetaData +import com.kingsrook.qqq.frontend.android.core.model.metadata.authentication.Auth0AuthenticationMetaDataValues +import com.kingsrook.qqq.frontend.android.core.model.metadata.authentication.ManageSessionRequest +import com.kingsrook.qqq.frontend.android.core.model.metadata.authentication.ManageSessionResponse +import com.kingsrook.qqq.frontend.android.mobileapp.container.QAppContainer +import com.kingsrook.qqq.frontend.android.mobileapp.data.MockPreferencesDataStore +import com.kingsrook.qqq.frontend.android.mobileapp.data.SESSION_UUID_KEY +import com.kingsrook.qqq.frontend.android.mobileapp.ui.authentication.Auth0Browser +import com.kingsrook.qqq.frontend.android.mobileapp.ui.authentication.LocalAuth0Browser +import com.kingsrook.qqq.frontend.android.mobileapp.ui.authentication.QAuth0Login +import com.kingsrook.qqq.frontend.android.mobileapp.ui.authentication.QAuth0Logout +import com.kingsrook.qqq.frontend.android.mobileapp.ui.authentication.QAuth0Service +import com.kingsrook.qqq.frontend.android.mobileapp.ui.authentication.QAuthenticationWrapper +import com.kingsrook.qqq.frontend.android.mobileapp.ui.authentication.OAuth2LoginBinding +import com.kingsrook.qqq.frontend.android.mobileapp.viewmodel.LoadState +import com.kingsrook.qqq.frontend.android.mobileapp.viewmodel.QViewModel +import java.util.Date +import java.util.concurrent.CopyOnWriteArrayList +import java.util.concurrent.atomic.AtomicInteger +import java.util.concurrent.atomic.AtomicReference +import java.util.concurrent.atomic.AtomicBoolean +import kotlinx.coroutines.CompletableDeferred +import kotlinx.coroutines.NonCancellable +import kotlinx.coroutines.withContext +import org.junit.Assert.assertEquals +import org.junit.Assert.assertFalse +import org.junit.Assert.assertTrue +import org.junit.Assert.assertSame +import org.junit.Assert.assertNull +import org.junit.After +import org.junit.Rule +import org.junit.Test + +/******************************************************************************* + ** Deliberately delayed, cancellation-resistant responses model a server finishing after local sign-out. + *******************************************************************************/ +class AuthenticationLifecycleTests : BaseTest() { + @get:Rule + val ui = createAndroidComposeRule<ComponentActivity>() + private val first = Environment("First", "https://first.example.test/") + private val second = Environment("Second", "https://second.example.test/") + private val fixtures = mutableListOf<Fixture>() + + /******************************************************************************* + ** + *******************************************************************************/ + @After + fun releaseHeldResponses() { + fixtures.forEach { it.release.complete(Unit); it.releaseLogout.complete(Unit); it.store.releaseWrite.complete(Unit) } + } + + /******************************************************************************* + ** + *******************************************************************************/ + private class HeldStore : DataStore<Preferences> { + private val delegate = MockPreferencesDataStore() + val preferences get() = delegate.preferences + override val data get() = delegate.data + val holdNextWrite = AtomicBoolean() + val writeStarted = CompletableDeferred<Unit>() + val releaseWrite = CompletableDeferred<Unit>() + + /******************************************************************************* + ** + *******************************************************************************/ + override suspend fun updateData(transform: suspend (Preferences) -> Preferences): Preferences = delegate.updateData { + val next = transform(it) + if (holdNextWrite.compareAndSet(true, false)) { + writeStarted.complete(Unit) + releaseWrite.await() + } + next + } + } + + /******************************************************************************* + ** + *******************************************************************************/ + private inner class Fixture(holdFirst: Boolean, holdLogout: Boolean, holdFinalWrite: Boolean) { + val store = HeldStore() + val calls = AtomicInteger() + val cookie = AtomicReference("") + val discarded = CopyOnWriteArrayList<Pair<String, String>>() + val release = CompletableDeferred<Unit>() + val releaseLogout = CompletableDeferred<Unit>() + val logoutCalls = AtomicInteger() + val browserCalls = AtomicInteger() + val providerLogoutCalls = AtomicInteger() + val callback = AtomicReference<Callback<Credentials, AuthenticationException>?>() + val logoutCallback = AtomicReference<Callback<Void?, AuthenticationException>?>() + val metadata = Auth0AuthenticationMetaData( + "Auth0", Auth0AuthenticationMetaDataValues( + "https://identity.example.test", "public-client", "https://api.example.test" + ) + ) + val repository = object : QQQRepository by SampleAppMockQQQRepository() { + /******************************************************************************* + ** + *******************************************************************************/ + override suspend fun getAuthenticationMetaData() = metadata + + /******************************************************************************* + ** + *******************************************************************************/ + override fun setSessionUUID(sessionUUID: String) { + cookie.set(sessionUUID) + } + + /******************************************************************************* + ** + *******************************************************************************/ + override suspend fun logout() { + logoutCalls.incrementAndGet() + if (holdLogout) releaseLogout.await() + cookie.set("") + if (holdFinalWrite) store.holdNextWrite.set(true) + } + + /******************************************************************************* + ** + *******************************************************************************/ + private suspend fun exchange(): ManageSessionResponse { + val number = calls.incrementAndGet() + if (holdFirst && number == 1) withContext(NonCancellable) { release.await() } + return ManageSessionResponse("synthetic-session-$number") + } + + /******************************************************************************* + ** + *******************************************************************************/ + override suspend fun loginWithPassword(username: String, password: String) = exchange() + + /******************************************************************************* + ** + *******************************************************************************/ + override suspend fun manageSession(body: ManageSessionRequest) = exchange() + + /******************************************************************************* + ** + *******************************************************************************/ + override suspend fun discardNativeSession(server: String, session: String) { + discarded.add(server to session) + } + } + lateinit var model: QViewModel + val browser = object : Auth0Browser { + /******************************************************************************* + ** + *******************************************************************************/ + override fun login( + context: Context, account: Auth0, audience: String, scheme: String, + callback: Callback<Credentials, AuthenticationException> + ) { + browserCalls.incrementAndGet(); this@Fixture.callback.set(callback) + } + + /******************************************************************************* + ** + *******************************************************************************/ + override fun logout(context: Context, account: Auth0, scheme: String, callback: Callback<Void?, AuthenticationException>) { + providerLogoutCalls.incrementAndGet(); logoutCallback.set(callback) + } + } + } + + /******************************************************************************* + ** + *******************************************************************************/ + private fun start(holdFirst: Boolean = true, holdLogout: Boolean = false, holdFinalWrite: Boolean = false): Fixture { + QAppContainer.availableEnvironments = listOf(first, second) + QAuth0Service.scheme = "qqq-test" + val fixture = Fixture(holdFirst, holdLogout, holdFinalWrite).also { fixtures.add(it) } + ui.runOnIdle { fixture.model = QViewModel(fixture.repository, fixture.store) } + ui.waitUntil(5000) { fixture.model.initialLoadFromDataStoreLoadState is LoadState.Success } + return fixture + } + + /******************************************************************************* + ** + *******************************************************************************/ + private fun assertCleared(fixture: Fixture) { + ui.runOnIdle { + assertFalse(fixture.model.isAuthenticated) + assertEquals("", fixture.model.sessionUUID) + assertEquals("", fixture.cookie.get()) + assertEquals("", fixture.store.preferences[SESSION_UUID_KEY]) + } + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun delayedPasswordAfterLogoutCannotRestoreRetainedModel() { + val fixture = start() + ui.runOnIdle { fixture.model.loginWithPassword("operator", "synthetic-password") } + ui.waitUntil(5000) { fixture.calls.get() == 1 } + ui.runOnIdle { fixture.model.logOut() } + ui.waitUntil(5000) { !fixture.model.logoutInProgress } + fixture.release.complete(Unit) + ui.waitUntil(5000) { fixture.discarded.size == 1 } + assertCleared(fixture) + assertEquals(first.baseUrl to "synthetic-session-1", fixture.discarded.single()) + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun delayedPasswordFromPreviousServerCannotReplaceNewOperator() { + val fixture = start() + ui.runOnIdle { fixture.model.loginWithPassword("old", "synthetic-password") } + ui.waitUntil(5000) { fixture.calls.get() == 1 } + ui.runOnIdle { fixture.model.switchEnvironment(second) {} } + ui.waitUntil(5000) { fixture.model.environment == second && fixture.model.authenticationMetaDataLoadState is LoadState.Success } + ui.runOnIdle { fixture.model.loginWithPassword("new", "synthetic-password") } + ui.waitUntil(5000) { fixture.model.isAuthenticated && fixture.store.preferences[SESSION_UUID_KEY] == "synthetic-session-2" } + fixture.release.complete(Unit) + ui.waitUntil(5000) { fixture.discarded.size == 1 } + ui.runOnIdle { + assertEquals("synthetic-session-2", fixture.model.sessionUUID) + assertEquals("synthetic-session-2", fixture.cookie.get()) + assertEquals("new", fixture.model.sessionUserFullName) + assertEquals("synthetic-session-2", fixture.store.preferences[SESSION_UUID_KEY]) + } + assertEquals(first.baseUrl to "synthetic-session-1", fixture.discarded.single()) + } + + /******************************************************************************* + ** + *******************************************************************************/ + private fun showAuth0(fixture: Fixture) { + ui.setContent { CompositionLocalProvider(LocalAuth0Browser provides fixture.browser) { QAuth0Login(fixture.model) } } + ui.waitUntil(5000) { fixture.callback.get() != null } + } + + /******************************************************************************* + ** + *******************************************************************************/ + private fun credentials(): Credentials { + /******************************************************************************* + ** + *******************************************************************************/ + fun encoded(value: String) = Base64.encodeToString(value.toByteArray(), Base64.URL_SAFE or Base64.NO_WRAP or Base64.NO_PADDING) + val token = encoded("""{"alg":"none"}""") + "." + encoded("""{"sub":"synthetic","nickname":"Operator"}""") + ".synthetic" + return Credentials(token, "synthetic-provider-token", "Bearer", null, Date(System.currentTimeMillis() + 60000), "openid") + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun lateAuth0BrowserCallbackAfterLogoutSendsNoToken() { + val fixture = start() + showAuth0(fixture) + val callback = requireNotNull(fixture.callback.get()) + ui.runOnIdle { fixture.model.logOut() } + ui.waitUntil(5000) { !fixture.model.logoutInProgress } + callback.onSuccess(credentials()) + ui.waitForIdle() + assertEquals(0, fixture.calls.get()) + assertCleared(fixture) + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun lateAuth0BrowserCallbackAfterServerSwitchSendsNoToken() { + val fixture = start() + showAuth0(fixture) + val callback = requireNotNull(fixture.callback.get()) + ui.runOnIdle { fixture.model.switchEnvironment(second) {} } + ui.waitUntil(5000) { fixture.model.environment == second } + callback.onSuccess(credentials()) + ui.waitForIdle() + assertEquals(0, fixture.calls.get()) + assertCleared(fixture) + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun delayedAuth0ExchangeAfterLogoutIsRevokedAtOriginalServer() { + val fixture = start() + showAuth0(fixture) + requireNotNull(fixture.callback.get()).onSuccess(credentials()) + ui.waitUntil(5000) { fixture.calls.get() == 1 } + ui.runOnIdle { fixture.model.logOut() } + ui.waitUntil(5000) { !fixture.model.logoutInProgress } + fixture.release.complete(Unit) + ui.waitUntil(5000) { fixture.discarded.size == 1 } + assertCleared(fixture) + assertEquals(first.baseUrl to "synthetic-session-1", fixture.discarded.single()) + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun duplicateAuth0SuccessCallbackStartsOnlyOneExchange() { + val fixture = start() + showAuth0(fixture) + val callback = requireNotNull(fixture.callback.get()) + callback.onSuccess(credentials()) + ui.waitUntil(5000) { fixture.calls.get() == 1 } + callback.onSuccess(credentials()) + ui.waitForIdle() + assertEquals(1, fixture.calls.get()) + fixture.release.complete(Unit) + ui.waitUntil(5000) { fixture.model.isAuthenticated && fixture.store.preferences[SESSION_UUID_KEY] == "synthetic-session-1" } + assertEquals(1, fixture.calls.get()) + assertEquals("synthetic-session-1", fixture.cookie.get()) + assertTrue(fixture.discarded.isEmpty()) + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun failedProviderLogoutStillClearsLocalSessionAndCannotRestoreOnRestart() { + val fixture = start(holdFirst = false) + ui.runOnIdle { fixture.model.loginWithPassword("operator", "synthetic-password") } + ui.waitUntil(5000) { fixture.model.isAuthenticated && !fixture.store.preferences[SESSION_UUID_KEY].isNullOrBlank() } + ui.runOnIdle { fixture.model.requestLogout() } + ui.setContent { CompositionLocalProvider(LocalAuth0Browser provides fixture.browser) { QAuth0Logout(fixture.model) } } + ui.waitUntil(5000) { fixture.logoutCallback.get() != null } + requireNotNull(fixture.logoutCallback.get()).onFailure(AuthenticationException("synthetic_failure", "Synthetic provider cancellation")) + ui.waitUntil(5000) { !fixture.model.logoutInProgress } + assertCleared(fixture) + lateinit var recreated: QViewModel + ui.runOnIdle { recreated = QViewModel(fixture.repository, fixture.store) } + ui.waitUntil(5000) { recreated.initialLoadFromDataStoreLoadState is LoadState.Success } + ui.runOnIdle { assertFalse(recreated.isAuthenticated); assertEquals("", recreated.sessionUUID) } + ui.runOnIdle { + fixture.model.requestLogin() + fixture.model.loginWithPassword("next", "synthetic-password") + } + ui.waitUntil(5000) { fixture.model.isAuthenticated && fixture.store.preferences[SESSION_UUID_KEY] == "synthetic-session-2" } + requireNotNull(fixture.logoutCallback.get()).onSuccess(null) + ui.waitForIdle() + ui.runOnIdle { + assertTrue(fixture.model.isAuthenticated) + assertEquals("synthetic-session-2", fixture.model.sessionUUID) + assertEquals("synthetic-session-2", fixture.cookie.get()) + } + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun auth0EffectLaunchesOnceAndCurrentResponseIsAdopted() { + val fixture = start(holdFirst = false) + val redraw = mutableStateOf(0) + ui.setContent { + CompositionLocalProvider(LocalAuth0Browser provides fixture.browser) { + Text("Redraw ${redraw.value}") + QAuth0Login(fixture.model) + } + } + ui.waitUntil(5000) { fixture.callback.get() != null } + ui.runOnIdle { redraw.value++ } + assertEquals(1, fixture.browserCalls.get()) + requireNotNull(fixture.callback.get()).onSuccess(credentials()) + ui.waitUntil(5000) { fixture.model.isAuthenticated && fixture.store.preferences[SESSION_UUID_KEY] == "synthetic-session-1" } + assertEquals(1, fixture.calls.get()) + assertEquals("synthetic-session-1", fixture.cookie.get()) + assertTrue(fixture.discarded.isEmpty()) + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun repeatedLogoutSharesOneRevocationAndCannotClearTheNextLogin() { + val fixture = start(holdFirst = false, holdLogout = true) + ui.runOnIdle { fixture.model.loginWithPassword("first", "synthetic-password") } + ui.waitUntil(5000) { fixture.model.isAuthenticated } + ui.runOnIdle { + val firstLogout = fixture.model.logOut() + val repeatedLogout = fixture.model.logOut() + assertSame(firstLogout, repeatedLogout) + fixture.model.loginWithPassword("blocked", "synthetic-password") + assertTrue(fixture.model.logoutInProgress) + assertNull( + fixture.model.prepareOAuth2Login( + OAuth2LoginBinding( + first.baseUrl, "provider", + "https://identity.example.test/", "https://identity.example.test/discovery", "public-client", + "openid", "qqq-test://callback", "login", "REQUIRED" + ) + ) + ) + } + ui.waitUntil(5000) { fixture.logoutCalls.get() == 1 } + assertEquals(1, fixture.calls.get()) + fixture.releaseLogout.complete(Unit) + ui.waitUntil(5000) { !fixture.model.logoutInProgress } + assertCleared(fixture) + ui.runOnIdle { fixture.model.loginWithPassword("next", "synthetic-password") } + ui.waitUntil(5000) { fixture.model.isAuthenticated && fixture.store.preferences[SESSION_UUID_KEY] == "synthetic-session-2" } + ui.runOnIdle { + assertEquals(1, fixture.logoutCalls.get()) + assertEquals("synthetic-session-2", fixture.cookie.get()) + assertEquals("next", fixture.model.sessionUserFullName) + } + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun fullAuthenticationWrapperKeepsLogoutStableWhileStorageFinishes() { + val fixture = start(holdFirst = false, holdFinalWrite = true) + val visible = mutableStateOf(true) + ui.runOnIdle { fixture.model.loginWithPassword("operator", "synthetic-password") } + ui.waitUntil(5000) { fixture.model.isAuthenticated && !fixture.store.preferences[SESSION_UUID_KEY].isNullOrBlank() } + ui.runOnIdle { fixture.model.requestLogout() } + ui.setContent { + CompositionLocalProvider(LocalAuth0Browser provides fixture.browser) { + if (visible.value) QAuthenticationWrapper(fixture.model) + } + } + ui.waitUntil(5000) { fixture.store.writeStarted.isCompleted } + ui.runOnIdle { + assertTrue(fixture.model.isLogoutRequested) + assertTrue(fixture.model.authenticationMetaDataLoadState is LoadState.Success) + assertTrue(fixture.model.logoutInProgress) + } + fixture.store.releaseWrite.complete(Unit) + ui.waitUntil(5000) { !fixture.model.logoutInProgress } + assertEquals(1, fixture.logoutCalls.get()) + assertEquals(1, fixture.providerLogoutCalls.get()) + // The retained model's completed sign-out is still idempotent when the logout form remounts. + ui.runOnIdle { visible.value = false } + ui.runOnIdle { visible.value = true } + ui.waitForIdle() + assertEquals(1, fixture.logoutCalls.get()) + assertEquals(1, fixture.providerLogoutCalls.get()) + assertCleared(fixture) + } +} diff --git a/qqqsampleandroidmobileapp/src/androidTest/java/com/kingsrook/qqq/sampleandroidmobileapp/BaseTest.kt b/qqqsampleandroidmobileapp/src/androidTest/java/com/kingsrook/qqq/sampleandroidmobileapp/BaseTest.kt new file mode 100644 index 0000000..64227ff --- /dev/null +++ b/qqqsampleandroidmobileapp/src/androidTest/java/com/kingsrook/qqq/sampleandroidmobileapp/BaseTest.kt @@ -0,0 +1,44 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2024-2024. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.kingsrook.qqq.sampleandroidmobileapp + +import com.kingsrook.qqq.frontend.android.core.model.Environment +import com.kingsrook.qqq.frontend.android.mobileapp.container.QAppContainer +import org.junit.Before + +/******************************************************************************* + ** + *******************************************************************************/ +open class BaseTest { + + /******************************************************************************* + ** + *******************************************************************************/ + @Before + fun beforeEach() { + QAppContainer.availableEnvironments = listOf( + Environment("Test Env 1", "http://192.168.4.67:8000/"), + Environment("Test Env 2", "http://192.168.4.67:8000/"), + ) + } + +} diff --git a/qqqsampleandroidmobileapp/src/androidTest/java/com/kingsrook/qqq/sampleandroidmobileapp/CoilRenderingTests.kt b/qqqsampleandroidmobileapp/src/androidTest/java/com/kingsrook/qqq/sampleandroidmobileapp/CoilRenderingTests.kt new file mode 100644 index 0000000..3586873 --- /dev/null +++ b/qqqsampleandroidmobileapp/src/androidTest/java/com/kingsrook/qqq/sampleandroidmobileapp/CoilRenderingTests.kt @@ -0,0 +1,207 @@ +/* Copyright (c) 2026 QRunIO. SPDX-License-Identifier: Apache-2.0 */ +package com.kingsrook.qqq.sampleandroidmobileapp + +import android.graphics.Bitmap +import android.net.Uri +import androidx.compose.foundation.Image +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.size +import androidx.compose.runtime.mutableStateOf +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.PixelMap +import androidx.compose.ui.graphics.toPixelMap +import androidx.compose.ui.layout.ContentScale +import androidx.compose.ui.platform.testTag +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.test.assertHeightIsEqualTo +import androidx.compose.ui.test.assertWidthIsEqualTo +import androidx.compose.ui.test.captureToImage +import androidx.compose.ui.test.junit4.createComposeRule +import androidx.compose.ui.test.onNodeWithTag +import androidx.compose.ui.unit.dp +import androidx.lifecycle.ViewModelStore +import androidx.test.platform.app.InstrumentationRegistry +import com.kingsrook.qqq.frontend.android.core.controllers.QQQRepository +import com.kingsrook.qqq.frontend.android.core.model.widgets.WidgetBlock +import com.kingsrook.qqq.frontend.android.mobileapp.R +import com.kingsrook.qqq.frontend.android.mobileapp.data.MockPreferencesDataStore +import com.kingsrook.qqq.frontend.android.mobileapp.ui.widgets.blocks.ImageWidgetBlock +import com.kingsrook.qqq.frontend.android.mobileapp.ui.widgets.blocks.WidgetBlockParameters +import com.kingsrook.qqq.frontend.android.mobileapp.viewmodel.QViewModel +import java.io.File +import kotlin.math.abs +import org.junit.After +import org.junit.Assert.assertEquals +import org.junit.Assert.assertTrue +import org.junit.Rule +import org.junit.Test + +/******************************************************************************* + ** Decode and draw local bytes through the production widget, including its configured SVG decoder. + *******************************************************************************/ +class CoilRenderingTests : BaseTest() { + @get:Rule + val ui = createComposeRule() + private val files = mutableListOf<File>() + private val models = ViewModelStore() + private val visible = mutableStateOf(true) + private val path = mutableStateOf("") + private var contentInstalled = false + private val left = Color(0xFFC92B1F) + private val right = Color(0xFF04AACC) + + /******************************************************************************* + ** + *******************************************************************************/ + @After + fun disposeFixtures() { + if (contentInstalled) { + ui.runOnIdle { visible.value = false; models.clear() } + ui.waitForIdle() + } + files.forEach { it.delete() } + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun rasterBytesDecodeAndRenderAtSemanticDimensions() { + val png = fixture(".png") + val bitmap = Bitmap.createBitmap(32, 16, Bitmap.Config.ARGB_8888) + try { + for (y in 0 until bitmap.height) { + for (x in 0 until bitmap.width) { + bitmap.setPixel(x, y, if (x < 16) 0xFFC92B1F.toInt() else 0xFF04AACC.toInt()) + } + } + png.outputStream().use { assertTrue(bitmap.compress(Bitmap.CompressFormat.PNG, 100, it)) } + } finally { + bitmap.recycle() + } + + render(png) + assertDecodedRegions() + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun svgBytesRenderAndInvalidSourceShowsTheProductionErrorPainter() { + val svg = fixture(".svg").apply { + writeText("""<svg xmlns="http://www.w3.org/2000/svg" width="32" height="16" viewBox="0 0 32 16"><rect width="16" height="16" fill="#c92b1f"/><rect x="16" width="16" height="16" fill="#04aacc"/></svg>""") + } + render(svg) + assertDecodedRegions() + + val invalid = fixture(".png").apply { writeText("This is a deliberately invalid local image.") } + ui.runOnIdle { path.value = Uri.fromFile(invalid).toString() } + ui.waitUntil(10000) + { + val actual = pixels("production-image") + val expected = pixels("error-reference") + actual.width == expected.width && actual.height == expected.height && + samplePoints(actual).all { (x, y) -> sameColor(actual[x, y], expected[x, y]) } + } + val actual = pixels("production-image") + val expected = pixels("error-reference") + assertEquals(expected.width, actual.width) + assertEquals(expected.height, actual.height) + assertTrue( + "Invalid bytes must replace the previous SVG with the configured error drawable", + samplePoints(actual).all { (x, y) -> sameColor(actual[x, y], expected[x, y]) }) + } + + /******************************************************************************* + ** + *******************************************************************************/ + private fun render(file: File) { + val repository = object : QQQRepository by SampleAppMockQQQRepository() { + /******************************************************************************* + ** + *******************************************************************************/ + override fun getURI(path: String): String { + check(path.startsWith("file://")) { "Image qualification accepts only its private local fixtures" } + return path + } + } + lateinit var model: QViewModel + ui.runOnIdle() + { + model = QViewModel(repository, MockPreferencesDataStore()) + models.put("image-rendering", model) + path.value = Uri.fromFile(file).toString() + } + ui.setContent() + { + if (visible.value) { + Column() + { + Box(Modifier.testTag("production-image")) + { + ImageWidgetBlock( + WidgetBlockParameters( + WidgetBlock( + "image", "IMAGE", styles = mutableMapOf("width" to 64, "height" to 32), + values = mutableMapOf("path" to path.value) + ), qViewModel = model + ) + ) + } + Image( + painterResource(R.drawable.ic_broken_image), contentDescription = null, + contentScale = ContentScale.Crop, modifier = Modifier.size(64.dp, 32.dp).testTag("error-reference") + ) + } + } + } + contentInstalled = true + } + + /******************************************************************************* + ** + *******************************************************************************/ + private fun assertDecodedRegions() { + ui.onNodeWithTag("production-image").assertWidthIsEqualTo(64.dp).assertHeightIsEqualTo(32.dp) + ui.waitUntil(10000) + { + val rendered = pixels("production-image") + sameColor(rendered[rendered.width / 4, rendered.height / 2], left) && + sameColor(rendered[rendered.width * 3 / 4, rendered.height / 2], right) + } + val rendered = pixels("production-image") + assertTrue( + "Decoded fixture must render both distinct source regions", + sameColor(rendered[rendered.width / 4, rendered.height / 2], left) && + sameColor(rendered[rendered.width * 3 / 4, rendered.height / 2], right) + ) + } + + /******************************************************************************* + ** + *******************************************************************************/ + private fun fixture(suffix: String): File = + File.createTempFile("qqq-coil-fixture-", suffix, InstrumentationRegistry.getInstrumentation().targetContext.cacheDir) + .also { files.add(it) } + + /******************************************************************************* + ** + *******************************************************************************/ + private fun pixels(tag: String): PixelMap = ui.onNodeWithTag(tag).captureToImage().toPixelMap() + + /******************************************************************************* + ** + *******************************************************************************/ + private fun samplePoints(image: PixelMap): List<Pair<Int, Int>> = + (1..7).flatMap { x -> (1..7).map { y -> image.width * x / 8 to image.height * y / 8 } } + + /******************************************************************************* + ** + *******************************************************************************/ + private fun sameColor(actual: Color, expected: Color): Boolean = + abs(actual.red - expected.red) < 0.025f && abs(actual.green - expected.green) < 0.025f && + abs(actual.blue - expected.blue) < 0.025f && abs(actual.alpha - expected.alpha) < 0.025f +} diff --git a/qqqsampleandroidmobileapp/src/androidTest/java/com/kingsrook/qqq/sampleandroidmobileapp/NavigationTests.kt b/qqqsampleandroidmobileapp/src/androidTest/java/com/kingsrook/qqq/sampleandroidmobileapp/NavigationTests.kt new file mode 100644 index 0000000..24f9aa5 --- /dev/null +++ b/qqqsampleandroidmobileapp/src/androidTest/java/com/kingsrook/qqq/sampleandroidmobileapp/NavigationTests.kt @@ -0,0 +1,390 @@ +/* Copyright (c) 2026 QRunIO. SPDX-License-Identifier: Apache-2.0 */ +package com.kingsrook.qqq.sampleandroidmobileapp + +import android.view.KeyEvent +import androidx.compose.runtime.key +import androidx.compose.runtime.mutableIntStateOf +import androidx.compose.ui.test.assertTextContains +import androidx.activity.ComponentActivity +import androidx.compose.ui.test.junit4.createAndroidComposeRule +import androidx.compose.ui.test.onNodeWithTag +import androidx.compose.ui.test.onNodeWithContentDescription +import androidx.compose.ui.test.performClick +import androidx.compose.ui.test.onNodeWithText +import androidx.compose.ui.test.onAllNodesWithText +import androidx.compose.ui.test.performTextReplacement +import androidx.compose.ui.test.performImeAction +import androidx.compose.ui.test.performScrollTo +import androidx.compose.ui.test.assertIsDisplayed +import androidx.compose.ui.test.assertIsEnabled +import androidx.navigation.compose.rememberNavController +import androidx.test.platform.app.InstrumentationRegistry +import com.kingsrook.qqq.frontend.android.mobileapp.QMobileAppMain +import com.kingsrook.qqq.sampleandroidmobileapp.utils.TestUtils +import com.kingsrook.qqq.frontend.android.core.controllers.QQQRepository +import com.kingsrook.qqq.frontend.android.core.model.metadata.QAppMetaData +import com.kingsrook.qqq.frontend.android.core.model.metadata.QComponentType +import com.kingsrook.qqq.frontend.android.core.model.metadata.QFieldMetaData +import com.kingsrook.qqq.frontend.android.core.model.metadata.QFieldType +import com.kingsrook.qqq.frontend.android.core.model.metadata.QFrontendComponent +import com.kingsrook.qqq.frontend.android.core.model.metadata.QFrontendStepMetaData +import com.kingsrook.qqq.frontend.android.core.model.metadata.QInstance +import com.kingsrook.qqq.frontend.android.core.model.metadata.QProcessMetaData +import com.kingsrook.qqq.frontend.android.core.model.processes.QJobComplete +import com.kingsrook.qqq.frontend.android.mobileapp.viewmodel.QViewModel +import com.kingsrook.qqq.frontend.android.mobileapp.viewmodel.ProcessAcknowledgment +import com.kingsrook.qqq.frontend.android.mobileapp.data.MockPreferencesDataStore +import java.util.concurrent.atomic.AtomicInteger +import org.junit.Assert.assertEquals +import org.junit.Assert.assertNull +import org.junit.Assert.assertTrue +import org.junit.Rule +import org.junit.Test + +/******************************************************************************* + ** + *******************************************************************************/ +class NavigationTests : BaseTest() { + @get:Rule + val ui = createAndroidComposeRule<ComponentActivity>() + + /******************************************************************************* + ** + *******************************************************************************/ + private fun hardwareBack() { + ui.waitForIdle() + // Dialog dismissal is asynchronous at the Android window layer, even after Compose settles. + try { + ui.waitUntil(5000) { ui.activity.hasWindowFocus() } + } catch (error: androidx.compose.ui.test.ComposeTimeoutException) { + var windowState = "unavailable" + // Collect only state flags on the main thread; never include UI text or device/account identifiers. + runCatching { + ui.activityRule.scenario.onActivity { activity -> + val power = activity.getSystemService(android.os.PowerManager::class.java) + val keyguard = activity.getSystemService(android.app.KeyguardManager::class.java) + windowState = "interactive=${power.isInteractive}, keyguard=${keyguard.isKeyguardLocked}, " + + "deviceLocked=${keyguard.isDeviceLocked}, activityFocus=${activity.hasWindowFocus()}, " + + "decorFocus=${activity.window.decorView.hasWindowFocus()}, lifecycle=${activity.lifecycle.currentState}, " + + "finishing=${activity.isFinishing}, destroyed=${activity.isDestroyed}" + if (android.os.Build.VERSION.SDK_INT >= 29) { + val windows = android.view.inspector.WindowInspector.getGlobalWindowViews() + windowState += ", ownWindows=" + windows.take(8).map { view -> + val attributes = view.layoutParams as? android.view.WindowManager.LayoutParams + "[activityDecor=${view === activity.window.decorView}, focused=${view.hasWindowFocus()}, " + + "shown=${view.isShown}, attached=${view.isAttachedToWindow}, type=${attributes?.type}, flags=${attributes?.flags}]" + } + } + } + } + val networkDialog = runCatching { + if (ui.onAllNodesWithText("No Network Connection").fetchSemanticsNodes().isEmpty()) false + else { + ui.onNodeWithText("No Network Connection").assertIsDisplayed(); true + } + }.getOrNull() + val focusedOwner = runCatching { + val instrumentation = InstrumentationRegistry.getInstrumentation() + val active = instrumentation.uiAutomation.windows.firstOrNull { it.isFocused }?.root + try { + when (active?.packageName?.toString()) { + null -> "unknown" + instrumentation.targetContext.packageName -> "own-app" + "android", "com.android.systemui" -> "system" + else -> "other-app" + } + } finally { + // Android 26–32 still pool accessibility nodes; recycling is obsolete from 33. + if (android.os.Build.VERSION.SDK_INT < 33) { + @Suppress("DEPRECATION") + active?.recycle() + } + } + }.getOrDefault("unavailable") + windowState += ", focusedWindowOwner=$focusedOwner, networkDialogVisible=$networkDialog" + throw AssertionError("Back requires a focused Activity: $windowState", error) + } + InstrumentationRegistry.getInstrumentation().sendKeyDownUpSync(KeyEvent.KEYCODE_BACK) + ui.waitForIdle() + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun signedOutDrawerExposesSettingsWithoutBusinessNavigation() { + TestUtils.startStandardTest(ui) + ui.onNodeWithTag("topBar.menuIcon").performClick() + ui.onNodeWithTag("drawer.home").assertDoesNotExist() + ui.onNodeWithTag("drawer.app:app1").assertDoesNotExist() + ui.onNodeWithTag("drawer.settings").assertIsDisplayed().performClick() + ui.onNodeWithText("Close").performClick() + ui.onNodeWithTag("topBar.menuIcon").performClick() + ui.onNodeWithTag("drawer.settings").assertIsDisplayed() + hardwareBack() + ui.onNodeWithText("Log In").assertIsDisplayed() + ui.onNodeWithTag("topBar.apps").assertDoesNotExist() + ui.onNodeWithTag("topBar.switchApp").assertDoesNotExist() + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun leavingSwitchingSettingsAndSignOutPreserveOrCancelExactlyOnce() { + val cancellations = AtomicInteger() + val submissions = AtomicInteger() + val base = SampleAppMockQQQRepository() + val repository = object : QQQRepository by base { + /******************************************************************************* + ** + *******************************************************************************/ + override suspend fun getMetaData(frontendName: String, frontendVersion: String, applicationName: String, applicationVersion: String): QInstance { + val instance = base.getMetaData(frontendName, frontendVersion, applicationName, applicationVersion) + return instance.copy(apps = instance.apps.orEmpty() + ("app2" to QAppMetaData("app2", "App 2"))) + } + + /******************************************************************************* + ** + *******************************************************************************/ + override suspend fun getProcessMetaData(processName: String) = QProcessMetaData( + "process1", "Process 1", frontendSteps = listOf( + QFrontendStepMetaData( + "input", "Input", components = listOf(QFrontendComponent(QComponentType.EDIT_FORM)), + formFields = listOf(QFieldMetaData("reference", "Reference", type = QFieldType.STRING)) + ) + ) + ) + + /******************************************************************************* + ** + *******************************************************************************/ + override suspend fun processInit(processName: String, values: Map<String, Any?>, recordsParam: String?, recordIds: String?, filterJSON: String?, stepTimeoutMillis: Int?) = QJobComplete("navigation-process", nextStep = "input") + + /******************************************************************************* + ** + *******************************************************************************/ + override suspend fun processStep(processName: String, processUUID: String, stepName: String, values: Map<String, Any?>, stepTimeoutMillis: Int?): QJobComplete { + submissions.incrementAndGet() + return QJobComplete(processUUID) + } + + /******************************************************************************* + ** + *******************************************************************************/ + override suspend fun processCancel(processName: String, processUUID: String) { + cancellations.incrementAndGet() + } + } + val model = QViewModel(repository, MockPreferencesDataStore()) + TestUtils.startStandardTest(ui, model) + TestUtils.login(ui) + /******************************************************************************* + ** + *******************************************************************************/ + fun openProcess(fromCatalog: Boolean = true) { + if (fromCatalog) ui.onNodeWithTag("appHome.rowForApp:app1").performClick() + ui.onNodeWithTag("appHome.rowForProcess:process1").performClick() + ui.waitUntil(5000) { model.activeProcessViewModel?.activeStepName == "input" } + } + openProcess() + ui.onNodeWithTag("topBar.apps").assertDoesNotExist() + ui.onNodeWithTag("topBar.switchApp").assertDoesNotExist() + ui.onNodeWithText("Reference").performTextReplacement("preserved draft") + ui.onNodeWithText("Reference").performImeAction() + ui.onNodeWithContentDescription("Go Back").performClick() + ui.onNodeWithText("Stay").performClick() + ui.onNodeWithText("Reference").assertTextContains("preserved draft") + assertEquals(0, cancellations.get()) + ui.onNodeWithTag("topBar.menuIcon").performClick() + ui.onNodeWithTag("drawer.home").assertIsDisplayed() + hardwareBack() + ui.onNodeWithText("Reference").assertTextContains("preserved draft") + assertEquals(0, cancellations.get()) + ui.onNodeWithTag("topBar.menuIcon").performClick() + ui.onNodeWithTag("drawer.settings").assertIsDisplayed().performClick() + ui.onNodeWithText("Close").performClick() + ui.onNodeWithTag("topBar.menuIcon").performClick() + ui.onNodeWithTag("drawer.diagnostics").assertIsDisplayed().performClick() + ui.onNodeWithText("Close").performClick() + ui.onNodeWithText("Reference").assertTextContains("preserved draft") + assertEquals(0, cancellations.get()) + ui.onNodeWithTag("topBar.accountIcon").performClick() + ui.onNodeWithText("Sign out").performClick() + ui.onNodeWithText("Stay").performClick() + ui.onNodeWithText("Reference").assertTextContains("preserved draft") + assertEquals(0, submissions.get()) + hardwareBack() + ui.onNodeWithText("Leave process").performClick() + ui.waitUntil(5000) { model.activeProcessViewModel == null } + assertEquals(1, cancellations.get()) + assertEquals("app1", model.qNavigator.currentAppName) + + openProcess(false) + ui.onNodeWithTag("topBar.menuIcon").performClick() + ui.onNodeWithTag("drawer.home").performClick() + ui.onNodeWithText("Leave process").performClick() + ui.waitUntil(5000) { model.qNavigator.atHome } + assertEquals(2, cancellations.get()) + openProcess() + ui.onNodeWithTag("topBar.menuIcon").performClick() + ui.onNodeWithTag("drawer.app:app2").performScrollTo().performClick() + ui.onNodeWithText("Leave process").performClick() + ui.waitUntil(5000) { model.qNavigator.currentAppName == "app2" } + assertEquals(3, cancellations.get()) + ui.onNodeWithContentDescription("Go Back").performClick() + assertTrue(model.qNavigator.atHome) + + openProcess() + ui.onNodeWithText("Next").performClick() + ui.onNodeWithText("Close").performClick() + assertEquals(3, cancellations.get()) + assertEquals(1, submissions.get()) + openProcess(false) + ui.onNodeWithTag("topBar.accountIcon").performClick() + ui.onNodeWithText("Sign out").performClick() + ui.onNodeWithText("Sign out", substring = false).performClick() + ui.waitUntil(5000) { !model.isAuthenticated } + assertEquals(4, cancellations.get()) + ui.onNodeWithText("Log back in").performClick() + TestUtils.login(ui) + assertTrue(model.qNavigator.atHome) + assertNull(model.activeProcessViewModel) + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun unconfirmedScanCanStayOrExplicitlyLeaveWithoutResubmitting() { + val cancellations = AtomicInteger() + val submissions = AtomicInteger() + val base = SampleAppMockQQQRepository() + val repository = object : QQQRepository by base { + /******************************************************************************* + ** + *******************************************************************************/ + override suspend fun getProcessMetaData(processName: String) = QProcessMetaData( + "process1", "Process 1", frontendSteps = listOf( + QFrontendStepMetaData( + "input", "Input", components = listOf(QFrontendComponent(QComponentType.EDIT_FORM)), + formFields = listOf(QFieldMetaData("reference", "Reference", type = QFieldType.STRING)) + ) + ) + ) + + /******************************************************************************* + ** + *******************************************************************************/ + override suspend fun processInit(processName: String, values: Map<String, Any?>, recordsParam: String?, recordIds: String?, filterJSON: String?, stepTimeoutMillis: Int?) = QJobComplete("scan-leave-process", nextStep = "input") + + /******************************************************************************* + ** + *******************************************************************************/ + override suspend fun processStep(processName: String, processUUID: String, stepName: String, values: Map<String, Any?>, stepTimeoutMillis: Int?): QJobComplete { + if (submissions.incrementAndGet() == 1) throw java.io.IOException("Synthetic response loss") + return QJobComplete(processUUID, values = mapOf("acknowledgedEventId" to "wrong-event"), nextStep = "input") + } + + /******************************************************************************* + ** + *******************************************************************************/ + override suspend fun processCancel(processName: String, processUUID: String) { + cancellations.incrementAndGet() + throw java.io.IOException("Synthetic cancellation unavailable") + } + } + val model = QViewModel(repository, MockPreferencesDataStore()) + TestUtils.startStandardTest(ui, model) + TestUtils.login(ui) + ui.onNodeWithTag("appHome.rowForApp:app1").performClick() + ui.onNodeWithTag("appHome.rowForProcess:process1").performClick() + ui.waitUntil(5000) { model.activeProcessViewModel?.activeStepName == "input" } + val process = model.activeProcessViewModel!! + ui.runOnIdle { process.runStep(mapOf("eventId" to "scan-leave-event"), ProcessAcknowledgment("acknowledgedEventId", "scan-leave-event")) } + ui.waitUntil(5000) { !process.waitingOnBackend && process.pendingStepValues != null } + ui.onNodeWithContentDescription("Go Back").performClick() + ui.onNodeWithText("The last scan is not confirmed and may already be saved.", substring = true).assertIsDisplayed() + ui.onNodeWithText("Leave process").assertIsEnabled() + ui.onNodeWithText("Leave anyway").assertDoesNotExist() + ui.onNodeWithText("Stay").performClick() + ui.runOnIdle { + assertEquals("scan-leave-event", process.pendingStepValues?.get("eventId")) + assertEquals(0, cancellations.get()) + process.retryPendingStep() + } + ui.waitUntil(5000) { submissions.get() == 2 && !process.waitingOnBackend } + ui.onNodeWithTag("topBar.menuIcon").performClick() + ui.onNodeWithTag("drawer.home").performClick() + ui.onNodeWithText("The last scan is not confirmed and may already be saved.", substring = true).assertIsDisplayed() + ui.onNodeWithText("Leave process").assertIsEnabled().performClick() + ui.waitUntil(5000) { process.cancellationFailed && !process.cancelling } + ui.onNodeWithText("Leave anyway").assertIsEnabled() + ui.onNodeWithText("Stay").performClick() + ui.runOnIdle { + assertEquals("scan-leave-event", process.pendingStepValues?.get("eventId")) + assertEquals(1, cancellations.get()) + } + ui.onNodeWithContentDescription("Go Back").performClick() + ui.onNodeWithText("Leave process").performClick() + ui.waitUntil(5000) { cancellations.get() == 2 && process.cancellationFailed && !process.cancelling } + ui.onNodeWithText("Leave anyway").assertIsEnabled().performClick() + ui.waitUntil(5000) { model.activeProcessViewModel == null } + assertEquals("app1", model.qNavigator.currentAppName) + ui.onNodeWithContentDescription("Go Back").performClick() + ui.waitUntil(5000) { model.qNavigator.atHome && model.activeProcessViewModel == null } + assertEquals(2, cancellations.get()) + assertEquals(2, submissions.get()) + assertNull(process.pendingStepValues) + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun systemBackAndToolbarBackUseTheActualDestination() { + TestUtils.startStandardTest(ui) + TestUtils.login(ui) + val navigator = TestUtils.qViewModel.qNavigator + ui.onNodeWithTag("appHome.rowForApp:app1").performClick() + ui.onNodeWithTag("topAppBar.title").assertTextContains("App 1") + hardwareBack() + ui.waitForIdle() + assertTrue(navigator.atHome) + assertNull(navigator.currentAppName) + ui.onNodeWithTag("topAppBar.title").assertTextContains("Apps") + ui.onNodeWithTag("appHome.rowForApp:app1").performClick() + ui.onNodeWithContentDescription("Go Back").performClick() + ui.onNodeWithTag("topAppBar.title").assertTextContains("Apps") + ui.runOnIdle { navigator.popStack() } + assertTrue(navigator.atHome) + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun replacingControllerDropsStaleAppAndProcessState() { + val model = TestUtils.createQViewModel() + TestUtils.qViewModel = model + val generation = mutableIntStateOf(0) + ui.setContent() + { + key(generation.intValue) + { + model.setNavController(rememberNavController()) + QMobileAppMain(model, "Test App") + } + } + TestUtils.login(ui) + ui.onNodeWithTag("appHome.rowForApp:app1").performClick() + ui.onNodeWithTag("appHome.rowForProcess:process1").performClick() + ui.onNodeWithTag("topAppBar.title").assertTextContains("Process 1") + ui.runOnIdle { generation.intValue++ } + ui.onNodeWithTag("topAppBar.title").assertTextContains("Apps") + assertTrue(model.qNavigator.atHome) + assertNull(model.qNavigator.currentAppName) + assertNull(model.activeProcessViewModel) + assertEquals(0, model.qNavigator.navDepth) + } +} diff --git a/qqqsampleandroidmobileapp/src/androidTest/java/com/kingsrook/qqq/sampleandroidmobileapp/OAuth2LoginTests.kt b/qqqsampleandroidmobileapp/src/androidTest/java/com/kingsrook/qqq/sampleandroidmobileapp/OAuth2LoginTests.kt new file mode 100644 index 0000000..cbfdafa --- /dev/null +++ b/qqqsampleandroidmobileapp/src/androidTest/java/com/kingsrook/qqq/sampleandroidmobileapp/OAuth2LoginTests.kt @@ -0,0 +1,403 @@ +/* Copyright (c) 2026 QRunIO. SPDX-License-Identifier: Apache-2.0 */ +package com.kingsrook.qqq.sampleandroidmobileapp + +import android.app.Activity +import android.app.Instrumentation +import android.content.Intent +import androidx.activity.ComponentActivity +import androidx.compose.runtime.CompositionLocalProvider +import androidx.compose.ui.test.assertIsDisplayed +import androidx.compose.ui.test.assertTextEquals +import androidx.compose.ui.test.junit4.createAndroidComposeRule +import androidx.compose.ui.test.onNodeWithTag +import androidx.compose.ui.test.onNodeWithText +import androidx.compose.ui.test.performClick +import androidx.navigation.compose.rememberNavController +import androidx.test.platform.app.InstrumentationRegistry +import com.kingsrook.qqq.frontend.android.core.controllers.QQQRepository +import com.kingsrook.qqq.frontend.android.core.controllers.UiApiCompatibility +import com.kingsrook.qqq.frontend.android.core.controllers.UiApiVersion +import com.kingsrook.qqq.frontend.android.core.model.Environment +import com.kingsrook.qqq.frontend.android.core.model.metadata.authentication.ManageSessionRequest +import com.kingsrook.qqq.frontend.android.core.model.metadata.authentication.ManageSessionResponse +import com.kingsrook.qqq.frontend.android.core.model.metadata.authentication.OAuth2AuthenticationMetaData +import com.kingsrook.qqq.frontend.android.mobileapp.QMobileAppMain +import com.kingsrook.qqq.frontend.android.mobileapp.container.QAppContainer +import com.kingsrook.qqq.frontend.android.mobileapp.data.MockPreferencesDataStore +import com.kingsrook.qqq.frontend.android.mobileapp.ui.authentication.LocalOAuth2Discovery +import com.kingsrook.qqq.frontend.android.mobileapp.ui.authentication.OAuth2LoginPhase +import com.kingsrook.qqq.frontend.android.mobileapp.ui.authentication.oauth2RedirectUri +import com.kingsrook.qqq.frontend.android.mobileapp.viewmodel.QViewModel +import java.util.concurrent.atomic.AtomicInteger +import java.util.concurrent.atomic.AtomicReference +import kotlinx.coroutines.CompletableDeferred +import kotlinx.coroutines.NonCancellable +import kotlinx.coroutines.withContext +import net.openid.appauth.AuthorizationRequest +import net.openid.appauth.AuthorizationResponse +import net.openid.appauth.AuthorizationServiceConfiguration +import net.openid.appauth.AuthorizationServiceDiscovery +import org.json.JSONArray +import org.json.JSONObject +import org.junit.Assert.assertEquals +import org.junit.Assert.assertFalse +import org.junit.Assert.assertNull +import org.junit.Assert.assertTrue +import org.junit.Rule +import org.junit.Test + +/******************************************************************************* + ** Native UI and actual AppAuth request/result handling; no live identity provider or TLS bypass. + *******************************************************************************/ +class OAuth2LoginTests : BaseTest() { + @get:Rule + val ui = createAndroidComposeRule<ComponentActivity>() + private val instrumentation get() = InstrumentationRegistry.getInstrumentation() + private val issuer = "https://identity.example.test" + + /******************************************************************************* + ** + *******************************************************************************/ + private class Fixture( + val model: QViewModel, val checks: AtomicInteger, val exchanges: AtomicInteger, + val adopted: AtomicReference<String?>, val releaseExchange: CompletableDeferred<Unit>, + val discarded: AtomicReference<String?>, val originalNonce: AtomicReference<String?> + ) + + /******************************************************************************* + ** + *******************************************************************************/ + private fun start( + configured: Boolean = true, discoveryIssuer: String = issuer, holdExchange: Boolean = false, + apiVersion: String = "1.10.0", nonceFeature: Boolean = true, noncePolicy: String = "REQUIRED" + ): Fixture { + QAppContainer.availableEnvironments = listOf(Environment("Organization", "https://qqq.example.test/")) + val callback = oauth2RedirectUri(instrumentation.targetContext.packageName) + val metadata = OAuth2AuthenticationMetaData( + "organization", values = OAuth2AuthenticationMetaData.Values( + clientId = "public-configuration-id", scopes = "openid profile", + nativeSessionLogin = if (configured) OAuth2AuthenticationMetaData.NativeSessionLogin( + OAuth2AuthenticationMetaData.SESSION_FLOW, "S256", issuer, "$issuer/discovery", listOf(callback), + prompt = "login", nonceValidation = noncePolicy + ) else null + ) + ) + val checks = AtomicInteger() + val exchanges = AtomicInteger() + val adopted = AtomicReference<String?>() + val discarded = AtomicReference<String?>() + val originalNonce = AtomicReference<String?>() + val releaseExchange = CompletableDeferred<Unit>() + if (!holdExchange) releaseExchange.complete(Unit) + val base = SampleAppMockQQQRepository() + val repository = object : QQQRepository by base { + /******************************************************************************* + ** + *******************************************************************************/ + override suspend fun getAuthenticationMetaData() = metadata + + /******************************************************************************* + ** + *******************************************************************************/ + override suspend fun verifyNativeSessionLogin() { + checks.incrementAndGet() + UiApiCompatibility.validateNativeSessionLogin( + UiApiVersion( + apiVersion, + listOf("nativeSessionLogin") + if (nonceFeature) listOf("nativeSessionNonceValidation") else emptyList() + ) + ) + } + + /******************************************************************************* + ** + *******************************************************************************/ + override suspend fun exchangeNativeSession(body: ManageSessionRequest): ManageSessionResponse { + assertEquals(OAuth2AuthenticationMetaData.SESSION_FLOW, body.authenticationFlow) + assertEquals(callback, body.redirectUri) + assertEquals("synthetic-authorization-code", body.code) + assertTrue(Regex("[A-Za-z0-9_-]{16,512}").matches(requireNotNull(body.expectedNonce))) + originalNonce.get()?.let { assertEquals(it, body.expectedNonce) } + assertTrue(Regex("[A-Za-z0-9._~-]{43,128}").matches(requireNotNull(body.codeVerifier))) + exchanges.incrementAndGet() + // Model an HTTP response that arrives after cancellation has already been requested. + withContext(NonCancellable) { releaseExchange.await() } + return ManageSessionResponse("synthetic-native-session") + } + + /******************************************************************************* + ** + *******************************************************************************/ + override suspend fun discardNativeSession(server: String, session: String) { + assertEquals("https://qqq.example.test/", server) + discarded.set(session) + } + + /******************************************************************************* + ** + *******************************************************************************/ + override suspend fun manageSession(body: ManageSessionRequest): ManageSessionResponse = + error("Native OAuth must use the deferred semantic exchange") + + /******************************************************************************* + ** + *******************************************************************************/ + override fun setSessionUUID(sessionUUID: String) { + adopted.set(sessionUUID) + } + } + val model = QViewModel(repository, MockPreferencesDataStore()) + val discovery = JSONObject().put("issuer", discoveryIssuer) + .put("authorization_endpoint", "$issuer/authorize").put("token_endpoint", "$issuer/token") + .put("jwks_uri", "$issuer/jwks").put("response_types_supported", JSONArray(listOf("code"))) + .put("subject_types_supported", JSONArray(listOf("public"))) + .put("id_token_signing_alg_values_supported", JSONArray(listOf("RS256"))) + ui.setContent { + CompositionLocalProvider(LocalOAuth2Discovery provides { + AuthorizationServiceConfiguration(AuthorizationServiceDiscovery(discovery)) + }) { + model.setNavController(rememberNavController()) + QMobileAppMain(model, "Organization") + } + } + return Fixture(model, checks, exchanges, adopted, releaseExchange, discarded, originalNonce) + } + + /******************************************************************************* + ** + *******************************************************************************/ + private fun browser( + result: (AuthorizationRequest) -> Instrumentation.ActivityResult, + block: (AtomicInteger) -> Unit + ) { + val launches = AtomicInteger() + val monitor = object : Instrumentation.ActivityMonitor() { + /******************************************************************************* + ** + *******************************************************************************/ + override fun onStartActivity(intent: Intent): Instrumentation.ActivityResult? { + if (intent.component?.className != "net.openid.appauth.AuthorizationManagementActivity") return null + launches.incrementAndGet() + // Pinned AppAuth0.11.1 test adapter; no production code relies on this internal extra. + return result(AuthorizationRequest.jsonDeserialize(requireNotNull(intent.getStringExtra("authRequest")))) + } + } + instrumentation.addMonitor(monitor) + try { + block(launches) + } finally { + instrumentation.removeMonitor(monitor) + } + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun advertisedBrowserFlowExchangesOnceAndOpensApps() { + val fixture = start() + browser({ request -> + fixture.originalNonce.set(requireNotNull(request.nonce)) + assertEquals("S256", request.codeVerifierChallengeMethod) + assertEquals("login", request.prompt) + assertEquals(listOf("login"), request.toUri().getQueryParameters("prompt")) + assertEquals("public-configuration-id", request.clientId) + Instrumentation.ActivityResult( + Activity.RESULT_OK, AuthorizationResponse.Builder(request) + .setState(request.state).setAuthorizationCode("synthetic-authorization-code").build().toIntent() + ) + }) { launches -> + ui.onNodeWithTag("oauth2.signIn").performClick() + ui.waitUntil(10000) { fixture.model.isAuthenticated } + ui.onNodeWithTag("topAppBar.title").assertTextEquals("Apps") + ui.onNodeWithTag("appHome.rowForApp:app1").assertIsDisplayed() + assertEquals(1, launches.get()) + assertEquals(1, fixture.checks.get()) + assertEquals(1, fixture.exchanges.get()) + assertEquals("synthetic-native-session", fixture.adopted.get()) + } + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun browserCancellationDoesNotExchangeOrFallBackToPassword() { + val fixture = start() + browser({ Instrumentation.ActivityResult(Activity.RESULT_CANCELED, Intent()) }) { launches -> + ui.onNodeWithTag("oauth2.signIn").performClick() + ui.waitUntil(10000) { fixture.model.oauth2LoginMessage != null } + ui.onNodeWithTag("oauth2.message").assertIsDisplayed() + ui.onNodeWithText("Username").assertDoesNotExist() + assertEquals(OAuth2LoginPhase.READY, fixture.model.oauth2LoginPhase) + assertFalse(fixture.model.isAuthenticated) + assertEquals(1, launches.get()) + assertEquals(0, fixture.exchanges.get()) + } + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun mismatchedBrowserStateNeverExchangesTheCode() { + val fixture = start() + browser({ request -> + Instrumentation.ActivityResult( + Activity.RESULT_OK, AuthorizationResponse.Builder(request) + .setState("unrelated-browser-state").setAuthorizationCode("synthetic-authorization-code").build().toIntent() + ) + }) { launches -> + ui.onNodeWithTag("oauth2.signIn").performClick() + ui.waitUntil(10000) { fixture.model.oauth2LoginMessage != null } + assertEquals(1, launches.get()) + assertEquals(0, fixture.exchanges.get()) + assertFalse(fixture.model.isAuthenticated) + } + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun cancelledAttemptCannotBeRevivedByALateSuccessfulBrowserResult() { + val fixture = start() + browser({ request -> + fixture.model.cancelOAuth2Login() + Instrumentation.ActivityResult( + Activity.RESULT_OK, AuthorizationResponse.Builder(request) + .setState(request.state).setAuthorizationCode("synthetic-authorization-code").build().toIntent() + ) + }) { launches -> + ui.onNodeWithTag("oauth2.signIn").performClick() + ui.waitUntil(10000) { launches.get() == 1 && fixture.model.oauth2LoginPhase == OAuth2LoginPhase.READY } + ui.waitForIdle() + assertEquals(0, fixture.exchanges.get()) + assertFalse(fixture.model.isAuthenticated) + } + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun cancelledExchangeDiscardsLateSessionWithoutAdoptingIt() { + val fixture = start(holdExchange = true) + try { + browser({ request -> + Instrumentation.ActivityResult( + Activity.RESULT_OK, AuthorizationResponse.Builder(request) + .setState(request.state).setAuthorizationCode("synthetic-authorization-code").build().toIntent() + ) + }) { + ui.onNodeWithTag("oauth2.signIn").performClick() + ui.waitUntil(10000) { fixture.exchanges.get() == 1 } + ui.runOnIdle { fixture.model.cancelOAuth2Login() } + fixture.releaseExchange.complete(Unit) + ui.waitUntil(10000) { fixture.discarded.get() != null } + assertEquals("synthetic-native-session", fixture.discarded.get()) + assertNull(fixture.adopted.get()) + assertFalse(fixture.model.isAuthenticated) + } + } finally { + fixture.releaseExchange.complete(Unit) + } + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun missingNativeAdvertisementDoesNotOfferPasswordOrBrowserLogin() { + val fixture = start(configured = false) + ui.onNodeWithText("This server has not configured compatible native browser sign-in with required nonce validation. Ask your administrator to enable it.").assertIsDisplayed() + ui.onNodeWithTag("oauth2.signIn").assertDoesNotExist() + ui.onNodeWithText("Username").assertDoesNotExist() + assertFalse(fixture.model.isAuthenticated) + assertEquals(0, fixture.checks.get()) + assertEquals(0, fixture.exchanges.get()) + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun wrongDiscoveryIssuerIsRejectedBeforeBrowserLaunch() { + val fixture = start(discoveryIssuer = "https://different.example.test") + browser({ error("Invalid discovery must never launch a browser") }) { launches -> + ui.onNodeWithTag("oauth2.signIn").performClick() + ui.waitUntil(10000) { fixture.model.oauth2LoginMessage != null } + assertEquals(0, launches.get()) + assertEquals(0, fixture.exchanges.get()) + assertFalse(fixture.model.isAuthenticated) + } + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun oldApiCannotLaunchBrowserEvenWithNewMetadata() { + assertVersionRejected(start(apiVersion = "1.9.0")) + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun missingNonceFeatureCannotLaunchBrowserEvenWithRequiredDescriptor() { + assertVersionRejected(start(nonceFeature = false)) + } + + /******************************************************************************* + ** + *******************************************************************************/ + private fun assertVersionRejected(fixture: Fixture) { + browser({ error("Unsupported nonce contract must not launch the browser") }) { launches -> + ui.onNodeWithTag("oauth2.signIn").performClick() + ui.waitUntil(10000) { fixture.model.oauth2LoginMessage != null } + ui.onNodeWithText("This server does not support native sign-in with required nonce validation. Ask your administrator to upgrade or enable it.").assertIsDisplayed() + assertEquals(0, launches.get()) + assertEquals(0, fixture.exchanges.get()) + assertFalse(fixture.model.isAuthenticated) + ui.onNodeWithText("Username").assertDoesNotExist() + } + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun missingNoncePolicyDoesNotOfferBrowserOrPasswordFallback() { + val fixture = start(noncePolicy = "") + ui.onNodeWithText("This server has not configured compatible native browser sign-in with required nonce validation. Ask your administrator to enable it.").assertIsDisplayed() + ui.onNodeWithTag("oauth2.signIn").assertDoesNotExist() + ui.onNodeWithText("Username").assertDoesNotExist() + assertEquals(0, fixture.checks.get()) + assertEquals(0, fixture.exchanges.get()) + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun callbackRequestCannotReplaceTheRetainedOriginalNonce() { + val fixture = start() + browser({ request -> + val changed = AuthorizationRequest.Builder(request.configuration, request.clientId, request.responseType, request.redirectUri) + .setState(request.state).setNonce("replacement-nonce-must-fail").setCodeVerifier(requireNotNull(request.codeVerifier)) + .setScope(request.scope).setPrompt(request.prompt).build() + Instrumentation.ActivityResult( + Activity.RESULT_OK, AuthorizationResponse.Builder(changed) + .setState(request.state).setAuthorizationCode("synthetic-authorization-code").build().toIntent() + ) + }) { launches -> + ui.onNodeWithTag("oauth2.signIn").performClick() + ui.waitUntil(10000) { fixture.model.oauth2LoginMessage != null } + assertEquals(1, launches.get()) + assertEquals(0, fixture.exchanges.get()) + assertNull(fixture.adopted.get()) + assertFalse(fixture.model.isAuthenticated) + } + } +} diff --git a/qqqsampleandroidmobileapp/src/androidTest/java/com/kingsrook/qqq/sampleandroidmobileapp/OAuth2LogoutTests.kt b/qqqsampleandroidmobileapp/src/androidTest/java/com/kingsrook/qqq/sampleandroidmobileapp/OAuth2LogoutTests.kt new file mode 100644 index 0000000..84906d8 --- /dev/null +++ b/qqqsampleandroidmobileapp/src/androidTest/java/com/kingsrook/qqq/sampleandroidmobileapp/OAuth2LogoutTests.kt @@ -0,0 +1,277 @@ +/* Copyright (c) 2026 QRunIO. SPDX-License-Identifier: Apache-2.0 */ +package com.kingsrook.qqq.sampleandroidmobileapp + +import android.app.Activity +import android.app.Instrumentation +import android.content.Intent +import android.os.ParcelFileDescriptor +import androidx.activity.ComponentActivity +import androidx.compose.material3.Text +import androidx.compose.runtime.CompositionLocalProvider +import androidx.compose.ui.test.junit4.createAndroidComposeRule +import androidx.test.platform.app.InstrumentationRegistry +import com.kingsrook.qqq.frontend.android.core.controllers.QQQRepository +import com.kingsrook.qqq.frontend.android.core.model.Environment +import com.kingsrook.qqq.frontend.android.core.model.metadata.authentication.NativeLogoutData +import com.kingsrook.qqq.frontend.android.core.model.metadata.authentication.OAuth2AuthenticationMetaData +import com.kingsrook.qqq.frontend.android.mobileapp.container.QAppContainer +import com.kingsrook.qqq.frontend.android.mobileapp.data.MockPreferencesDataStore +import com.kingsrook.qqq.frontend.android.mobileapp.ui.authentication.LocalOAuth2Discovery +import com.kingsrook.qqq.frontend.android.mobileapp.ui.authentication.OAuth2LogoutBinding +import com.kingsrook.qqq.frontend.android.mobileapp.ui.authentication.OAuth2LogoutPhase +import com.kingsrook.qqq.frontend.android.mobileapp.ui.authentication.QLogoutForm +import com.kingsrook.qqq.frontend.android.mobileapp.ui.authentication.oauth2LogoutBinding +import com.kingsrook.qqq.frontend.android.mobileapp.ui.authentication.oauth2RedirectUri +import com.kingsrook.qqq.frontend.android.mobileapp.viewmodel.LoadState +import com.kingsrook.qqq.frontend.android.mobileapp.viewmodel.QViewModel +import java.util.UUID +import java.util.concurrent.atomic.AtomicInteger +import java.util.concurrent.atomic.AtomicReference +import net.openid.appauth.AuthorizationServiceConfiguration +import net.openid.appauth.AuthorizationServiceDiscovery +import net.openid.appauth.EndSessionRequest +import net.openid.appauth.EndSessionResponse +import org.json.JSONArray +import org.json.JSONObject +import org.junit.Assert.assertEquals +import org.junit.Assert.assertFalse +import org.junit.Assert.assertNull +import org.junit.Assert.assertTrue +import org.junit.Rule +import org.junit.Test + +/******************************************************************************* + ** Tests actual SDK request/result plumbing with synthetic responses, not real-provider acceptance. + *******************************************************************************/ +class OAuth2LogoutTests : BaseTest() { + @get:Rule + val ui = createAndroidComposeRule<ComponentActivity>() + private val instrumentation get() = InstrumentationRegistry.getInstrumentation() + private val issuer = "https://identity.example.test" + private val endpoint = "$issuer/end-session" + private val hint = "qqq-logout-canary-" + UUID.randomUUID() + + /******************************************************************************* + ** + *******************************************************************************/ + private class Fixture( + val model: QViewModel, val binding: OAuth2LogoutBinding, val calls: AtomicInteger, + val cookie: AtomicReference<String>, val preferences: MockPreferencesDataStore + ) + + /******************************************************************************* + ** + *******************************************************************************/ + private fun start(failLocal: Boolean = false, returnedEndpoint: String = endpoint): Fixture { + val server = "https://qqq.example.test/" + QAppContainer.availableEnvironments = listOf(Environment("Company", server)) + val callback = oauth2RedirectUri(instrumentation.targetContext.packageName) + val metadata = OAuth2AuthenticationMetaData( + "company", values = OAuth2AuthenticationMetaData.Values( + clientId = "synthetic-client", scopes = "openid", nativeSessionLogin = OAuth2AuthenticationMetaData.NativeSessionLogin( + OAuth2AuthenticationMetaData.SESSION_FLOW, "S256", issuer, "$issuer/discovery", listOf(callback), "login", "REQUIRED" + ), + nativeSessionLogout = OAuth2AuthenticationMetaData.NativeSessionLogout(OAuth2AuthenticationMetaData.LOGOUT_FLOW, listOf(callback)) + ) + ) + val calls = AtomicInteger() + val cookie = AtomicReference("synthetic-session") + val repository = object : QQQRepository by SampleAppMockQQQRepository() { + /******************************************************************************* + ** + *******************************************************************************/ + override suspend fun getAuthenticationMetaData() = metadata + + /******************************************************************************* + ** + *******************************************************************************/ + override fun setSessionUUID(sessionUUID: String) { + cookie.set(sessionUUID) + } + + /******************************************************************************* + ** + *******************************************************************************/ + override suspend fun logoutWithProvider(postLogoutRedirectUri: String): NativeLogoutData? { + assertEquals(callback, postLogoutRedirectUri) + calls.incrementAndGet() + if (failLocal) error("synthetic transport failure") + return NativeLogoutData(issuer, returnedEndpoint, callback, hint) + } + } + val preferences = MockPreferencesDataStore() + val model = QViewModel(repository, preferences) + val discovery = JSONObject().put("issuer", issuer).put("authorization_endpoint", "$issuer/authorize") + .put("token_endpoint", "$issuer/token").put("end_session_endpoint", endpoint).put("jwks_uri", "$issuer/jwks") + .put("response_types_supported", JSONArray(listOf("code"))).put("subject_types_supported", JSONArray(listOf("public"))) + .put("id_token_signing_alg_values_supported", JSONArray(listOf("RS256"))) + ui.setContent { + CompositionLocalProvider(LocalOAuth2Discovery provides { + AuthorizationServiceConfiguration(AuthorizationServiceDiscovery(discovery)) + }) { + if (model.isLogoutRequested) QLogoutForm(model, metadata) else Text("Ready") + } + } + ui.waitUntil(10000) { model.initialLoadFromDataStoreLoadState is LoadState.Success && model.authenticationMetaDataLoadState is LoadState.Success } + ui.runOnIdle { model.logInSuccessful() } + return Fixture(model, requireNotNull(oauth2LogoutBinding(metadata, server, instrumentation.targetContext.packageName)), calls, cookie, preferences) + } + + /******************************************************************************* + ** + *******************************************************************************/ + private fun browser(result: (EndSessionRequest) -> Instrumentation.ActivityResult, block: (AtomicInteger) -> Unit) { + val launches = AtomicInteger() + val monitor = object : Instrumentation.ActivityMonitor() { + /******************************************************************************* + ** + *******************************************************************************/ + override fun onStartActivity(intent: Intent): Instrumentation.ActivityResult? { + if (intent.component?.className != "net.openid.appauth.AuthorizationManagementActivity") return null + launches.incrementAndGet() + // Pinned SDK adapter. Production uses the public AppAuth result contract. + return result(EndSessionRequest.jsonDeserialize(requireNotNull(intent.getStringExtra("authRequest")))) + } + } + instrumentation.addMonitor(monitor) + try { + block(launches) + } finally { + instrumentation.removeMonitor(monitor) + } + } + + /******************************************************************************* + ** + *******************************************************************************/ + private fun beginAndAwait(fixture: Fixture) { + ui.runOnIdle { fixture.model.requestCompanyLogout(fixture.binding) } + ui.waitUntil(10000) { fixture.model.companyLogoutPhase == OAuth2LogoutPhase.FINISHED } + assertFalse(fixture.model.isAuthenticated) + assertEquals("", fixture.cookie.get()) + assertEquals("", fixture.model.sessionUserFullName) + assertFalse(fixture.preferences.preferences.toString().contains(hint)) + assertEquals(1, fixture.calls.get()) + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun stateOnlyReturnCompletesAfterLocalClearingAndDoesNotLogOrPersistHint() { + val fixture = start() + browser({ request -> + assertFalse(fixture.model.isAuthenticated) + assertEquals("", fixture.cookie.get()) + assertNull(fixture.model.prepareOAuth2Login(fixture.binding.login)) + assertNull(fixture.model.prepareAuthentication()) + fixture.model.requestLogin() + assertTrue(fixture.model.isLogoutRequested) + assertEquals(endpoint, request.configuration.endSessionEndpoint.toString()) + assertEquals(hint, request.toUri().getQueryParameter("id_token_hint")) + assertEquals(fixture.binding.postLogoutRedirectUri, request.postLogoutRedirectUri.toString()) + Instrumentation.ActivityResult(Activity.RESULT_OK, EndSessionResponse.Builder(request).setState(request.state).build().toIntent()) + }) { launches -> + beginAndAwait(fixture) + assertTrue(fixture.model.logoutMessage.contains("Company sign-out completed.")) + assertEquals(1, launches.get()) + } + val logs = ParcelFileDescriptor.AutoCloseInputStream(instrumentation.uiAutomation.executeShellCommand("logcat -d -t 1000 -v brief")) + .bufferedReader().use { it.readText() } + assertFalse("Synthetic logout hint must not enter logcat", logs.contains(hint)) + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun cancellationAndWrongStateNeverClaimProviderLogoutOrRestoreLocalIdentity() { + val fixture = start() + browser({ request -> + Instrumentation.ActivityResult( + Activity.RESULT_OK, + EndSessionResponse.Builder(request).setState("wrong-state").build().toIntent() + ) + }) { launches -> + beginAndAwait(fixture) + assertTrue(fixture.model.logoutMessage.contains("Company sign-out did not complete.")) + assertEquals(1, launches.get()) + } + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun cancelledBrowserLeavesLocalSessionCleared() { + val fixture = start() + browser({ Instrumentation.ActivityResult(Activity.RESULT_CANCELED, Intent()) }) { launches -> + beginAndAwait(fixture) + assertTrue(fixture.model.logoutMessage.contains("Company sign-out did not complete.")) + assertEquals(1, launches.get()) + } + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun localFailureDoesNotLaunchBrowserAndStillClearsPrivateState() { + val fixture = start(failLocal = true) + browser({ error("Browser must not launch after local failure") }) { launches -> + beginAndAwait(fixture) + assertTrue(fixture.model.logoutMessage.contains("Server sign-out could not be confirmed.")) + assertEquals(0, launches.get()) + } + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun mismatchedDiscoveredEndpointCannotReceiveHint() { + val fixture = start(returnedEndpoint = "https://other.example.test/logout") + browser({ error("Untrusted endpoint must not receive the hint") }) { launches -> + beginAndAwait(fixture) + assertTrue(fixture.model.logoutMessage.contains("Company sign-out did not complete.")) + assertEquals(0, launches.get()) + } + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun lateCallbackAfterResetCannotRestoreLogoutOrLoginState() { + val fixture = start() + browser({ request -> + fixture.model.resetApp() + Instrumentation.ActivityResult(Activity.RESULT_OK, EndSessionResponse.Builder(request).setState(request.state).build().toIntent()) + }) { launches -> + ui.runOnIdle { fixture.model.requestCompanyLogout(fixture.binding) } + ui.waitUntil(10000) { launches.get() == 1 && fixture.model.companyLogoutPhase == OAuth2LogoutPhase.IDLE } + assertFalse(fixture.model.isAuthenticated) + assertFalse(fixture.model.isLogoutRequested) + assertFalse(fixture.model.logoutMessage.contains("Company sign-out completed.")) + assertEquals("", fixture.cookie.get()) + } + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun wrongAppAuthResponseTypeCannotCompleteLogout() { + val fixture = start() + browser({ + Instrumentation.ActivityResult( + Activity.RESULT_OK, + Intent().putExtra("net.openid.appauth.AuthorizationResponse", "{}") + ) + }) { launches -> + beginAndAwait(fixture) + assertTrue(fixture.model.logoutMessage.contains("Company sign-out did not complete.")) + assertEquals(1, launches.get()) + } + } +} diff --git a/qqqsampleandroidmobileapp/src/androidTest/java/com/kingsrook/qqq/sampleandroidmobileapp/ProcessTests.kt b/qqqsampleandroidmobileapp/src/androidTest/java/com/kingsrook/qqq/sampleandroidmobileapp/ProcessTests.kt new file mode 100644 index 0000000..ced6d10 --- /dev/null +++ b/qqqsampleandroidmobileapp/src/androidTest/java/com/kingsrook/qqq/sampleandroidmobileapp/ProcessTests.kt @@ -0,0 +1,77 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2004-2024. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package com.kingsrook.qqq.sampleandroidmobileapp + +import androidx.compose.ui.test.assertIsDisplayed +import androidx.compose.ui.test.assertTextContains +import androidx.compose.ui.test.junit4.createComposeRule +import androidx.compose.ui.test.onNodeWithTag +import androidx.compose.ui.test.performClick +import com.kingsrook.qqq.frontend.android.core.model.metadata.QAppNodeType +import com.kingsrook.qqq.sampleandroidmobileapp.utils.TestUtils +import com.kingsrook.qqq.sampleandroidmobileapp.utils.clickAppScreenOption +import org.junit.Rule +import org.junit.Test + +/******************************************************************************* + ** + *******************************************************************************/ +class ProcessTests : BaseTest() { + @get:Rule + val composeTestRule = createComposeRule() + + /******************************************************************************* + ** + *******************************************************************************/ + private fun atEndLocalDebugSleep() { + TestUtils.localDebugSleep(composeTestRule, 5) + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun testLaunchProcess() { + TestUtils.startStandardTest(composeTestRule) + TestUtils.login(composeTestRule) + + composeTestRule.clickAppScreenOption(QAppNodeType.APP, "app1") + + composeTestRule + .onNodeWithTag("topAppBar.title") + .assertTextContains("App 1") + .assertIsDisplayed() + .performClick() + + composeTestRule.clickAppScreenOption(QAppNodeType.PROCESS, "process1") + + composeTestRule + .onNodeWithTag("topAppBar.title") + .assertTextContains("Process 1") + .assertIsDisplayed() + .performClick() + + atEndLocalDebugSleep() + } + +} diff --git a/qqqsampleandroidmobileapp/src/androidTest/java/com/kingsrook/qqq/sampleandroidmobileapp/SampleAppMockQQQRepository.kt b/qqqsampleandroidmobileapp/src/androidTest/java/com/kingsrook/qqq/sampleandroidmobileapp/SampleAppMockQQQRepository.kt new file mode 100644 index 0000000..380eccf --- /dev/null +++ b/qqqsampleandroidmobileapp/src/androidTest/java/com/kingsrook/qqq/sampleandroidmobileapp/SampleAppMockQQQRepository.kt @@ -0,0 +1,168 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2004-2024. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package com.kingsrook.qqq.sampleandroidmobileapp + +import com.kingsrook.qqq.frontend.android.core.controllers.QQQRepository +import com.kingsrook.qqq.frontend.android.core.model.Environment +import com.kingsrook.qqq.frontend.android.core.model.metadata.QAppMetaData +import com.kingsrook.qqq.frontend.android.core.model.metadata.QAppNodeType +import com.kingsrook.qqq.frontend.android.core.model.metadata.QAppSection +import com.kingsrook.qqq.frontend.android.core.model.metadata.QAppTreeNode +import com.kingsrook.qqq.frontend.android.core.model.metadata.QBrandingMetaData +import com.kingsrook.qqq.frontend.android.core.model.metadata.QInstance +import com.kingsrook.qqq.frontend.android.core.model.metadata.QProcessMetaData +import com.kingsrook.qqq.frontend.android.core.model.metadata.authentication.BaseAuthenticationMetaData +import com.kingsrook.qqq.frontend.android.core.model.metadata.authentication.FullyAnonymousAuthenticationMetaData +import com.kingsrook.qqq.frontend.android.core.model.metadata.authentication.ManageSessionRequest +import com.kingsrook.qqq.frontend.android.core.model.metadata.authentication.ManageSessionResponse +import com.kingsrook.qqq.frontend.android.core.model.processes.ProcessStepResult +import com.kingsrook.qqq.frontend.android.core.model.processes.QJobComplete +import com.kingsrook.qqq.frontend.android.core.model.processes.QJobStarted +import java.util.UUID + +/******************************************************************************* + ** + *******************************************************************************/ +class SampleAppMockQQQRepository : QQQRepository { + private var sessionUUID: String? = null + private var environment: Environment = Environment("Mock Env", "https://mock/") + + val appMap = mapOf( + "app1" to QAppMetaData( + name = "app1", label = "App 1", sections = listOf( + QAppSection("section1", "Section 1", processes = listOf("process1")) + ) + ) + ) + + val processMap = mapOf( + "process1" to QProcessMetaData(name = "process1", label = "Process 1") + ) + + /******************************************************************************* + ** + *******************************************************************************/ + override fun setEnvironment(environment: Environment) { + this.environment = environment + } + + /******************************************************************************* + ** + *******************************************************************************/ + override fun setSessionUUID(sessionUUID: String) { + this.sessionUUID = sessionUUID + } + + /******************************************************************************* + ** + *******************************************************************************/ + override suspend fun getAuthenticationMetaData(): BaseAuthenticationMetaData { + return (FullyAnonymousAuthenticationMetaData("FULLY_ANONYMOUS")) + } + + /******************************************************************************* + ** + *******************************************************************************/ + override suspend fun manageSession(body: ManageSessionRequest): ManageSessionResponse { + return ManageSessionResponse(UUID.randomUUID().toString()) + } + + /******************************************************************************* + ** + *******************************************************************************/ + override suspend fun getMetaData(frontendName: String, frontendVersion: String, applicationName: String, applicationVersion: String): QInstance { + if ((sessionUUID ?: "").lowercase().contains("fail")) { + throw RuntimeException("sessionUUID indicates that we should fail") + } + + var appName = "Mock Application" + if (environment.label == "Test Env 2") { + appName += " 2" + } + + val env1AppTree = listOf( + QAppTreeNode(name = "app1", label = "App 1", type = QAppNodeType.APP), + QAppTreeNode(name = "app2", label = "App 2", type = QAppNodeType.APP) + ) + + val env2AppTree = listOf( + QAppTreeNode(name = "app3", label = "App 3", type = QAppNodeType.APP), + QAppTreeNode(name = "app4", label = "App 4", type = QAppNodeType.APP) + ) + + return QInstance( + branding = QBrandingMetaData(appName = appName), + appTree = if (environment.label == "Test Env 2") env2AppTree else env1AppTree, + apps = appMap, + processes = processMap + ) + } + + /******************************************************************************* + ** + *******************************************************************************/ + override suspend fun getProcessMetaData(processName: String): QProcessMetaData { + val processMetaData = processMap[processName] + if (processMetaData != null) { + return processMetaData + } + + return QProcessMetaData(name = processName, label = processName) + } + + /******************************************************************************* + ** + *******************************************************************************/ + override suspend fun processInit(processName: String, values: Map<String, Any?>, recordsParam: String?, recordIds: String?, filterJSON: String?, stepTimeoutMillis: Int?): ProcessStepResult { + return QJobComplete(UUID.randomUUID().toString(), emptyMap(), "step2") + } + + /******************************************************************************* + ** + *******************************************************************************/ + override suspend fun processStep(processName: String, processUUID: String, stepName: String, values: Map<String, Any?>, stepTimeoutMillis: Int?): ProcessStepResult { + return QJobStarted(UUID.randomUUID().toString(), UUID.randomUUID().toString()) + } + + /******************************************************************************* + ** + *******************************************************************************/ + override suspend fun processJobStatus(processName: String, processUUID: String, jobUUID: String): ProcessStepResult { + return QJobComplete(UUID.randomUUID().toString(), emptyMap(), "step2") + } + + /******************************************************************************* + ** + *******************************************************************************/ + override suspend fun processCancel(processName: String, processUUID: String) { + } + + /******************************************************************************* + ** + *******************************************************************************/ + override fun getURI(path: String): String { + val uri = java.net.URI(environment.baseUrl).resolve(path) + require(uri.scheme in setOf("https", "http") && uri.userInfo == null && uri.host != null) { "Unsupported media URL" } + return uri.toASCIIString() + } +} diff --git a/qqqsampleandroidmobileapp/src/androidTest/java/com/kingsrook/qqq/sampleandroidmobileapp/SampleHostSecurityTests.kt b/qqqsampleandroidmobileapp/src/androidTest/java/com/kingsrook/qqq/sampleandroidmobileapp/SampleHostSecurityTests.kt new file mode 100644 index 0000000..aebe941 --- /dev/null +++ b/qqqsampleandroidmobileapp/src/androidTest/java/com/kingsrook/qqq/sampleandroidmobileapp/SampleHostSecurityTests.kt @@ -0,0 +1,53 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2004-2026. Kingsrook, LLC + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * https://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.kingsrook.qqq.sampleandroidmobileapp + +import android.content.pm.ApplicationInfo +import android.security.NetworkSecurityPolicy +import androidx.test.ext.junit.runners.AndroidJUnit4 +import androidx.test.platform.app.InstrumentationRegistry +import com.kingsrook.qqq.frontend.android.mobileapp.data.SettingsRepository +import java.io.File +import kotlinx.coroutines.runBlocking +import org.junit.Assert.assertEquals +import org.junit.Assert.assertFalse +import org.junit.Assert.assertTrue +import org.junit.Test +import org.junit.runner.RunWith + +/******************************************************************************* + ** + *******************************************************************************/ +@RunWith(AndroidJUnit4::class) +class SampleHostSecurityTests { + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun sessionStorageIsExcludedFromBackup() = runBlocking() + { + val context = InstrumentationRegistry.getInstrumentation().targetContext + assertFalse(context.applicationInfo.flags and ApplicationInfo.FLAG_ALLOW_BACKUP != 0) + assertEquals(BuildConfig.DEBUG, NetworkSecurityPolicy.getInstance().isCleartextTrafficPermitted) + val settings = SettingsRepository(context.dataStore) + try { + settings.setSessionUUID("synthetic-backup-exclusion-test") + assertEquals("synthetic-backup-exclusion-test", settings.getSessionUUID()) + assertTrue(File(context.noBackupFilesDir, "settings.preferences_pb").isFile) + } finally { + settings.setSessionUUID("") + } + } +} diff --git a/qqqsampleandroidmobileapp/src/androidTest/java/com/kingsrook/qqq/sampleandroidmobileapp/SemanticInputTests.kt b/qqqsampleandroidmobileapp/src/androidTest/java/com/kingsrook/qqq/sampleandroidmobileapp/SemanticInputTests.kt new file mode 100644 index 0000000..ad68060 --- /dev/null +++ b/qqqsampleandroidmobileapp/src/androidTest/java/com/kingsrook/qqq/sampleandroidmobileapp/SemanticInputTests.kt @@ -0,0 +1,182 @@ +/* Copyright (c) 2026 QRunIO. SPDX-License-Identifier: Apache-2.0 */ +package com.kingsrook.qqq.sampleandroidmobileapp + +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.width +import androidx.compose.material3.MaterialTheme +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.ui.Modifier +import androidx.compose.ui.test.assertIsDisplayed +import androidx.compose.ui.test.assertIsEnabled +import androidx.compose.ui.test.assertIsNotEnabled +import androidx.compose.ui.test.assert +import androidx.compose.ui.test.SemanticsMatcher +import androidx.compose.ui.semantics.SemanticsProperties +import androidx.compose.ui.test.hasClickAction +import androidx.compose.ui.test.hasText +import androidx.compose.ui.test.junit4.createComposeRule +import androidx.compose.ui.test.onNodeWithText +import androidx.compose.ui.test.performClick +import androidx.compose.ui.test.performImeAction +import androidx.compose.ui.test.performScrollTo +import androidx.compose.ui.test.performTextReplacement +import androidx.compose.ui.unit.dp +import com.kingsrook.qqq.frontend.android.core.controllers.QQQRepository +import com.kingsrook.qqq.frontend.android.core.model.metadata.QComponentType +import com.kingsrook.qqq.frontend.android.core.model.metadata.QFieldMetaData +import com.kingsrook.qqq.frontend.android.core.model.metadata.QFieldType +import com.kingsrook.qqq.frontend.android.core.model.metadata.QFrontendComponent +import com.kingsrook.qqq.frontend.android.core.model.metadata.QFrontendStepMetaData +import com.kingsrook.qqq.frontend.android.core.model.metadata.QInstance +import com.kingsrook.qqq.frontend.android.core.model.metadata.QProcessMetaData +import com.kingsrook.qqq.frontend.android.core.model.metadata.authentication.ManageSessionResponse +import com.kingsrook.qqq.frontend.android.core.model.processes.QJobComplete +import com.kingsrook.qqq.frontend.android.core.model.widgets.WidgetBlock +import com.kingsrook.qqq.frontend.android.mobileapp.data.MockPreferencesDataStore +import com.kingsrook.qqq.frontend.android.mobileapp.ui.authentication.QPasswordLogin +import com.kingsrook.qqq.frontend.android.mobileapp.ui.processes.ProcessFrontendStepView +import com.kingsrook.qqq.frontend.android.mobileapp.ui.widgets.blocks.InputFieldWidgetBlock +import com.kingsrook.qqq.frontend.android.mobileapp.ui.widgets.blocks.WidgetBlockParameters +import com.kingsrook.qqq.frontend.android.mobileapp.viewmodel.ProcessViewModel +import com.kingsrook.qqq.frontend.android.mobileapp.viewmodel.QViewModel +import java.util.concurrent.atomic.AtomicReference +import org.junit.Assert.assertEquals +import org.junit.Rule +import org.junit.Test + +/******************************************************************************* + ** Exercise real native controls in a constrained viewport, including the actions below their content. + *******************************************************************************/ +class SemanticInputTests : BaseTest() { + @get:Rule + val ui = createComposeRule() + + /******************************************************************************* + ** A short screen must still let an operator reach Sign in and actually call authentication. + *******************************************************************************/ + @Test + fun loginIsReachableInAShortViewport() { + val loggedIn = AtomicReference<String?>() + val repository = object : QQQRepository by SampleAppMockQQQRepository() { + /******************************************************************************* + ** + *******************************************************************************/ + override suspend fun loginWithPassword(username: String, password: String): ManageSessionResponse { + loggedIn.set(username) + return ManageSessionResponse("local-test-session") + } + } + val model = QViewModel(repository, MockPreferencesDataStore()) + ui.setContent() + { + MaterialTheme() + { + Box(Modifier.width(320.dp).height(180.dp)) { QPasswordLogin(model, Modifier.fillMaxSize()) } + } + } + ui.onNodeWithText("Username").performScrollTo().performTextReplacement("operator") + ui.onNodeWithText("Password").performScrollTo().performTextReplacement("synthetic-test-input") + ui.onNodeWithText("Password").performImeAction() + ui.onNode(hasText("Sign in") and hasClickAction()).performScrollTo().assertIsDisplayed().assertIsEnabled().performClick() + ui.waitUntil(10000) { loggedIn.get() == "operator" } + } + + /******************************************************************************* + ** The last field scrolls into view while the standard action remains outside the scrolling content. + *******************************************************************************/ + @Test + fun longFormCanEditItsLastFieldAndSubmit() { + val saved = AtomicReference<Map<String, Any?>?>() + val repository = object : QQQRepository by SampleAppMockQQQRepository() { + /******************************************************************************* + ** + *******************************************************************************/ + override suspend fun getProcessMetaData(processName: String) = QProcessMetaData( + "long", "Long form", frontendSteps = listOf( + QFrontendStepMetaData( + "input", "Input", components = listOf(QFrontendComponent(QComponentType.EDIT_FORM)), + formFields = (1..12).map { QFieldMetaData("field$it", "Field $it", type = QFieldType.STRING) }) + ) + ) + + /******************************************************************************* + ** + *******************************************************************************/ + override suspend fun processInit(processName: String, values: Map<String, Any?>, recordsParam: String?, recordIds: String?, filterJSON: String?, stepTimeoutMillis: Int?) = QJobComplete("p", nextStep = "input") + + /******************************************************************************* + ** + *******************************************************************************/ + override suspend fun processStep(processName: String, processUUID: String, stepName: String, values: Map<String, Any?>, stepTimeoutMillis: Int?): QJobComplete { + saved.set(values) + return QJobComplete("p") + } + } + val model = ProcessViewModel().apply { qqqRepository = repository; processName = "long"; qInstance = QInstance() } + ui.setContent() + { + LaunchedEffect(Unit) { model.doInit() } + MaterialTheme() + { + Box(Modifier.width(320.dp).height(280.dp)) { ProcessFrontendStepView(model, QInstance()) } + } + } + ui.waitUntil(10000) { model.activeStepName == "input" } + ui.onNodeWithText("Field 12").performScrollTo().assertIsDisplayed().performTextReplacement("last-value") + ui.onNodeWithText("Field 12").performImeAction() + ui.waitUntil(5000) { runCatching { ui.onNodeWithText("Next").assertIsDisplayed(); true }.getOrDefault(false) } + ui.onNodeWithText("Next").assertIsDisplayed().assertIsEnabled().performClick() + ui.waitUntil(10000) { saved.get() != null } + assertEquals("last-value", saved.get()!!["field12"]) + ui.onNodeWithText("Close").assertIsDisplayed() + } + + /******************************************************************************* + ** Autofocus is presentation metadata: arrow-prefixed data must not become a business action. + *******************************************************************************/ + @Test + fun inputWidgetSubmitsArrowPrefixLiterally() { + val submitted = AtomicReference<Map<String, Any>?>() + val block = WidgetBlock( + "input", "INPUT_FIELD", values = mutableMapOf( + "autoFocus" to true, "submitOnEnter" to true, + "fieldMetaData" to mapOf("name" to "code", "label" to "Code", "type" to "STRING") + ) + ) + ui.setContent { MaterialTheme { InputFieldWidgetBlock(WidgetBlockParameters(block, { submitted.set(it) })) } } + ui.onNodeWithText("Code").performTextReplacement("->literal") + ui.onNodeWithText("Code").performImeAction() + ui.waitUntil(10000) { submitted.get() != null } + assertEquals(mapOf("code" to "->literal"), submitted.get()) + } + + /******************************************************************************* + ** Field presentation flags apply to widgets just as they do to semantic forms. + *******************************************************************************/ + @Test + fun widgetPasswordReadonlyAndHiddenMetadataAreHonored() { + /******************************************************************************* + ** + *******************************************************************************/ + fun block(name: String, type: String, properties: Map<String, Any> = emptyMap()) = WidgetBlock( + name, "INPUT_FIELD", values = mutableMapOf( + "fieldMetaData" to (mapOf("name" to name, "label" to name, "type" to type) + properties) + ) + ) + ui.setContent { + MaterialTheme { + Column { + InputFieldWidgetBlock(WidgetBlockParameters(block("Secret", "PASSWORD"))) + InputFieldWidgetBlock(WidgetBlockParameters(block("Readonly", "STRING", mapOf("isEditable" to false)))) + InputFieldWidgetBlock(WidgetBlockParameters(block("Hidden", "STRING", mapOf("isHidden" to true)))) + } + } + } + ui.onNodeWithText("Secret").assert(SemanticsMatcher.keyIsDefined(SemanticsProperties.Password)) + ui.onNodeWithText("Readonly").assertIsNotEnabled() + ui.onNodeWithText("Hidden").assertDoesNotExist() + } +} diff --git a/qqqsampleandroidmobileapp/src/androidTest/java/com/kingsrook/qqq/sampleandroidmobileapp/SessionTests.kt b/qqqsampleandroidmobileapp/src/androidTest/java/com/kingsrook/qqq/sampleandroidmobileapp/SessionTests.kt new file mode 100644 index 0000000..59508f6 --- /dev/null +++ b/qqqsampleandroidmobileapp/src/androidTest/java/com/kingsrook/qqq/sampleandroidmobileapp/SessionTests.kt @@ -0,0 +1,290 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2004-2024. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package com.kingsrook.qqq.sampleandroidmobileapp + +import androidx.compose.ui.test.assertHasClickAction +import androidx.compose.ui.test.assertIsDisplayed +import androidx.compose.ui.test.assertIsEnabled +import androidx.compose.ui.test.assertIsNotEnabled +import androidx.compose.ui.test.assertTextContains +import androidx.compose.ui.test.hasAnyAncestor +import androidx.compose.ui.test.hasText +import androidx.compose.ui.test.isDialog +import androidx.compose.ui.test.junit4.createComposeRule +import androidx.compose.ui.test.onNodeWithTag +import androidx.compose.ui.test.onNodeWithText +import androidx.compose.ui.test.performClick +import androidx.datastore.preferences.core.MutablePreferences +import androidx.datastore.preferences.core.preferencesOf +import androidx.navigation.NavHostController +import com.kingsrook.qqq.frontend.android.mobileapp.data.ENVIRONMENT_JSON_KEY +import com.kingsrook.qqq.frontend.android.mobileapp.data.MockPreferencesDataStore +import com.kingsrook.qqq.frontend.android.mobileapp.data.SESSION_USER_FULL_NAME_KEY +import com.kingsrook.qqq.frontend.android.mobileapp.data.SESSION_UUID_KEY +import com.kingsrook.qqq.frontend.android.mobileapp.viewmodel.QViewModel +import com.kingsrook.qqq.sampleandroidmobileapp.utils.TestUtils +import org.junit.Assert.assertEquals +import org.junit.Assert.assertNotEquals +import org.junit.Rule +import org.junit.Test + +/******************************************************************************* + ** + *******************************************************************************/ +class SessionTests : BaseTest() { + @get:Rule + val composeTestRule = createComposeRule() + + private val knownUUID = "some-known-uuid" + private val fullName = "John Doe Test" + private val envLabel = "Some Stored Env" + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun testLogin() { + TestUtils.startStandardTest(composeTestRule) + TestUtils.login(composeTestRule) + + assertHomePageIsDisplayed() + + atEndLocalDebugSleep() + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun testValuesFromDataStore() { + val dataStore = makeMockPreferencesDataStoreWithValues() + val qViewModel = QViewModel(SampleAppMockQQQRepository(), dataStore) + qViewModel.setNavController(null) + + TestUtils.startStandardTest(composeTestRule, qViewModel) + + ////////////////////////////////////////////////////////////// + // note - no login needed - should go straight to home page // + // with known values in viewModel // + ////////////////////////////////////////////////////////////// + assertHomePageIsDisplayed() + assertEquals(fullName, qViewModel.sessionUserFullName) + assertEquals(knownUUID, qViewModel.sessionUUID) + + openUserDialog() + composeTestRule + .onNodeWithText("Current User: ${fullName}") + .assertIsDisplayed() + + assertEquals(envLabel, qViewModel.environment.label) + composeTestRule + .onNodeWithText("Close") + .performClick() + composeTestRule.onNodeWithTag("topBar.menuIcon").performClick() + composeTestRule.onNodeWithTag("drawer.settings").performClick() + composeTestRule.onNodeWithText("Server: ${qViewModel.environment.baseUrl}").assertIsDisplayed() + composeTestRule.onNodeWithText("Close").performClick() + + atEndLocalDebugSleep() + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun testExpiredSessionFromDataStore() { + val failureUUID = "please-fail" + val dataStore = makeMockPreferencesDataStoreWithValues() + (dataStore.preferences as MutablePreferences)[SESSION_UUID_KEY] = failureUUID + val qViewModel = QViewModel(SampleAppMockQQQRepository(), dataStore) + + TestUtils.startStandardTest(composeTestRule, qViewModel) + + /////////////////////////////////////////////////////////////////////////// + // instead of logging in automatically, we should land on a login screen // + /////////////////////////////////////////////////////////////////////////// + composeTestRule + .onNodeWithText("Click to log in Anonymously:") + .assertIsDisplayed() + + ///////////////////////////////////// + // and we should be able to log in // + ///////////////////////////////////// + TestUtils.login(composeTestRule) + assertHomePageIsDisplayed() + + assertNotEquals(failureUUID, qViewModel.sessionUUID) + + assertNotEquals(failureUUID, dataStore.preferences[SESSION_UUID_KEY]) + + atEndLocalDebugSleep() + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun testUserInfoDialogAndLogout() { + TestUtils.startStandardTest(composeTestRule) + + openUserDialog() + + composeTestRule + .onNodeWithText("Not currently logged in") + .assertIsDisplayed() + + composeTestRule + .onNode(hasAnyAncestor(isDialog()) and hasText("Sign out")) + .assertIsDisplayed() + .performClick() + .assertIsNotEnabled() + + composeTestRule + .onNode(hasAnyAncestor(isDialog()) and hasText("Close")) + .assertIsDisplayed() + .performClick() + + TestUtils.login(composeTestRule) + + openUserDialog() + + composeTestRule + .onNodeWithText("Current User: Anonymous") + .assertIsDisplayed() + + composeTestRule + .onNode(hasAnyAncestor(isDialog()) and hasText("Sign out")) + .assertIsEnabled() + .performClick() + + composeTestRule.onNodeWithText("Stay").performClick() + assertEquals(true, TestUtils.qViewModel.isAuthenticated) + openUserDialog() + composeTestRule.onNode(hasAnyAncestor(isDialog()) and hasText("Sign out")).performClick() + composeTestRule.onNode(hasAnyAncestor(isDialog()) and hasText("Sign out")).performClick() + + composeTestRule + .onNodeWithText("Signed out.") + .assertIsDisplayed() + + composeTestRule + .onNodeWithText("Log back in") + .assertIsDisplayed() + .performClick() + + TestUtils.login(composeTestRule) + assertHomePageIsDisplayed() + + atEndLocalDebugSleep() + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun testEnvironmentDialogAndSwitch() { + TestUtils.startStandardTest(composeTestRule) + TestUtils.login(composeTestRule) + + composeTestRule.onNodeWithTag("topBar.menuIcon").performClick() + composeTestRule.onNodeWithTag("drawer.settings").performClick() + + composeTestRule + .onNodeWithText("Test Env 1") + .assertIsDisplayed() + .performClick() + + composeTestRule + .onNodeWithText("Test Env 2") + .assertIsDisplayed() + .performClick() + + composeTestRule + .onNodeWithText("Switch") + .assertIsDisplayed() + .performClick() + + composeTestRule.onNodeWithText("Change server", substring = false).performClick() + + TestUtils.login(composeTestRule) + + //////////////////////////////////////////////////////// + // Test Env 2 has different apps than the default env // + //////////////////////////////////////////////////////// + assertHomePageIsDisplayed(anAppLabelOnPage = "App 3") + + atEndLocalDebugSleep() + } + + /******************************************************************************* + ** + *******************************************************************************/ + private fun makeMockPreferencesDataStoreWithValues(): MockPreferencesDataStore { + val dataStore = MockPreferencesDataStore() + dataStore.preferences = preferencesOf( + SESSION_UUID_KEY to knownUUID, + SESSION_USER_FULL_NAME_KEY to fullName, + ENVIRONMENT_JSON_KEY to """ + {"label": "${envLabel}", "baseUrl": "http://was-stored"} + """.trimIndent() + ).toMutablePreferences() + return dataStore + } + + /******************************************************************************* + ** + *******************************************************************************/ + private fun openUserDialog() { + composeTestRule + .onNodeWithTag("topBar.accountIcon", true) + .assertIsDisplayed() + .assertHasClickAction() + .performClick() + + composeTestRule + .onNodeWithTag("accountDialog.title") + .assertIsDisplayed() + } + + /******************************************************************************* + ** + *******************************************************************************/ + private fun assertHomePageIsDisplayed(pageTitle: String = "Apps", anAppLabelOnPage: String = "App 1") { + composeTestRule + .onNodeWithTag("topAppBar.title") + .assertTextContains(pageTitle) + .assertIsDisplayed() + + composeTestRule + .onNodeWithTag("appHome.rowForApp:" + if (anAppLabelOnPage == "App 3") "app3" else "app1") + .assertIsDisplayed() + } + + /******************************************************************************* + ** + *******************************************************************************/ + private fun atEndLocalDebugSleep() { + TestUtils.localDebugSleep(composeTestRule, 0) + } + +} diff --git a/qqqsampleandroidmobileapp/src/androidTest/java/com/kingsrook/qqq/sampleandroidmobileapp/previews/apps/QAppHomePreview.kt b/qqqsampleandroidmobileapp/src/androidTest/java/com/kingsrook/qqq/sampleandroidmobileapp/previews/apps/QAppHomePreview.kt new file mode 100644 index 0000000..38dc788 --- /dev/null +++ b/qqqsampleandroidmobileapp/src/androidTest/java/com/kingsrook/qqq/sampleandroidmobileapp/previews/apps/QAppHomePreview.kt @@ -0,0 +1,101 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2024-2024. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.kingsrook.qqq.sampleandroidmobileapp.previews.apps + +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.tooling.preview.Preview +import com.kingsrook.qqq.frontend.android.core.model.metadata.QAppMetaData +import com.kingsrook.qqq.frontend.android.core.model.metadata.QAppNodeType +import com.kingsrook.qqq.frontend.android.core.model.metadata.QAppSection +import com.kingsrook.qqq.frontend.android.core.model.metadata.QAppTreeNode +import com.kingsrook.qqq.frontend.android.core.model.metadata.QInstance +import com.kingsrook.qqq.frontend.android.core.model.metadata.QProcessMetaData +import com.kingsrook.qqq.frontend.android.mobileapp.ui.apps.QAppHome + +/******************************************************************************* + ** + *******************************************************************************/ +@Preview(widthDp = 400, heightDp = 800) +@Composable +fun QAppHomeTopLevelPreview() { + val qInstance = QInstance( + appTree = listOf( + QAppTreeNode("app1", "App 1", QAppNodeType.APP), + QAppTreeNode("app1", "App 2", QAppNodeType.APP), + QAppTreeNode("app1", "App 3 has a long name in here and stuff and it keeps going and wrapping to multiple lines", QAppNodeType.APP), + ) + ) + + QAppHome(qInstance, Modifier, null) +} + +/******************************************************************************* + ** + *******************************************************************************/ +@Preview(widthDp = 400, heightDp = 800) +@Composable +fun QAppHomeAppLevelPreviewWithWidgets() { + val qInstance = QInstance() + + val app = QAppMetaData( + "app2", "App 2", children = listOf( + QAppTreeNode("app1", "App 2.1", QAppNodeType.APP), + QAppTreeNode("app1", "App 2.2", QAppNodeType.APP), + QAppTreeNode("app1", "App 2.3", QAppNodeType.APP), + ), + widgets = listOf("someLineChart", "someBarChart", "someWidgetProcess") + ) + + QAppHome(qInstance, Modifier, app) +} + +/******************************************************************************* + ** + *******************************************************************************/ +@Preview(widthDp = 380, heightDp = 800) +@Composable +fun QAppHomeAppLevelPreviewWithProcesses() { + val qInstance = QInstance( + processes = mapOf( + "process1" to QProcessMetaData("process1", "Process 1"), + "process2" to QProcessMetaData("process2", "Process 2 with the very long and why wont name that wraps nicely") + ) + ) + + val app = QAppMetaData( + "app2", "App 2", children = listOf( + QAppTreeNode("app1", "App 2.1", QAppNodeType.APP), + QAppTreeNode("app1", "App 2.2 and it has a silly a long name that wraps nicely", QAppNodeType.APP), + QAppTreeNode("app1", "App 2.3", QAppNodeType.APP), + ), + sections = listOf( + QAppSection( + "section1", "Section 1", processes = listOf( + "process1", "process2" + ) + ) + ) + ) + + QAppHome(qInstance, Modifier, app) +} diff --git a/qqqsampleandroidmobileapp/src/androidTest/java/com/kingsrook/qqq/sampleandroidmobileapp/previews/horseshoe/MenuDialogPreview.kt b/qqqsampleandroidmobileapp/src/androidTest/java/com/kingsrook/qqq/sampleandroidmobileapp/previews/horseshoe/MenuDialogPreview.kt new file mode 100644 index 0000000..011df71 --- /dev/null +++ b/qqqsampleandroidmobileapp/src/androidTest/java/com/kingsrook/qqq/sampleandroidmobileapp/previews/horseshoe/MenuDialogPreview.kt @@ -0,0 +1,76 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2024-2024. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.kingsrook.qqq.sampleandroidmobileapp.previews.horseshoe + +import androidx.compose.runtime.Composable +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.ui.tooling.preview.Preview +import com.kingsrook.qqq.frontend.android.mobileapp.ui.horseshoe.MenuDialog +import com.kingsrook.qqq.frontend.android.mobileapp.viewmodel.QViewModel +import com.kingsrook.qqq.sampleandroidmobileapp.previews.utils.PreviewUtils + +/******************************************************************************* + ** + *******************************************************************************/ +@Preview(widthDp = 400) +@Composable +fun MenuDialogPreviewNormal() { + QViewModel.applicationVersion = "17.47" + QViewModel.applicationBuildTimestamp = "2024-11-04 14:36:00 UTC" + val qViewModel = PreviewUtils.createQViewModel().also() + { + it.logInSuccessful() + it.sessionUserFullName = "John Doekhoff" + } + val isOpen = remember { mutableStateOf(true) } + + MenuDialog(qViewModel, "A Preview", isOpen) +} + +/******************************************************************************* + ** + *******************************************************************************/ +@Preview(widthDp = 400) +@Composable +fun MenuDialogPreviewSuperLongName() { + val qViewModel = PreviewUtils.createQViewModel().also() + { + it.logInSuccessful() + it.sessionUserFullName = "Testasuperlongnameandwheredoesitwraandwheredoesitwrappandwheredoesitwrap?" + } + val isOpen = remember { mutableStateOf(true) } + + MenuDialog(qViewModel, "A Preview", isOpen) +} + +/******************************************************************************* + ** + *******************************************************************************/ +@Preview(widthDp = 400) +@Composable +fun MenuDialogPreviewNotLoggedIn() { + val qViewModel = PreviewUtils.createQViewModel() + val isOpen = remember { mutableStateOf(true) } + + MenuDialog(qViewModel, "A Preview", isOpen) +} diff --git a/qqqsampleandroidmobileapp/src/androidTest/java/com/kingsrook/qqq/sampleandroidmobileapp/previews/horseshoe/QTopAppBarPreview.kt b/qqqsampleandroidmobileapp/src/androidTest/java/com/kingsrook/qqq/sampleandroidmobileapp/previews/horseshoe/QTopAppBarPreview.kt new file mode 100644 index 0000000..e7b6d3b --- /dev/null +++ b/qqqsampleandroidmobileapp/src/androidTest/java/com/kingsrook/qqq/sampleandroidmobileapp/previews/horseshoe/QTopAppBarPreview.kt @@ -0,0 +1,44 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2004-2024. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package com.kingsrook.qqq.sampleandroidmobileapp.previews.horseshoe + +import androidx.compose.runtime.Composable +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.ui.tooling.preview.Preview +import com.kingsrook.qqq.frontend.android.mobileapp.ui.horseshoe.QTopAppBar +import com.kingsrook.qqq.sampleandroidmobileapp.previews.utils.PreviewUtils + +/******************************************************************************* + ** + *******************************************************************************/ +@Preview(widthDp = 400) +@Composable +fun QTopAppBarPreview() { + val qViewModel = PreviewUtils.createQViewModel().also() + { + it.logInSuccessful() + it.sessionUserFullName = "John Doekhoff" + } + QTopAppBar(qViewModel, "My App") +} diff --git a/qqqsampleandroidmobileapp/src/androidTest/java/com/kingsrook/qqq/sampleandroidmobileapp/previews/processes/ProcessStepLoadingPreview.kt b/qqqsampleandroidmobileapp/src/androidTest/java/com/kingsrook/qqq/sampleandroidmobileapp/previews/processes/ProcessStepLoadingPreview.kt new file mode 100644 index 0000000..3295067 --- /dev/null +++ b/qqqsampleandroidmobileapp/src/androidTest/java/com/kingsrook/qqq/sampleandroidmobileapp/previews/processes/ProcessStepLoadingPreview.kt @@ -0,0 +1,78 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2004-2024. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package com.kingsrook.qqq.sampleandroidmobileapp.previews.processes + +import androidx.compose.runtime.Composable +import androidx.compose.ui.tooling.preview.Preview +import com.kingsrook.qqq.sampleandroidmobileapp.SampleAppMockQQQRepository +import com.kingsrook.qqq.frontend.android.mobileapp.ui.processes.ProcessStepLoading +import com.kingsrook.qqq.frontend.android.mobileapp.viewmodel.ProcessViewModel + +/******************************************************************************* + ** + *******************************************************************************/ +@Preview +@Composable +fun ProcessStepLoadingPreview() { + val processViewModel = ProcessViewModel() + processViewModel.qqqRepository = SampleAppMockQQQRepository() + ProcessStepLoading(processViewModel) +} + +/******************************************************************************* + ** + *******************************************************************************/ +@Preview +@Composable +fun ProcessStepLoadingPreviewWithMessageWithoutCurrentAndTotal() { + val processViewModel = ProcessViewModel() + processViewModel.qqqRepository = SampleAppMockQQQRepository() + processViewModel.jobRunningMessage = "Working..." + ProcessStepLoading(processViewModel) +} + +/******************************************************************************* + ** + *******************************************************************************/ +@Preview +@Composable +fun ProcessStepLoadingPreviewSuperLongMessage() { + val processViewModel = ProcessViewModel() + processViewModel.qqqRepository = SampleAppMockQQQRepository() + processViewModel.jobRunningMessage = "Doing a thing and stuff and words and more and and on and on." + ProcessStepLoading(processViewModel) +} + +/******************************************************************************* + ** + *******************************************************************************/ +@Preview +@Composable +fun ProcessStepLoadingPreviewWithMessageWithCurrentAndTotal() { + val processViewModel = ProcessViewModel() + processViewModel.qqqRepository = SampleAppMockQQQRepository() + processViewModel.jobRunningMessage = "Processing Orders" + processViewModel.currentOfTotalMessage = "3 of 2" + ProcessStepLoading(processViewModel) +} + diff --git a/qqqsampleandroidmobileapp/src/androidTest/java/com/kingsrook/qqq/sampleandroidmobileapp/previews/processes/components/ProcessComponentHTMLPreview.kt b/qqqsampleandroidmobileapp/src/androidTest/java/com/kingsrook/qqq/sampleandroidmobileapp/previews/processes/components/ProcessComponentHTMLPreview.kt new file mode 100644 index 0000000..8256d82 --- /dev/null +++ b/qqqsampleandroidmobileapp/src/androidTest/java/com/kingsrook/qqq/sampleandroidmobileapp/previews/processes/components/ProcessComponentHTMLPreview.kt @@ -0,0 +1,46 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2004-2024. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package com.kingsrook.qqq.sampleandroidmobileapp.previews.processes.components + +import androidx.compose.runtime.Composable +import androidx.compose.ui.tooling.preview.Preview +import com.kingsrook.qqq.sampleandroidmobileapp.SampleAppMockQQQRepository +import com.kingsrook.qqq.frontend.android.core.model.metadata.QComponentType +import com.kingsrook.qqq.frontend.android.core.model.metadata.QFrontendComponent +import com.kingsrook.qqq.frontend.android.mobileapp.ui.processes.components.ProcessComponentHTML +import com.kingsrook.qqq.frontend.android.mobileapp.viewmodel.ProcessViewModel + +/******************************************************************************* + ** + *******************************************************************************/ +@Preview +@Composable +fun ProcessComponentHTMLPreview() { + val processViewModel = ProcessViewModel() + processViewModel.qqqRepository = SampleAppMockQQQRepository() + processViewModel.activeStepName = "preview" + processViewModel.processValues["preview.html"] = "oh <u>you're</u><br /><br /><span style='color: blue'>Beautiful!</span>" + val component = QFrontendComponent(type = QComponentType.HTML) + ProcessComponentHTML(processViewModel, component) +} + diff --git a/qqqsampleandroidmobileapp/src/androidTest/java/com/kingsrook/qqq/sampleandroidmobileapp/previews/processes/components/ProcessComponentWidgetPreview.kt b/qqqsampleandroidmobileapp/src/androidTest/java/com/kingsrook/qqq/sampleandroidmobileapp/previews/processes/components/ProcessComponentWidgetPreview.kt new file mode 100644 index 0000000..6d4846b --- /dev/null +++ b/qqqsampleandroidmobileapp/src/androidTest/java/com/kingsrook/qqq/sampleandroidmobileapp/previews/processes/components/ProcessComponentWidgetPreview.kt @@ -0,0 +1,131 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2004-2024. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package com.kingsrook.qqq.sampleandroidmobileapp.previews.processes.components + +import androidx.compose.runtime.Composable +import androidx.compose.ui.tooling.preview.Preview +import com.kingsrook.qqq.sampleandroidmobileapp.SampleAppMockQQQRepository +import com.kingsrook.qqq.frontend.android.core.model.metadata.QComponentType +import com.kingsrook.qqq.frontend.android.core.model.metadata.QFrontendComponent +import com.kingsrook.qqq.frontend.android.core.model.metadata.QInstance +import com.kingsrook.qqq.frontend.android.mobileapp.ui.processes.components.ProcessComponentWidget +import com.kingsrook.qqq.frontend.android.mobileapp.viewmodel.ProcessViewModel + +/******************************************************************************* + ** + *******************************************************************************/ +@Preview +@Composable +fun ProcessComponentWidgetPreview() { + val processViewModel = ProcessViewModel() + processViewModel.qqqRepository = SampleAppMockQQQRepository() + val component = QFrontendComponent( + type = QComponentType.WIDGET, values = mapOf( + "isAdHocWidget" to true, + "blocks" to listOf( + mapOf( + "blockType" to "TEXT", + "styles" to mapOf( + "foo" to "bar" + ), + "values" to mapOf( + "text" to "this is my text, what do you want from me?" + ), + ) + ) + ) + ) + ProcessComponentWidget(processViewModel, QInstance(), component) +} + +/******************************************************************************* + ** + *******************************************************************************/ +@Preview +@Composable +fun ProcessComponentWidgetPreviewMultipleAdHoc() { + val processViewModel = ProcessViewModel() + processViewModel.qqqRepository = SampleAppMockQQQRepository() + val component = QFrontendComponent( + type = QComponentType.WIDGET, values = mapOf( + "isAdHocWidget" to true, + "blocks" to listOf( + mapOf( + "blockType" to "TEXT", + "styles" to mapOf( + "standardColor" to "SUCCESS" + ), + "values" to mapOf( + "text" to "this is my text, what do you want from me?" + ), + ), + mapOf( + "blockType" to "TEXT", + "values" to mapOf( + "text" to "and this is mine." + ), + ) + ) + ) + ) + ProcessComponentWidget(processViewModel, QInstance(), component) +} + + +/******************************************************************************* + ** + *******************************************************************************/ +@Preview +@Composable +fun ProcessComponentWidgetAdHocUnknownType() { + val processViewModel = ProcessViewModel() + processViewModel.qqqRepository = SampleAppMockQQQRepository() + val component = QFrontendComponent( + type = QComponentType.WIDGET, values = mapOf( + "isAdHocWidget" to true, + "blocks" to listOf( + mapOf( + "blockType" to "FOOBAR" + ) + ) + ) + ) + ProcessComponentWidget(processViewModel, QInstance(), component) +} + +/******************************************************************************* + ** + *******************************************************************************/ +@Preview +@Composable +fun ProcessComponentWidgetPreviewNonAdHoc() { + val processViewModel = ProcessViewModel() + processViewModel.qqqRepository = SampleAppMockQQQRepository() + val component = QFrontendComponent( + type = QComponentType.WIDGET, values = mapOf( + "widgetName" to "testWidget" + ) + ) + ProcessComponentWidget(processViewModel, QInstance(), component) +} + diff --git a/qqqsampleandroidmobileapp/src/androidTest/java/com/kingsrook/qqq/sampleandroidmobileapp/previews/processes/components/UnsupportedProcessComponentPreview.kt b/qqqsampleandroidmobileapp/src/androidTest/java/com/kingsrook/qqq/sampleandroidmobileapp/previews/processes/components/UnsupportedProcessComponentPreview.kt new file mode 100644 index 0000000..b940f4a --- /dev/null +++ b/qqqsampleandroidmobileapp/src/androidTest/java/com/kingsrook/qqq/sampleandroidmobileapp/previews/processes/components/UnsupportedProcessComponentPreview.kt @@ -0,0 +1,44 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2004-2024. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package com.kingsrook.qqq.sampleandroidmobileapp.previews.processes.components + +import androidx.compose.runtime.Composable +import androidx.compose.ui.tooling.preview.Preview +import com.kingsrook.qqq.sampleandroidmobileapp.SampleAppMockQQQRepository +import com.kingsrook.qqq.frontend.android.core.model.metadata.QComponentType +import com.kingsrook.qqq.frontend.android.core.model.metadata.QFrontendComponent +import com.kingsrook.qqq.frontend.android.mobileapp.ui.processes.components.UnsupportedProcessComponent +import com.kingsrook.qqq.frontend.android.mobileapp.viewmodel.ProcessViewModel + +/******************************************************************************* + ** + *******************************************************************************/ +@Preview +@Composable +fun UnsupportedProcessComponentPreview() { + val processViewModel = ProcessViewModel() + processViewModel.qqqRepository = SampleAppMockQQQRepository() + val component = QFrontendComponent(type = QComponentType.HTML) + UnsupportedProcessComponent(processViewModel, component) +} + diff --git a/qqqsampleandroidmobileapp/src/androidTest/java/com/kingsrook/qqq/sampleandroidmobileapp/previews/utils/PreviewUtils.kt b/qqqsampleandroidmobileapp/src/androidTest/java/com/kingsrook/qqq/sampleandroidmobileapp/previews/utils/PreviewUtils.kt new file mode 100644 index 0000000..0235eef --- /dev/null +++ b/qqqsampleandroidmobileapp/src/androidTest/java/com/kingsrook/qqq/sampleandroidmobileapp/previews/utils/PreviewUtils.kt @@ -0,0 +1,49 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2024-2024. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.kingsrook.qqq.sampleandroidmobileapp.previews.utils + +import com.kingsrook.qqq.sampleandroidmobileapp.SampleAppMockQQQRepository +import com.kingsrook.qqq.frontend.android.core.model.Environment +import com.kingsrook.qqq.frontend.android.mobileapp.container.QAppContainer +import com.kingsrook.qqq.frontend.android.mobileapp.data.MockPreferencesDataStore +import com.kingsrook.qqq.frontend.android.mobileapp.viewmodel.QViewModel + +/******************************************************************************* + ** + *******************************************************************************/ +object PreviewUtils { + /******************************************************************************* + ** + *******************************************************************************/ + fun createQViewModel(): QViewModel { + QAppContainer.availableEnvironments = listOf( + Environment("Production", "https://live.coldtrack.com/"), + Environment("Staging", "https://live.coldtrack-staging.com/"), + Environment("Production", "https://live.coldtrack-dev.com/"), + Environment("Local Test", "http://192.168.4.67:8000/"), + ) + + val dataStore = MockPreferencesDataStore() + val qViewModel = QViewModel(SampleAppMockQQQRepository(), dataStore) + return (qViewModel) + } +} diff --git a/qqqsampleandroidmobileapp/src/androidTest/java/com/kingsrook/qqq/sampleandroidmobileapp/previews/widgets/blocks/ButtonWidgetBlockPreview.kt b/qqqsampleandroidmobileapp/src/androidTest/java/com/kingsrook/qqq/sampleandroidmobileapp/previews/widgets/blocks/ButtonWidgetBlockPreview.kt new file mode 100644 index 0000000..cd813e5 --- /dev/null +++ b/qqqsampleandroidmobileapp/src/androidTest/java/com/kingsrook/qqq/sampleandroidmobileapp/previews/widgets/blocks/ButtonWidgetBlockPreview.kt @@ -0,0 +1,144 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2004-2024. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package com.kingsrook.qqq.sampleandroidmobileapp.previews.widgets.blocks + +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.padding +import androidx.compose.material3.Surface +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import com.kingsrook.qqq.frontend.android.core.model.MutableMapOfStringAny +import com.kingsrook.qqq.frontend.android.core.model.widgets.WidgetBlock +import com.kingsrook.qqq.frontend.android.mobileapp.ui.widgets.blocks.ButtonWidgetBlock +import com.kingsrook.qqq.frontend.android.mobileapp.ui.widgets.blocks.WidgetBlockParameters + +/******************************************************************************* + ** + *******************************************************************************/ +@Composable +fun ActionButton( + styles: MutableMapOfStringAny = emptyMap<String, Any?>().toMutableMap(), + values: MutableMapOfStringAny = emptyMap<String, Any?>().toMutableMap() +) = ButtonWidgetBlock(WidgetBlockParameters(WidgetBlock("", "BUTTON", styles = styles, values = values))) + +/******************************************************************************* + ** + *******************************************************************************/ +@Preview +@Composable +fun ActionButtonWidgetBlockDefault() { + ActionButton(values = mutableMapOf("label" to "Default")) +} + +/******************************************************************************* + ** + *******************************************************************************/ +@Preview +@Composable +fun ActionButtonWidgetBlockSuccess() { + ActionButton(styles = mutableMapOf("color" to "SUCCESS"), values = mutableMapOf("label" to "Default")) +} + +/******************************************************************************* + ** + *******************************************************************************/ +@Preview +@Composable +fun ActionButtonWidgetBlockOutlined() { + Surface(modifier = Modifier.background(Color.Gray).padding(20.dp)) + { + ActionButton(styles = mutableMapOf("format" to "outlined"), values = mutableMapOf("label" to "Outlined")) + } +} + + +/******************************************************************************* + ** + *******************************************************************************/ +@Preview +@Composable +fun ActionButtonWidgetBlockOutlinedError() { + ActionButton(styles = mutableMapOf("color" to "ERROR", "format" to "outlined"), values = mutableMapOf("label" to "Outlined")) +} + +/******************************************************************************* + ** + *******************************************************************************/ +@Preview +@Composable +fun ActionButtonWidgetBlockFilled() { + ActionButton(styles = mutableMapOf("format" to "filled"), values = mutableMapOf("label" to "Filled")) +} + + +/******************************************************************************* + ** + *******************************************************************************/ +@Preview +@Composable +fun ActionButtonWidgetBlockFilledError() { + ActionButton(styles = mutableMapOf("color" to "SUCCESS", "format" to "filled"), values = mutableMapOf("label" to "Filled")) +} + +/******************************************************************************* + ** + *******************************************************************************/ +@Preview +@Composable +fun ActionButtonWidgetBlockText() { + ActionButton(styles = mutableMapOf("format" to "text"), values = mutableMapOf("label" to "Text")) +} + + +/******************************************************************************* + ** + *******************************************************************************/ +@Preview +@Composable +fun ActionButtonWidgetBlockTextError() { + ActionButton(styles = mutableMapOf("color" to "ERROR", "format" to "text"), values = mutableMapOf("label" to "Text")) +} + + +/******************************************************************************* + ** + *******************************************************************************/ +@Preview +@Composable +fun ActionButtonWidgetBlockStartIcon() { + ActionButton(styles = mutableMapOf("color" to "INFO", "format" to "outlined"), values = mutableMapOf("label" to "Text", "startIcon" to mapOf("name" to "check"))) +} + + +/******************************************************************************* + ** + *******************************************************************************/ +@Preview +@Composable +fun ActionButtonWidgetBlockEndIcon() { + ActionButton(styles = mutableMapOf("color" to "WARNING", "format" to "filled"), values = mutableMapOf("label" to "Text", "endIcon" to mapOf("name" to "warning"))) +} + diff --git a/qqqsampleandroidmobileapp/src/androidTest/java/com/kingsrook/qqq/sampleandroidmobileapp/previews/widgets/blocks/CompositeWidgetBlockPreview.kt b/qqqsampleandroidmobileapp/src/androidTest/java/com/kingsrook/qqq/sampleandroidmobileapp/previews/widgets/blocks/CompositeWidgetBlockPreview.kt new file mode 100644 index 0000000..fb5bc4a --- /dev/null +++ b/qqqsampleandroidmobileapp/src/androidTest/java/com/kingsrook/qqq/sampleandroidmobileapp/previews/widgets/blocks/CompositeWidgetBlockPreview.kt @@ -0,0 +1,118 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2004-2024. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package com.kingsrook.qqq.sampleandroidmobileapp.previews.widgets.blocks + +import androidx.compose.runtime.Composable +import androidx.compose.ui.tooling.preview.Preview +import com.kingsrook.qqq.frontend.android.core.model.widgets.WidgetBlock +import com.kingsrook.qqq.frontend.android.mobileapp.ui.widgets.blocks.CompositeWidgetBlock +import com.kingsrook.qqq.frontend.android.mobileapp.ui.widgets.blocks.WidgetBlockParameters + +/******************************************************************************* + ** + *******************************************************************************/ +fun makeTextBlock(text: String): WidgetBlock { + return WidgetBlock("", "TEXT", values = mutableMapOf("text" to text)) +} + +/******************************************************************************* + ** + *******************************************************************************/ +fun makeCompositeBlock(layout: String, subBlocks: List<WidgetBlock>): WidgetBlock { + return WidgetBlock("", "COMPOSITE", layout = layout, subBlocks = subBlocks) +} + +val twoSubBlocks = listOf( + makeTextBlock("one"), + makeTextBlock("two") +) + +/******************************************************************************* + ** + *******************************************************************************/ +@Composable +fun Test(layout: String, subBlocks: List<WidgetBlock>) { + val params = WidgetBlockParameters(WidgetBlock("", "COMPOSITE", layout = layout, subBlocks = subBlocks), null) + CompositeWidgetBlock(params) +} + +/******************************************************************************* + ** + *******************************************************************************/ +@Preview(widthDp = 200) +@Composable +fun CompositeWidgetBlockFlexRowCenter() { + Test("FLEX_ROW_CENTER", twoSubBlocks) +} + +/******************************************************************************* + ** + *******************************************************************************/ +@Preview(widthDp = 200) +@Composable +fun CompositeWidgetBlockFlexRowSpaceBetween() { + Test("FLEX_ROW_SPACE_BETWEEN", twoSubBlocks) +} + +/******************************************************************************* + ** + *******************************************************************************/ +@Preview(widthDp = 200) +@Composable +fun CompositeWidgetBlockFlexRowWrapped() { + Test( + "FLEX_ROW_WRAPPED", listOf( + makeTextBlock("something"), makeTextBlock("something else"), makeTextBlock("a third thing"), makeTextBlock("and ...") + ) + ) +} + +/******************************************************************************* + ** + *******************************************************************************/ +@Preview(widthDp = 200) +@Composable +fun CompositeWidgetBlockFlexColumn() { + Test("FLEX_COLUMN", twoSubBlocks) +} + +/******************************************************************************* + ** + *******************************************************************************/ +@Preview(widthDp = 200) +@Composable +fun CompositeWidgetBlockThingForScanner() { + Test( + "FLEX_ROW_WRAPPED", listOf( + makeTextBlock("Icon"), + makeCompositeBlock( + "FLEX_COLUMN", listOf( + makeTextBlock("line 1"), + makeTextBlock("line 2"), + makeTextBlock("line 3"), + ) + ) + ) + ) +} + diff --git a/qqqsampleandroidmobileapp/src/androidTest/java/com/kingsrook/qqq/sampleandroidmobileapp/previews/widgets/blocks/InputFieldWidgetBlockPreview.kt b/qqqsampleandroidmobileapp/src/androidTest/java/com/kingsrook/qqq/sampleandroidmobileapp/previews/widgets/blocks/InputFieldWidgetBlockPreview.kt new file mode 100644 index 0000000..eecc275 --- /dev/null +++ b/qqqsampleandroidmobileapp/src/androidTest/java/com/kingsrook/qqq/sampleandroidmobileapp/previews/widgets/blocks/InputFieldWidgetBlockPreview.kt @@ -0,0 +1,47 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2004-2024. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package com.kingsrook.qqq.sampleandroidmobileapp.previews.widgets.blocks + +import androidx.compose.runtime.Composable +import androidx.compose.ui.tooling.preview.Preview +import com.kingsrook.qqq.frontend.android.core.model.widgets.WidgetBlock +import com.kingsrook.qqq.frontend.android.mobileapp.ui.widgets.blocks.InputFieldWidgetBlock +import com.kingsrook.qqq.frontend.android.mobileapp.ui.widgets.blocks.WidgetBlockParameters + +/******************************************************************************* + ** + *******************************************************************************/ +@Preview +@Composable +fun InputFieldWidgetBlockPreview() { + val values = mutableMapOf<String, Any?>( + "submitOnEnter" to false, + "autoFocus" to true, + "fieldMetaData" to mapOf( + "name" to "someField", + "label" to "Some Field", + "type" to "STRING", + ) + ) + InputFieldWidgetBlock(WidgetBlockParameters(WidgetBlock("", "INPUT_FIELD", values = values))) +} diff --git a/qqqsampleandroidmobileapp/src/androidTest/java/com/kingsrook/qqq/sampleandroidmobileapp/previews/widgets/blocks/TextWidgetBlockPreview.kt b/qqqsampleandroidmobileapp/src/androidTest/java/com/kingsrook/qqq/sampleandroidmobileapp/previews/widgets/blocks/TextWidgetBlockPreview.kt new file mode 100644 index 0000000..cd9f2d7 --- /dev/null +++ b/qqqsampleandroidmobileapp/src/androidTest/java/com/kingsrook/qqq/sampleandroidmobileapp/previews/widgets/blocks/TextWidgetBlockPreview.kt @@ -0,0 +1,246 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2004-2024. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package com.kingsrook.qqq.sampleandroidmobileapp.previews.widgets.blocks + +import androidx.compose.runtime.Composable +import androidx.compose.ui.tooling.preview.Preview +import com.kingsrook.qqq.frontend.android.core.model.MutableMapOfStringAny +import com.kingsrook.qqq.frontend.android.core.model.widgets.WidgetBlock +import com.kingsrook.qqq.frontend.android.mobileapp.ui.widgets.blocks.TextWidgetBlock +import com.kingsrook.qqq.frontend.android.mobileapp.ui.widgets.blocks.WidgetBlockParameters + +/******************************************************************************* + ** + *******************************************************************************/ +@Composable +fun TextBlock( + styles: MutableMapOfStringAny = emptyMap<String, Any?>().toMutableMap(), + values: MutableMapOfStringAny = emptyMap<String, Any?>().toMutableMap() +) = TextWidgetBlock(WidgetBlockParameters(WidgetBlock("", "TEXT", styles = styles, values = values))) + +/******************************************************************************* + ** + *******************************************************************************/ +@Preview +@Composable +fun TextWidgetBlockDefault() { + TextBlock(values = mutableMapOf("text" to "Default color")) +} + +/******************************************************************************* + ** + *******************************************************************************/ +@Preview +@Composable +fun TextWidgetBlockAlert() { + TextBlock(mutableMapOf("format" to "alert"), mutableMapOf("text" to "Default color")) +} + +/******************************************************************************* + ** + *******************************************************************************/ +@Preview +@Composable +fun TextWidgetBlockUnknownColor() { + TextBlock(mutableMapOf("color" to "un known"), mutableMapOf("text" to "Unknown color")) +} + +/******************************************************************************* + ** + *******************************************************************************/ +@Preview +@Composable +fun TextWidgetBlockSuccess() { + TextBlock(mutableMapOf("color" to "SUCCESS"), mutableMapOf("text" to "Great Success")) +} + +/******************************************************************************* + ** + *******************************************************************************/ +@Preview +@Composable +fun TextWidgetBlockSuccessAlert() { + TextBlock(mutableMapOf("color" to "SUCCESS", "format" to "alert"), mutableMapOf("text" to "Success alert")) +} + +/******************************************************************************* + ** + *******************************************************************************/ +@Preview +@Composable +fun TextWidgetBlockDefaultColorBanner() { + TextBlock(mutableMapOf("format" to "banner"), mutableMapOf("text" to "Default banner!")) +} + +/******************************************************************************* + ** + *******************************************************************************/ +@Preview +@Composable +fun TextWidgetBlockMutedBanner() { + TextBlock(mutableMapOf("color" to "MUTED", "format" to "banner"), mutableMapOf("text" to "Muted banner!")) +} + +/******************************************************************************* + ** + *******************************************************************************/ +@Preview +@Composable +fun TextWidgetBlockErrorBanner() { + TextBlock(mutableMapOf("color" to "ERROR", "format" to "banner"), mutableMapOf("text" to "Error banner!")) +} + +/******************************************************************************* + ** + *******************************************************************************/ +@Preview +@Composable +fun TextWidgetBlockSuccessBanner() { + TextBlock(mutableMapOf("color" to "SUCCESS", "format" to "banner"), mutableMapOf("text" to "Success banner!")) +} + +/******************************************************************************* + ** + *******************************************************************************/ +@Preview +@Composable +fun TextWidgetBlockWarning() { + TextBlock(mutableMapOf("color" to "WARNING"), mutableMapOf("text" to "Warning Will")) +} + +/******************************************************************************* + ** + *******************************************************************************/ +@Preview +@Composable +fun TextWidgetBlockError() { + TextBlock(mutableMapOf("color" to "ERROR"), mutableMapOf("text" to "Error Jordan")) +} + +/******************************************************************************* + ** + *******************************************************************************/ +@Preview +@Composable +fun TextWidgetBlockInfo() { + TextBlock(mutableMapOf("color" to "INFO"), mutableMapOf("text" to "Info matic")) +} + +/******************************************************************************* + ** + *******************************************************************************/ +@Preview +@Composable +fun TextWidgetBlockMuted() { + TextBlock(mutableMapOf("color" to "MUTED"), mutableMapOf("text" to "Shhh!")) +} + +/******************************************************************************* + ** + *******************************************************************************/ +@Preview +@Composable +fun TextWidgetBlockInterpolated() { + TextBlock(values = mutableMapOf("text" to "\${someVar}", "interpolatedText" to "Some Val")) +} + +/******************************************************************************* + ** + *******************************************************************************/ +@Preview +@Composable +fun TextWidgetBlockSemiBold() { + TextBlock(mutableMapOf("weight" to "semibold"), mutableMapOf("text" to "boldly")) +} + +/******************************************************************************* + ** + *******************************************************************************/ +@Preview +@Composable +fun TextWidgetBlockWeight100() { + TextBlock(mutableMapOf("weight" to "100"), mutableMapOf("text" to "thin 100")) +} + +/******************************************************************************* + ** + *******************************************************************************/ +@Preview +@Composable +fun TextWidgetBlockWeight900() { + TextBlock(mutableMapOf("weight" to "900"), mutableMapOf("text" to "thick 900")) +} + +/******************************************************************************* + ** + *******************************************************************************/ +@Preview +@Composable +fun TextWidgetBlockSizeLargest() { + TextBlock(mutableMapOf("size" to "largest"), mutableMapOf("text" to "big")) +} + +/******************************************************************************* + ** + *******************************************************************************/ +@Preview +@Composable +fun TextWidgetBlockSize6() { + TextBlock(mutableMapOf("size" to "6"), mutableMapOf("text" to "so 6")) +} + +/******************************************************************************* + ** + *******************************************************************************/ +@Preview +@Composable +fun TextWidgetBlockSize26() { + TextBlock(mutableMapOf("size" to "26"), mutableMapOf("text" to "so 26")) +} + +/******************************************************************************* + ** + *******************************************************************************/ +@Preview +@Composable +fun TextWidgetRGBColor() { + TextBlock(mutableMapOf("color" to "00FF80"), mutableMapOf("text" to "some teal")) +} + +/******************************************************************************* + ** + *******************************************************************************/ +@Preview +@Composable +fun TextWidgetRGBAColor() { + TextBlock(mutableMapOf("color" to "00FF8080"), mutableMapOf("text" to "some teal")) +} + +/******************************************************************************* + ** + *******************************************************************************/ +@Preview +@Composable +fun TextWidgetBannerAndIcon() { + TextBlock(mutableMapOf("format" to "banner"), mutableMapOf("startIcon" to "verified_user", "text" to "Hello there")) +} diff --git a/qqqsampleandroidmobileapp/src/androidTest/java/com/kingsrook/qqq/sampleandroidmobileapp/utils/TestUtils.kt b/qqqsampleandroidmobileapp/src/androidTest/java/com/kingsrook/qqq/sampleandroidmobileapp/utils/TestUtils.kt new file mode 100644 index 0000000..9f4f649 --- /dev/null +++ b/qqqsampleandroidmobileapp/src/androidTest/java/com/kingsrook/qqq/sampleandroidmobileapp/utils/TestUtils.kt @@ -0,0 +1,164 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2004-2024. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package com.kingsrook.qqq.sampleandroidmobileapp.utils + +import android.widget.Toast +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.test.ExperimentalTestApi +import androidx.compose.ui.test.assertIsDisplayed +import androidx.compose.ui.test.assertIsEnabled +import androidx.compose.ui.test.hasTestTag +import androidx.compose.ui.test.junit4.ComposeContentTestRule +import androidx.compose.ui.test.onNodeWithText +import androidx.compose.ui.test.onRoot +import androidx.compose.ui.test.performClick +import androidx.compose.ui.test.printToLog +import androidx.navigation.compose.rememberNavController +import com.kingsrook.qqq.frontend.android.core.model.metadata.QAppNodeType +import com.kingsrook.qqq.frontend.android.mobileapp.QMobileAppMain +import com.kingsrook.qqq.sampleandroidmobileapp.SampleAppMockQQQRepository +import com.kingsrook.qqq.frontend.android.mobileapp.viewmodel.QViewModel +import com.kingsrook.qqq.frontend.android.mobileapp.data.MockPreferencesDataStore + +/******************************************************************************* + ** + *******************************************************************************/ +object TestUtils { + lateinit var qViewModel: QViewModel + lateinit var toast: Toast + + /******************************************************************************* + ** + *******************************************************************************/ + fun startStandardTest(composeTestRule: ComposeContentTestRule, qViewModelParam: QViewModel? = null) { + if (qViewModelParam == null) { + this.qViewModel = createQViewModel() + } else { + this.qViewModel = qViewModelParam + } + + composeTestRule.setContent() + { + toast = Toast.makeText(LocalContext.current, "This is a test", 3) + + val navController = rememberNavController() + qViewModel.setNavController(navController) + + QMobileAppMain(this.qViewModel, "Test App") + } + } + + /******************************************************************************* + ** + *******************************************************************************/ + fun login(composeTestRule: ComposeContentTestRule) { + composeTestRule.onNodeWithText("Log In").performClick() + composeTestRule.waitUntil( + "Should become authed", timeoutMillis = 5000, condition = + { + qViewModel.isAuthenticated + }) + } + + /******************************************************************************* + ** + *******************************************************************************/ + fun createQViewModel(): QViewModel { + val dataStore = MockPreferencesDataStore() + val qViewModel = QViewModel(SampleAppMockQQQRepository(), dataStore) + return (qViewModel) + } + + /******************************************************************************* + ** + *******************************************************************************/ + fun sleep(composeTestRule: ComposeContentTestRule, seconds: Int) { + composeTestRule.waitUntil( + "Intentional Sleep", timeoutMillis = (seconds + 1) * 1000L, condition = + { + try { + Thread.sleep(seconds * 1000L) + return@waitUntil true + } catch (e: Exception) { + // noop, just return + return@waitUntil true + } + }) + } + + /******************************************************************************* + ** Sleep, but, only when running locally, e.g., to see the screen and debug. + ** will this cause tests to behave differently in CI? We shall see! + *******************************************************************************/ + fun localDebugSleep(composeTestRule: ComposeContentTestRule, seconds: Int = 300) { + if (seconds == 0) { + return + } + + if (System.getenv("CIRCLECI") != null) { + println("In CIRCLECI - so - not doing a localDebugSleep") + return + } + + showToast("Going into a localDebugSleep sleep \uD83D\uDECC now for ${seconds} second${if (seconds == 1) "" else "s"} ⏰") + sleep(composeTestRule, seconds) + } + + /******************************************************************************* + ** + *******************************************************************************/ + fun logTree(composeTestRule: ComposeContentTestRule, useUnmergedTree: Boolean = false) { + composeTestRule.onRoot(useUnmergedTree = useUnmergedTree) + .printToLog("currentLabelExists") + } + + /******************************************************************************* + ** + *******************************************************************************/ + fun showToast(text: String) { + toast.setText(text) + toast.show() + } +} + +/******************************************************************************* + ** + *******************************************************************************/ +@OptIn(ExperimentalTestApi::class) // for waitUntilAtLeastOneExists +fun ComposeContentTestRule.clickAppScreenOption(type: QAppNodeType, childName: String) { + val testTag = "appHome.rowFor" + when (type) { + QAppNodeType.APP -> "App:" + QAppNodeType.TABLE -> "Table:" + QAppNodeType.PROCESS -> "Process:" + QAppNodeType.REPORT -> "Report:" + QAppNodeType.UNKNOWN -> error("Unknown app node types cannot be selected") + } + childName + + this.waitUntilAtLeastOneExists(hasTestTag(testTag)) + + this.onNode(hasTestTag(testTag)) + .assertIsDisplayed() + .assertIsEnabled() + .performClick() +} + diff --git a/qqqsampleandroidmobileapp/src/debug/AndroidManifest.xml b/qqqsampleandroidmobileapp/src/debug/AndroidManifest.xml new file mode 100644 index 0000000..f40a917 --- /dev/null +++ b/qqqsampleandroidmobileapp/src/debug/AndroidManifest.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8"?> +<manifest xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:tools="http://schemas.android.com/tools"> + <application android:usesCleartextTraffic="true" tools:replace="android:usesCleartextTraffic" /> +</manifest> diff --git a/qqqsampleandroidmobileapp/src/main/AndroidManifest.xml b/qqqsampleandroidmobileapp/src/main/AndroidManifest.xml new file mode 100644 index 0000000..4da170b --- /dev/null +++ b/qqqsampleandroidmobileapp/src/main/AndroidManifest.xml @@ -0,0 +1,51 @@ +<?xml version="1.0" encoding="utf-8"?> +<manifest xmlns:tools="http://schemas.android.com/tools" xmlns:android="http://schemas.android.com/apk/res/android"> + + <uses-permission android:name="android.permission.INTERNET" /> + <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" /> + + <application + android:name="com.kingsrook.qqq.frontend.android.mobileapp.QMobileApplication" + android:allowBackup="false" + android:fullBackupContent="false" + android:dataExtractionRules="@xml/data_extraction_rules" + android:icon="@mipmap/ic_launcher" + android:label="@string/app_name" + android:roundIcon="@mipmap/ic_launcher_round" + android:supportsRtl="true" + android:usesCleartextTraffic="false" + android:theme="@style/Theme.AndroidDevProject"> + + <activity + android:name=".SampleAppMainActivity" + android:exported="true" + android:label="@string/app_name" + android:theme="@style/Theme.AndroidDevProject"> + <intent-filter> + <action android:name="android.intent.action.MAIN" /> + <category android:name="android.intent.category.LAUNCHER" /> + </intent-filter> + </activity> + + <activity + android:name="com.auth0.android.provider.RedirectActivity" + tools:node="replace" + android:exported="true" > + <intent-filter android:autoVerify="true" tools:ignore="AppLinkUrlError"> + <action android:name="android.intent.action.VIEW" /> + + <category android:name="android.intent.category.DEFAULT" /> + <category android:name="android.intent.category.BROWSABLE" /> + + <data android:scheme="qqqsampleapp"/> + <data android:pathPrefix="/"/> + <data android:host="auth.coldtrack-dev.com"/> + <data android:host="auth.coldtrack-staging.com"/> + <data android:host="auth.coldtrack.com"/> + + </intent-filter> + </activity> + + </application> + +</manifest> diff --git a/qqqsampleandroidmobileapp/src/main/ic_launcher-playstore.png b/qqqsampleandroidmobileapp/src/main/ic_launcher-playstore.png new file mode 100644 index 0000000..11bbf78 Binary files /dev/null and b/qqqsampleandroidmobileapp/src/main/ic_launcher-playstore.png differ diff --git a/qqqsampleandroidmobileapp/src/main/java/com/kingsrook/qqq/sampleandroidmobileapp/SampleAppMainActivity.kt b/qqqsampleandroidmobileapp/src/main/java/com/kingsrook/qqq/sampleandroidmobileapp/SampleAppMainActivity.kt new file mode 100644 index 0000000..541a35b --- /dev/null +++ b/qqqsampleandroidmobileapp/src/main/java/com/kingsrook/qqq/sampleandroidmobileapp/SampleAppMainActivity.kt @@ -0,0 +1,112 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2004-2024. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package com.kingsrook.qqq.sampleandroidmobileapp + +import android.content.Context +import android.os.Bundle +import androidx.activity.ComponentActivity +import androidx.activity.compose.setContent +import androidx.activity.enableEdgeToEdge +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource +import androidx.datastore.core.DataStore +import androidx.datastore.preferences.core.Preferences +import androidx.datastore.preferences.core.PreferenceDataStoreFactory +import androidx.lifecycle.viewmodel.compose.viewModel +import androidx.navigation.compose.rememberNavController +import com.kingsrook.qqq.frontend.android.core.model.Environment +import com.kingsrook.qqq.frontend.android.mobileapp.QMobileAppMain +import com.kingsrook.qqq.frontend.android.mobileapp.container.QAppContainer +import com.kingsrook.qqq.frontend.android.mobileapp.ui.authentication.QAuth0Service +import com.kingsrook.qqq.frontend.android.mobileapp.viewmodel.QViewModel +import com.kingsrook.qqq.sampleandroidmobileapp.ui.theme.AppTheme +import java.io.File + +/******************************************************************************* + ** + *******************************************************************************/ +class SampleAppMainActivity : ComponentActivity() { + /******************************************************************************* + ** + *******************************************************************************/ + override fun onCreate(savedInstanceState: Bundle?) { + ///////////////////////////////////////////////////////////////////////////////////////////// + // configure your application: // + // availableEnvironments: list of Environments - labels & Urls of your application servers // + // // + // and, ideally, you can define these 4 settings (see below) in a strings.xml values file // + // title: text displayed in topAppBar // + // scheme: unique identifier for your app, used by URL-scheme-based callbacks // + // applicationName: name sent to your backend server to identify this frontend application // + // applicationVersion: version that accompanies applicationName. // + // applicationBuildTimestamp: timestamp of the app's build (e.g., injected by CD pipeline) // + ///////////////////////////////////////////////////////////////////////////////////////////// + QAppContainer.availableEnvironments = listOf( + Environment("Production", "https://live.coldtrack.com/"), + Environment("Staging", "https://live.coldtrack-staging.com/"), + Environment("Development", "https://live.coldtrack-dev.com/"), + ) + if (BuildConfig.DEBUG) listOf( + Environment("Local Dev", "http://192.168.4.122:8000/"), + Environment("Bad URL", "http://no.such.domain.dot.dot/"), + ) else emptyList() + val splashResourceId: Int? = null // R.drawable.kingsrook_logo + + /////////////////////////////////////////////////////////// + // boilerplate - paste in below your app's configuration // + /////////////////////////////////////////////////////////// + super.onCreate(savedInstanceState) + enableEdgeToEdge() + setContent() + { + val title = stringResource(R.string.app_title) + QAuth0Service.scheme = stringResource(R.string.app_scheme) + QViewModel.applicationName = stringResource(R.string.app_name) + QViewModel.applicationVersion = stringResource(R.string.app_version) + QViewModel.applicationBuildTimestamp = stringResource(R.string.application_build_timestamp) + + QViewModel.dataStore = LocalContext.current.dataStore + val qViewModel: QViewModel = viewModel(factory = QViewModel.factory) + + val navController = rememberNavController() + qViewModel.setNavController(navController) + + AppTheme() + { + QMobileAppMain(qViewModel, title = title, if (splashResourceId == null) null else painterResource(splashResourceId)) + } + } + } +} + +private var settingsStore: DataStore<Preferences>? = null + +// Do not migrate the old backup-eligible store: upgraded/restored samples require fresh login. +val Context.dataStore: DataStore<Preferences> + get() = synchronized(SampleAppMainActivity::class.java) + { + settingsStore ?: run { + val file = File(applicationContext.noBackupFilesDir, "settings.preferences_pb") + PreferenceDataStoreFactory.create { file }.also { settingsStore = it } + } + } diff --git a/qqqsampleandroidmobileapp/src/main/java/com/kingsrook/qqq/sampleandroidmobileapp/ui/theme/Color.kt b/qqqsampleandroidmobileapp/src/main/java/com/kingsrook/qqq/sampleandroidmobileapp/ui/theme/Color.kt new file mode 100644 index 0000000..5e02b68 --- /dev/null +++ b/qqqsampleandroidmobileapp/src/main/java/com/kingsrook/qqq/sampleandroidmobileapp/ui/theme/Color.kt @@ -0,0 +1,32 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2024-2024. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.kingsrook.qqq.sampleandroidmobileapp.ui.theme + +import androidx.compose.ui.graphics.Color + +val Purple80 = Color(0xFFD0BCFF) +val PurpleGrey80 = Color(0xFFCCC2DC) +val Pink80 = Color(0xFFEFB8C8) + +val Purple40 = Color(0xFF6650a4) +val PurpleGrey40 = Color(0xFF625b71) +val Pink40 = Color(0xFF7D5260) diff --git a/qqqsampleandroidmobileapp/src/main/java/com/kingsrook/qqq/sampleandroidmobileapp/ui/theme/Theme.kt b/qqqsampleandroidmobileapp/src/main/java/com/kingsrook/qqq/sampleandroidmobileapp/ui/theme/Theme.kt new file mode 100644 index 0000000..5f6461c --- /dev/null +++ b/qqqsampleandroidmobileapp/src/main/java/com/kingsrook/qqq/sampleandroidmobileapp/ui/theme/Theme.kt @@ -0,0 +1,82 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2024-2024. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.kingsrook.qqq.sampleandroidmobileapp.ui.theme + +import android.app.Activity +import android.os.Build +import androidx.compose.foundation.isSystemInDarkTheme +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.darkColorScheme +import androidx.compose.material3.dynamicDarkColorScheme +import androidx.compose.material3.dynamicLightColorScheme +import androidx.compose.material3.lightColorScheme +import androidx.compose.runtime.Composable +import androidx.compose.ui.platform.LocalContext + +private val DarkColorScheme = darkColorScheme( + primary = Purple80, + secondary = PurpleGrey80, + tertiary = Pink80 +) + +private val LightColorScheme = lightColorScheme( + primary = Purple40, + secondary = PurpleGrey40, + tertiary = Pink40 + + /* Other default colors to override + background = Color(0xFFFFFBFE), + surface = Color(0xFFFFFBFE), + onPrimary = Color.White, + onSecondary = Color.White, + onTertiary = Color.White, + onBackground = Color(0xFF1C1B1F), + onSurface = Color(0xFF1C1B1F), + */ +) + +/******************************************************************************* + ** + *******************************************************************************/ +@Composable +fun AppTheme( + darkTheme: Boolean = isSystemInDarkTheme(), + // Dynamic color is available on Android 12+ + dynamicColor: Boolean = true, + content: @Composable () -> Unit +) { + val colorScheme = when { + dynamicColor && Build.VERSION.SDK_INT >= Build.VERSION_CODES.S -> { + val context = LocalContext.current + if (darkTheme) dynamicDarkColorScheme(context) else dynamicLightColorScheme(context) + } + + darkTheme -> DarkColorScheme + else -> LightColorScheme + } + + MaterialTheme( + colorScheme = colorScheme, + typography = Typography, + content = content + ) +} diff --git a/qqqsampleandroidmobileapp/src/main/java/com/kingsrook/qqq/sampleandroidmobileapp/ui/theme/Type.kt b/qqqsampleandroidmobileapp/src/main/java/com/kingsrook/qqq/sampleandroidmobileapp/ui/theme/Type.kt new file mode 100644 index 0000000..9a4ee83 --- /dev/null +++ b/qqqsampleandroidmobileapp/src/main/java/com/kingsrook/qqq/sampleandroidmobileapp/ui/theme/Type.kt @@ -0,0 +1,55 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2024-2024. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.kingsrook.qqq.sampleandroidmobileapp.ui.theme + +import androidx.compose.material3.Typography +import androidx.compose.ui.text.TextStyle +import androidx.compose.ui.text.font.FontFamily +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.unit.sp + +// Set of Material typography styles to start with +val Typography = Typography( + bodyLarge = TextStyle( + fontFamily = FontFamily.Default, + fontWeight = FontWeight.Normal, + fontSize = 16.sp, + lineHeight = 24.sp, + letterSpacing = 0.5.sp + ) + /* Other default text styles to override + titleLarge = TextStyle( + fontFamily = FontFamily.Default, + fontWeight = FontWeight.Normal, + fontSize = 22.sp, + lineHeight = 28.sp, + letterSpacing = 0.sp + ), + labelSmall = TextStyle( + fontFamily = FontFamily.Default, + fontWeight = FontWeight.Medium, + fontSize = 11.sp, + lineHeight = 16.sp, + letterSpacing = 0.5.sp + ) + */ +) diff --git a/qqqsampleandroidmobileapp/src/main/res/drawable/ic_launcher_background.xml b/qqqsampleandroidmobileapp/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 0000000..a929f97 --- /dev/null +++ b/qqqsampleandroidmobileapp/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,190 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + ~ QQQ - Low-code Application Framework for Engineers. + ~ Copyright (C) 2024-2024. Kingsrook, LLC + ~ 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + ~ contact@kingsrook.com + ~ https://github.com/Kingsrook/ + ~ + ~ Licensed under the Apache License, Version 2.0 (the "License"); + ~ you may not use this file except in compliance with the License. + ~ You may obtain a copy of the License at + ~ + ~ https://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, software + ~ distributed under the License is distributed on an "AS IS" BASIS, + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ~ See the License for the specific language governing permissions and + ~ limitations under the License. + --> + +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:height="108dp" + android:width="108dp" + android:viewportHeight="108" + android:viewportWidth="108"> + <path + android:fillColor="#3DDC84" + android:pathData="M0,0h108v108h-108z" /> + <path + android:fillColor="#00000000" + android:pathData="M9,0L9,108" + android:strokeColor="#33FFFFFF" + android:strokeWidth="0.8" /> + <path + android:fillColor="#00000000" + android:pathData="M19,0L19,108" + android:strokeColor="#33FFFFFF" + android:strokeWidth="0.8" /> + <path + android:fillColor="#00000000" + android:pathData="M29,0L29,108" + android:strokeColor="#33FFFFFF" + android:strokeWidth="0.8" /> + <path + android:fillColor="#00000000" + android:pathData="M39,0L39,108" + android:strokeColor="#33FFFFFF" + android:strokeWidth="0.8" /> + <path + android:fillColor="#00000000" + android:pathData="M49,0L49,108" + android:strokeColor="#33FFFFFF" + android:strokeWidth="0.8" /> + <path + android:fillColor="#00000000" + android:pathData="M59,0L59,108" + android:strokeColor="#33FFFFFF" + android:strokeWidth="0.8" /> + <path + android:fillColor="#00000000" + android:pathData="M69,0L69,108" + android:strokeColor="#33FFFFFF" + android:strokeWidth="0.8" /> + <path + android:fillColor="#00000000" + android:pathData="M79,0L79,108" + android:strokeColor="#33FFFFFF" + android:strokeWidth="0.8" /> + <path + android:fillColor="#00000000" + android:pathData="M89,0L89,108" + android:strokeColor="#33FFFFFF" + android:strokeWidth="0.8" /> + <path + android:fillColor="#00000000" + android:pathData="M99,0L99,108" + android:strokeColor="#33FFFFFF" + android:strokeWidth="0.8" /> + <path + android:fillColor="#00000000" + android:pathData="M0,9L108,9" + android:strokeColor="#33FFFFFF" + android:strokeWidth="0.8" /> + <path + android:fillColor="#00000000" + android:pathData="M0,19L108,19" + android:strokeColor="#33FFFFFF" + android:strokeWidth="0.8" /> + <path + android:fillColor="#00000000" + android:pathData="M0,29L108,29" + android:strokeColor="#33FFFFFF" + android:strokeWidth="0.8" /> + <path + android:fillColor="#00000000" + android:pathData="M0,39L108,39" + android:strokeColor="#33FFFFFF" + android:strokeWidth="0.8" /> + <path + android:fillColor="#00000000" + android:pathData="M0,49L108,49" + android:strokeColor="#33FFFFFF" + android:strokeWidth="0.8" /> + <path + android:fillColor="#00000000" + android:pathData="M0,59L108,59" + android:strokeColor="#33FFFFFF" + android:strokeWidth="0.8" /> + <path + android:fillColor="#00000000" + android:pathData="M0,69L108,69" + android:strokeColor="#33FFFFFF" + android:strokeWidth="0.8" /> + <path + android:fillColor="#00000000" + android:pathData="M0,79L108,79" + android:strokeColor="#33FFFFFF" + android:strokeWidth="0.8" /> + <path + android:fillColor="#00000000" + android:pathData="M0,89L108,89" + android:strokeColor="#33FFFFFF" + android:strokeWidth="0.8" /> + <path + android:fillColor="#00000000" + android:pathData="M0,99L108,99" + android:strokeColor="#33FFFFFF" + android:strokeWidth="0.8" /> + <path + android:fillColor="#00000000" + android:pathData="M19,29L89,29" + android:strokeColor="#33FFFFFF" + android:strokeWidth="0.8" /> + <path + android:fillColor="#00000000" + android:pathData="M19,39L89,39" + android:strokeColor="#33FFFFFF" + android:strokeWidth="0.8" /> + <path + android:fillColor="#00000000" + android:pathData="M19,49L89,49" + android:strokeColor="#33FFFFFF" + android:strokeWidth="0.8" /> + <path + android:fillColor="#00000000" + android:pathData="M19,59L89,59" + android:strokeColor="#33FFFFFF" + android:strokeWidth="0.8" /> + <path + android:fillColor="#00000000" + android:pathData="M19,69L89,69" + android:strokeColor="#33FFFFFF" + android:strokeWidth="0.8" /> + <path + android:fillColor="#00000000" + android:pathData="M19,79L89,79" + android:strokeColor="#33FFFFFF" + android:strokeWidth="0.8" /> + <path + android:fillColor="#00000000" + android:pathData="M29,19L29,89" + android:strokeColor="#33FFFFFF" + android:strokeWidth="0.8" /> + <path + android:fillColor="#00000000" + android:pathData="M39,19L39,89" + android:strokeColor="#33FFFFFF" + android:strokeWidth="0.8" /> + <path + android:fillColor="#00000000" + android:pathData="M49,19L49,89" + android:strokeColor="#33FFFFFF" + android:strokeWidth="0.8" /> + <path + android:fillColor="#00000000" + android:pathData="M59,19L59,89" + android:strokeColor="#33FFFFFF" + android:strokeWidth="0.8" /> + <path + android:fillColor="#00000000" + android:pathData="M69,19L69,89" + android:strokeColor="#33FFFFFF" + android:strokeWidth="0.8" /> + <path + android:fillColor="#00000000" + android:pathData="M79,19L79,89" + android:strokeColor="#33FFFFFF" + android:strokeWidth="0.8" /> +</vector> diff --git a/qqqsampleandroidmobileapp/src/main/res/drawable/ic_launcher_foreground.xml b/qqqsampleandroidmobileapp/src/main/res/drawable/ic_launcher_foreground.xml new file mode 100644 index 0000000..b0bddf6 --- /dev/null +++ b/qqqsampleandroidmobileapp/src/main/res/drawable/ic_launcher_foreground.xml @@ -0,0 +1,50 @@ +<!-- + ~ QQQ - Low-code Application Framework for Engineers. + ~ Copyright (C) 2024-2024. Kingsrook, LLC + ~ 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + ~ contact@kingsrook.com + ~ https://github.com/Kingsrook/ + ~ + ~ Licensed under the Apache License, Version 2.0 (the "License"); + ~ you may not use this file except in compliance with the License. + ~ You may obtain a copy of the License at + ~ + ~ https://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, software + ~ distributed under the License is distributed on an "AS IS" BASIS, + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ~ See the License for the specific language governing permissions and + ~ limitations under the License. + --> + +<vector xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:aapt="http://schemas.android.com/aapt" + android:width="108dp" + android:height="108dp" + android:viewportWidth="108" + android:viewportHeight="108"> + <path android:pathData="M31,63.928c0,0 6.4,-11 12.1,-13.1c7.2,-2.6 26,-1.4 26,-1.4l38.1,38.1L107,108.928l-32,-1L31,63.928z"> + <aapt:attr name="android:fillColor"> + <gradient + android:startY="49.59793" + android:startX="42.9492" + android:endY="92.4963" + android:endX="85.84757" + android:type="linear"> + <item + android:color="#44000000" + android:offset="0.0" /> + <item + android:color="#00000000" + android:offset="1.0" /> + </gradient> + </aapt:attr> + </path> + <path + android:pathData="M65.3,45.828l3.8,-6.6c0.2,-0.4 0.1,-0.9 -0.3,-1.1c-0.4,-0.2 -0.9,-0.1 -1.1,0.3l-3.9,6.7c-6.3,-2.8 -13.4,-2.8 -19.7,0l-3.9,-6.7c-0.2,-0.4 -0.7,-0.5 -1.1,-0.3C38.8,38.328 38.7,38.828 38.9,39.228l3.8,6.6C36.2,49.428 31.7,56.028 31,63.928h46C76.3,56.028 71.8,49.428 65.3,45.828zM43.4,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2c-0.3,-0.7 -0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C45.3,56.528 44.5,57.328 43.4,57.328L43.4,57.328zM64.6,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2s-0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C66.5,56.528 65.6,57.328 64.6,57.328L64.6,57.328z" + android:fillColor="#FFFFFF" + android:fillType="nonZero" + android:strokeWidth="1" + android:strokeColor="#00000000" /> +</vector> \ No newline at end of file diff --git a/qqqsampleandroidmobileapp/src/main/res/drawable/kingsrook_logo.png b/qqqsampleandroidmobileapp/src/main/res/drawable/kingsrook_logo.png new file mode 100755 index 0000000..a06f4c2 Binary files /dev/null and b/qqqsampleandroidmobileapp/src/main/res/drawable/kingsrook_logo.png differ diff --git a/qqqsampleandroidmobileapp/src/main/res/drawable/local_shipping.xml b/qqqsampleandroidmobileapp/src/main/res/drawable/local_shipping.xml new file mode 100644 index 0000000..7fc1d0e --- /dev/null +++ b/qqqsampleandroidmobileapp/src/main/res/drawable/local_shipping.xml @@ -0,0 +1,30 @@ +<!-- + ~ QQQ - Low-code Application Framework for Engineers. + ~ Copyright (C) 2004-2024. Kingsrook, LLC + ~ 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + ~ contact@kingsrook.com + ~ https://github.com/Kingsrook/ + ~ + ~ Licensed under the Apache License, Version 2.0 (the "License"); + ~ you may not use this file except in compliance with the License. + ~ You may obtain a copy of the License at + ~ + ~ https://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, software + ~ distributed under the License is distributed on an "AS IS" BASIS, + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ~ See the License for the specific language governing permissions and + ~ limitations under the License. + ~ + --> + +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF000000" + android:pathData="M20,8h-3L17,4L3,4c-1.1,0 -2,0.9 -2,2v11h2c0,1.66 1.34,3 3,3s3,-1.34 3,-3h6c0,1.66 1.34,3 3,3s3,-1.34 3,-3h2v-5l-3,-4zM6,18.5c-0.83,0 -1.5,-0.67 -1.5,-1.5s0.67,-1.5 1.5,-1.5 1.5,0.67 1.5,1.5 -0.67,1.5 -1.5,1.5zM19.5,9.5l1.96,2.5L17,12L17,9.5h2.5zM18,18.5c-0.83,0 -1.5,-0.67 -1.5,-1.5s0.67,-1.5 1.5,-1.5 1.5,0.67 1.5,1.5 -0.67,1.5 -1.5,1.5z"/> +</vector> diff --git a/qqqsampleandroidmobileapp/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/qqqsampleandroidmobileapp/src/main/res/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 0000000..036d09b --- /dev/null +++ b/qqqsampleandroidmobileapp/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8"?> +<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android"> + <background android:drawable="@color/ic_launcher_background"/> + <foreground android:drawable="@mipmap/ic_launcher_foreground"/> +</adaptive-icon> \ No newline at end of file diff --git a/qqqsampleandroidmobileapp/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/qqqsampleandroidmobileapp/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml new file mode 100644 index 0000000..036d09b --- /dev/null +++ b/qqqsampleandroidmobileapp/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8"?> +<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android"> + <background android:drawable="@color/ic_launcher_background"/> + <foreground android:drawable="@mipmap/ic_launcher_foreground"/> +</adaptive-icon> \ No newline at end of file diff --git a/qqqsampleandroidmobileapp/src/main/res/mipmap-hdpi/ic_launcher.webp b/qqqsampleandroidmobileapp/src/main/res/mipmap-hdpi/ic_launcher.webp new file mode 100644 index 0000000..2684b60 Binary files /dev/null and b/qqqsampleandroidmobileapp/src/main/res/mipmap-hdpi/ic_launcher.webp differ diff --git a/qqqsampleandroidmobileapp/src/main/res/mipmap-hdpi/ic_launcher_foreground.webp b/qqqsampleandroidmobileapp/src/main/res/mipmap-hdpi/ic_launcher_foreground.webp new file mode 100644 index 0000000..a3d2cb5 Binary files /dev/null and b/qqqsampleandroidmobileapp/src/main/res/mipmap-hdpi/ic_launcher_foreground.webp differ diff --git a/qqqsampleandroidmobileapp/src/main/res/mipmap-hdpi/ic_launcher_round.webp b/qqqsampleandroidmobileapp/src/main/res/mipmap-hdpi/ic_launcher_round.webp new file mode 100644 index 0000000..c7a7d99 Binary files /dev/null and b/qqqsampleandroidmobileapp/src/main/res/mipmap-hdpi/ic_launcher_round.webp differ diff --git a/qqqsampleandroidmobileapp/src/main/res/mipmap-mdpi/ic_launcher.webp b/qqqsampleandroidmobileapp/src/main/res/mipmap-mdpi/ic_launcher.webp new file mode 100644 index 0000000..416b2c7 Binary files /dev/null and b/qqqsampleandroidmobileapp/src/main/res/mipmap-mdpi/ic_launcher.webp differ diff --git a/qqqsampleandroidmobileapp/src/main/res/mipmap-mdpi/ic_launcher_foreground.webp b/qqqsampleandroidmobileapp/src/main/res/mipmap-mdpi/ic_launcher_foreground.webp new file mode 100644 index 0000000..1048cac Binary files /dev/null and b/qqqsampleandroidmobileapp/src/main/res/mipmap-mdpi/ic_launcher_foreground.webp differ diff --git a/qqqsampleandroidmobileapp/src/main/res/mipmap-mdpi/ic_launcher_round.webp b/qqqsampleandroidmobileapp/src/main/res/mipmap-mdpi/ic_launcher_round.webp new file mode 100644 index 0000000..a375db4 Binary files /dev/null and b/qqqsampleandroidmobileapp/src/main/res/mipmap-mdpi/ic_launcher_round.webp differ diff --git a/qqqsampleandroidmobileapp/src/main/res/mipmap-xhdpi/ic_launcher.webp b/qqqsampleandroidmobileapp/src/main/res/mipmap-xhdpi/ic_launcher.webp new file mode 100644 index 0000000..9b61471 Binary files /dev/null and b/qqqsampleandroidmobileapp/src/main/res/mipmap-xhdpi/ic_launcher.webp differ diff --git a/qqqsampleandroidmobileapp/src/main/res/mipmap-xhdpi/ic_launcher_foreground.webp b/qqqsampleandroidmobileapp/src/main/res/mipmap-xhdpi/ic_launcher_foreground.webp new file mode 100644 index 0000000..3195d8b Binary files /dev/null and b/qqqsampleandroidmobileapp/src/main/res/mipmap-xhdpi/ic_launcher_foreground.webp differ diff --git a/qqqsampleandroidmobileapp/src/main/res/mipmap-xhdpi/ic_launcher_round.webp b/qqqsampleandroidmobileapp/src/main/res/mipmap-xhdpi/ic_launcher_round.webp new file mode 100644 index 0000000..35c8b51 Binary files /dev/null and b/qqqsampleandroidmobileapp/src/main/res/mipmap-xhdpi/ic_launcher_round.webp differ diff --git a/qqqsampleandroidmobileapp/src/main/res/mipmap-xxhdpi/ic_launcher.webp b/qqqsampleandroidmobileapp/src/main/res/mipmap-xxhdpi/ic_launcher.webp new file mode 100644 index 0000000..91a75fe Binary files /dev/null and b/qqqsampleandroidmobileapp/src/main/res/mipmap-xxhdpi/ic_launcher.webp differ diff --git a/qqqsampleandroidmobileapp/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.webp b/qqqsampleandroidmobileapp/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.webp new file mode 100644 index 0000000..385627d Binary files /dev/null and b/qqqsampleandroidmobileapp/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.webp differ diff --git a/qqqsampleandroidmobileapp/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp b/qqqsampleandroidmobileapp/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp new file mode 100644 index 0000000..514f551 Binary files /dev/null and b/qqqsampleandroidmobileapp/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp differ diff --git a/qqqsampleandroidmobileapp/src/main/res/mipmap-xxxhdpi/ic_launcher.webp b/qqqsampleandroidmobileapp/src/main/res/mipmap-xxxhdpi/ic_launcher.webp new file mode 100644 index 0000000..13fd79d Binary files /dev/null and b/qqqsampleandroidmobileapp/src/main/res/mipmap-xxxhdpi/ic_launcher.webp differ diff --git a/qqqsampleandroidmobileapp/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.webp b/qqqsampleandroidmobileapp/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.webp new file mode 100644 index 0000000..ddde0da Binary files /dev/null and b/qqqsampleandroidmobileapp/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.webp differ diff --git a/qqqsampleandroidmobileapp/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp b/qqqsampleandroidmobileapp/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp new file mode 100644 index 0000000..6a8e1bf Binary files /dev/null and b/qqqsampleandroidmobileapp/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp differ diff --git a/qqqsampleandroidmobileapp/src/main/res/values/colors.xml b/qqqsampleandroidmobileapp/src/main/res/values/colors.xml new file mode 100644 index 0000000..8fc8584 --- /dev/null +++ b/qqqsampleandroidmobileapp/src/main/res/values/colors.xml @@ -0,0 +1,30 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + ~ QQQ - Low-code Application Framework for Engineers. + ~ Copyright (C) 2024-2024. Kingsrook, LLC + ~ 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + ~ contact@kingsrook.com + ~ https://github.com/Kingsrook/ + ~ + ~ Licensed under the Apache License, Version 2.0 (the "License"); + ~ you may not use this file except in compliance with the License. + ~ You may obtain a copy of the License at + ~ + ~ https://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, software + ~ distributed under the License is distributed on an "AS IS" BASIS, + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ~ See the License for the specific language governing permissions and + ~ limitations under the License. + --> + +<resources> + <color name="purple_200">#FFBB86FC</color> + <color name="purple_500">#FF6200EE</color> + <color name="purple_700">#FF3700B3</color> + <color name="teal_200">#FF03DAC5</color> + <color name="teal_700">#FF018786</color> + <color name="black">#FF000000</color> + <color name="white">#FFFFFFFF</color> +</resources> \ No newline at end of file diff --git a/qqqsampleandroidmobileapp/src/main/res/values/font_certs.xml b/qqqsampleandroidmobileapp/src/main/res/values/font_certs.xml new file mode 100644 index 0000000..2803d65 --- /dev/null +++ b/qqqsampleandroidmobileapp/src/main/res/values/font_certs.xml @@ -0,0 +1,37 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + ~ QQQ - Low-code Application Framework for Engineers. + ~ Copyright (C) 2004-2024. Kingsrook, LLC + ~ 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + ~ contact@kingsrook.com + ~ https://github.com/Kingsrook/ + ~ + ~ Licensed under the Apache License, Version 2.0 (the "License"); + ~ you may not use this file except in compliance with the License. + ~ You may obtain a copy of the License at + ~ + ~ https://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, software + ~ distributed under the License is distributed on an "AS IS" BASIS, + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ~ See the License for the specific language governing permissions and + ~ limitations under the License. + ~ + --> +<resources> + <array name="com_google_android_gms_fonts_certs"> + <item>@array/com_google_android_gms_fonts_certs_dev</item> + <item>@array/com_google_android_gms_fonts_certs_prod</item> + </array> + <string-array name="com_google_android_gms_fonts_certs_dev"> + <item> + MIIEqDCCA5CgAwIBAgIJANWFuGx90071MA0GCSqGSIb3DQEBBAUAMIGUMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNTW91bnRhaW4gVmlldzEQMA4GA1UEChMHQW5kcm9pZDEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9pZDEiMCAGCSqGSIb3DQEJARYTYW5kcm9pZEBhbmRyb2lkLmNvbTAeFw0wODA0MTUyMzM2NTZaFw0zNTA5MDEyMzM2NTZaMIGUMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNTW91bnRhaW4gVmlldzEQMA4GA1UEChMHQW5kcm9pZDEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9pZDEiMCAGCSqGSIb3DQEJARYTYW5kcm9pZEBhbmRyb2lkLmNvbTCCASAwDQYJKoZIhvcNAQEBBQADggENADCCAQgCggEBANbOLggKv+IxTdGNs8/TGFy0PTP6DHThvbbR24kT9ixcOd9W+EaBPWW+wPPKQmsHxajtWjmQwWfna8mZuSeJS48LIgAZlKkpFeVyxW0qMBujb8X8ETrWy550NaFtI6t9+u7hZeTfHwqNvacKhp1RbE6dBRGWynwMVX8XW8N1+UjFaq6GCJukT4qmpN2afb8sCjUigq0GuMwYXrFVee74bQgLHWGJwPmvmLHC69EH6kWr22ijx4OKXlSIx2xT1AsSHee70w5iDBiK4aph27yH3TxkXy9V89TDdexAcKk/cVHYNnDBapcavl7y0RiQ4biu8ymM8Ga/nmzhRKya6G0cGw8CAQOjgfwwgfkwHQYDVR0OBBYEFI0cxb6VTEM8YYY6FbBMvAPyT+CyMIHJBgNVHSMEgcEwgb6AFI0cxb6VTEM8YYY6FbBMvAPyT+CyoYGapIGXMIGUMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNTW91bnRhaW4gVmlldzEQMA4GA1UEChMHQW5kcm9pZDEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9pZDEiMCAGCSqGSIb3DQEJARYTYW5kcm9pZEBhbmRyb2lkLmNvbYIJANWFuGx90071MAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEEBQADggEBABnTDPEF+3iSP0wNfdIjIz1AlnrPzgAIHVvXxunW7SBrDhEglQZBbKJEk5kT0mtKoOD1JMrSu1xuTKEBahWRbqHsXclaXjoBADb0kkjVEJu/Lh5hgYZnOjvlba8Ld7HCKePCVePoTJBdI4fvugnL8TsgK05aIskyY0hKI9L8KfqfGTl1lzOv2KoWD0KWwtAWPoGChZxmQ+nBli+gwYMzM1vAkP+aayLe0a1EQimlOalO762r0GXO0ks+UeXde2Z4e+8S/pf7pITEI/tP+MxJTALw9QUWEv9lKTk+jkbqxbsh8nfBUapfKqYn0eidpwq2AzVp3juYl7//fKnaPhJD9gs= + </item> + </string-array> + <string-array name="com_google_android_gms_fonts_certs_prod"> + <item> + MIIEQzCCAyugAwIBAgIJAMLgh0ZkSjCNMA0GCSqGSIb3DQEBBAUAMHQxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1Nb3VudGFpbiBWaWV3MRQwEgYDVQQKEwtHb29nbGUgSW5jLjEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9pZDAeFw0wODA4MjEyMzEzMzRaFw0zNjAxMDcyMzEzMzRaMHQxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1Nb3VudGFpbiBWaWV3MRQwEgYDVQQKEwtHb29nbGUgSW5jLjEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9pZDCCASAwDQYJKoZIhvcNAQEBBQADggENADCCAQgCggEBAKtWLgDYO6IIrgqWbxJOKdoR8qtW0I9Y4sypEwPpt1TTcvZApxsdyxMJZ2JORland2qSGT2y5b+3JKkedxiLDmpHpDsz2WCbdxgxRczfey5YZnTJ4VZbH0xqWVW/8lGmPav5xVwnIiJS6HXk+BVKZF+JcWjAsb/GEuq/eFdpuzSqeYTcfi6idkyugwfYwXFU1+5fZKUaRKYCwkkFQVfcAs1fXA5V+++FGfvjJ/CxURaSxaBvGdGDhfXE28LWuT9ozCl5xw4Yq5OGazvV24mZVSoOO0yZ31j7kYvtwYK6NeADwbSxDdJEqO4k//0zOHKrUiGYXtqw/A0LFFtqoZKFjnkCAQOjgdkwgdYwHQYDVR0OBBYEFMd9jMIhF1Ylmn/Tgt9r45jk14alMIGmBgNVHSMEgZ4wgZuAFMd9jMIhF1Ylmn/Tgt9r45jk14aloXikdjB0MQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNTW91bnRhaW4gVmlldzEUMBIGA1UEChMLR29vZ2xlIEluYy4xEDAOBgNVBAsTB0FuZHJvaWQxEDAOBgNVBAMTB0FuZHJvaWSCCQDC4IdGZEowjTAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBBAUAA4IBAQBt0lLO74UwLDYKqs6Tm8/yzKkEu116FmH4rkaymUIE0P9KaMftGlMexFlaYjzmB2OxZyl6euNXEsQH8gjwyxCUKRJNexBiGcCEyj6z+a1fuHHvkiaai+KL8W1EyNmgjmyy8AW7P+LLlkR+ho5zEHatRbM/YAnqGcFh5iZBqpknHf1SKMXFh4dd239FJ1jWYfbMDMy3NS5CTMQ2XFI1MvcyUTdZPErjQfTbQe3aDQsQcafEQPD+nqActifKZ0Np0IS9L9kR/wbNvyz6ENwPiTrjV2KRkEjH78ZMcUQXg0L3BYHJ3lc69Vs5Ddf9uUGGMYldX3WfMBEmh/9iFBDAaTCK + </item> + </string-array> +</resources> diff --git a/qqqsampleandroidmobileapp/src/main/res/values/ic_launcher_background.xml b/qqqsampleandroidmobileapp/src/main/res/values/ic_launcher_background.xml new file mode 100644 index 0000000..2e8a152 --- /dev/null +++ b/qqqsampleandroidmobileapp/src/main/res/values/ic_launcher_background.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <color name="ic_launcher_background">#E0E0E0</color> +</resources> \ No newline at end of file diff --git a/qqqsampleandroidmobileapp/src/main/res/values/strings.xml b/qqqsampleandroidmobileapp/src/main/res/values/strings.xml new file mode 100644 index 0000000..474606c --- /dev/null +++ b/qqqsampleandroidmobileapp/src/main/res/values/strings.xml @@ -0,0 +1,27 @@ +<!-- + ~ QQQ - Low-code Application Framework for Engineers. + ~ Copyright (C) 2024-2024. Kingsrook, LLC + ~ 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + ~ contact@kingsrook.com + ~ https://github.com/Kingsrook/ + ~ + ~ Licensed under the Apache License, Version 2.0 (the "License"); + ~ you may not use this file except in compliance with the License. + ~ You may obtain a copy of the License at + ~ + ~ https://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, software + ~ distributed under the License is distributed on an "AS IS" BASIS, + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ~ See the License for the specific language governing permissions and + ~ limitations under the License. + --> + +<resources> + <string name="app_name">qqqSampleAndroidMobileApp</string> + <string name="app_version">0.1</string> + <string name="app_title">Sample App</string> + <string name="app_scheme">qqqsampleapp</string> + <string name="application_build_timestamp">1970-01-01 00:00:00</string> +</resources> \ No newline at end of file diff --git a/qqqsampleandroidmobileapp/src/main/res/values/themes.xml b/qqqsampleandroidmobileapp/src/main/res/values/themes.xml new file mode 100644 index 0000000..193409b --- /dev/null +++ b/qqqsampleandroidmobileapp/src/main/res/values/themes.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + ~ QQQ - Low-code Application Framework for Engineers. + ~ Copyright (C) 2024-2024. Kingsrook, LLC + ~ 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + ~ contact@kingsrook.com + ~ https://github.com/Kingsrook/ + ~ + ~ Licensed under the Apache License, Version 2.0 (the "License"); + ~ you may not use this file except in compliance with the License. + ~ You may obtain a copy of the License at + ~ + ~ https://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, software + ~ distributed under the License is distributed on an "AS IS" BASIS, + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ~ See the License for the specific language governing permissions and + ~ limitations under the License. + --> + +<resources> + + <style name="Theme.AndroidDevProject" parent="android:Theme.Material.Light.NoActionBar" /> +</resources> \ No newline at end of file diff --git a/qqqsampleandroidmobileapp/src/main/res/xml/data_extraction_rules.xml b/qqqsampleandroidmobileapp/src/main/res/xml/data_extraction_rules.xml new file mode 100644 index 0000000..2c6bad3 --- /dev/null +++ b/qqqsampleandroidmobileapp/src/main/res/xml/data_extraction_rules.xml @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="utf-8"?> +<data-extraction-rules> + <cloud-backup> + <exclude domain="root" path="." /> + <exclude domain="file" path="." /> + <exclude domain="database" path="." /> + <exclude domain="sharedpref" path="." /> + <exclude domain="external" path="." /> + </cloud-backup> + <device-transfer> + <exclude domain="root" path="." /> + <exclude domain="file" path="." /> + <exclude domain="database" path="." /> + <exclude domain="sharedpref" path="." /> + <exclude domain="external" path="." /> + </device-transfer> +</data-extraction-rules> diff --git a/qqqsampleandroidmobileapp/src/test/java/com/kingsrook/qqq/sampleandroidmobileapp/ExampleUnitTest.kt b/qqqsampleandroidmobileapp/src/test/java/com/kingsrook/qqq/sampleandroidmobileapp/ExampleUnitTest.kt new file mode 100644 index 0000000..6fd8574 --- /dev/null +++ b/qqqsampleandroidmobileapp/src/test/java/com/kingsrook/qqq/sampleandroidmobileapp/ExampleUnitTest.kt @@ -0,0 +1,40 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2024-2024. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.kingsrook.qqq.sampleandroidmobileapp + +import org.junit.Test + +import org.junit.Assert.assertEquals + +/******************************************************************************* + ** Example local unit test, which will execute on the development machine (host). + ** See [testing documentation](http://d.android.com/tools/testing). + *******************************************************************************/ +class ExampleUnitTest { + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun addition_isCorrect() { + assertEquals(4, 2 + 2) + } +} diff --git a/scanner-host/.gitignore b/scanner-host/.gitignore new file mode 100644 index 0000000..84c048a --- /dev/null +++ b/scanner-host/.gitignore @@ -0,0 +1 @@ +/build/ diff --git a/scanner-host/build.gradle.kts b/scanner-host/build.gradle.kts new file mode 100644 index 0000000..e0d6eee --- /dev/null +++ b/scanner-host/build.gradle.kts @@ -0,0 +1,262 @@ +/* Copyright (c) 2026 QRunIO. SPDX-License-Identifier: Apache-2.0 */ +import java.security.MessageDigest + +plugins { + alias(libs.plugins.android.application) + alias(libs.plugins.kotlin.android) + alias(libs.plugins.aboutlibraries) +} + +aboutLibraries { + configPath = "scanner-host/third-party" + offlineMode = true + fetchRemoteLicense = false + fetchRemoteFunding = false + includePlatform = false + filterVariants = arrayOf("debug", "release", "e2e", "qa") + // The plugin also scans compile classpaths. This SDK is not redistributed; + // verifyEmdkSdk separately forbids it in every runtime classpath. + exclusionPatterns = listOf(Regex("^com\\.symbol:emdk$").toPattern()) + strictMode = com.mikepenz.aboutlibraries.plugin.StrictMode.FAIL + allowedLicenses = arrayOf("Apache-2.0", "MIT", "MPL-2.0", "BSD-2-Clause", "Apache-2.0 WITH LLVM-exception") + prettyPrint = true +} + +// AboutLibraries 10.9.2 marks the collected graph @Internal. Without this input, +// changing a selected dependency can reuse the previous dependency_cache.json. +tasks.withType<com.mikepenz.aboutlibraries.plugin.AboutLibrariesCollectorTask>().configureEach { + inputs.property("resolvedDependencyCoordinates", providers.provider { + listOf("debug", "release", "e2e", "qa").flatMap { variant -> + listOf("CompileClasspath", "RuntimeClasspath").flatMap { suffix -> + val configurationName = "$variant$suffix" + configurations.getByName(configurationName).incoming.resolutionResult.allComponents.map { component -> + "$configurationName:${component.id.displayName}" + } + } + }.sorted() + }) +} + +val scannerVersionCode = providers.gradleProperty("scannerVersionCode").orElse("1").get().toInt() +val scannerVersionName = providers.gradleProperty("scannerVersionName").orElse("0.1.0").get() +require(scannerVersionCode in 1..2100000000) { "scannerVersionCode must be a positive Android version code" } +require(Regex("[0-9]+\\.[0-9]+\\.[0-9]+(?:-[A-Za-z0-9.-]+)?").matches(scannerVersionName)) { + "scannerVersionName must be a semantic version" +} +val signingVariables = listOf("SCANNER_KEYSTORE", "SCANNER_STORE_PASSWORD", "SCANNER_KEY_ALIAS", "SCANNER_KEY_PASSWORD") +val signingValues = signingVariables.associateWith { providers.environmentVariable(it).orNull } +val hasSigningValues = signingValues.values.any { !it.isNullOrBlank() } +val scannerTestBuildType = providers.gradleProperty("scannerTestBuildType").orElse("e2e").get() +require(scannerTestBuildType in setOf("e2e", "qa")) { "scannerTestBuildType must be e2e or qa" } +require(!hasSigningValues || signingValues.values.all { !it.isNullOrBlank() }) { + "Release signing requires all four SCANNER signing environment variables" +} + +android { + namespace = "io.qrun.mobile.scanner" + compileSdk = 35 + defaultConfig { + applicationId = "io.qrun.mobile.scanner" + minSdk = 26 + targetSdk = 35 + versionCode = scannerVersionCode + versionName = scannerVersionName + testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + manifestPlaceholders["auth0Domain"] = "unused.invalid" + manifestPlaceholders["auth0Scheme"] = "io.qrun.mobile.scanner" + } + signingConfigs { + if(hasSigningValues) { + create("production") { + storeFile = file(signingValues.getValue("SCANNER_KEYSTORE")!!) + storePassword = signingValues.getValue("SCANNER_STORE_PASSWORD") + keyAlias = signingValues.getValue("SCANNER_KEY_ALIAS") + keyPassword = signingValues.getValue("SCANNER_KEY_PASSWORD") + } + } + } + buildTypes { + getByName("release") { + if(hasSigningValues) signingConfig = signingConfigs.getByName("production") + } + create("e2e") { + initWith(getByName("debug")) + applicationIdSuffix = ".e2e" + matchingFallbacks += "debug" + } + create("qa") { + initWith(getByName("debug")) + applicationIdSuffix = ".qa" + matchingFallbacks += "debug" + } + } + testBuildType = scannerTestBuildType + sourceSets.getByName("debug").java.srcDir("src/production/java") + sourceSets.getByName("release").java.srcDir("src/production/java") + sourceSets.getByName("qa").java.srcDir("src/production/java") + if(scannerTestBuildType == "qa") { + sourceSets.getByName("androidTestQa").java.srcDir("src/qaAndroidTest/java") + sourceSets.getByName("androidTestQa").manifest.srcFile("src/qaAndroidTest/AndroidManifest.xml") + } + buildFeatures { compose = true; buildConfig = true } + composeOptions { kotlinCompilerExtensionVersion = "1.5.1" } + compileOptions { + sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 + } + kotlinOptions { jvmTarget = "1.8" } + packaging { resources.excludes += "/META-INF/{AL2.0,LGPL2.1}" } +} + +dependencies { + compileOnly(libs.zebra.emdk) + implementation(libs.aboutlibraries.compose) + implementation(project(":qqq:android:core")) + implementation(project(":qqq:android:mobileapp")) + implementation(libs.androidx.core.ktx) + implementation(libs.androidx.activity.compose) + implementation(libs.androidx.lifecycle.viewmodel.compose) + implementation(libs.androidx.lifecycle.runtime.ktx) + implementation(libs.androidx.navigation.compose) + implementation(libs.androidx.datastore.preferences) + implementation(platform(libs.androidx.compose.bom)) + implementation(libs.androidx.material3) + implementation(libs.androidx.ui) + implementation(libs.kotlinx.serialization.json) + implementation(libs.coil.compose) + implementation(libs.coil.svg) + implementation(libs.okhttp) + testImplementation(libs.junit) + testImplementation(libs.okhttp.mockwebserver) + testImplementation(libs.json.test) + testImplementation(libs.kotlinx.coroutines.test) + androidTestImplementation(libs.androidx.junit) + androidTestImplementation(libs.androidx.espresso.core) + androidTestImplementation(platform(libs.androidx.compose.bom)) + androidTestImplementation(libs.androidx.ui.test.junit4) +} + +// The vendor SDK is compile-only, supplied at runtime by Zebra firmware. Verify +// its independently reviewed bytes before any variant compiler consumes them. +val verifyEmdkSdk = tasks.register("verifyEmdkSdk") { + doLast { + configurations.filter { it.isCanBeResolved && it.name.endsWith("RuntimeClasspath") }.forEach { runtime -> + val vendorRuntime = runtime.incoming.artifactView { + componentFilter { + it is org.gradle.api.artifacts.component.ModuleComponentIdentifier && it.group == "com.symbol" && it.module == "emdk" + } + }.artifacts.artifacts + check(vendorRuntime.isEmpty()) { "Zebra EMDK must remain compile-only; found in ${runtime.name}" } + } + listOf("debug", "release", "e2e", "qa").forEach { variant -> + val artifacts = configurations.getByName("${variant}CompileClasspath").incoming.artifactView { + componentFilter { + it is org.gradle.api.artifacts.component.ModuleComponentIdentifier && it.group == "com.symbol" && it.module == "emdk" + } + }.artifacts.artifacts + check(artifacts.size == 1) { "Expected one Zebra EMDK compile-only SDK for $variant" } + val artifact = artifacts.single() + val id = artifact.id.componentIdentifier as org.gradle.api.artifacts.component.ModuleComponentIdentifier + check(id.version == "11.0.134") { "Unexpected Zebra EMDK SDK version for $variant" } + val digest = MessageDigest.getInstance("SHA-256").digest(artifact.file.readBytes()) + .joinToString("") { "%02x".format(it) } + check(digest == "e0c6b481c25bf641333bf644de940f1ac7f3fc4f8d5c92ba4ae62ea2252c4e36") { + "Zebra EMDK SDK checksum differs from the reviewed 11.0.134 artifact" + } + } + } +} +tasks.matching { it.name.startsWith("compile") || it.name == "preBuild" }.configureEach { dependsOn(verifyEmdkSdk) } + +// AboutLibraries generates/parses notices. Its strict mode rejects unapproved license +// IDs, but does not reject an omitted dependency or empty license text. Validate the +// standard report against Gradle's resolved runtime before any variant is packaged. +android.applicationVariants.all { + val variantName = name + val capitalizedName = name.replaceFirstChar { it.uppercaseChar() } + val definitionsName = "prepareLibraryDefinitions$capitalizedName" + val verifyNotices = tasks.register("verify${capitalizedName}ThirdPartyNotices") { + group = "verification" + description = "Verifies bundled license text and resolved $variantName runtime coverage" + dependsOn(definitionsName) + doLast { + val reportFile = tasks.named<com.mikepenz.aboutlibraries.plugin.AboutLibrariesTask>(definitionsName) + .get().combinedLibrariesOutputFile + check(reportFile.isFile) { "AboutLibraries did not generate $reportFile" } + val report = groovy.json.JsonSlurper().parse(reportFile) as Map<*, *> + val libraries = (report["libraries"] as List<*>).map { it as Map<*, *> } + val licenses = report["licenses"] as Map<*, *> + check(libraries.isNotEmpty()) { "Generated third-party library list is empty" } + val byId = libraries.associateBy { it["uniqueId"] as String } + val runtime = configurations.getByName("${variantName}RuntimeClasspath") + .incoming.artifactView { + componentFilter { it is org.gradle.api.artifacts.component.ModuleComponentIdentifier } + }.artifacts.artifacts.mapNotNull { + it.id.componentIdentifier as? org.gradle.api.artifacts.component.ModuleComponentIdentifier + }.associate { "${it.group}:${it.module}" to it.version } + check(runtime.isNotEmpty()) { "No external runtime dependencies resolved for $variantName" } + runtime.forEach { (id, version) -> + check(byId[id]?.get("artifactVersion") == version) { + "Missing or stale third-party notice for runtime dependency $id:$version" + } + } + libraries.forEach { library -> + val references = library["licenses"] as? List<*> + check(!references.isNullOrEmpty()) { "No license declared for ${library["uniqueId"]}" } + references.forEach { reference -> + val license = licenses[reference] as? Map<*, *> + check(!(license?.get("content") as? String).isNullOrBlank()) { + "Missing bundled license text $reference for ${library["uniqueId"]}" + } + check(license?.get("spdxId") != "MIT" || library["uniqueId"] == "com.auth0.android:auth0") { + "A new MIT dependency needs its own reviewed copyright notice: ${library["uniqueId"]}" + } + check(license?.get("spdxId") != "MPL-2.0" || library["uniqueId"] == "org.publicsuffix:list") { + "MPL-2.0 is reviewed only for the embedded Public Suffix List: ${library["uniqueId"]}" + } + check(license?.get("spdxId") != "BSD-2-Clause" || library["uniqueId"] == "android.ndk:bionic-crt") { + "BSD-2-Clause is reviewed only for the pinned NDK startup objects: ${library["uniqueId"]}" + } + check(license?.get("spdxId") != "Apache-2.0 WITH LLVM-exception" || library["uniqueId"] == "android.ndk:llvm-runtime") { + "LLVM exceptions are reviewed only for the pinned NDK runtime/header notice: ${library["uniqueId"]}" + } + } + } + setOf("google:material-design-icons", "org.publicsuffix:list", "io.qrun:qqq-android", + "android.ndk:bionic-crt", "android.ndk:llvm-runtime").forEach { + check(byId.containsKey(it)) { "Missing supplemental bundled notice: $it" } + } + mapOf( + "androidx.graphics:graphics-path" to ("1.0.1" to "AndroidX-Native-Graphics"), + "androidx.datastore:datastore-core-android" to ("1.1.1" to "AndroidX-Native-DataStore") + ).forEach { (id, reviewed) -> + check(runtime[id] == reviewed.first && + (byId[id]?.get("licenses") as? List<*>)?.firstOrNull() == reviewed.second) { + "Review native source/toolchain notices after changing $id; its reviewed notice must remain visible first" + } + } + listOf("android.ndk:bionic-crt", "android.ndk:llvm-runtime").forEach { + check(byId.getValue(it)["artifactVersion"] == "25.2.9519653") { + "Native runtime notice must identify the reviewed Android NDK r25c build" + } + } + check(byId.getValue("org.publicsuffix:list")["artifactVersion"] == + "bundled with OkHttp ${runtime["com.squareup.okhttp3:okhttp"]}") { + "Review and update the embedded Public Suffix List notice after changing OkHttp" + } + val projectNotice = ((licenses["QQQ-Android"] as Map<*, *>)["content"] as String).replace("\r\n", "\n") + check(projectNotice.contains(rootProject.file("NOTICE").readText().replace("\r\n", "\n")) && + projectNotice.contains(rootProject.file("LICENSE").readText().replace("\r\n", "\n"))) { + "Bundled QQQ project notice is stale; refresh it from LICENSE and NOTICE" + } + // Distribution copy remains the unmodified standard AboutLibraries JSON. + val distribution = layout.buildDirectory.dir("reports/third-party/$variantName").get().asFile + distribution.mkdirs() + reportFile.copyTo(distribution.resolve("aboutlibraries.json"), overwrite = true) + rootProject.file("NOTICE").copyTo(distribution.resolve("NOTICE"), overwrite = true) + rootProject.file("LICENSE").copyTo(distribution.resolve("LICENSE"), overwrite = true) + logger.lifecycle("Verified ${runtime.size} runtime dependencies and ${libraries.size} bundled notice entries for $variantName") + } + } + mergeResourcesProvider.configure { dependsOn(verifyNotices) } +} diff --git a/scanner-host/src/androidTest/java/io/qrun/mobile/scanner/AppScreenCaptureTest.kt b/scanner-host/src/androidTest/java/io/qrun/mobile/scanner/AppScreenCaptureTest.kt new file mode 100644 index 0000000..7a88807 --- /dev/null +++ b/scanner-host/src/androidTest/java/io/qrun/mobile/scanner/AppScreenCaptureTest.kt @@ -0,0 +1,75 @@ +/* Copyright (c) 2026 QRunIO. SPDX-License-Identifier: Apache-2.0 */ +package io.qrun.mobile.scanner + +import android.graphics.BitmapFactory +import android.graphics.Rect +import androidx.activity.compose.setContent +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxHeight +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.test.junit4.createAndroidComposeRule +import androidx.lifecycle.lifecycleScope +import androidx.test.ext.junit.runners.AndroidJUnit4 +import java.util.concurrent.CountDownLatch +import java.util.concurrent.TimeUnit +import kotlinx.coroutines.launch +import org.junit.Assert.assertNotNull +import org.junit.Assert.assertTrue +import org.junit.Rule +import org.junit.Test +import org.junit.runner.RunWith + +/******************************************************************************* + ** + *******************************************************************************/ +@RunWith(AndroidJUnit4::class) +class AppScreenCaptureTest { + @get:Rule + val ui = createAndroidComposeRule<ScannerActivity>() + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun pixelCopyCapturesActualAppPixelsAsABoundedJpeg() { + ui.runOnUiThread { + ui.activity.setContent { + Row(Modifier.fillMaxSize()) { + Box(Modifier.weight(1f).fillMaxHeight().background(Color.Red)) + Box(Modifier.weight(1f).fillMaxHeight().background(Color.Blue)) + } + } + } + ui.waitForIdle() + val done = CountDownLatch(1) + var result: ScreenFrame? = null + ui.runOnUiThread { + val view = ui.activity.findViewById<android.view.View>(android.R.id.content) + val location = IntArray(2) + view.getLocationInWindow(location) + val bounds = Rect(location[0], location[1], location[0] + view.width, location[1] + view.height) + ui.activity.lifecycleScope.launch { + try { + result = captureAppScreen(ui.activity.window, bounds, ScreenLease("test", 30000, 1000, 640, 1280, 262144, 0)) + } finally { + done.countDown() + } + } + } + assertTrue("PixelCopy must finish", done.await(20, TimeUnit.SECONDS)) + val frame = requireNotNull(result) { "PixelCopy must capture the foreground app window" } + assertTrue(frame.jpeg.size <= 262144) + assertTrue(frame.width <= 640 && frame.height <= 1280) + val bitmap = BitmapFactory.decodeByteArray(frame.jpeg, 0, frame.jpeg.size) + assertNotNull(bitmap) + val left = bitmap.getPixel(bitmap.width / 4, bitmap.height / 2) + val right = bitmap.getPixel(bitmap.width * 3 / 4, bitmap.height / 2) + assertTrue("Captured left panel must be red", android.graphics.Color.red(left) > 200 && android.graphics.Color.blue(left) < 40) + assertTrue("Captured right panel must be blue", android.graphics.Color.blue(right) > 200 && android.graphics.Color.red(right) < 40) + bitmap.recycle() + } +} diff --git a/scanner-host/src/androidTest/java/io/qrun/mobile/scanner/DiagnosticScreenTest.kt b/scanner-host/src/androidTest/java/io/qrun/mobile/scanner/DiagnosticScreenTest.kt new file mode 100644 index 0000000..339f0c3 --- /dev/null +++ b/scanner-host/src/androidTest/java/io/qrun/mobile/scanner/DiagnosticScreenTest.kt @@ -0,0 +1,51 @@ +/* Copyright (c) 2026 QRunIO. SPDX-License-Identifier: Apache-2.0 */ +package io.qrun.mobile.scanner + +import androidx.activity.compose.setContent +import androidx.compose.material3.MaterialTheme +import androidx.compose.ui.test.assertIsDisplayed +import androidx.compose.ui.test.junit4.createAndroidComposeRule +import androidx.compose.ui.test.onNodeWithText +import androidx.compose.ui.test.performClick +import androidx.compose.ui.test.performScrollTo +import androidx.test.ext.junit.runners.AndroidJUnit4 +import org.junit.Assert.assertTrue +import org.junit.Rule +import org.junit.Test +import org.junit.runner.RunWith + +/******************************************************************************* + ** + *******************************************************************************/ +@RunWith(AndroidJUnit4::class) +class DiagnosticScreenTest { + @get:Rule + val ui = createAndroidComposeRule<ScannerActivity>() + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun filtersPausesClearsAndReturnsWithoutNetworkOrCredentials() { + val log = DiagnosticLog() + log.record(DiagnosticCode.CONNECTION_OK, 200, 15) + log.record(DiagnosticCode.DEVICE_RESPONSE, 403, 25) + var returned = false + ui.runOnUiThread { ui.activity.setContent { MaterialTheme { DiagnosticScreen(log) { returned = true } } } } + ui.onNodeWithText("Reachable").assertIsDisplayed() + ui.onNodeWithText("Problems").performScrollTo().performClick() + ui.onNodeWithText("Device request failed").performScrollTo().assertIsDisplayed() + ui.onNodeWithText("Server reachable").assertDoesNotExist() + ui.onNodeWithText("Pause updates").performScrollTo().performClick() + log.record(DiagnosticCode.SESSION_RESPONSE, 500, 50) + ui.onNodeWithText("Session request failed").assertDoesNotExist() + ui.onNodeWithText("Resume live updates").performScrollTo().performClick() + ui.waitForIdle() + ui.onNodeWithText("Session request failed").performScrollTo().assertIsDisplayed() + ui.onNodeWithText("Clear").performClick() + ui.onNodeWithText("No activity recorded yet. New events appear here while this screen is live.").performScrollTo().assertIsDisplayed() + assertTrue(log.snapshot().isEmpty()) + ui.onNodeWithText("Back").performClick() + ui.runOnIdle { assertTrue(returned) } + } +} diff --git a/scanner-host/src/androidTest/java/io/qrun/mobile/scanner/OpenSourceLicensesTest.kt b/scanner-host/src/androidTest/java/io/qrun/mobile/scanner/OpenSourceLicensesTest.kt new file mode 100644 index 0000000..8178d2b --- /dev/null +++ b/scanner-host/src/androidTest/java/io/qrun/mobile/scanner/OpenSourceLicensesTest.kt @@ -0,0 +1,52 @@ +/* Copyright (c) 2026 QRunIO. SPDX-License-Identifier: Apache-2.0 */ +package io.qrun.mobile.scanner + +import androidx.activity.compose.setContent +import androidx.compose.material3.MaterialTheme +import androidx.compose.ui.test.assertIsDisplayed +import androidx.compose.ui.test.hasScrollAction +import androidx.compose.ui.test.hasText +import androidx.compose.ui.test.junit4.createAndroidComposeRule +import androidx.compose.ui.test.onAllNodesWithText +import androidx.compose.ui.test.onNodeWithText +import androidx.compose.ui.test.performClick +import androidx.compose.ui.test.performScrollToNode +import androidx.test.ext.junit.runners.AndroidJUnit4 +import androidx.test.espresso.Espresso.onView +import androidx.test.espresso.assertion.ViewAssertions.matches +import androidx.test.espresso.matcher.ViewMatchers.isDisplayed +import androidx.test.espresso.matcher.ViewMatchers.withText +import org.hamcrest.Matchers.containsString +import org.junit.Rule +import org.junit.Test +import org.junit.runner.RunWith + +/******************************************************************************* + ** Uses the actual generated APK resources; no server or license download is required. + *******************************************************************************/ +@RunWith(AndroidJUnit4::class) +class OpenSourceLicensesTest { + @get:Rule + val ui = createAndroidComposeRule<ScannerActivity>() + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun bundledNoticesOpenAndCloseFromSettings() { + ui.runOnUiThread { + ui.activity.setContent { MaterialTheme { OpenSourceLicensesButton() } } + } + ui.onNodeWithText("Open-source licenses").performClick() + ui.waitUntil(timeoutMillis = 10000) { + ui.onAllNodesWithText("Apache", substring = true).fetchSemanticsNodes().isNotEmpty() + } + ui.onNode(hasScrollAction()).performScrollToNode(hasText("Material Design icons by Google")) + ui.onNodeWithText("Material Design icons by Google").assertIsDisplayed() + ui.onNodeWithText("Material Design icons by Google").performClick() + onView(withText(containsString("Drawing paths match the pinned source"))).check(matches(isDisplayed())) + ui.onNodeWithText("OK").performClick() + ui.onNodeWithText("Close").performClick() + ui.onNodeWithText("Open-source licenses").assertIsDisplayed() + } +} diff --git a/scanner-host/src/androidTest/java/io/qrun/mobile/scanner/OrientationPolicyTest.kt b/scanner-host/src/androidTest/java/io/qrun/mobile/scanner/OrientationPolicyTest.kt new file mode 100644 index 0000000..8e4ab3e --- /dev/null +++ b/scanner-host/src/androidTest/java/io/qrun/mobile/scanner/OrientationPolicyTest.kt @@ -0,0 +1,53 @@ +/* Copyright (c) 2026 QRunIO. SPDX-License-Identifier: Apache-2.0 */ +package io.qrun.mobile.scanner + +import androidx.test.core.app.ActivityScenario +import androidx.test.platform.app.InstrumentationRegistry +import org.junit.Assert.assertEquals +import org.junit.Test + +/******************************************************************************* + ** + *******************************************************************************/ +class OrientationPolicyTest { + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun deviceSelectionSurvivesRecreationAndColdActivityLaunch() { + val context = InstrumentationRegistry.getInstrumentation().targetContext + check(context.packageName == "io.qrun.mobile.scanner.e2e") + OrientationPolicy.entries.forEach { policy -> + ActivityScenario.launch(ScannerActivity::class.java).use { scenario -> + scenario.onActivity { policy.select(it) } + InstrumentationRegistry.getInstrumentation().waitForIdleSync() + scenario.recreate() + if (policy != OrientationPolicy.SYSTEM) { + val expected = if (policy == OrientationPolicy.PORTRAIT || policy == OrientationPolicy.REVERSE_PORTRAIT) + android.content.res.Configuration.ORIENTATION_PORTRAIT else android.content.res.Configuration.ORIENTATION_LANDSCAPE + val deadline = android.os.SystemClock.uptimeMillis() + 15000 + var applied = false + while (!applied && android.os.SystemClock.uptimeMillis() < deadline) { + scenario.onActivity { applied = it.resources.configuration.orientation == expected } + if (!applied) android.os.SystemClock.sleep(100) + } + } + scenario.onActivity { + assertEquals(policy, OrientationPolicy.read(it)) + assertEquals(policy.requested, it.requestedOrientation) + if (policy != OrientationPolicy.SYSTEM) { + val expected = if (policy == OrientationPolicy.PORTRAIT || policy == OrientationPolicy.REVERSE_PORTRAIT) + android.content.res.Configuration.ORIENTATION_PORTRAIT else android.content.res.Configuration.ORIENTATION_LANDSCAPE + assertEquals("The handheld applies the selected screen axis", expected, it.resources.configuration.orientation) + } + } + } + ActivityScenario.launch(ScannerActivity::class.java).use { scenario -> + scenario.onActivity { assertEquals(policy.requested, it.requestedOrientation) } + } + } + ActivityScenario.launch(ScannerActivity::class.java).use { scenario -> + scenario.onActivity { OrientationPolicy.SYSTEM.select(it) } + } + } +} diff --git a/scanner-host/src/androidTest/java/io/qrun/mobile/scanner/RealAuthentikAcceptanceTest.kt b/scanner-host/src/androidTest/java/io/qrun/mobile/scanner/RealAuthentikAcceptanceTest.kt new file mode 100644 index 0000000..9fd4927 --- /dev/null +++ b/scanner-host/src/androidTest/java/io/qrun/mobile/scanner/RealAuthentikAcceptanceTest.kt @@ -0,0 +1,273 @@ +/* Copyright (c) 2026 QRunIO. SPDX-License-Identifier: Apache-2.0 */ +package io.qrun.mobile.scanner + +import android.os.Bundle +import androidx.compose.ui.semantics.SemanticsProperties +import androidx.compose.ui.semantics.getOrNull +import androidx.compose.ui.test.SemanticsMatcher +import androidx.compose.ui.test.assertIsEnabled +import androidx.compose.ui.test.hasClickAction +import androidx.compose.ui.test.hasTestTag +import androidx.compose.ui.test.hasText +import androidx.compose.ui.test.isEnabled +import androidx.compose.ui.test.junit4.createAndroidComposeRule +import androidx.compose.ui.test.onAllNodesWithTag +import androidx.compose.ui.test.onAllNodesWithText +import androidx.compose.ui.test.onNodeWithTag +import androidx.compose.ui.test.onNodeWithText +import androidx.compose.ui.test.performClick +import androidx.compose.ui.test.performTextReplacement +import androidx.test.ext.junit.runners.AndroidJUnit4 +import androidx.test.platform.app.InstrumentationRegistry +import java.io.File +import java.net.URI +import java.util.concurrent.TimeUnit +import okhttp3.OkHttpClient +import org.json.JSONObject +import org.junit.Assert.assertEquals +import org.junit.Assert.assertNotEquals +import org.junit.Assert.assertTrue +import org.junit.Assume.assumeTrue +import org.junit.Rule +import org.junit.Test +import org.junit.runner.RunWith + +/******************************************************************************* + ** Opt-in acceptance against the real fixture Authentik and real QQQ (docs/REAL-AUTHENTIK-ACCEPTANCE.md). + ** Skipped unless the instrumentation argument realAuthentik=true is passed, so ordinary runs never reach it. + ** Nothing here injects a callback, ActivityResult, token or discovery document, and nothing clears browser + ** state: the external browser, the exported callback activity and the QQQ code exchange run as in production. + ** The person holding the device types each operator's provider credentials into the browser themselves. + ** Progress is reported only as fixed stage names; no URL, query, token, cookie or credential is emitted. + *******************************************************************************/ +@RunWith(AndroidJUnit4::class) +class RealAuthentikAcceptanceTest { + @get:Rule + val ui = createAndroidComposeRule<ScannerActivity>() + private val instrumentation = InstrumentationRegistry.getInstrumentation() + private val context get() = instrumentation.targetContext + private val client = OkHttpClient.Builder().callTimeout(20, TimeUnit.SECONDS).build() + private lateinit var admin: SessionAcceptanceClient + private lateinit var deviceId: String + private var actorField: String = "" + + /******************************************************************************* + ** A signs in through the browser, company sign-out runs, then B must authenticate afresh. + *******************************************************************************/ + @Test + fun browserCallbackThenCompanyLogoutThenFreshSecondOperator() { + assumeTrue(InstrumentationRegistry.getArguments().getString("realAuthentik") == "true") + check(context.packageName == "io.qrun.mobile.scanner.e2e") { "Requires the disposable E2E package" } + val file = File(context.filesDir, "real-auth.json") + val config = try { JSONObject(file.readText()) } catch (exception: Exception) { throw AssertionError("Fixture configuration is invalid") } + finally { file.delete() } + check(config.optString("fixtureType") == "real-authentik-android") + val server = URI(config.getString("qqqOrigin")) + check(server.scheme == "https" && server.host == "localhost" && server.port == 18443 && server.userInfo == null && + server.query == null && server.fragment == null && server.path in setOf("", "/")) + val origin = "https://localhost:18443" + val operators = config.getJSONObject("operators") + val a = operators.getJSONObject("A") + val b = operators.getJSONObject("B") + check(a.getString("display") != b.getString("display")) { "Operators must have distinct display names" } + actorField = config.optString("sessionActorField") + admin = SessionAcceptanceClient(origin, config.getString("adminCookie"), client) + + var lastSession: String? = null + try { + waitFor("QQQ server URL") + ui.onNodeWithText("QQQ server URL").performTextReplacement("$origin/") + click("Connect") + // OAuth2 is advertised: the browser button exists and no local password form is offered. + await("browser-login-offered") { ui.onAllNodesWithTag("oauth2.signIn").fetchSemanticsNodes().isNotEmpty() } + assertTrue("No password fallback may be offered", ui.onAllNodesWithText("Password").fetchSemanticsNodes().isEmpty()) + stage("login-screen-verified") + + // Operator A: real browser, real provider redirect, exported callback, real QQQ exchange. + browserLogin("A") + deviceId = DeviceCredentials(context, "$origin/").deviceId + assertTrue("A new device must wait for administrator approval", pendingShown()) + stage("device-pending-A") + approveAndOpenCatalog() + assertPrincipal(a.getString("display")) + val sessionA = activeSession(a.optString("actor")) + stage("operator-A-verified") + + // Optional company sign-out; no browser state is cleared by this harness. + companySignOut() + await("operator-A-session-ended") { sessionStatus(sessionA) != "ACTIVE" } + stage("operator-A-qqq-session-ended") + click("Log back in") + + // Operator B must authenticate again; a silent reuse of A would show A as the principal. + await("browser-login-offered-B") { ui.onAllNodesWithTag("oauth2.signIn").fetchSemanticsNodes().isNotEmpty() } + browserLogin("B") + if (pendingShown()) approveAndOpenCatalog() + else await("catalog-B", 60) { catalogShown() } + assertPrincipal(b.getString("display")) + lastSession = activeSession(b.optString("actor")) + assertNotEquals("B must hold a different QQQ session than A", sessionA, lastSession) + stage("operator-B-verified") + } finally { + // End only the disposable device session; the supplied admin session belongs to root and is left alone. + lastSession?.let { runCatching { admin.apply("mobileSessionEnd", JSONObject().put("sessionId", it)) } } + } + } + + /******************************************************************************* + ** Start AppAuth from the native button, require a real external browser, then wait for the operator. + *******************************************************************************/ + private fun browserLogin(label: String) { + click("oauth2.signIn", tag = true) + stage("browser-$label-requested") + var browser: String? = null + await("external-browser-foreground-$label", 45) { + browser = foreignPackage() + browser != null || ui.onAllNodesWithTag("oauth2.message").fetchSemanticsNodes().isNotEmpty() + } + assertTrue( + "Browser sign-in never reached an external browser. Check temporary CA trust, reverse mappings and server advertisement.", + browser != null + ) + stage("browser-$label-operator-enter-credentials") + // The provider's callback re-enters through the exported redirect activity; only then is the app foreground again. + await("callback-returned-$label", 600) { + activePackage() == context.packageName && ( + pendingShown() || catalogShown() || ui.onAllNodesWithTag("oauth2.message").fetchSemanticsNodes().isNotEmpty()) + } + assertTrue("Native sign-in did not complete after the browser returned", ui.onAllNodesWithTag("oauth2.message").fetchSemanticsNodes().isEmpty()) + stage("callback-exchange-$label-complete") + } + + /******************************************************************************* + ** Approve this device through the real administrator process, then re-check approval in the app. + *******************************************************************************/ + private fun approveAndOpenCatalog() { + admin.apply("mobileDeviceApprove", JSONObject().put("deviceId", deviceId)) + click("Check approval") + await("approved-catalog", 60) { catalogShown() } + } + + /******************************************************************************* + ** The principal shown by QQQ comes from the provider claims QQQ validated, not from this harness. + *******************************************************************************/ + private fun assertPrincipal(display: String) { + click("topBar.accountIcon", tag = true) + await("principal-visible") { ui.onAllNodesWithText("Current User: $display").fetchSemanticsNodes().isNotEmpty() } + click("Close") + } + + /******************************************************************************* + ** Run optional RP-initiated logout through the browser and require explicit completion. + *******************************************************************************/ + private fun companySignOut() { + click("topBar.accountIcon", tag = true) + await("company-signout-offered", 30) { ui.onAllNodesWithText("Sign out of company").fetchSemanticsNodes().isNotEmpty() } + click("Sign out of company") + // The confirmation dialog explains the effect; its button carries the same label as the Account item. + await("company-signout-confirm") { + ui.onAllNodesWithText("Sign out of QQQ and continue in your browser", substring = true).fetchSemanticsNodes().isNotEmpty() && + ui.onAllNodes(hasText("Sign out of company") and hasClickAction() and isEnabled()).fetchSemanticsNodes().size == 1 + } + click("Sign out of company") + stage("company-signout-requested") + await("company-signout-browser", 45) { foreignPackage() != null } + stage("company-signout-operator-confirm-if-asked") + await("company-signout-returned", 300) { + activePackage() == context.packageName && ui.onAllNodesWithTag("oauth2.logoutMessage").fetchSemanticsNodes().isNotEmpty() + } + await("company-signout-result", 30) { logoutMessage().contains("Company sign-out") } + val message = logoutMessage() + assertTrue("Company sign-out must be verified complete", message.contains("Company sign-out completed.") && !message.contains("did not complete")) + stage("company-signout-verified") + } + + /******************************************************************************* + ** The visible company sign-out progress/result text. + *******************************************************************************/ + private fun logoutMessage(): String = ui.onNodeWithTag("oauth2.logoutMessage").fetchSemanticsNode().config + .getOrNull(SemanticsProperties.Text)?.joinToString("") { it.text }.orEmpty() + + /******************************************************************************* + ** The single ACTIVE session for this device, optionally checked for its server-derived actor. + *******************************************************************************/ + private fun activeSession(expectedActor: String): String { + var found: JSONObject? = null + await("active-session", 30) { + found = admin.sessions().singleOrNull { it.optString("deviceId") == deviceId && it.optString("status") == "ACTIVE" } + found != null + } + val row = requireNotNull(found) + if (actorField.isNotBlank() && expectedActor.isNotBlank()) assertEquals("Server actor must match the provider user", expectedActor, row.optString(actorField)) + return row.getString("id") + } + + /******************************************************************************* + ** + *******************************************************************************/ + private fun sessionStatus(id: String) = admin.sessions().single { it.getString("id") == id }.optString("status") + + /******************************************************************************* + ** + *******************************************************************************/ + private fun pendingShown() = ui.onAllNodesWithText("An administrator must approve this device before you can run mobile apps.").fetchSemanticsNodes().isNotEmpty() + + /******************************************************************************* + ** + *******************************************************************************/ + private fun catalogShown() = ui.onAllNodes(SemanticsMatcher("test tag starts with appHome.rowForApp:") { + it.config.getOrNull(SemanticsProperties.TestTag)?.startsWith("appHome.rowForApp:") == true + }).fetchSemanticsNodes().isNotEmpty() + + /******************************************************************************* + ** The active window's package when it is neither this app nor system chrome (that is, the browser). + *******************************************************************************/ + private fun foreignPackage(): String? = activePackage()?.takeIf { it != context.packageName && it != "com.android.systemui" && it != "android" } + + /******************************************************************************* + ** + *******************************************************************************/ + private fun activePackage(): String? { + val root = instrumentation.uiAutomation.rootInActiveWindow ?: return null + return try { + root.packageName?.toString() + } finally { + @Suppress("DEPRECATION") root.recycle() + } + } + + /******************************************************************************* + ** + *******************************************************************************/ + private fun click(label: String, tag: Boolean = false) { + val matcher = (if (tag) hasTestTag(label) else hasText(label, substring = false)) and hasClickAction() + await("enabled-app-control") { ui.onAllNodes(matcher and isEnabled()).fetchSemanticsNodes().isNotEmpty() } + ui.onNode(matcher).assertIsEnabled().performClick() + } + + /******************************************************************************* + ** + *******************************************************************************/ + private fun waitFor(text: String) = await("app-control") { ui.onAllNodesWithText(text, substring = false).fetchSemanticsNodes().isNotEmpty() } + + /******************************************************************************* + ** Fixed stage identifiers only; the launcher maps them to operator instructions. + *******************************************************************************/ + private fun stage(name: String) = instrumentation.sendStatus(0, Bundle().apply { putString("qqqStage", name) }) + + /******************************************************************************* + ** Bounded wait that keeps Compose's clock moving while the app is in the background. + *******************************************************************************/ + private fun await(name: String, seconds: Long = 40, predicate: () -> Boolean) { + val deadline = System.nanoTime() + TimeUnit.SECONDS.toNanos(seconds) + var previous = System.nanoTime() + do { + val now = System.nanoTime() + ui.mainClock.advanceTimeBy(TimeUnit.NANOSECONDS.toMillis(now - previous).coerceAtLeast(16)) + previous = now + if (predicate()) return + Thread.sleep(250) + } while (System.nanoTime() < deadline) + throw AssertionError("Real-provider stage did not complete within its bound: $name") + } +} diff --git a/scanner-host/src/androidTest/java/io/qrun/mobile/scanner/ScannerEndToEndTest.kt b/scanner-host/src/androidTest/java/io/qrun/mobile/scanner/ScannerEndToEndTest.kt new file mode 100644 index 0000000..3f8038d --- /dev/null +++ b/scanner-host/src/androidTest/java/io/qrun/mobile/scanner/ScannerEndToEndTest.kt @@ -0,0 +1,1089 @@ +/* Copyright (c) 2026 QRunIO. SPDX-License-Identifier: Apache-2.0 */ +package io.qrun.mobile.scanner + +import android.os.Bundle +import android.graphics.BitmapFactory +import android.graphics.Bitmap +import android.graphics.Color +import android.app.Activity +import android.app.Instrumentation +import android.content.Intent +import android.net.Uri +import android.provider.MediaStore +import android.util.Base64 + +import androidx.compose.ui.test.hasClickAction +import androidx.compose.ui.test.assert +import androidx.compose.ui.test.assertHasNoClickAction +import androidx.compose.ui.test.assertIsDisplayed +import androidx.compose.ui.test.hasTestTag +import androidx.compose.ui.test.performScrollToNode +import androidx.compose.ui.test.performSemanticsAction +import androidx.compose.ui.test.assertIsEnabled +import androidx.compose.ui.test.assertIsNotEnabled +import androidx.compose.ui.test.assertTextContains +import androidx.compose.ui.test.assertTextEquals +import androidx.compose.ui.test.SemanticsMatcher +import androidx.compose.ui.semantics.SemanticsActions +import androidx.compose.ui.semantics.SemanticsProperties +import androidx.compose.ui.semantics.getOrNull +import androidx.compose.ui.test.hasSetTextAction +import androidx.core.view.WindowCompat +import androidx.core.view.ViewCompat +import androidx.core.view.WindowInsetsCompat +import androidx.compose.ui.test.hasAnyAncestor +import androidx.compose.ui.test.hasText +import androidx.compose.ui.test.isEnabled +import androidx.compose.ui.test.isPopup +import androidx.compose.ui.test.junit4.createAndroidComposeRule +import androidx.compose.ui.test.onAllNodesWithText +import androidx.compose.ui.test.onFirst +import androidx.compose.ui.test.onNodeWithTag +import androidx.compose.ui.test.onNodeWithText +import androidx.compose.ui.test.onRoot +import androidx.compose.ui.test.printToString +import androidx.compose.ui.test.performClick +import androidx.compose.ui.test.performScrollTo +import androidx.compose.ui.test.performImeAction +import androidx.compose.ui.test.performTextReplacement + +import androidx.test.ext.junit.runners.AndroidJUnit4 +import androidx.test.platform.app.InstrumentationRegistry +import androidx.core.content.FileProvider +import java.io.File +import java.io.ByteArrayOutputStream +import java.util.UUID +import java.net.URI +import java.util.concurrent.atomic.AtomicInteger +import java.util.concurrent.TimeUnit +import okhttp3.MediaType.Companion.toMediaType +import okhttp3.OkHttpClient +import okhttp3.Request +import okhttp3.RequestBody.Companion.toRequestBody +import org.json.JSONObject +import org.junit.Assert.assertEquals +import org.junit.Assert.assertTrue +import org.junit.Rule +import org.junit.Test +import org.junit.runner.RunWith + +/******************************************************************************* + ** Real host UI and real QQQ server. No repository mocks or production app data. + *******************************************************************************/ +@RunWith(AndroidJUnit4::class) +class ScannerEndToEndTest { + @get:Rule + val ui = createAndroidComposeRule<ScannerActivity>() + private val client = OkHttpClient.Builder().callTimeout(20, TimeUnit.SECONDS).build() + private lateinit var origin: String + private lateinit var adminCookie: String + /******************************************************************************* + ** Explicitly prepare a disposable QA app for an operator's manual record/photo test. + ** Uses real sign-in and approval; does not alter the ordinary scanner application. + *******************************************************************************/ + @Test + fun prepareManualRecordPhotoPreview() { + val context = InstrumentationRegistry.getInstrumentation().targetContext + check(context.packageName == "io.qrun.mobile.scanner.qa") + val configFile = File(context.filesDir, "manual-photo-preview.json") + val config = try { JSONObject(configFile.readText()) } finally { configFile.delete() } + check(config.optBoolean("manualPhotoPreview")) + origin = config.getString("serverUrl").trimEnd('/') + val endpoint = URI(origin) + check(endpoint.scheme == "http" && endpoint.host == "127.0.0.1" && endpoint.port in 1024..65535 && + endpoint.port !in setOf(8080, 57832, 51631, 18081, 18086) && endpoint.path in setOf("", "/") && + endpoint.userInfo == null && endpoint.query == null && endpoint.fragment == null) + waitFor("QQQ server URL") + ui.onNodeWithText("QQQ server URL").performTextReplacement("$origin/") + ui.onNodeWithText("Connect", substring = false).performClick() + waitFor("Username") + ui.onNodeWithText("Username").performTextReplacement("scanner") + ui.onNodeWithText("Password").performTextReplacement(config.getString("scannerPassword")) + ui.onNodeWithText("Password").performImeAction() + ui.onNode(hasText("Sign in") and hasClickAction()).performScrollTo().performClick() + waitFor("An administrator must approve this device before you can run mobile apps.") + val device = DeviceCredentials(context, "$origin/") + adminCookie = loginAdmin(config.getString("adminPassword")) + runAdmin("mobileDeviceApprove", device.deviceId) + ui.onNodeWithText("Check approval").performScrollTo().performClick() + waitForTag("appHome.rowForApp:mobileScanApp") + ui.onNodeWithTag("appHome.rowForApp:mobileScanApp").performClick() + waitForTag("appHome.rowForTable:document") + ui.onNodeWithTag("appHome.rowForTable:document").performClick() + waitForTag("records.row:1") + ui.onNodeWithTag("records.row:1").performClick() + waitFor("Take photo") + stage("manual-photo-preview-ready") + } + + /******************************************************************************* + ** Exercise real Echo process/PVS persistence with explicitly simulated print acceptance. + ** No printer, production scanner ingress, screenshots or private identifiers become evidence. + *******************************************************************************/ + @Test + fun echoSelectsOnceQueuesTwoScansAndClosesOnAppsLeave() { + val context = InstrumentationRegistry.getInstrumentation().targetContext + check(context.packageName == "io.qrun.mobile.scanner.e2e") { "Echo requires the disposable E2E package" } + val configFile = File(context.filesDir, "e2e.json") + val config = try { JSONObject(configFile.readText()) } + catch(exception: Exception) { throw AssertionError("Echo fixture configuration is invalid") } + finally { configFile.delete() } + check(config.optString("fixtureType") == "echo-ui-e2e" && config.optBoolean("simulatedPrinting")) + origin = config.getString("serverUrl").trimEnd('/') + val endpoint = URI(origin) + check(endpoint.scheme == "http" && endpoint.host == "127.0.0.1" && endpoint.port in 1..65535 && + endpoint.port !in setOf(57832, 51631, 18081, 18086) && endpoint.path in setOf("", "/") && + endpoint.userInfo == null && endpoint.query == null && endpoint.fragment == null) + + waitFor("QQQ server URL") + ui.onNodeWithText("QQQ server URL").performTextReplacement("$origin/") + ui.onNodeWithText("Connect", substring = false).performClick() + waitFor("Username") + ui.onNodeWithText("Username").performTextReplacement("scanner") + ui.onNodeWithText("Password").performTextReplacement(config.getString("scannerPassword")) + ui.onNodeWithText("Password").performImeAction() + ui.onNode(hasText("Sign in") and hasClickAction()).performScrollTo().performClick() + waitFor("An administrator must approve this device before you can run mobile apps.") + val device = DeviceCredentials(context, "$origin/") + adminCookie = loginAdmin(config.getString("adminPassword")) + runAdmin("mobileDeviceApprove", device.deviceId) + ui.onNodeWithText("Check approval").performScrollTo().performClick() + waitForTag("appHome.rowForApp:echo") + val scannerCookie = loginAdmin(config.getString("scannerPassword"), "scanner") + + /******************************************************************************* + ** Verify persisted rows through ordinary QQQ reads under the operator's real actor/device locks. + *******************************************************************************/ + fun rows(table: String): List<JSONObject> { + check(table in setOf("echoScan", "echoFixtureRun")) + val request = Request.Builder().url("$origin/qqq/v1/table/$table/query").header("Cookie", scannerCookie) + .post("{}".toRequestBody("application/json".toMediaType())) + device.headers().forEach { (name, value) -> request.header(name, value) } + val records = executeJson(request.build()).getJSONArray("records") + return (0 until records.length()).map { records.getJSONObject(it).getJSONObject("values") } + } + + /******************************************************************************* + ** Discover choices through the same versioned `searchProcessPossibleValues` POST the renderer uses + ** ({values, processValues, useCase:form}), so no document id or label is assumed by this harness. + *******************************************************************************/ + fun choices(field: String, values: JSONObject): List<Pair<Any, String>> { + val request = Request.Builder().url("$origin/qqq/v1/processes/echoPrint/possibleValues/$field").header("Cookie", scannerCookie) + .post(JSONObject().put("values", values).put("processValues", JSONObject()).put("useCase", "form").toString().toRequestBody("application/json".toMediaType())) + device.headers().forEach { (name, value) -> request.header(name, value) } + val options = executeJson(request.build()).optJSONArray("options") ?: return emptyList() + return (0 until options.length()).map { options.getJSONObject(it) }.map { it.get("id") to it.getString("label") } + } + val printerChoice = choices("printerId", JSONObject().put("mediaId", JSONObject.NULL).put("templateId", JSONObject.NULL)).single { it.second == "Simulated printer" } + val mediaChoice = choices("mediaId", JSONObject().put("printerId", printerChoice.first).put("templateId", JSONObject.NULL)).single { it.second == "Simulated 4 x 6 in — 300 dpi" } + val documents = choices("templateId", JSONObject().put("printerId", printerChoice.first).put("mediaId", mediaChoice.first)) + assertTrue("Document choices must be offered for the selected printer/media with unique labels and true JSON integer ids", + documents.isNotEmpty() && documents.map { it.second }.toSet().size == documents.size && documents.all { it.first is Int || it.first is Long }) + // Choose a different document after the stale-selection check when more than one is offered, so restoring the old one is detectable. + val firstDocument = documents.first() + val finalDocument = documents.last() + // Persisted setup column holding the chosen document id; confirm against the server fixture schema. + val documentColumn = "templateId" + // Persisted setup column and process field for the optional Copies per scan integer. The Echo owner must expose + // both; the Printing service's own limit is 1..100, and this test does not hard-code any other bound. + val copiesColumn = "copies" + val selectedCopies = 3 + fun assertCopiesPinned(row: JSONObject) { + val pinnedCopies = row.opt(copiesColumn) + assertTrue("Setup must pin Copies per scan as the true JSON integer $selectedCopies the operator chose (found: $pinnedCopies); " + + "the Echo fixture run table must expose an integer '$copiesColumn' column", + pinnedCopies is Number && pinnedCopies.toLong() == selectedCopies.toLong()) + } + fun assertSetupPinned(row: JSONObject) { + assertTrue("Setup must pin the selected printer and media once", row.getString("state") == "OPEN" && + row.getString("printerRecordId") == "fixture-printer" && row.getString("mediaId") == "fixture-4x6") + val persisted = row.opt(documentColumn) + assertTrue("Setup must persist the chosen document as the same integer id the choices returned", + persisted is Number && persisted.toLong() == (finalDocument.first as Number).toLong()) + assertCopiesPinned(row) + } + + /******************************************************************************* + ** The metadata-driven integer control: a text field labelled by the server's field label, found by its set-text action. + *******************************************************************************/ + val copiesField = hasText("Copies per scan") and hasSetTextAction() + fun copiesValue(): String? = ui.onNode(copiesField).performScrollTo().fetchSemanticsNode().config.getOrNull(SemanticsProperties.EditableText)?.text + fun enterCopies(value: String) { + ui.onNode(copiesField).performScrollTo().performTextReplacement(value) + // Dismiss the keyboard as a person would, so later read-only scan-display assertions measure the app, not this input. + ui.activityRule.scenario.onActivity { WindowCompat.getInsetsController(it.window, it.window.decorView).hide(WindowInsetsCompat.Type.ime()) } + ui.waitForIdle() + } + + /******************************************************************************* + ** The only enabled, unselected choice control (earlier fields already hold labels). + *******************************************************************************/ + fun openOnlyRemainingChoice() { + ui.waitUntil(timeoutMillis = 60_000) { + ui.onAllNodesWithText("Choose a value").fetchSemanticsNodes().size == 1 && + ui.onAllNodes(hasText("Choose a value") and isEnabled()).fetchSemanticsNodes().size == 1 + } + ui.onNodeWithText("Choose a value").performScrollTo().performClick() + } + + val priorRuns = rows("echoFixtureRun").map { it.getString("id") }.toSet() + ui.onNodeWithTag("appHome.rowForApp:echo").performClick() + waitForTag("appHome.rowForProcess:echoPrint") + ui.onNodeWithTag("appHome.rowForProcess:echoPrint").performClick() + waitFor("Printer") + waitFor("Paper or label size") + waitFor("Document") + waitFor("Copies per scan") + assertEquals("Copies per scan must default to 1 from the server's field metadata", "1", copiesValue()) + stage("echo-copies-defaulted") + ui.onAllNodesWithText("Choose a value").onFirst().performScrollTo().performClick() + waitFor("Simulated printer") + ui.onNodeWithText("Simulated printer").performClick() + // Media is a contingent field: it stays disabled until the server returns choices for the selected printer. + ui.waitUntil(timeoutMillis = 60_000) { ui.onAllNodes(hasText("Choose a value") and isEnabled()).fetchSemanticsNodes().isNotEmpty() } + ui.onAllNodesWithText("Choose a value").onFirst().performScrollTo().performClick() + waitFor("Simulated 4 x 6 in — 300 dpi") + ui.onNodeWithText("Simulated 4 x 6 in — 300 dpi").performClick() + // Document depends on both printer and media; it is the only unselected control left once media holds its label. + openOnlyRemainingChoice() + waitFor(firstDocument.second) + ui.onNodeWithText(firstDocument.second).performClick() + waitFor(firstDocument.second) + stage("echo-document-selected") + + // Choosing a controlling field again drops every dependent selection and blocks Next until they are reselected. + ui.onNodeWithText("Simulated printer").performScrollTo().performClick() + ui.onNode(hasText("Simulated printer") and hasAnyAncestor(isPopup())).performClick() + ui.waitUntil(timeoutMillis = 60_000) { ui.onAllNodesWithText("Choose a value").fetchSemanticsNodes().size == 2 } + assertTrue("The stale document must not stay selected", ui.onAllNodesWithText(firstDocument.second).fetchSemanticsNodes().isEmpty()) + waitFor("Choose Paper or label size first.") + ui.onNodeWithText("Next", substring = false).performClick() + waitFor("Paper or label size is required.") + waitFor("Document is required.") + assertTrue("Next must not start setup without a reselected document", ui.onAllNodesWithText("Scanner ready. Press the handheld trigger.").fetchSemanticsNodes().isEmpty() && + rows("echoFixtureRun").none { it.getString("id") !in priorRuns && it.optString("printerRecordId").isNotBlank() }) + ui.onAllNodesWithText("Choose a value").onFirst().performScrollTo().performClick() + waitFor("Simulated 4 x 6 in — 300 dpi") + ui.onNodeWithText("Simulated 4 x 6 in — 300 dpi").performClick() + openOnlyRemainingChoice() + waitFor(finalDocument.second) + ui.onNodeWithText(finalDocument.second).performClick() + waitFor(finalDocument.second) + assertTrue("Only the reselected document may remain chosen", firstDocument == finalDocument || ui.onAllNodesWithText(firstDocument.second).fetchSemanticsNodes().isEmpty()) + stage("echo-stale-document-cleared") + assertEquals("Reselecting a controlling choice must not disturb the independent Copies per scan value", "1", copiesValue()) + // The field's advertised bounds (Printing's 1..100) are enforced by the renderer before any run is created. + for ((invalid, message) in listOf("0" to "Copies per scan is below the allowed minimum.", "101" to "Copies per scan exceeds the allowed maximum.")) { + enterCopies(invalid) + ui.onNodeWithText("Next", substring = false).performClick() + waitFor(message) + assertTrue("Invalid Copies per scan must not start setup", ui.onAllNodesWithText("Scanner ready. Press the handheld trigger.").fetchSemanticsNodes().isEmpty() && + rows("echoFixtureRun").none { it.getString("id") !in priorRuns && it.optString("printerRecordId").isNotBlank() }) + } + enterCopies(selectedCopies.toString()) + assertEquals("The chosen quantity must be held by the metadata-driven integer field", selectedCopies.toString(), copiesValue()) + stage("echo-copies-selected") + ui.onNodeWithText("Next", substring = false).performClick() + waitFor("Scanner ready. Press the handheld trigger.") + assertTrue("Echo must not offer manual barcode input", ui.onAllNodesWithText("Manual barcode").fetchSemanticsNodes().isEmpty()) + assertTrue("Echo must not offer manual submission", ui.onAllNodesWithText("Submit barcode").fetchSemanticsNodes().isEmpty()) + // The scan display is read-only and present although Echo disables manual entry; nothing opens the keyboard. + fun assertScanDisplay(barcode: String?, symbology: String?, status: String) { + ui.onNodeWithTag("scanner-barcode").performScrollTo().assertIsDisplayed() + .assert(SemanticsMatcher.keyNotDefined(SemanticsActions.SetText)) + if (barcode != null) ui.onNodeWithTag("scanner-barcode").assert(hasText(barcode)) + ui.onNodeWithTag("scanner-symbology").assertTextEquals("Symbology: ${symbology ?: "—"}") + ui.onNodeWithTag("scanner-status").assertTextEquals(status) + assertTrue("Read-only scan display must not open the keyboard", + ViewCompat.getRootWindowInsets(ui.activity.window.decorView)?.isVisible(WindowInsetsCompat.Type.ime()) != true) + } + assertScanDisplay(null, null, "Waiting for scan") + val run = rows("echoFixtureRun").single { it.getString("id") !in priorRuns } + val runId = run.getString("id") + assertSetupPinned(run) + stage("echo-setup-selected") + + var receipt = "" + val gs1Payload = "01095011015300031120101421TEST000123" + for ((index, sample) in listOf("001234567890" to "LABEL-TYPE-CODE128", "000-ECHO-QR" to "QRCODE", gs1Payload to "EAN128").withIndex()) { + waitFor("Scanner ready. Press the handheld trigger.") + context.sendBroadcast(Intent("io.qrun.mobile.scanner.SCAN").setPackage(context.packageName) + .addCategory(Intent.CATEGORY_DEFAULT).putExtra("com.symbol.datawedge.data_string", sample.first) + .putExtra("com.symbol.datawedge.label_type", sample.second).apply { + if (sample.second == "EAN128") { + putExtra("io.qrun.mobile.scanner.e2e.raw_data", sample.first.toByteArray(Charsets.US_ASCII)) + putExtra("io.qrun.mobile.scanner.e2e.aim_identifier", "]C1") + } + }) + var accepted: JSONObject? = null + waitForServer { + accepted = rows("echoScan").singleOrNull { it.optString("runId") == runId && it.optString("barcode") == sample.first && it.optString("state") == "QUEUED" } + accepted != null + } + val row = requireNotNull(accepted) + receipt = row.getString("mobileScanId") + waitFor("Print queued $receipt", substring = true) + assertScanDisplay(sample.first, sample.second, "Confirmed by server") + assertTrue("Accepted Echo scans must preserve exact type and approved-device attribution", + row.getString("symbology") == sample.second && row.getString("rendererSymbology") == listOf("code128", "qr", "gs1-128")[index] && + row.getString("scanSource") == "e2e-fixture" && row.getString("deviceId") == device.deviceId && row.getString("actorId") == "scanner") + assertTrue("Only a synthetic accepted job may acknowledge this fixture scan", + row.getString("id") == receipt && row.getString("printJobId") == "fixture-job-$receipt" && row.getString("eventId").isNotBlank()) + assertTrue("Each event must create exactly one accepted Echo scan", rows("echoScan").count { it.optString("runId") == runId } == index + 1) + assertSetupPinned(rows("echoFixtureRun").single { it.getString("id") == runId }) + if (index == 2) { + assertEquals("]C1", row.getString("aimIdentifier")) + assertEquals("[01]09501101530003[11]201014[21]TEST000123", row.getString("rendererValue")) + assertEquals("(01)09501101530003(11)201014(21)TEST000123", row.getString("humanReadable")) + } + stage(listOf("echo-first-queued", "echo-second-queued", "echo-gs1-queued")[index]) + } + + ui.activityRule.scenario.onActivity { OrientationPolicy.LANDSCAPE.select(it) } + waitFor("Print queued $receipt", substring = true) + ui.activityRule.scenario.recreate() + waitFor("Print queued $receipt", substring = true) + assertScanDisplay(gs1Payload, "EAN128", "Confirmed by server") + assertTrue("Recreation must retain scan phase without showing printer selection", ui.onAllNodesWithText("Choose a value").fetchSemanticsNodes().isEmpty()) + val acceptedRows = rows("echoScan").filter { it.optString("runId") == runId } + assertTrue("Rotation/recreation must not accept another event", acceptedRows.size == 3 && acceptedRows.map { it.getString("eventId") }.toSet().size == 3 && + acceptedRows.map { it.getString("printJobId") }.toSet().size == 3) + assertSetupPinned(rows("echoFixtureRun").single { it.getString("id") == runId }) + stage("echo-copies-persisted") + stage("echo-recreation-stable") + ui.onNodeWithTag("topBar.menuIcon").performClick() + ui.onNodeWithTag("drawer.home").performClick() + waitFor("Leave process") + ui.onNodeWithText("Leave process", substring = false).performClick() + waitForTag("appHome.rowForApp:echo") + waitForServer { rows("echoFixtureRun").single { it.getString("id") == runId }.getString("state") == "CLOSED" } + assertTrue("Leaving must close this run without accepting extra print work", rows("echoScan").count { it.optString("runId") == runId } == 3) + assertCopiesPinned(rows("echoFixtureRun").single { it.getString("id") == runId }) + stage("echo-run-closed") + ui.onNodeWithTag("appHome.rowForApp:echo").performClick() + waitForTag("appHome.rowForTable:echoScan") + ui.onNodeWithTag("appHome.rowForTable:echoScan").performClick() + waitForTag("records.row:$receipt") + ui.onNodeWithTag("records.row:$receipt").performClick() + waitForTag("record.details") + ui.onNodeWithText("(01)09501101530003(11)201014(21)TEST000123").performScrollTo().assertIsDisplayed() + stage("echo-record-browsed") + } + + /******************************************************************************* + ** Real host/native activity-result boundaries and real upload APIs, using synthetic images only. + *******************************************************************************/ + @Test + fun cameraAutoUploadsAndPendingGallerySurvivesRotationThenCleansOnRemoteLogout() { + exercisePhotoCapture(false) + } + + /******************************************************************************* + ** Record browsing selects the parent, and the same upload/lifecycle contract still applies. + *******************************************************************************/ + @Test + fun recordDetailsCameraAndGalleryAttachToSelectedRecord() { + exercisePhotoCapture(true) + } + + @Test + fun richRecordsPageGroupNavigateAndAttachPhotos() { + exercisePhotoCapture(fromRecord = true, rich = true) + } + + private fun exercisePhotoCapture(fromRecord: Boolean, rich: Boolean = false) { + val parentTable = if (rich) "testOrder" else "document" + val parentId = if (rich) "26" else "1" + val instrumentation = InstrumentationRegistry.getInstrumentation() + val context = instrumentation.targetContext + check(context.packageName == "io.qrun.mobile.scanner.e2e") + val configFile = File(context.filesDir, "e2e.json") + val config = JSONObject(configFile.readText()) + configFile.delete() + origin = config.getString("serverUrl").trimEnd('/') + // Explicit fixture expectations, not production host classification: the rich-records scenario (rich=true) runs + // against the configured EchoDemo host, which admits an approved device's captures immediately + // (Record Files quarantineCapturedFiles=false) and so expects AVAILABLE. The generic document/process photo + // fixtures (rich=false) expect QUARANTINED. + val echoHost = rich + val savedMessage = if (echoHost) "Saved photo." else "Saved photo. Awaiting server review." + val expectedLifecycle = if (echoHost) "AVAILABLE" else "QUARANTINED" + val expectedBadge = if (echoHost) "Available" else "Awaiting review" + val bitmap = Bitmap.createBitmap(4, 4, Bitmap.Config.ARGB_8888).apply { eraseColor(Color.BLUE) } + val bytes = ByteArrayOutputStream().use { output -> bitmap.compress(Bitmap.CompressFormat.JPEG, 100, output); output.toByteArray() } + bitmap.recycle() + val directory = File(context.cacheDir, "record-photos").apply { mkdirs() } + val galleryFile = File(directory, "gallery-fixture-${UUID.randomUUID()}.jpg").apply { writeBytes(bytes) } + val galleryUri = FileProvider.getUriForFile(context, context.packageName + ".photos", galleryFile) + val cameraCalls = AtomicInteger() + val galleryCalls = AtomicInteger() + val monitor = object : Instrumentation.ActivityMonitor() { + /******************************************************************************* + ** + *******************************************************************************/ + override fun onStartActivity(intent: Intent): Instrumentation.ActivityResult? { + if (intent.action == MediaStore.ACTION_IMAGE_CAPTURE) { + cameraCalls.incrementAndGet() + // API26-compatible parcelable access; this URI is created by the tested host's FileProvider. + @Suppress("DEPRECATION") val output = intent.getParcelableExtra<Uri>(MediaStore.EXTRA_OUTPUT)!! + context.contentResolver.openOutputStream(output)!!.use { it.write(bytes) } + return Instrumentation.ActivityResult(Activity.RESULT_OK, null) + } + if (intent.action in setOf(MediaStore.ACTION_PICK_IMAGES, Intent.ACTION_OPEN_DOCUMENT, Intent.ACTION_GET_CONTENT)) { + galleryCalls.incrementAndGet() + return Instrumentation.ActivityResult(Activity.RESULT_OK, Intent().setData(galleryUri).addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)) + } + return null + } + } + instrumentation.addMonitor(monitor) + try { + waitFor("QQQ server URL") + ui.onNodeWithText("QQQ server URL").performTextReplacement("$origin/") + ui.onNodeWithText("Connect", substring = false).performClick() + waitFor("Username") + ui.onNodeWithText("Username").performTextReplacement("scanner") + ui.onNodeWithText("Password").performTextReplacement(config.getString("scannerPassword")) + ui.onNodeWithText("Password").performImeAction() + ui.onNode(hasText("Sign in") and hasClickAction()).performScrollTo().performClick() + waitFor("An administrator must approve this device before you can run mobile apps.") + val device = DeviceCredentials(context, "$origin/") + adminCookie = loginAdmin(config.getString("adminPassword")) + runAdmin("mobileDeviceApprove", device.deviceId) + ui.onNodeWithText("Check approval").performScrollTo().performClick() + val app = if (rich) "mobileTestData" else "mobileScanApp" + waitForTag("appHome.rowForApp:$app") + // Accessible activation avoids a system floating control covering a tile on physical devices. + ui.onNodeWithTag("appHome.rowForApp:$app").performScrollTo().assertIsDisplayed() + .performSemanticsAction(SemanticsActions.OnClick) { it() } + if (fromRecord) { + waitForTag("appHome.rowForTable:$parentTable") + ui.onNodeWithTag("appHome.rowForTable:$parentTable").performScrollTo().assertIsDisplayed() + .performSemanticsAction(SemanticsActions.OnClick) { it() } + waitForTag("records.row:1") + if (rich) { + ui.onNodeWithText("Next").performClick() + waitForTag("records.row:26") + ui.onNodeWithTag("records.row:1").assertDoesNotExist() + } + ui.onNodeWithTag("records.row:$parentId").performClick() + waitForTag("record.details") + if (rich) { + ui.activityRule.scenario.onActivity { it.onBackPressedDispatcher.onBackPressed() } + waitForTag("records.row:26") + ui.onNodeWithText("26–50 of 1000").assertIsDisplayed() + ui.onNodeWithTag("records.row:1").assertDoesNotExist() + ui.onNodeWithTag("records.search").performTextReplacement("TEST-000026") + ui.waitForIdle() + waitFor("1–1 of 1") + ui.onNodeWithTag("records.row:26").performClick() + waitForTag("record.details") + ui.activityRule.scenario.onActivity { it.onBackPressedDispatcher.onBackPressed() } + waitFor("1–1 of 1") + ui.onNodeWithTag("records.search").assertTextContains("TEST-000026") + ui.onNodeWithText("Clear", substring = false).performClick() + waitFor("1–25 of 1000") + ui.onNodeWithText("Filter", substring = false).performClick() + waitFor("Filter records") + ui.onNodeWithTag("records.filter.value").performTextReplacement("TEST-000026") + ui.onNodeWithText("Apply filter").performClick() + waitFor("1–1 of 1") + ui.onNodeWithTag("records.row:26").performClick() + waitForTag("record.details") + listOf("Order overview", "Customer", "Shipping", "Amounts", "Warehouse", "Notes and audit").forEach { + ui.onNodeWithText("Sections (6)").performClick() + ui.onNodeWithText(it, substring = false).performClick() + ui.onNodeWithTag("record.section:$it").performScrollTo().assertIsDisplayed() + } + ui.onNodeWithText("Items", substring = false).performClick() + waitForTag("record.related.row:testOrderItem:301") + ui.onNodeWithText("1–10 of 12").assertIsDisplayed() + ui.onNodeWithTag("record.related.row:testOrderItem:1").assertDoesNotExist() + ui.onNodeWithText("Next", substring = false).performClick() + waitForTag("record.related.row:testOrderItem:311") + ui.onNodeWithTag("record.related.row:testOrderItem:311").performClick() + waitForTag("record.section:Pricing and handling") + ui.onNodeWithText("Back to parent record").performClick() + waitForTag("record.related.row:testOrderItem:311") + ui.onNodeWithText("History", substring = false).performClick() + waitForTag("record.related.row:testOrderEvent:76") + ui.onNodeWithText("1–3 of 3").assertIsDisplayed() + stage("rich-records-grouped-related-paged") + stage("rich-records-search-filter-back-preserved") + } + ui.onNodeWithText("Take photo").assertDoesNotExist() + ui.onNodeWithText("Actions", substring = false).performClick() + waitFor("Add photo") + ui.onNodeWithText("Add photo", substring = false).performClick() + } else { + waitForTag("appHome.rowForProcess:mobileRecordPhotos") + ui.onNodeWithTag("appHome.rowForProcess:mobileRecordPhotos").performClick() + } + waitFor("Take photo") + ui.onNodeWithText("Take photo").performScrollTo().performClick() + waitFor(savedMessage) + if (echoHost) ui.onNodeWithText("Saved photo. Awaiting server review.").assertDoesNotExist() + assertEquals("Camera result must automatically upload without a second tap", 1, cameraCalls.get()) + assertTrue(directory.listFiles().orEmpty().none { it.name.startsWith("photo-") }) + val savedRows = jsonRequest("/qqq/v1/table/record_files_file/query", JSONObject()).getJSONArray("records") + val savedFile = (0 until savedRows.length()).map { savedRows.getJSONObject(it).getJSONObject("values") } + .single { it.optString("deviceId") == device.deviceId && it.optString("sha256") == RecordFilesApi.sha256(bytes) } + assertEquals(parentTable, savedFile.getString("tableName")) + assertEquals(parentId, savedFile.getString("recordId")) + assertEquals("CAPTURE", savedFile.getString("origin")) + assertTrue(savedFile.getString("originDetail").endsWith("source CAMERA")) + assertEquals(expectedLifecycle, savedFile.getString("lifecycle")) + assertEquals(bytes.size.toLong(), savedFile.getLong("sizeBytes")) + assertTrue(savedFile.getLong("attachmentId") > 0) + val associations = jsonRequest("/qqq/v1/table/record_files_collection_item/query", JSONObject()).getJSONArray("records") + // Collection storage is one-based; the upload manifest/receipt positions are zero-based. + assertTrue((0 until associations.length()).map { associations.getJSONObject(it).getJSONObject("values") } + .any { it.optString("fileId") == savedFile.getString("id") && it.optString("tableName") == parentTable && it.optString("recordId") == parentId && it.optInt("position") == 1 }) + stage("native-photo-camera-saved") + + ui.onNodeWithText("Choose photo").performScrollTo().performClick() + waitFor("Photo ready to upload.") + assertEquals(1, galleryCalls.get()) + ui.onNodeWithText("Upload photo").performScrollTo().performClick() + waitFor(savedMessage) + val galleryRows = jsonRequest("/qqq/v1/table/record_files_file/query", JSONObject()).getJSONArray("records") + val gallerySaved = (0 until galleryRows.length()).map { galleryRows.getJSONObject(it).getJSONObject("values") } + .single { it.optString("deviceId") == device.deviceId && it.optString("originDetail").endsWith("source GALLERY") } + assertEquals(parentTable, gallerySaved.getString("tableName")) + assertEquals(parentId, gallerySaved.getString("recordId")) + assertEquals(RecordFilesApi.sha256(bytes), gallerySaved.getString("sha256")) + assertEquals(expectedLifecycle, gallerySaved.getString("lifecycle")) + assertTrue(gallerySaved.getLong("attachmentId") > 0) + stage("native-photo-gallery-saved") + if (fromRecord) { + ui.onNodeWithText("Done", substring = false).performClick() + ui.onNodeWithText("Photos", substring = false).performClick() + waitFor(if (rich) "3 photos" else "2 photos") + if (rich) { + ui.onNodeWithText("Preview example 27.jpg").assertDoesNotExist() + // Seeded, camera and gallery photos are all AVAILABLE, so scope thumbnail and Preview to the newly captured camera row. + val cameraRow = "record.photo:${savedFile.getString("id")}" + ui.onNodeWithTag("record.photos.list").performScrollToNode(hasTestTag(cameraRow)) + val cameraThumbnail = hasTestTag("photo.image:256") and hasAnyAncestor(hasTestTag(cameraRow)) + ui.waitUntil(timeoutMillis = 60_000) { runCatching { ui.onNode(cameraThumbnail).fetchSemanticsNode() }.isSuccess } + ui.onNode(hasText("Preview photo") and hasAnyAncestor(hasTestTag(cameraRow))).performClick() + waitFor("Photo preview") + waitForTag("photo.image:1600") + ui.onNodeWithText("Close preview").performClick() + stage("native-photo-approved-preview") + } else ui.onNodeWithText("Preview photo").assertDoesNotExist() + listOf(savedFile, gallerySaved).forEach { file -> + val row = "record.photo:${file.getString("id")}" + ui.onNodeWithTag("record.photos.list").performScrollToNode(hasTestTag(row)) + ui.onNode(hasText(expectedBadge) and hasAnyAncestor(hasTestTag(row))).assertIsDisplayed() + } + stage("native-photo-gallery-parent-scoped") + ui.onNodeWithText("Actions", substring = false).performClick() + ui.onNodeWithText("Add photo", substring = false).performClick() + } + ui.onNodeWithText("Choose photo").performScrollTo().performClick() + waitFor("Photo ready to upload.") + assertEquals(2, galleryCalls.get()) + val pending = directory.listFiles().orEmpty().single { it.name.startsWith("photo-") } + assertTrue(bytes.contentEquals(pending.readBytes())) + ui.activityRule.scenario.onActivity { OrientationPolicy.LANDSCAPE.select(it) } + waitFor("Photo ready to upload.") + ui.activityRule.scenario.recreate() + waitFor("Photo ready to upload.") + assertTrue("Rotation retains the same private original", pending.exists()) + if (fromRecord) { + ui.onNodeWithText("Done", substring = false).assertIsNotEnabled() + ui.activityRule.scenario.onActivity { it.onBackPressedDispatcher.onBackPressed() } + waitFor("Photo in progress") + ui.onNodeWithText("Return to photo").performClick() + waitFor("Photo ready to upload.") + } else { + ui.onNodeWithTag("topBar.menuIcon").performClick() + ui.onNodeWithTag("drawer.home").performClick() + ui.onNodeWithText("Leave process", substring = false).assertIsNotEnabled() + ui.onNodeWithText("Stay").performClick() + } + stage("native-photo-rotation-preserved") + + var sessionId = "" + waitForServer { + sessionId = sessionRows().firstOrNull { it.optString("deviceId") == device.deviceId && it.optString("status") == "ACTIVE" }?.optString("id").orEmpty() + sessionId.isNotBlank() + } + val launch = processCall("mobileSessionEnd", "/init", JSONObject()) + val ended = processCall("mobileSessionEnd", "/${launch.getString("processUUID")}/step/input", JSONObject().put("sessionId", sessionId)) + if (ended.optString("nextStep") == "result") processCall("mobileSessionEnd", "/${launch.getString("processUUID")}/step/result", JSONObject()) + waitFor("Log back in") + waitForServer { !pending.exists() } + assertTrue("The selected gallery original is never deleted", galleryFile.exists()) + assertEquals("No late callback created a second camera action", 1, cameraCalls.get()) + stage("native-photo-forced-logout-cleaned") + } finally { + instrumentation.removeMonitor(monitor) + galleryFile.delete() + } + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun sessionActivityMirrorsActualScreenAndAdminEndForcesFreshLogin() { + val context = InstrumentationRegistry.getInstrumentation().targetContext + check(context.packageName in setOf("io.qrun.mobile.scanner.e2e", "io.qrun.mobile.scanner.qa")) + val configFile = File(context.filesDir, "e2e.json") + val config = JSONObject(configFile.readText()) + configFile.delete() + origin = config.getString("serverUrl").trimEnd('/') + waitFor("QQQ server URL") + ui.onNodeWithText("QQQ server URL").performTextReplacement("$origin/") + ui.onNodeWithText("Connect", substring = false).performClick() + /******************************************************************************* + ** + *******************************************************************************/ + fun signIn() { + waitFor("Username") + ui.onNodeWithText("Username").performTextReplacement("scanner") + ui.onNodeWithText("Password").performTextReplacement(config.getString("scannerPassword")) + ui.onNodeWithText("Password").performImeAction() + ui.onNode(hasText("Sign in") and hasClickAction()).performScrollTo().performClick() + } + signIn() + waitFor("An administrator must approve this device before you can run mobile apps.") + val device = DeviceCredentials(context, "$origin/") + adminCookie = loginAdmin(config.getString("adminPassword")) + runAdmin("mobileDeviceApprove", device.deviceId) + ui.onNodeWithText("Check approval").performScrollTo().assertIsDisplayed().performClick() + try { + waitForTag("appHome.rowForApp:mobileScanApp") + } catch (error: androidx.compose.ui.test.ComposeTimeoutException) { + val safeTree = ui.onRoot().printToString().replace(config.getString("scannerPassword"), "<REDACTED>") + .replace(config.getString("adminPassword"), "<REDACTED>") + throw AssertionError("Approved app catalog did not load: $safeTree", error) + } + ui.onNodeWithTag("appHome.rowForApp:mobileScanApp").performClick() + waitForTag("appHome.rowForProcess:mobileScanCapture") + ui.onNodeWithTag("appHome.rowForProcess:mobileScanCapture").performClick() + waitFor("Manual barcode") + ui.onNodeWithText("Manual barcode").performTextReplacement("orientation-draft") + ui.onNodeWithText("Manual barcode").assertTextContains("orientation-draft") + ui.activityRule.scenario.onActivity { OrientationPolicy.LANDSCAPE.select(it) } + ui.waitUntil(timeoutMillis = 15000) + { + var landscape = false + ui.activityRule.scenario.onActivity { + landscape = it.resources.configuration.orientation == android.content.res.Configuration.ORIENTATION_LANDSCAPE && + it.lifecycle.currentState.isAtLeast(androidx.lifecycle.Lifecycle.State.RESUMED) + } + landscape + } + waitFor("Manual barcode") + ui.onNodeWithText("Manual barcode").assertTextContains("orientation-draft") + ui.activityRule.scenario.recreate() + waitFor("Manual barcode") + ui.onNodeWithText("Manual barcode").assertTextContains("orientation-draft") + stage("session-process-open") + var row = JSONObject() + waitForServer { + row = sessionRows().firstOrNull { it.optString("deviceId") == device.deviceId && it.optString("status") == "ACTIVE" } ?: JSONObject() + row.optString("processName") == "mobileScanCapture" && row.optString("stepName").isNotBlank() + } + val sessionId = row.getString("id") + assertEquals("mobileScanApp", row.getString("appName")) + assertTrue(row.getBoolean("foreground")) + val deviceRows = jsonRequest("/qqq/v1/table/mobileDevice/query", JSONObject()).getJSONArray("records") + val deviceRow = (0 until deviceRows.length()).map { deviceRows.getJSONObject(it).getJSONObject("values") }.single { it.getString("id") == device.deviceId } + assertEquals("PERMISSION_DENIED", deviceRow.getString("locationStatus")) + /******************************************************************************* + ** + *******************************************************************************/ + fun screenWidget() = jsonRequest("/qqq/v1/widget/mobileSessionScreen", JSONObject().put("id", sessionId)) + try { + waitForServer { + row = sessionRows().single { it.getString("id") == sessionId } + row.optBoolean("screenAvailable") + } + } catch (error: AssertionError) { + var windowState = "unavailable" + ui.activityRule.scenario.onActivity { activity -> + val power = activity.getSystemService(android.os.PowerManager::class.java) + val keyguard = activity.getSystemService(android.app.KeyguardManager::class.java) + windowState = "interactive=${power.isInteractive}, keyguard=${keyguard.isKeyguardLocked}, deviceLocked=${keyguard.isDeviceLocked}, activityFocus=${activity.hasWindowFocus()}, decorFocus=${activity.window.decorView.hasWindowFocus()}, lifecycle=${activity.lifecycle.currentState}" + } + throw AssertionError("Capture eligibility did not converge: foreground=${row.optBoolean("foreground")}, reason=${row.optString("captureBlockedReason")}, $windowState", error) + } + // Match the ordinary admin widget's polling lease, including transient screen changes. + var widgetStatus = "unobserved" + try { + waitForServer { + val widget = screenWidget() + val blocks = widget.optJSONArray("blocks") ?: widget.optJSONArray("subBlocks") + widgetStatus = blocks?.optJSONObject(0)?.optJSONObject("values")?.optString("text").orEmpty() + ui.onAllNodesWithText("Screen being viewed by an administrator").fetchSemanticsNodes().isNotEmpty() + } + } catch (error: AssertionError) { + val latest = sessionRows().single { it.getString("id") == sessionId } + throw AssertionError("Viewing demand did not converge: available=${latest.optBoolean("screenAvailable")}, reason=${latest.optString("captureBlockedReason")}, lastSeenAt=${latest.optString("lastSeenAt")}, deviceTime=${java.time.Instant.now()}, widgetStatus=$widgetStatus", error) + } + var frame = "" + waitForServer { + frame = findImage(screenWidget()).orEmpty() + frame.startsWith("data:image/jpeg;base64,") + } + val bytes = Base64.decode(frame.substringAfter(','), Base64.DEFAULT) + val bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.size) + assertTrue("Admin receives actual decodable app pixels", bitmap != null && bitmap.width <= 640 && bitmap.height <= 1280) + bitmap?.recycle() + stage("session-mirror-frame") + ui.activityRule.scenario.moveToState(androidx.lifecycle.Lifecycle.State.STARTED) + waitForServer { screenWidget().toString().contains("APP_BACKGROUND") && findImage(screenWidget()) == null } + ui.activityRule.scenario.moveToState(androidx.lifecycle.Lifecycle.State.RESUMED) + waitForServer { + screenWidget() + ui.onAllNodesWithText("Screen being viewed by an administrator").fetchSemanticsNodes().isNotEmpty() + } + // Scanner users have no in-app control to pause or disable administrator viewing. + assertTrue("No in-app Stop viewing control", ui.onAllNodesWithText("Stop viewing").fetchSemanticsNodes().isEmpty()) + assertTrue("No in-app Allow viewing control", ui.onAllNodesWithText("Allow viewing").fetchSemanticsNodes().isEmpty()) + ui.onNodeWithText("Screen being viewed by an administrator").assertHasNoClickAction() + waitForServer { findImage(screenWidget()).orEmpty().startsWith("data:image/jpeg;base64,") } + val launch = processCall("mobileSessionEnd", "/init", JSONObject()) + val applied = processCall("mobileSessionEnd", "/${launch.getString("processUUID")}/step/input", JSONObject().put("sessionId", sessionId)) + if (applied.optString("nextStep") == "result") processCall("mobileSessionEnd", "/${launch.getString("processUUID")}/step/result", JSONObject()) + waitFor("Log back in") + assertEquals("ENDED", sessionRows().single { it.getString("id") == sessionId }.getString("status")) + // The label is rendered during asynchronous logout while its button is disabled. + // Clicking that disabled control is a no-op, not a request for a fresh login. + ui.waitUntil(timeoutMillis = 15_000) + { + val signedOut = ui.onAllNodesWithText("Signed out.").fetchSemanticsNodes().isNotEmpty() || + ui.onAllNodesWithText("Signed out on this device.", substring = true).fetchSemanticsNodes().isNotEmpty() + signedOut && ui.onAllNodes(hasText("Log back in") and isEnabled()).fetchSemanticsNodes().isNotEmpty() + } + stage("session-login-action-ready") + ui.onNodeWithText("Log back in").assertIsEnabled().performClick() + signIn() + waitForTag("appHome.rowForApp:mobileScanApp") + waitForServer { sessionRows().any { it.optString("deviceId") == device.deviceId && it.optString("status") == "ACTIVE" && it.optString("id") != sessionId } } + stage("session-fresh-login") + } + + /******************************************************************************* + ** + *******************************************************************************/ + private fun sessionRows(): List<JSONObject> { + return SessionAcceptanceClient(origin, adminCookie, client).sessions() + } + + /******************************************************************************* + ** + *******************************************************************************/ + private fun waitForServer(condition: () -> Boolean) { + val deadline = System.nanoTime() + TimeUnit.SECONDS.toNanos(40) + var lastClockAdvance = System.nanoTime() + while (true) { + // LaunchedEffect timers use this clock; keep it aligned with real network/polling time. + val now = System.nanoTime() + ui.mainClock.advanceTimeBy(TimeUnit.NANOSECONDS.toMillis(now - lastClockAdvance).coerceAtLeast(16)) + lastClockAdvance = now + if (condition()) return + assertTrue("Session server state must converge", System.nanoTime() < deadline) + Thread.sleep(250) + } + } + + /******************************************************************************* + ** + *******************************************************************************/ + private fun findImage(value: Any?): String? = SessionAcceptanceClient.image(value) + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun adminFormsApproveRevokeAndCancel() { + stage("admin-start") + val context = InstrumentationRegistry.getInstrumentation().targetContext + check(context.packageName == "io.qrun.mobile.scanner.e2e") + val configFile = File(context.filesDir, "e2e.json") + val config = JSONObject(configFile.readText()) + configFile.delete() + origin = config.getString("serverUrl").trimEnd('/') + waitFor("QQQ server URL") + ui.onNodeWithText("QQQ server URL").performTextReplacement("$origin/") + ui.onNodeWithText("Connect", substring = false).performClick() + try { + waitFor("Username") + } catch (error: androidx.compose.ui.test.ComposeTimeoutException) { + // This is before any credentials are entered; retain the actual startup error for diagnosis. + throw AssertionError("Admin login screen did not load: ${ui.onRoot().printToString()}", error) + } + stage("admin-login") + ui.onNodeWithText("Username").performTextReplacement("admin") + ui.onNodeWithText("Password").performTextReplacement(config.getString("adminPassword")) + ui.onNodeWithText("Password").performImeAction() + ui.onNode(hasText("Sign in") and hasClickAction()).performScrollTo().assertIsDisplayed().assertIsEnabled().performClick() + waitFor("An administrator must approve this device before you can run mobile apps.") + stage("admin-enrolled") + adminCookie = loginAdmin(config.getString("adminPassword")) + runAdmin("mobileDeviceApprove", DeviceCredentials(context, "$origin/").deviceId) + val targetDevice = jsonRequest( + "/qqq/v1/qbit/mobile-scanners/devices/enroll", JSONObject() + .put("installationId", UUID.randomUUID().toString()).put("displayName", "Native form fixture") + .put("manufacturer", "Test").put("model", "Emulator").put("osVersion", "test").put("appVersion", "test"), expectedStatus = 201 + ) + val target = targetDevice.getString("deviceId") + ui.onNodeWithText("Check approval").performScrollTo().assertIsDisplayed().performClick() + waitForTag("appHome.rowForApp:mobileScannerAdmin") + ui.onNodeWithTag("appHome.rowForApp:mobileScannerAdmin").performClick() + stage("admin-app-open") + for ((process, status, result) in listOf( + Triple("mobileDeviceApprove", "APPROVED", "1 device approved."), + Triple("mobileDeviceRevoke", "REVOKED", "1 device revoked.") + )) { + stage("admin-open-$process") + waitForTag("appHome.rowForProcess:$process") + ui.onNodeWithTag("appHome.rowForProcess:$process").performClick() + waitFor("Device IDs", substring = true) + ui.onNodeWithText("Device IDs", substring = true).performTextReplacement(target) + ui.onNodeWithText("Next", substring = false).performClick() + stage("admin-submitted-$process") + waitFor(result, substring = true) + assertEquals("Native form must persist its submitted target", status, deviceStatus(target)) + ui.onNodeWithText("Next", substring = false).performClick() + stage("admin-finish-submitted-$process") + waitFor("Close") + stage("admin-complete-$process") + ui.onNodeWithText("Close").performClick() + stage("admin-closed-$process") + } + // A separate core login represents another handheld; end it through the native metadata form. + runAdmin("mobileDeviceApprove", target) + val fixtureCookie = loginAdmin(config.getString("scannerPassword"), "scanner") + val heartbeat = executeJson( + Request.Builder().url("$origin/qqq/v1/qbit/mobile-scanners/sessions/heartbeat") + .header("Cookie", fixtureCookie).header("X-QQQ-Device-Id", target) + .header("X-QQQ-Device-Token", targetDevice.getString("deviceToken")) + .header("X-QQQ-Client", "android/qqq-mobile") + .post( + JSONObject().put("foreground", true).put("screenAvailable", false).put("captureBlockedReason", "SCREEN_LOADING") + .toString().toRequestBody("application/json".toMediaType()) + ).build() + ) + val targetSession = heartbeat.getString("sessionId") + waitForTag("appHome.rowForProcess:mobileSessionEnd") + ui.onNodeWithTag("appHome.rowForProcess:mobileSessionEnd").performClick() + waitFor("Session IDs", substring = true) + ui.onNodeWithText("Session IDs", substring = true).performScrollTo().performTextReplacement(targetSession) + ui.onNodeWithText("Next", substring = false).performClick() + waitFor("1 session ended.", substring = true) + assertEquals("ENDED", sessionRows().single { it.getString("id") == targetSession }.getString("status")) + ui.onNodeWithText("Next", substring = false).performClick() + waitFor("Close") + ui.onNodeWithText("Close").performClick() + runAdmin("mobileDeviceRevoke", target) + stage("admin-ended-session") + waitForTag("appHome.rowForProcess:mobileDeviceApprove") + ui.onNodeWithTag("appHome.rowForProcess:mobileDeviceApprove").performClick() + waitFor("Device IDs", substring = true) + ui.onNodeWithText("Device IDs", substring = true).performTextReplacement(target) + ui.onNodeWithText("Device IDs", substring = true).performImeAction() + ui.onNodeWithText("Cancel", substring = false).performClick() + ui.onNodeWithText("Leave process", substring = false).performClick() + stage("admin-cancel-submitted") + waitForTag("appHome.rowForProcess:mobileDeviceApprove") + assertEquals("Cancel must not execute a populated form", "REVOKED", deviceStatus(target)) + stage("admin-finished") + } + + /******************************************************************************* + ** + *******************************************************************************/ + private fun stage(name: String) { + InstrumentationRegistry.getInstrumentation().sendStatus(2, Bundle().apply { putString("qqqStage", name) }) + } + + /******************************************************************************* + ** + *******************************************************************************/ + private fun deviceStatus(id: String): String { + val rows = jsonRequest("/qqq/v1/table/mobileDevice/query", JSONObject()).getJSONArray("records") + return (0 until rows.length()).map { rows.getJSONObject(it).getJSONObject("values") } + .single { it.getString("id") == id }.getString("status") + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun incompatibleServerStopsBeforeLogin() { + val context = InstrumentationRegistry.getInstrumentation().targetContext + check(context.packageName == "io.qrun.mobile.scanner.e2e") + val configFile = File(context.filesDir, "e2e.json") + val config = JSONObject(configFile.readText()) + configFile.delete() + waitFor("QQQ server URL") + ui.onNodeWithText("QQQ server URL").performTextReplacement(config.getString("serverUrl")) + ui.onNodeWithText("Connect", substring = false).performClick() + waitFor(config.getString("expectedError"), substring = true) + assertTrue("Incompatible servers must not display a login form", ui.onAllNodesWithText("Username").fetchSemanticsNodes().isEmpty()) + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun loginEnrollApproveCaptureAndRevoke() { + val context = InstrumentationRegistry.getInstrumentation().targetContext + check(context.packageName == "io.qrun.mobile.scanner.e2e") { "E2E must run in its isolated application" } + val configFile = File(context.filesDir, "e2e.json") + val config = JSONObject(configFile.readText()) + configFile.delete() + origin = config.getString("serverUrl").trimEnd('/') + waitFor("QQQ server URL") + ui.onNodeWithText("QQQ server URL").performTextReplacement("$origin/") + ui.onNodeWithText("Connect", substring = false).performClick() + waitFor("Username") + ui.onNodeWithText("Username").performTextReplacement("scanner") + ui.onNodeWithText("Password").performTextReplacement(config.getString("scannerPassword")) + ui.onNodeWithText("Password").performImeAction() + stage("scanner-login-ready") + ui.onNode(hasText("Sign in") and hasClickAction()).performScrollTo().assertIsDisplayed().assertIsEnabled().performClick() + stage("scanner-login-clicked") + waitFor("An administrator must approve this device before you can run mobile apps.") + val device = DeviceCredentials(context, "$origin/") + assertTrue("Enrollment must persist a device identity", device.deviceId.isNotEmpty()) + adminCookie = loginAdmin(config.getString("adminPassword")) + runAdmin("mobileDeviceApprove", device.deviceId) + ui.onNodeWithText("Check approval").performScrollTo().assertIsDisplayed().performClick() + waitForTag("appHome.rowForApp:mobileScanApp") + ui.onNodeWithTag("appHome.rowForApp:mobileScanApp").performClick() + waitForTag("appHome.rowForProcess:mobileScanCapture") + ui.onNodeWithTag("appHome.rowForProcess:mobileScanCapture").performClick() + waitFor("Manual barcode") + val barcode = "000-E2E-${UUID.randomUUID()}" + ui.onNodeWithText("Manual barcode").performScrollTo().performTextReplacement(barcode) + ui.onNodeWithText("Manual barcode").performImeAction() + ui.onNodeWithText("Submit barcode").performScrollTo().assertIsDisplayed().performClick() + waitFor("Saved scan ", substring = true) + val records = jsonRequest("/qqq/v1/table/mobileScan/query", JSONObject()).getJSONArray("records") + val scans = (0 until records.length()).map { records.getJSONObject(it).getJSONObject("values") } + .filter { it.optString("barcode") == barcode } + assertEquals("One UI submission must create one durable scan", 1, scans.size) + assertEquals(device.deviceId, scans.single().getString("deviceId")) + assertEquals("scanner", scans.single().getString("userId")) + assertEquals("manual", scans.single().getString("scanSource")) + assertTrue(scans.single().has("receivedAt")) + + // Scanner-sourced fixture event with exact raw bytes (NUL, high bytes, embedded ]Q1) and an explicit AIM + // identifier, delivered through the disposable e2e driver. Text, type and bytes are fixed and non-sensitive. + val scannedBarcode = "000-NATIVE-RAW-0123" + val scannedSymbology = "LABEL-TYPE-QRCODE" + val rawBytes = byteArrayOf(0x00, 0xFF.toByte(), 0x80.toByte(), ']'.code.toByte(), 'Q'.code.toByte(), '1'.code.toByte(), 'A'.code.toByte(), 0x00, 0xFE.toByte()) + // The same >=1.5 negotiation rule as production, read independently from public discovery of this scenario's server. + val fidelityNegotiated = mobileScannersAtLeast15() + fun scanRows() = jsonRequest("/qqq/v1/table/mobileScan/query", JSONObject()).getJSONArray("records") + val beforeScan = scanRows().length() + waitFor("Scanner ready. Press the handheld trigger.") + context.sendBroadcast(Intent("io.qrun.mobile.scanner.SCAN").setPackage(context.packageName) + .addCategory(Intent.CATEGORY_DEFAULT).putExtra("com.symbol.datawedge.data_string", scannedBarcode) + .putExtra("com.symbol.datawedge.label_type", scannedSymbology) + .putExtra("io.qrun.mobile.scanner.e2e.raw_data", rawBytes) + .putExtra("io.qrun.mobile.scanner.e2e.aim_identifier", "]Q1")) + var scanned: JSONObject? = null + waitForServer { + val rows = scanRows() + scanned = (0 until rows.length()).map { rows.getJSONObject(it).getJSONObject("values") } + .singleOrNull { it.optString("barcode") == scannedBarcode } + scanned != null + } + val persisted = requireNotNull(scanned) + // The acknowledgment names this event's id, so it cannot be the earlier manual acknowledgment. + waitFor("Saved scan ${persisted.getString("id")}", substring = true) + assertEquals("e2e-fixture", persisted.getString("scanSource")) + assertEquals(device.deviceId, persisted.getString("deviceId")) + assertEquals(scannedBarcode, persisted.getString("barcode")) + assertEquals(scannedSymbology, persisted.getString("symbology")) + if (fidelityNegotiated) { + assertTrue("Persisted raw bytes must equal the exact bytes sent, including NUL and high bytes", + rawBytes.contentEquals(Base64.decode(persisted.getString("rawDataBase64"), Base64.NO_WRAP))) + assertEquals("]Q1", persisted.getString("aimIdentifier")) + } else { + assertTrue("A server without scan fidelity must receive and persist legacy fields only", + persisted.isNull("rawDataBase64") && persisted.isNull("aimIdentifier")) + } + assertEquals("One scanner event must create exactly one durable scan", beforeScan + 1, scanRows().length()) + stage(if (fidelityNegotiated) "native-raw-scan-persisted" else "native-legacy-scan-persisted") + + val beforeRevoke = scanRows() + runAdmin("mobileDeviceRevoke", device.deviceId) + // The active heartbeat revokes the open UI as well as protected process submissions. + waitFor("Log back in") + val afterRevoke = scanRows() + assertEquals("Revoked devices cannot save through an already-open process", beforeRevoke.length(), afterRevoke.length()) + } + + /******************************************************************************* + ** Public, credential-free discovery: mobile-scanners at its fixed path with version >=1.5.0 and <2. + *******************************************************************************/ + private fun mobileScannersAtLeast15(): Boolean { + val discovery = executeJson(Request.Builder().url("$origin/qqq/v1/version").get().build()) + val extensions = discovery.optJSONArray("extensions") ?: return false + val extension = (0 until extensions.length()).map { extensions.getJSONObject(it) }.singleOrNull { it.optString("name") == "mobile-scanners" } ?: return false + if (extension.optString("pathPrefix") != "/qbit/mobile-scanners") return false + val parts = Regex("(0|[1-9][0-9]*)\\.(0|[1-9][0-9]*)\\.(0|[1-9][0-9]*)").matchEntire(extension.optString("version"))?.groupValues ?: return false + return parts[1] == "1" && (parts[2].toIntOrNull() ?: return false) >= 5 + } + + /******************************************************************************* + ** + *******************************************************************************/ + private fun waitFor(text: String, substring: Boolean = false) { + ui.waitUntil(timeoutMillis = 60_000) { ui.onAllNodesWithText(text, substring = substring).fetchSemanticsNodes().isNotEmpty() } + } + + /******************************************************************************* + ** + *******************************************************************************/ + private fun waitForTag(tag: String) { + ui.waitUntil(timeoutMillis = 60_000) { runCatching { ui.onNodeWithTag(tag).fetchSemanticsNode() }.isSuccess } + } + + /******************************************************************************* + ** + *******************************************************************************/ + private fun loginAdmin(password: String, account: String = "admin"): String { + return SessionAcceptanceClient.login(origin, password, client, account) + } + + /******************************************************************************* + ** + *******************************************************************************/ + private fun runAdmin(process: String, deviceId: String) { + val launch = processCall(process, "/init", JSONObject()) + val processId = launch.getString("processUUID") + val applied = processCall(process, "/$processId/step/input", JSONObject().put("deviceId", deviceId)) + if (applied.optString("nextStep") == "result") processCall(process, "/$processId/step/result", JSONObject()) + } + + /******************************************************************************* + ** + *******************************************************************************/ + private fun processCall(process: String, suffix: String, values: JSONObject): JSONObject { + return SessionAcceptanceClient(origin, adminCookie, client).process(process, suffix, values) + } + + /******************************************************************************* + ** + *******************************************************************************/ + private fun jsonRequest(path: String, body: JSONObject, expectedStatus: Int = 200): JSONObject = + SessionAcceptanceClient(origin, adminCookie, client).json(path, body, expectedStatus) + + /******************************************************************************* + ** + *******************************************************************************/ + private fun executeJson(request: Request, expectedStatus: Int = 200): JSONObject = client.newCall(request).execute().use { response -> + assertEquals("Test server request must succeed", expectedStatus, response.code) + JSONObject(response.body!!.string()) + } +} diff --git a/scanner-host/src/androidTest/java/io/qrun/mobile/scanner/SessionAcceptanceClient.kt b/scanner-host/src/androidTest/java/io/qrun/mobile/scanner/SessionAcceptanceClient.kt new file mode 100644 index 0000000..f4a2a09 --- /dev/null +++ b/scanner-host/src/androidTest/java/io/qrun/mobile/scanner/SessionAcceptanceClient.kt @@ -0,0 +1,122 @@ +/* Copyright (c) 2026 QRunIO. SPDX-License-Identifier: Apache-2.0 */ +package io.qrun.mobile.scanner + +import java.util.concurrent.TimeUnit +import okhttp3.Credentials +import okhttp3.MediaType.Companion.toMediaType +import okhttp3.MultipartBody +import okhttp3.OkHttpClient +import okhttp3.Request +import okhttp3.RequestBody.Companion.toRequestBody +import org.json.JSONObject +import org.junit.Assert.assertEquals +import org.junit.Assert.assertTrue + +/******************************************************************************* + ** Shared real semantic HTTP fixture operations; never prints credentials or response bodies. + *******************************************************************************/ +internal class SessionAcceptanceClient( + private val origin: String, private val cookie: String, + private val client: OkHttpClient +) { + /******************************************************************************* + ** + *******************************************************************************/ + fun json(path: String, body: JSONObject, expectedStatus: Int = 200): JSONObject = execute( + Request.Builder().url("$origin$path") + .header("Cookie", cookie).header("Origin", origin).post(body.toString().toRequestBody("application/json".toMediaType())).build(), expectedStatus + ) + + /******************************************************************************* + ** + *******************************************************************************/ + fun process(name: String, suffix: String, values: JSONObject): JSONObject { + var result = execute( + Request.Builder().url("$origin/qqq/v1/processes/$name$suffix").header("Cookie", cookie).header("Origin", origin) + .post( + MultipartBody.Builder().setType(MultipartBody.FORM).addFormDataPart("values", values.toString()) + .addFormDataPart("stepTimeoutMillis", "10000").build() + ).build() + ) + val id = result.optString("processUUID") + val job = result.optString("jobUUID") + val deadline = System.nanoTime() + TimeUnit.SECONDS.toNanos(30) + while (result.optString("type") in listOf("JOB_STARTED", "RUNNING")) { + assertTrue("Fixture process must finish before its deadline", System.nanoTime() < deadline) + Thread.sleep(50) + result = execute(Request.Builder().url("$origin/qqq/v1/processes/$name/$id/status/$job").header("Cookie", cookie).build()) + } + assertTrue("Fixture process must not fail", !result.has("error")) + return result + } + + /******************************************************************************* + ** + *******************************************************************************/ + fun apply(name: String, values: JSONObject) { + val id = process(name, "/init", JSONObject()).getString("processUUID") + val applied = process(name, "/$id/step/input", values) + if (applied.optString("nextStep") == "result") process(name, "/$id/step/result", JSONObject()) + } + + /******************************************************************************* + ** + *******************************************************************************/ + fun sessions(): List<JSONObject> { + val rows = json("/qqq/v1/table/mobileSession/query", JSONObject()).getJSONArray("records") + return (0 until rows.length()).map { rows.getJSONObject(it).getJSONObject("values") } + } + + /******************************************************************************* + ** + *******************************************************************************/ + fun widget(id: String) = json("/qqq/v1/widget/mobileSessionScreen", JSONObject().put("id", id)) + + /******************************************************************************* + ** + *******************************************************************************/ + fun logout() { + client.newCall( + Request.Builder().url("$origin/qqq/v1/logout").header("Cookie", cookie).header("Origin", origin) + .post("{}".toRequestBody("application/json".toMediaType())).build() + ).execute().use { + assertTrue("Fixture admin logout must succeed", it.isSuccessful) + } + } + + /******************************************************************************* + ** + *******************************************************************************/ + private fun execute(request: Request, expectedStatus: Int = 200) = client.newCall(request).execute().use { + assertEquals("Fixture semantic request must succeed", expectedStatus, it.code) + JSONObject(it.body!!.string()) + } + + /******************************************************************************* + ** + *******************************************************************************/ + companion object { + /******************************************************************************* + ** + *******************************************************************************/ + fun login(origin: String, password: String, client: OkHttpClient, account: String = "admin"): String = + client.newCall( + Request.Builder().url("$origin/qqq/v1/manageSession") + .header("Authorization", Credentials.basic(account, password)) + .post("{}".toRequestBody("application/json".toMediaType())).build() + ).execute().use { + assertEquals("Fixture admin login must succeed", 200, it.code) + it.headers("Set-Cookie").first { value -> value.startsWith("sessionUUID=") }.substringBefore(';') + } + + /******************************************************************************* + ** + *******************************************************************************/ + fun image(value: Any?): String? = when (value) { + is String -> value.takeIf { it.startsWith("data:image/jpeg;base64,") } + is JSONObject -> value.keys().asSequence().mapNotNull { image(value.opt(it)) }.firstOrNull() + is org.json.JSONArray -> (0 until value.length()).firstNotNullOfOrNull { image(value.opt(it)) } + else -> null + } + } +} diff --git a/scanner-host/src/debug/AndroidManifest.xml b/scanner-host/src/debug/AndroidManifest.xml new file mode 100644 index 0000000..28c3cc1 --- /dev/null +++ b/scanner-host/src/debug/AndroidManifest.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8"?> +<manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools"> + <!-- Local LAN demos only. Release builds reject cleartext. --> + <application android:usesCleartextTraffic="true" tools:replace="android:usesCleartextTraffic" /> +</manifest> diff --git a/scanner-host/src/e2e/AndroidManifest.xml b/scanner-host/src/e2e/AndroidManifest.xml new file mode 100644 index 0000000..7f36407 --- /dev/null +++ b/scanner-host/src/e2e/AndroidManifest.xml @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="utf-8"?> +<manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools"> + <!-- Isolated test application; the normal debug/release identities are untouched. + networkSecurityConfig supersedes usesCleartextTraffic on API 24+; the config itself keeps cleartext for + the 127.0.0.1 fixtures and adds user-CA trust for the host localhost only (see docs/REAL-AUTHENTIK-ACCEPTANCE.md). --> + <application android:usesCleartextTraffic="true" android:label="QQQ Mobile E2E" + android:networkSecurityConfig="@xml/network_security_config" + tools:replace="android:usesCleartextTraffic,android:label" /> +</manifest> diff --git a/scanner-host/src/e2e/java/io/qrun/mobile/scanner/ScannerDriverFactory.kt b/scanner-host/src/e2e/java/io/qrun/mobile/scanner/ScannerDriverFactory.kt new file mode 100644 index 0000000..71922c6 --- /dev/null +++ b/scanner-host/src/e2e/java/io/qrun/mobile/scanner/ScannerDriverFactory.kt @@ -0,0 +1,79 @@ +/* Copyright (c) 2026 QRunIO. SPDX-License-Identifier: Apache-2.0 */ +package io.qrun.mobile.scanner + +import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent +import android.content.IntentFilter +import androidx.core.content.ContextCompat + +internal const val HARDWARE_SCAN_SOURCE = "e2e-fixture" +internal const val E2E_RAW_DATA_EXTRA = "io.qrun.mobile.scanner.e2e.raw_data" +internal const val E2E_AIM_IDENTIFIER_EXTRA = "io.qrun.mobile.scanner.e2e.aim_identifier" + +/******************************************************************************* + ** Disposable E2E package only. No debug/release source set contains this ingress. + *******************************************************************************/ +internal fun createScannerDriver(context: Context): ScannerDriver = object : ScannerDriver { + private var listener: ScannerDriver.Listener? = null + private var registered = false + private var pending = false + private val receiver = object : BroadcastReceiver() { + /******************************************************************************* + ** + *******************************************************************************/ + override fun onReceive(context: Context?, intent: Intent?) { + if (!pending || intent?.action != "io.qrun.mobile.scanner.SCAN") return + val data = intent.getStringExtra("com.symbol.datawedge.data_string") ?: return + if (intent.getStringExtra("com.symbol.datawedge.decode_mode") == "multiple" || intent.hasExtra("com.symbol.datawedge.barcodes")) return + pending = false + // Test-only fixture metadata: exact bytes and an explicit AIM identifier, never derived from the text. + val raw = intent.getByteArrayExtra(E2E_RAW_DATA_EXTRA) + val aim = intent.getStringExtra(E2E_AIM_IDENTIFIER_EXTRA) + listener?.scanned(ScannerCapture.of(data, intent.getStringExtra("com.symbol.datawedge.label_type") ?: "UNKNOWN", raw, aim)) + listener?.idle() + } + } + + /******************************************************************************* + ** + *******************************************************************************/ + override fun open(listener: ScannerDriver.Listener) { + this.listener = listener + ContextCompat.registerReceiver(context, receiver, IntentFilter("io.qrun.mobile.scanner.SCAN").apply { + addCategory(Intent.CATEGORY_DEFAULT) + }, ContextCompat.RECEIVER_EXPORTED) + registered = true + listener.idle() + } + + /******************************************************************************* + ** + *******************************************************************************/ + override fun isReadPending() = pending + + /******************************************************************************* + ** + *******************************************************************************/ + override fun read() { + pending = true + } + + /******************************************************************************* + ** + *******************************************************************************/ + override fun cancelRead() { + pending = false; listener?.idle() + } + + /******************************************************************************* + ** + *******************************************************************************/ + override fun close() { + listener = null + pending = false + if (registered) { + context.unregisterReceiver(receiver); registered = false + } + } +} diff --git a/scanner-host/src/e2e/res/xml/network_security_config.xml b/scanner-host/src/e2e/res/xml/network_security_config.xml new file mode 100644 index 0000000..4f971c4 --- /dev/null +++ b/scanner-host/src/e2e/res/xml/network_security_config.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright (c) 2026 QRunIO. SPDX-License-Identifier: Apache-2.0 --> +<!-- E2E package only. Keeps the existing cleartext 127.0.0.1 fixture traffic and system trust everywhere, and lets + ONLY the literal host "localhost" additionally trust a user-installed (temporary, user-approved) test CA. + localhost is HTTPS-only. Debug, qa and release builds never see this file. No certificate is pinned or bypassed. --> +<network-security-config> + <base-config cleartextTrafficPermitted="true"> + <trust-anchors> + <certificates src="system" /> + </trust-anchors> + </base-config> + <domain-config cleartextTrafficPermitted="false"> + <domain includeSubdomains="false">localhost</domain> + <trust-anchors> + <certificates src="system" /> + <certificates src="user" /> + </trust-anchors> + </domain-config> +</network-security-config> diff --git a/scanner-host/src/main/AndroidManifest.xml b/scanner-host/src/main/AndroidManifest.xml new file mode 100644 index 0000000..069b3eb --- /dev/null +++ b/scanner-host/src/main/AndroidManifest.xml @@ -0,0 +1,40 @@ +<?xml version="1.0" encoding="utf-8"?> +<manifest xmlns:android="http://schemas.android.com/apk/res/android"> + <uses-permission android:name="android.permission.INTERNET" /> + <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> + <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> + <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> + <uses-permission android:name="android.permission.FOREGROUND_SERVICE" /> + <uses-permission android:name="android.permission.FOREGROUND_SERVICE_MEDIA_PROJECTION" /> + <uses-permission android:name="android.permission.POST_NOTIFICATIONS" /> + <uses-permission android:name="com.symbol.emdk.permission.EMDK" /> + <queries> + <package android:name="com.symbol.emdk.emdkservice" /> + </queries> + <application android:allowBackup="false" android:fullBackupContent="false" + android:dataExtractionRules="@xml/data_extraction_rules" android:usesCleartextTraffic="false" + android:icon="@drawable/ic_scanner" + android:label="QQQ Mobile" android:theme="@android:style/Theme.Material.Light.NoActionBar"> + <uses-library android:name="com.symbol.emdk" android:required="false" /> + <meta-data android:name="android.content.APP_RESTRICTIONS" android:resource="@xml/app_restrictions" /> + <!-- Optional live wallpaper; inactive until chosen in Android's wallpaper chooser. Only the system may bind it. --> + <service android:name=".QqqStatusWallpaperService" android:exported="true" android:label="@string/status_wallpaper_label" + android:permission="android.permission.BIND_WALLPAPER"> + <intent-filter> + <action android:name="android.service.wallpaper.WallpaperService" /> + </intent-filter> + <meta-data android:name="android.service.wallpaper" android:resource="@xml/status_wallpaper" /> + </service> + <service android:name=".DeviceScreenCaptureService" android:foregroundServiceType="mediaProjection" android:exported="false" /> + <provider android:name="androidx.core.content.FileProvider" android:authorities="${applicationId}.photos" + android:exported="false" android:grantUriPermissions="true"> + <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/photo_paths" /> + </provider> + <activity android:name=".ScannerActivity" android:exported="true"> + <intent-filter> + <action android:name="android.intent.action.MAIN" /> + <category android:name="android.intent.category.LAUNCHER" /> + </intent-filter> + </activity> + </application> +</manifest> diff --git a/scanner-host/src/main/java/io/qrun/mobile/scanner/AboutScreen.kt b/scanner-host/src/main/java/io/qrun/mobile/scanner/AboutScreen.kt new file mode 100644 index 0000000..a8b26a1 --- /dev/null +++ b/scanner-host/src/main/java/io/qrun/mobile/scanner/AboutScreen.kt @@ -0,0 +1,94 @@ +/* Copyright (c) 2026 QRunIO. SPDX-License-Identifier: Apache-2.0 */ +package io.qrun.mobile.scanner + +import android.content.ActivityNotFoundException +import androidx.compose.foundation.Image +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.safeDrawingPadding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.verticalScroll +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Surface +import androidx.compose.material3.Text +import androidx.compose.material3.TextButton +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.saveable.rememberSaveable +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalUriHandler +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.unit.dp +import androidx.compose.ui.window.Dialog +import androidx.compose.ui.window.DialogProperties + +/******************************************************************************* + ** Keep product information and public website links in secondary settings; + ** Query's bundled artwork remains visible without a server connection. + *******************************************************************************/ +@Composable +fun AboutButton() { + var visible by rememberSaveable { mutableStateOf(false) } + TextButton(onClick = { visible = true }) { Text("About QQQ Mobile") } + if (visible) { + Dialog(onDismissRequest = { visible = false }, properties = DialogProperties(usePlatformDefaultWidth = false)) + { + Surface(Modifier.fillMaxSize()) + { + Column(Modifier.fillMaxSize().safeDrawingPadding()) + { + Row(Modifier.fillMaxWidth().padding(horizontal = 16.dp), verticalAlignment = Alignment.CenterVertically) + { + Text("About", Modifier.weight(1f), style = MaterialTheme.typography.titleLarge) + TextButton(onClick = { visible = false }) { Text("Back") } + } + Column( + Modifier.fillMaxWidth().weight(1f).verticalScroll(rememberScrollState()).padding(24.dp), + verticalArrangement = Arrangement.spacedBy(16.dp) + ) + { + Image(painterResource(R.drawable.query_mascot), "Query, the QRun mascot", Modifier.size(144.dp)) + Text("QQQ Mobile", style = MaterialTheme.typography.headlineSmall) + Text("Version ${BuildConfig.VERSION_NAME} (${BuildConfig.VERSION_CODE})") + Text("Meet Query", style = MaterialTheme.typography.titleMedium) + Text("Query is the QRun mascot. Learn about Query and how we use QQQ ourselves.") + AboutWebsiteLink("Dogfooding at QRun", "https://www.qrun.io/dogfooding") + AboutWebsiteLink("Meet Query", "https://www.qrun.io/query") + OpenSourceLicensesButton() + } + } + } + } + } +} + + +/******************************************************************************* + ** Open only fixed public information URLs in the external browser, without + ** adding server addresses, session information or device identifiers. + *******************************************************************************/ +@Composable +private fun AboutWebsiteLink(label: String, url: String) { + val handler = LocalUriHandler.current + var unavailable by rememberSaveable { mutableStateOf(false) } + TextButton(onClick = { + unavailable = false + try { + handler.openUri(url) + } catch (exception: ActivityNotFoundException) { + unavailable = true + } catch (exception: IllegalArgumentException) { + unavailable = true + } + }) { Text(label) } + Text(url, style = MaterialTheme.typography.bodySmall) + if (unavailable) Text("No browser is available to open this link.", color = MaterialTheme.colorScheme.error) +} diff --git a/scanner-host/src/main/java/io/qrun/mobile/scanner/AimOutputProfile.kt b/scanner-host/src/main/java/io/qrun/mobile/scanner/AimOutputProfile.kt new file mode 100644 index 0000000..3e105c7 --- /dev/null +++ b/scanner-host/src/main/java/io/qrun/mobile/scanner/AimOutputProfile.kt @@ -0,0 +1,52 @@ +/* Copyright (c) 2026 QRunIO. SPDX-License-Identifier: Apache-2.0 */ +package io.qrun.mobile.scanner + +/******************************************************************************* + ** What a configuration read-back proves after the AIM output profile was requested. + *******************************************************************************/ +internal enum class AimReadback { CONFIRMED, UNCHANGED, INDETERMINATE } + +/******************************************************************************* + ** Classify the value the scanner reports (null when it could not be read) against the value it held before the + ** request and the AIM value requested. AIM wins even when the original was already AIM; only exactly the original + ** counts as unchanged; an unreadable or any other value is indeterminate and must be restored or failed, never + ** trusted. Generic so the rule is independent of the vendor SDK's enum. + *******************************************************************************/ +internal fun <T : Any> classifyAimReadback(original: T, aim: T, effective: T?): AimReadback = when { + effective == null -> AimReadback.INDETERMINATE + effective == aim -> AimReadback.CONFIRMED + effective == original -> AimReadback.UNCHANGED + else -> AimReadback.INDETERMINATE +} + +/******************************************************************************* + ** Strict reading of the application-owned EMDK "AIM code identifier" output profile. Only a driver that + ** applied ScannerConfig.scanParams.codeIdType=AIM and read the same value back may call [split]; without + ** that confirmation the SDK text is user payload and must never be stripped or interpreted. + *******************************************************************************/ +internal object AimOutputProfile { + private val AIM = Regex("\\][A-Za-z][0-9A-Za-z]") + + // AIM symbology character each known EMDK label must report; the modifier character is not checked here. + private val FAMILY = mapOf( + "CODE128" to 'C', "EAN128" to 'C', "GS1_128" to 'C', "GS1-128" to 'C', "CODE39" to 'A', "CODE93" to 'G', "I2OF5" to 'I', "QRCODE" to 'Q', "DATAMATRIX" to 'd', + "PDF417" to 'L', "AZTEC" to 'z', "EAN13" to 'E', "EAN8" to 'E', "UPCA" to 'E', "UPCE0" to 'E', "UPCE1" to 'E' + ) + + /******************************************************************************* + ** The configured identifier and the user payload that followed it, taken exactly as the SDK delivered them. + *******************************************************************************/ + internal data class Split(val aimIdentifier: String, val payload: String) + + /******************************************************************************* + ** Remove exactly the first three characters when they form an AIM identifier consistent with the label. + ** A missing, malformed or label-inconsistent prefix returns null: the scan is not trusted, never guessed. + ** An empty payload is refused, and a payload that itself begins with an identifier is left intact. + *******************************************************************************/ + fun split(text: String, label: String): Split? { + if (text.length < 4 || !AIM.matches(text.substring(0, 3))) return null + val family = FAMILY[label.removePrefix("LABEL-TYPE-")] + if (family != null && text[1] != family) return null + return Split(text.substring(0, 3), text.substring(3)) + } +} diff --git a/scanner-host/src/main/java/io/qrun/mobile/scanner/AppScreenCapture.kt b/scanner-host/src/main/java/io/qrun/mobile/scanner/AppScreenCapture.kt new file mode 100644 index 0000000..8524cb2 --- /dev/null +++ b/scanner-host/src/main/java/io/qrun/mobile/scanner/AppScreenCapture.kt @@ -0,0 +1,55 @@ +/* Copyright (c) 2026 QRunIO. SPDX-License-Identifier: Apache-2.0 */ +package io.qrun.mobile.scanner + +import android.graphics.Bitmap +import android.graphics.Rect +import android.os.Handler +import android.os.Looper +import android.view.PixelCopy +import android.view.Window +import java.io.ByteArrayOutputStream +import java.time.Instant +import kotlin.coroutines.resume +import kotlin.math.min +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.suspendCancellableCoroutine +import kotlinx.coroutines.withContext + +/******************************************************************************* + ** Copies only the caller's app-content rectangle, never the display or another app's window. + *******************************************************************************/ +internal suspend fun captureAppScreen(window: Window, bounds: Rect, lease: ScreenLease): ScreenFrame? = withContext(Dispatchers.Main) +{ + if (bounds.width() <= 0 || bounds.height() <= 0 || !window.decorView.isAttachedToWindow || !window.decorView.hasWindowFocus()) return@withContext null + val scale = min(1.0, min(lease.maxWidth.toDouble() / bounds.width(), lease.maxHeight.toDouble() / bounds.height())) + val width = (bounds.width() * scale).toInt().coerceAtLeast(1) + val height = (bounds.height() * scale).toInt().coerceAtLeast(1) + val bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888) + val copied = suspendCancellableCoroutine<Boolean> { continuation -> + try { + PixelCopy.request(window, Rect(bounds), bitmap, { result -> + if (continuation.isActive) continuation.resume(result == PixelCopy.SUCCESS) { _, _, _ -> bitmap.recycle() } + else bitmap.recycle() + }, Handler(Looper.getMainLooper())) + } catch (exception: IllegalArgumentException) { + continuation.resume(false) + } + } + try { + if (!copied) return@withContext null + withContext(Dispatchers.Default) + { + var bytes: ByteArray? = null + for (quality in listOf(70, 50, 30)) { + val buffer = ByteArrayOutputStream() + bitmap.compress(Bitmap.CompressFormat.JPEG, quality, buffer) + if (buffer.size() <= lease.maxBytes) { + bytes = buffer.toByteArray(); break + } + } + bytes?.let { ScreenFrame(it, width, height, Instant.now().toString()) } + } + } finally { + if (!bitmap.isRecycled) bitmap.recycle() + } +} diff --git a/scanner-host/src/main/java/io/qrun/mobile/scanner/DeviceApi.kt b/scanner-host/src/main/java/io/qrun/mobile/scanner/DeviceApi.kt new file mode 100644 index 0000000..6a2fc69 --- /dev/null +++ b/scanner-host/src/main/java/io/qrun/mobile/scanner/DeviceApi.kt @@ -0,0 +1,67 @@ +/* Copyright (c) 2026 QRunIO. SPDX-License-Identifier: Apache-2.0 */ +package io.qrun.mobile.scanner + +import com.kingsrook.qqq.frontend.android.core.controllers.UiApiCompatibility +import com.kingsrook.qqq.frontend.android.core.controllers.UiApiException +import com.kingsrook.qqq.frontend.android.core.controllers.MOBILE_SCANNERS_PATH +import com.kingsrook.qqq.frontend.android.core.controllers.ANDROID_CLIENT +import android.os.Build +import com.kingsrook.qqq.frontend.android.core.controllers.RequestOutcome +import com.kingsrook.qqq.frontend.android.core.controllers.RequestOutcomeInterceptor +import com.kingsrook.qqq.frontend.android.core.controllers.SameOriginInterceptor +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.withContext +import okhttp3.MediaType.Companion.toMediaType +import okhttp3.OkHttpClient +import okhttp3.Request +import okhttp3.RequestBody.Companion.toRequestBody +import org.json.JSONObject + +/******************************************************************************* + ** The server already knows this installation, but this app never received its secret. + *******************************************************************************/ +class EnrollmentConflict : IllegalStateException("Registration already exists but its credentials were not received. Start a new registration and ask the administrator to approve it.") + +/******************************************************************************* + ** The native QQQ session also authenticates device management. + *******************************************************************************/ +class DeviceApi( + private val server: String, private val credentials: DeviceCredentials, onRequestOutcome: (RequestOutcome) -> Unit = {}, + private val compatibility: UiApiCompatibility = UiApiCompatibility(server, requireMobileScanners = true) +) { + var shortName: String = "" + private set + var displayName: String = "" + private set + private val client = OkHttpClient.Builder().followRedirects(false).followSslRedirects(false) + .addInterceptor(RequestOutcomeInterceptor(onRequestOutcome)).addInterceptor(SameOriginInterceptor()).build() + + /******************************************************************************* + ** Check enrollment on demand; approval remains a server-side decision. + *******************************************************************************/ + suspend fun status(session: String, displayName: String): String = withContext(Dispatchers.IO) + { + require(compatibility.server == server) { "Compatibility discovery must match the selected server" } + compatibility.verify() + val enrolling = credentials.deviceId.isBlank() + val request = Request.Builder().url(server.trimEnd('/') + MOBILE_SCANNERS_PATH + if (enrolling) "/devices/enroll" else "/devices/current") + .header("X-QQQ-Client", ANDROID_CLIENT) + .header("Cookie", "sessionUUID=$session") + credentials.headers().forEach { (name, value) -> request.header(name, value) } + if (enrolling) { + val body = JSONObject().put("installationId", credentials.installationId).put("displayName", displayName) + .put("manufacturer", Build.MANUFACTURER).put("model", Build.MODEL) + .put("osVersion", Build.VERSION.RELEASE).put("appVersion", BuildConfig.VERSION_NAME) + request.post(body.toString().toRequestBody("application/json".toMediaType())) + } + client.newCall(request.build()).execute().use { response -> + if (enrolling && response.code == 409) throw EnrollmentConflict() + if (!response.isSuccessful) throw UiApiException.from(response) + val body = JSONObject(response.body?.string() ?: error("Empty device response")) + shortName = body.optString("shortName").takeUnless { it == "null" }.orEmpty() + this@DeviceApi.displayName = body.optString("displayName").takeUnless { it == "null" }.orEmpty() + if (enrolling) credentials.enroll(body) + body.getString("status") + } + } +} diff --git a/scanner-host/src/main/java/io/qrun/mobile/scanner/DeviceCredentials.kt b/scanner-host/src/main/java/io/qrun/mobile/scanner/DeviceCredentials.kt new file mode 100644 index 0000000..6e87561 --- /dev/null +++ b/scanner-host/src/main/java/io/qrun/mobile/scanner/DeviceCredentials.kt @@ -0,0 +1,98 @@ +/* Copyright (c) 2026 QRunIO. SPDX-License-Identifier: Apache-2.0 */ +package io.qrun.mobile.scanner + +import android.content.Context +import android.security.keystore.KeyGenParameterSpec +import android.security.keystore.KeyProperties +import android.util.Base64 +import org.json.JSONObject +import java.io.File +import java.security.KeyStore +import java.security.MessageDigest +import java.util.UUID +import javax.crypto.Cipher +import javax.crypto.KeyGenerator +import javax.crypto.SecretKey +import javax.crypto.spec.GCMParameterSpec + +/******************************************************************************* + ** Enrollment belongs to one server; its secret is encrypted by a non-exportable device key. + *******************************************************************************/ +class DeviceCredentials(context: Context, server: String) { + private val scope = MessageDigest.getInstance("SHA-256").digest(server.toByteArray()).joinToString("") { "%02x".format(it) } + private val file = File(context.noBackupFilesDir, "device-$scope.json") + private val alias = "qqq-mobile-device" + private var values: JSONObject = if (file.exists()) decrypt(file.readText()) else JSONObject().put("installationId", UUID.randomUUID().toString()) + + init { + if (!file.exists()) save() + } + + val installationId: String get() = values.getString("installationId") + val deviceId: String get() = values.optString("deviceId") + + /******************************************************************************* + ** Credentials are headers only and never become QQQ process inputs. + *******************************************************************************/ + fun headers(): Map<String, String> = if (deviceId.isBlank()) emptyMap() else mapOf( + "X-QQQ-Device-Id" to deviceId, "X-QQQ-Device-Token" to values.getString("deviceToken") + ) + + /******************************************************************************* + ** Save before exposing the enrollment result to UI. + *******************************************************************************/ + fun enroll(response: JSONObject) { + values.put("deviceId", response.get("deviceId").toString()) + values.put("deviceToken", response.getString("deviceToken")) + save() + } + + /******************************************************************************* + ** A lost enrollment response requires a fresh identity and a new administrator approval. + *******************************************************************************/ + fun restartPendingEnrollment() { + check(deviceId.isBlank()) { "An enrolled identity cannot be silently replaced" } + values = JSONObject().put("installationId", UUID.randomUUID().toString()) + save() + } + + /******************************************************************************* + ** Android Keystore owns the AES key across application launches. + *******************************************************************************/ + private fun key(): SecretKey { + val keyStore = KeyStore.getInstance("AndroidKeyStore").apply { load(null) } + (keyStore.getKey(alias, null) as? SecretKey)?.let { return it } + return KeyGenerator.getInstance(KeyProperties.KEY_ALGORITHM_AES, "AndroidKeyStore").apply { + init( + KeyGenParameterSpec.Builder(alias, KeyProperties.PURPOSE_ENCRYPT or KeyProperties.PURPOSE_DECRYPT) + .setBlockModes(KeyProperties.BLOCK_MODE_GCM).setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_NONE).build() + ) + }.generateKey() + } + + /******************************************************************************* + ** Atomic replacement prevents a partially written token after interruption. + *******************************************************************************/ + private fun save() { + val cipher = Cipher.getInstance("AES/GCM/NoPadding").apply { init(Cipher.ENCRYPT_MODE, key()) } + val encrypted = cipher.doFinal(values.toString().toByteArray(Charsets.UTF_8)) + val encoded = Base64.encodeToString(cipher.iv + encrypted, Base64.NO_WRAP) + val atomicFile = android.util.AtomicFile(file) + val stream = atomicFile.startWrite() + try { + stream.write(encoded.toByteArray()); atomicFile.finishWrite(stream) + } catch (exception: Exception) { + atomicFile.failWrite(stream); throw exception + } + } + + /******************************************************************************* + ** Corrupt storage fails closed instead of silently enrolling a replacement identity. + *******************************************************************************/ + private fun decrypt(encoded: String): JSONObject { + val bytes = Base64.decode(encoded, Base64.NO_WRAP) + val cipher = Cipher.getInstance("AES/GCM/NoPadding") + cipher.init(Cipher.DECRYPT_MODE, key(), GCMParameterSpec(128, bytes.copyOfRange(0, 12))) + return JSONObject(String(cipher.doFinal(bytes.copyOfRange(12, bytes.size)), Charsets.UTF_8)) + } +} diff --git a/scanner-host/src/main/java/io/qrun/mobile/scanner/DeviceScreenCaptureService.kt b/scanner-host/src/main/java/io/qrun/mobile/scanner/DeviceScreenCaptureService.kt new file mode 100644 index 0000000..2200ee3 --- /dev/null +++ b/scanner-host/src/main/java/io/qrun/mobile/scanner/DeviceScreenCaptureService.kt @@ -0,0 +1,341 @@ +/* Copyright (c) 2026 QRunIO. SPDX-License-Identifier: Apache-2.0 */ +package io.qrun.mobile.scanner + +import android.app.Activity +import android.app.KeyguardManager +import android.app.Notification +import android.app.NotificationChannel +import android.app.NotificationManager +import android.app.Service +import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent +import android.content.IntentFilter +import android.content.pm.ServiceInfo +import android.content.res.Configuration +import android.graphics.Bitmap +import android.graphics.PixelFormat +import android.hardware.display.DisplayManager +import android.hardware.display.VirtualDisplay +import android.media.ImageReader +import android.media.Image +import android.media.projection.MediaProjection +import android.media.projection.MediaProjectionManager +import android.os.Binder +import android.os.Build +import android.os.Handler +import android.os.IBinder +import android.os.Looper +import android.os.SystemClock +import android.view.WindowManager +import androidx.core.content.ContextCompat +import java.io.ByteArrayOutputStream +import java.time.Instant +import kotlin.math.min +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.withContext + +/******************************************************************************* + ** Nonexported, session-only projection. No consent, credentials or frames are persisted. + *******************************************************************************/ +class DeviceScreenCaptureService : Service() { + private val handler = Handler(Looper.getMainLooper()) + private var owner: String? = null + private var projection: MediaProjection? = null + private var display: VirtualDisplay? = null + private var reader: ImageReader? = null + private val latestImage = LatestScreenImage<Image>() + private var latestCapturedAt = "" + private var stopped: (() -> Unit)? = null + private var foregroundReady = false + private var screenReceiverRegistered = false + private val stopReceiver = object : BroadcastReceiver() { + /******************************************************************************* + ** Screen-off invalidates projection immediately, even between leased frame polls. + *******************************************************************************/ + override fun onReceive(context: Context?, intent: Intent?) { + finishProjection() + } + } + private var projectionCallback: MediaProjection.Callback? = null + private val unboundTimeout = Runnable { if (owner == null) finishProjection() } + private val leaseTimeout = Runnable { finishProjection() } + + /******************************************************************************* + ** Expose the same-process service without exporting projection control to other applications. + *******************************************************************************/ + internal inner class LocalBinder : Binder() { + /******************************************************************************* + ** Return the bound instance so the authenticated host can supply its memory-only owner ticket. + *******************************************************************************/ + fun service() = this@DeviceScreenCaptureService + } + + /******************************************************************************* + ** Grant only the local binder; binding itself never adopts a projection consent result. + *******************************************************************************/ + override fun onBind(intent: Intent): IBinder = LocalBinder() + + /******************************************************************************* + ** Establish the visible sharing notification before accepting consent; never restart projection automatically. + *******************************************************************************/ + override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { + try { + val manager = getSystemService(NotificationManager::class.java) + manager.createNotificationChannel(NotificationChannel(CHANNEL, "Device screen sharing", NotificationManager.IMPORTANCE_LOW)) + if (!manager.areNotificationsEnabled() || manager.getNotificationChannel(CHANNEL).importance == NotificationManager.IMPORTANCE_NONE) { + finishProjection() + return START_NOT_STICKY + } + val notification = Notification.Builder(this, CHANNEL).setSmallIcon(R.drawable.ic_scanner) + .setContentTitle("QQQ device screen sharing").setContentText("Other apps and notifications may be visible to your administrator.") + .setOngoing(true).build() + if (Build.VERSION.SDK_INT >= 29) startForeground(NOTIFICATION_ID, notification, ServiceInfo.FOREGROUND_SERVICE_TYPE_MEDIA_PROJECTION) + else startForeground(NOTIFICATION_ID, notification) + foregroundReady = true + handler.removeCallbacks(unboundTimeout) + handler.postDelayed(unboundTimeout, 5000) + } catch (exception: Exception) { + finishProjection() + } + return START_NOT_STICKY + } + + /******************************************************************************* + ** Called only by our same-process binder after a freshly approved system result. + *******************************************************************************/ + internal fun begin(grantOwner: String, resultCode: Int, data: Intent, onStopped: () -> Unit): Boolean { + if (!foregroundReady || owner != null || resultCode != Activity.RESULT_OK || getSystemService(KeyguardManager::class.java).isDeviceLocked) return false + owner = grantOwner + stopped = onStopped + handler.removeCallbacks(unboundTimeout) + return try { + val granted = requireNotNull(getSystemService(MediaProjectionManager::class.java).getMediaProjection(resultCode, data)) + projection = granted + val callback = object : MediaProjection.Callback() { + /******************************************************************************* + ** A revoked projection ends only the matching grant, so a late callback cannot stop its replacement. + *******************************************************************************/ + override fun onStop() { + if (projection === granted) finishProjection() + } + + /******************************************************************************* + ** Ignore obsolete projection callbacks and resize only positive dimensions from the active grant. + *******************************************************************************/ + override fun onCapturedContentResize(width: Int, height: Int) { + if (projection === granted && width > 0 && height > 0) resize(width, height) + } + } + projectionCallback = callback + granted.registerCallback(callback, handler) + val (width, height) = displaySize() + val (scaledWidth, scaledHeight) = scaledSize(width, height) + reader = newReader(scaledWidth, scaledHeight) + display = requireNotNull( + granted.createVirtualDisplay( + "QQQ consented device screen", scaledWidth, scaledHeight, + resources.configuration.densityDpi, DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR, reader!!.surface, null, handler + ) + ) + ContextCompat.registerReceiver(this, stopReceiver, IntentFilter(Intent.ACTION_SCREEN_OFF), ContextCompat.RECEIVER_NOT_EXPORTED) + screenReceiverRegistered = true + handler.postDelayed(leaseTimeout, 30000) + true + } catch (exception: Exception) { + finishProjection(); false + } + } + + /******************************************************************************* + ** Allow only the authenticated host lifetime that owns the grant to stop its projection. + *******************************************************************************/ + internal fun stop(grantOwner: String) { + if (owner == grantOwner) finishProjection() + } + + /******************************************************************************* + ** Bound projection lifetime to the current server lease using the monotonic device clock. + *******************************************************************************/ + internal fun boundLease(grantOwner: String, expiresAt: Long) { + if (owner != grantOwner || projection == null) return + handler.removeCallbacks(leaseTimeout) + val remaining = expiresAt - SystemClock.elapsedRealtime() + if (remaining <= 0) finishProjection() else handler.postDelayed(leaseTimeout, remaining.coerceAtMost(30000)) + } + + /******************************************************************************* + ** Copy only the owning grant's current pixels and enforce lease dimensions and encoded-byte limits. + *******************************************************************************/ + internal suspend fun frame(grantOwner: String, lease: ScreenLease): ScreenFrame? = withContext(Dispatchers.Main) + { + if (owner != grantOwner || projection == null || lease.captureMode != CaptureMode.DEVICE_SCREEN) return@withContext null + val capturedProjection = projection + if (getSystemService(KeyguardManager::class.java).isDeviceLocked) { + finishProjection(); return@withContext null + } + val image = latestImage.image ?: return@withContext null + val capturedAt = latestCapturedAt + // The main-thread listener cannot replace this image while its pixels are copied. + val bitmap = run { + val plane = image.planes.single() + if (plane.pixelStride != 4 || plane.rowStride < image.width * 4 || plane.rowStride.toLong() * image.height > 8388608L) + return@withContext null + val source = plane.buffer.duplicate() + val rowBytes = image.width * 4 + if (source.remaining().toLong() < plane.rowStride.toLong() * (image.height - 1) + rowBytes) return@withContext null + val packed = java.nio.ByteBuffer.allocate(rowBytes * image.height) + val origin = source.position() + for (row in 0 until image.height) { + val slice = source.duplicate() + slice.position(origin + row * plane.rowStride) + slice.limit(slice.position() + rowBytes) + packed.put(slice) + } + packed.flip() + val copied = Bitmap.createBitmap(image.width, image.height, Bitmap.Config.ARGB_8888) + try { + copied.copyPixelsFromBuffer(packed) + copied + } catch (exception: Exception) { + copied.recycle(); throw exception + } + } + try { + if (bitmap.width > lease.maxWidth || bitmap.height > lease.maxHeight) return@withContext null + withContext(Dispatchers.Default) { + var frame: ScreenFrame? = null + for (quality in listOf(70, 50, 30)) { + val bytes = ByteArrayOutputStream() + bitmap.compress(Bitmap.CompressFormat.JPEG, quality, bytes) + if (bytes.size() <= lease.maxBytes) { + frame = ScreenFrame(bytes.toByteArray(), bitmap.width, bitmap.height, capturedAt, CaptureMode.DEVICE_SCREEN) + break + } + } + frame + }.takeIf { owner == grantOwner && projection === capturedProjection } + } finally { + bitmap.recycle() + } + } + + /******************************************************************************* + ** Recreate the reader dimensions for the current display while retaining the same consent grant. + *******************************************************************************/ + override fun onConfigurationChanged(newConfig: Configuration) { + super.onConfigurationChanged(newConfig) + if (projection != null) { + val (width, height) = displaySize(); resize(width, height) + } + } + + /******************************************************************************* + ** Use full display bounds so projection scaling is independent of the current application window. + *******************************************************************************/ + private fun displaySize(): Pair<Int, Int> { + val metrics = getSystemService(WindowManager::class.java) + if (Build.VERSION.SDK_INT >= 30) return metrics.maximumWindowMetrics.bounds.let { it.width() to it.height() } + @Suppress("DEPRECATION") val size = android.util.DisplayMetrics().also { metrics.defaultDisplay.getRealMetrics(it) } + return size.widthPixels to size.heightPixels + } + + /******************************************************************************* + ** Preserve aspect ratio within the client's maximum capture dimensions without enlarging pixels. + *******************************************************************************/ + private fun scaledSize(width: Int, height: Int): Pair<Int, Int> { + val scale = min(1.0, min(640.0 / width, 1280.0 / height)) + return (width * scale).toInt().coerceAtLeast(1) to (height * scale).toInt().coerceAtLeast(1) + } + + /******************************************************************************* + ** Replace the reader surface without retaining the previous image; any failure ends projection. + *******************************************************************************/ + private fun resize(width: Int, height: Int) { + val current = display ?: return + val (targetWidth, targetHeight) = scaledSize(width, height) + if (reader?.width == targetWidth && reader?.height == targetHeight) return + val previous = reader + try { + latestImage.close() + val replacement = newReader(targetWidth, targetHeight) + reader = replacement + current.surface = replacement.surface + current.resize(targetWidth, targetHeight, resources.configuration.densityDpi) + } catch (exception: Exception) { + finishProjection() + } finally { + runCatching { previous?.close() } + } + } + + /******************************************************************************* + ** Drain continuously so first demand gets current pixels; encode only on leased polls. + *******************************************************************************/ + private fun newReader(width: Int, height: Int): ImageReader { + // One retained image plus two free slots lets acquireLatestImage discard older queued frames. + return ImageReader.newInstance(width, height, PixelFormat.RGBA_8888, 3).also { created -> + created.setOnImageAvailableListener({ source -> + if (source === reader && projection != null) { + try { + source.acquireLatestImage()?.let { image -> + latestImage.replace(image) + latestCapturedAt = Instant.now().toString() + } + } catch (exception: Exception) { + finishProjection() + } + } + }, handler) + } + } + + /******************************************************************************* + ** Invalidate ownership before releasing every projection resource and notifying its host once. + *******************************************************************************/ + private fun finishProjection() { + val callback = stopped + stopped = null + owner = null + handler.removeCallbacks(unboundTimeout) + handler.removeCallbacks(leaseTimeout) + val prior = projection + projection = null + foregroundReady = false + if (screenReceiverRegistered) { + runCatching { unregisterReceiver(stopReceiver) }; screenReceiverRegistered = false + } + runCatching { display?.release() }; display = null + runCatching { latestImage.close() } + latestCapturedAt = "" + runCatching { reader?.close() }; reader = null + projectionCallback?.let { projectionListener -> runCatching { prior?.unregisterCallback(projectionListener) } } + projectionCallback = null + runCatching { prior?.stop() } + runCatching { stopForeground(STOP_FOREGROUND_REMOVE) } + stopSelf() + callback?.invoke() + } + + /******************************************************************************* + ** Release projection resources before Android destroys the service, including partially initialized grants. + *******************************************************************************/ + override fun onDestroy() { + finishProjection(); super.onDestroy() + } + + /******************************************************************************* + ** Removing the host task revokes the grant instead of leaving capture running in the background. + *******************************************************************************/ + override fun onTaskRemoved(rootIntent: Intent?) { + finishProjection(); super.onTaskRemoved(rootIntent) + } + + /******************************************************************************* + ** Keep notification identifiers private to the nonexported projection service. + *******************************************************************************/ + private companion object { + const val CHANNEL = "qqq-device-screen" + const val NOTIFICATION_ID = 8716 + } +} diff --git a/scanner-host/src/main/java/io/qrun/mobile/scanner/DeviceScreenSharing.kt b/scanner-host/src/main/java/io/qrun/mobile/scanner/DeviceScreenSharing.kt new file mode 100644 index 0000000..2c4a7a7 --- /dev/null +++ b/scanner-host/src/main/java/io/qrun/mobile/scanner/DeviceScreenSharing.kt @@ -0,0 +1,217 @@ +/* Copyright (c) 2026 QRunIO. SPDX-License-Identifier: Apache-2.0 */ +package io.qrun.mobile.scanner + +import android.Manifest +import android.app.Activity +import android.app.NotificationManager +import android.content.ComponentName +import android.content.Context +import android.content.Intent +import android.content.ServiceConnection +import android.content.pm.PackageManager +import android.media.projection.MediaProjectionConfig +import android.media.projection.MediaProjectionManager +import android.os.Build +import android.os.IBinder +import androidx.activity.compose.rememberLauncherForActivityResult +import androidx.activity.result.contract.ActivityResultContracts +import androidx.compose.material3.AlertDialog +import androidx.compose.material3.Text +import androidx.compose.material3.TextButton +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberUpdatedState +import androidx.compose.runtime.setValue +import androidx.compose.ui.platform.LocalContext +import androidx.core.content.ContextCompat +import java.util.UUID + +/******************************************************************************* + ** A consent attempt belongs to one authenticated host lifetime, never a saved preference. + *******************************************************************************/ +internal class DeviceScreenSharing(private val context: Context) { + var active by mutableStateOf(false) + private set + var pending by mutableStateOf(false) + private set + var connecting by mutableStateOf(false) + private set + var message by mutableStateOf("") + private set + private val consentAttempt = ScreenConsentAttempt() + private val owner = UUID.randomUUID().toString() + private var connection: ServiceConnection? = null + private var service: DeviceScreenCaptureService? = null + var onSystemStop: () -> Unit = {} + var onStarted: () -> Unit = {} + + /******************************************************************************* + ** Revoke any previous grant before creating a fresh ticket for Android's consent result. + *******************************************************************************/ + fun beginConsent(): String { + stop() + pending = true + message = "" + return consentAttempt.begin() + } + + /******************************************************************************* + ** Consume consent only for the current authenticated host, then recheck permission when binding completes. + *******************************************************************************/ + fun accept(ticket: String, resultCode: Int, data: Intent?, allowed: () -> Boolean) { + if (!consentAttempt.current(ticket) || !pending) return + pending = false + if (!consentAttempt.consume(ticket, resultCode == Activity.RESULT_OK && data != null, allowed())) { + message = "Device screen sharing was not started." + return + } + requireNotNull(data) + connecting = true + val serviceIntent = Intent(context, DeviceScreenCaptureService::class.java) + val binding = object : ServiceConnection { + /******************************************************************************* + ** Reject stale bindings and recheck host eligibility before handing Android consent to the service. + *******************************************************************************/ + override fun onServiceConnected(name: ComponentName, binder: IBinder) { + if (!consentAttempt.current(ticket) || connection !== this) { + runCatching { context.unbindService(this) }; return + } + if (!allowed()) { + stop(); return + } + val current = (binder as DeviceScreenCaptureService.LocalBinder).service() + service = current + active = current.begin(owner, resultCode, data) { + if (consentAttempt.current(ticket)) { + stop(); onSystemStop() + } + } + if (active) onStarted() + connecting = false + if (!active) { + stop(); message = "Device screen sharing could not start. Try again from the app." + } + } + + /******************************************************************************* + ** Invalidate the current binding and notify its host when Android removes the projection service. + *******************************************************************************/ + private fun disconnected() { + if (connection === this) { + stop(); onSystemStop() + } + } + + /******************************************************************************* + ** Treat service loss as revoked sharing rather than automatically reconnecting without consent. + *******************************************************************************/ + override fun onServiceDisconnected(name: ComponentName) { + disconnected() + } + + /******************************************************************************* + ** A dead binding invalidates this host's projection and requires a new operator action. + *******************************************************************************/ + override fun onBindingDied(name: ComponentName) { + disconnected() + } + + /******************************************************************************* + ** A rejected service binding ends the attempt rather than retaining a pending consent state. + *******************************************************************************/ + override fun onNullBinding(name: ComponentName) { + disconnected() + } + } + connection = binding + try { + ContextCompat.startForegroundService(context, serviceIntent) + if (!context.bindService(serviceIntent, binding, Context.BIND_AUTO_CREATE)) { + connection = null + stop() + message = "Device screen sharing could not start." + } + } catch (exception: Exception) { + stop(); message = "Device screen sharing could not start. Check notification permission." + } + } + + /******************************************************************************* + ** Invalidate the consent ticket before unbinding so late results cannot resume sharing. + *******************************************************************************/ + fun stop() { + consentAttempt.invalidate() + active = false + pending = false + connecting = false + val previous = service + service = null + val binding = connection + connection = null + previous?.stop(owner) + if (binding != null) runCatching { context.unbindService(binding) } + } + + /******************************************************************************* + ** Delegate capture only while this host still owns an active projection. + *******************************************************************************/ + suspend fun frame(lease: ScreenLease): ScreenFrame? = if (active) service?.frame(owner, lease) else null + + /******************************************************************************* + ** Pass the authenticated viewer's deadline only to this host's active projection grant. + *******************************************************************************/ + fun boundLease(expiresAt: Long) { + if (active) service?.boundLease(owner, expiresAt) + } +} + +/******************************************************************************* + ** Only a deliberate device operator action launches Android's fresh consent dialog. + *******************************************************************************/ +@Composable +internal fun DeviceScreenSharingControl(sharing: DeviceScreenSharing, controller: MobileSessionController, allowed: () -> Boolean) { + val context = LocalContext.current + val currentAllowed by rememberUpdatedState(allowed) + var disclosure by remember { mutableStateOf(false) } + var ticket by remember { mutableStateOf<String?>(null) } + var permissionRevision by remember { mutableStateOf(0) } + val notificationPermission = rememberLauncherForActivityResult(ActivityResultContracts.RequestPermission()) { permissionRevision++ } + val consent = rememberLauncherForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> + val currentTicket = ticket + ticket = null + if (currentTicket != null) sharing.accept(currentTicket, result.resultCode, result.data) { + currentAllowed() && controller.supportsDeviceScreen + } + } + if (sharing.active) { + Text("Sharing this device screen, including other apps and notifications.") + } else if (controller.supportsDeviceScreen) { + val canNotify = remember(permissionRevision) { + Build.VERSION.SDK_INT < 33 || + ContextCompat.checkSelfPermission(context, Manifest.permission.POST_NOTIFICATIONS) == PackageManager.PERMISSION_GRANTED + } + if (!canNotify) TextButton(onClick = { if (Build.VERSION.SDK_INT >= 33) notificationPermission.launch(Manifest.permission.POST_NOTIFICATIONS) }) { + Text("Enable sharing notification") + } else TextButton(enabled = !sharing.pending && !sharing.connecting && allowed(), onClick = { disclosure = true }) { Text("Share device screen…") } + if (sharing.connecting) Text("Starting device screen sharing…") + if (sharing.message.isNotBlank()) Text(sharing.message) + } + if (disclosure) AlertDialog( + onDismissRequest = { disclosure = false }, title = { Text("Share this device screen?") }, + text = { Text("An authorized administrator can see other apps and notifications while viewing this session. Android will ask for permission. Sharing stops if the viewer disconnects, you sign out, or this activity restarts. Android shows its own sharing indicator while this device screen is shared.") }, + dismissButton = { TextButton(onClick = { disclosure = false }) { Text("Cancel") } }, + confirmButton = { + TextButton(onClick = { + disclosure = false + if (currentAllowed() && controller.supportsDeviceScreen && context.getSystemService(NotificationManager::class.java).areNotificationsEnabled()) { + ticket = sharing.beginConsent() + val manager = context.getSystemService(MediaProjectionManager::class.java) + val intent = if (Build.VERSION.SDK_INT >= 34) manager.createScreenCaptureIntent(MediaProjectionConfig.createConfigForDefaultDisplay()) + else manager.createScreenCaptureIntent() + consent.launch(intent) + } + }) { Text("Continue to Android permission") } + }) +} diff --git a/scanner-host/src/main/java/io/qrun/mobile/scanner/DiagnosticPresentation.kt b/scanner-host/src/main/java/io/qrun/mobile/scanner/DiagnosticPresentation.kt new file mode 100644 index 0000000..fa72f37 --- /dev/null +++ b/scanner-host/src/main/java/io/qrun/mobile/scanner/DiagnosticPresentation.kt @@ -0,0 +1,84 @@ +/* Copyright (c) 2026 QRunIO. SPDX-License-Identifier: Apache-2.0 */ +package io.qrun.mobile.scanner + +import java.time.ZoneId +import java.time.format.DateTimeFormatter +import java.time.format.FormatStyle + +/******************************************************************************* + ** Presentation accepts only the fixed, credential-free event model, never raw HTTP text. + *******************************************************************************/ +internal fun DiagnosticEvent.isProblem(): Boolean = httpStatus?.let { it !in 200..299 } == true || code in setOf( + DiagnosticCode.COMPATIBILITY_FAILED, DiagnosticCode.BRAND_DEFAULT, DiagnosticCode.LOGO_UNAVAILABLE, + DiagnosticCode.CONNECTION_FAILED, DiagnosticCode.NATIVE_TRANSPORT_FAILED, + DiagnosticCode.DEVICE_TRANSPORT_FAILED, DiagnosticCode.SESSION_TRANSPORT_FAILED +) + +/******************************************************************************* + ** Translate fixed event categories into operator language without including raw server text. + *******************************************************************************/ +internal fun DiagnosticEvent.title(): String = when (code) { + DiagnosticCode.COMPATIBILITY_RESPONSE -> "Server compatibility checked" + DiagnosticCode.COMPATIBILITY_FAILED -> "Server compatibility check failed" + DiagnosticCode.BRAND_LOADED -> "Server appearance loaded" + DiagnosticCode.BRAND_DEFAULT -> "Default appearance used" + DiagnosticCode.LOGO_LOADED -> "Server logo loaded" + DiagnosticCode.LOGO_UNAVAILABLE -> "Server logo unavailable" + DiagnosticCode.CONNECTION_OK -> "Server reachable" + DiagnosticCode.CONNECTION_FAILED -> "Connection check failed" + DiagnosticCode.NATIVE_RESPONSE -> if (isProblem()) "App request failed" else "App request completed" + DiagnosticCode.NATIVE_TRANSPORT_FAILED -> "App request could not connect" + DiagnosticCode.DEVICE_RESPONSE -> if (isProblem()) "Device request failed" else "Device request completed" + DiagnosticCode.DEVICE_TRANSPORT_FAILED -> "Device request could not connect" + DiagnosticCode.SESSION_RESPONSE -> if (isProblem()) "Session request failed" else "Session request completed" + DiagnosticCode.SESSION_TRANSPORT_FAILED -> "Session request could not connect" +} + +/******************************************************************************* + ** Explain status codes and duration using the credential-free event model alone. + *******************************************************************************/ +internal fun DiagnosticEvent.detail(): String { + val result = when (httpStatus) { + null -> "No HTTP response" + 401 -> "HTTP 401 · Sign-in required or expired" + 403 -> "HTTP 403 · Request not permitted" + in 500..599 -> "HTTP $httpStatus · Server error" + else -> "HTTP $httpStatus" + } + val validation = if (code == DiagnosticCode.CONNECTION_FAILED && httpStatus in 200..299) " · Unexpected status response" else "" + return "$result$validation · ${elapsedMillis} ms" +} + +/******************************************************************************* + ** Render the event instant in the selected zone without changing its stored ordering. + *******************************************************************************/ +internal fun DiagnosticEvent.localTime(zone: ZoneId = ZoneId.systemDefault()): String = + DateTimeFormatter.ofLocalizedTime(FormatStyle.MEDIUM).withZone(zone).format(time) + +/******************************************************************************* + ** Present newest activity first while retaining only actionable categories when filtering problems. + *******************************************************************************/ +internal fun diagnosticRows(events: List<DiagnosticEvent>, problemsOnly: Boolean): List<DiagnosticEvent> = + events.asReversed().filter { !problemsOnly || it.isProblem() } + +/******************************************************************************* + ** Select explicit reachability checks rather than inferring connectivity from authentication requests. + *******************************************************************************/ +internal fun latestConnectionCheck(events: List<DiagnosticEvent>): DiagnosticEvent? = events.lastOrNull { + it.code == DiagnosticCode.CONNECTION_OK || it.code == DiagnosticCode.CONNECTION_FAILED +} + +/******************************************************************************* + ** Build a shareable report solely from bounded, credential-free diagnostic records. + *******************************************************************************/ +internal fun diagnosticReport(events: List<DiagnosticEvent>, problemsOnly: Boolean, zone: ZoneId = ZoneId.systemDefault()): String { + val rows = diagnosticRows(events, problemsOnly) + val date = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss z").withZone(zone) + return buildString { + appendLine("QQQ Mobile connection diagnostics") + appendLine("Connection checks measure server reachability only; sign-in and device approval are separate.") + appendLine(if (problemsOnly) "Problems · newest first" else "All events · newest first") + if (rows.isEmpty()) append("No events.") + rows.forEach { appendLine("${date.format(it.time)} · ${it.title()} · ${it.detail()}") } + }.trimEnd() +} diff --git a/scanner-host/src/main/java/io/qrun/mobile/scanner/DiagnosticScreen.kt b/scanner-host/src/main/java/io/qrun/mobile/scanner/DiagnosticScreen.kt new file mode 100644 index 0000000..09a94b2 --- /dev/null +++ b/scanner-host/src/main/java/io/qrun/mobile/scanner/DiagnosticScreen.kt @@ -0,0 +1,184 @@ +/* Copyright (c) 2026 QRunIO. SPDX-License-Identifier: Apache-2.0 */ +package io.qrun.mobile.scanner + +import android.content.ActivityNotFoundException +import android.content.Intent +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.systemBarsPadding +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items +import androidx.compose.material3.Card +import androidx.compose.material3.CardDefaults +import androidx.compose.material3.FilterChip +import androidx.compose.material3.HorizontalDivider +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.OutlinedButton +import androidx.compose.material3.SnackbarHost +import androidx.compose.material3.SnackbarHostState +import androidx.compose.material3.Surface +import androidx.compose.material3.Text +import androidx.compose.material3.TextButton +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.runtime.setValue +import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalClipboardManager +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.semantics.heading +import androidx.compose.ui.semantics.semantics +import androidx.compose.ui.text.AnnotatedString +import androidx.compose.ui.unit.dp +import androidx.compose.ui.window.Dialog +import androidx.compose.ui.window.DialogProperties +import kotlinx.coroutines.delay +import kotlinx.coroutines.launch + +/******************************************************************************* + ** A dedicated window keeps process input blocked while diagnostics are being inspected. + *******************************************************************************/ +@Composable +internal fun DiagnosticScreen(log: DiagnosticLog, onBack: () -> Unit) { + var events by remember(log) { mutableStateOf(log.snapshot()) } + var paused by remember(log) { mutableStateOf(false) } + var problemsOnly by remember(log) { mutableStateOf(false) } + val clipboard = LocalClipboardManager.current + val context = LocalContext.current + val snackbar = remember { SnackbarHostState() } + val scope = rememberCoroutineScope() + LaunchedEffect(log, paused) + { + while (!paused) { + events = log.snapshot() + delay(1000) + } + } + val rows = diagnosticRows(events, problemsOnly) + Dialog(onDismissRequest = onBack, properties = DialogProperties(usePlatformDefaultWidth = false)) + { + Surface(Modifier.fillMaxSize()) + { + Column(Modifier.fillMaxSize().systemBarsPadding()) + { + Row(Modifier.fillMaxWidth().padding(horizontal = 8.dp)) + { + TextButton(onClick = onBack) { Text("Back") } + Text("Diagnostics", Modifier.padding(12.dp).weight(1f).semantics { heading() }, style = MaterialTheme.typography.titleLarge) + } + HorizontalDivider() + LazyColumn(Modifier.weight(1f).fillMaxWidth(), contentPadding = PaddingValues(16.dp), verticalArrangement = Arrangement.spacedBy(12.dp)) + { + item() + { + ConnectionSummary(events, paused) + } + item() + { + Column(verticalArrangement = Arrangement.spacedBy(4.dp)) + { + Text("Recent activity", style = MaterialTheme.typography.titleMedium, modifier = Modifier.semantics { heading() }) + Text("${rows.size} shown · Latest 100 events · Newest first", style = MaterialTheme.typography.bodySmall) + Row(horizontalArrangement = Arrangement.spacedBy(8.dp)) + { + FilterChip(selected = !problemsOnly, onClick = { problemsOnly = false }, label = { Text("All") }) + FilterChip(selected = problemsOnly, onClick = { problemsOnly = true }, label = { Text("Problems") }) + } + OutlinedButton(onClick = { + if (!paused) events = log.snapshot() + paused = !paused + }) { Text(if (paused) "Resume live updates" else "Pause updates") } + } + } + if (rows.isEmpty()) item() + { + Text( + if (problemsOnly && events.isNotEmpty()) "No problems in the recorded activity." else "No activity recorded yet. New events appear here while this screen is live.", + style = MaterialTheme.typography.bodyLarge, modifier = Modifier.padding(vertical = 24.dp) + ) + } + items(rows) { event -> DiagnosticEventRow(event) } + item() + { + Text("Safe to share: no credentials, scan values, server addresses or response bodies are recorded.", style = MaterialTheme.typography.bodySmall) + } + } + HorizontalDivider() + Row(Modifier.fillMaxWidth().padding(horizontal = 8.dp), horizontalArrangement = Arrangement.SpaceEvenly) + { + TextButton(modifier = Modifier.weight(1f), enabled = rows.isNotEmpty(), onClick = { + clipboard.setText(AnnotatedString(diagnosticReport(events, problemsOnly))) + scope.launch { snackbar.showSnackbar("Diagnostics copied") } + }) { Text("Copy") } + TextButton(modifier = Modifier.weight(1f), enabled = rows.isNotEmpty(), onClick = { + val intent = Intent(Intent.ACTION_SEND).setType("text/plain") + .putExtra(Intent.EXTRA_TEXT, diagnosticReport(events, problemsOnly)) + try { + context.startActivity(Intent.createChooser(intent, "Share diagnostics")) + } catch (exception: ActivityNotFoundException) { + scope.launch { snackbar.showSnackbar("No app is available to share diagnostics") } + } + }) { Text("Share") } + TextButton(modifier = Modifier.weight(1f), enabled = events.isNotEmpty(), onClick = { + log.clear() + events = emptyList() + scope.launch { snackbar.showSnackbar("Activity cleared") } + }) { Text("Clear") } + } + SnackbarHost(snackbar) + } + } + } +} + +/******************************************************************************* + ** Separate explicit server reachability from sign-in and device approval in the operator summary. + *******************************************************************************/ +@Composable +private fun ConnectionSummary(events: List<DiagnosticEvent>, paused: Boolean) { + val check = latestConnectionCheck(events) + val reachable = check?.code == DiagnosticCode.CONNECTION_OK + Card(colors = CardDefaults.cardColors(containerColor = if (check != null && !reachable) MaterialTheme.colorScheme.errorContainer else MaterialTheme.colorScheme.surfaceVariant)) + { + Column(Modifier.fillMaxWidth().padding(16.dp), verticalArrangement = Arrangement.spacedBy(6.dp)) + { + Text("Server connection", style = MaterialTheme.typography.labelLarge) + Text( + when { + check == null -> "No check recorded"; reachable -> "Reachable"; else -> "Check failed" + }, + style = MaterialTheme.typography.headlineSmall + ) + if (check != null) { + Text("Last check ${check.localTime()} · ${check.elapsedMillis} ms", style = MaterialTheme.typography.bodyMedium) + } + Text(if (paused) "Updates paused · Showing a saved snapshot" else "Live · Activity updates automatically", style = MaterialTheme.typography.bodySmall) + Text("Reachability only. Sign-in and device approval are checked separately.", style = MaterialTheme.typography.bodySmall) + } + } +} + +/******************************************************************************* + ** Render one safe event consistently with copied and shared diagnostic reports. + *******************************************************************************/ +@Composable +private fun DiagnosticEventRow(event: DiagnosticEvent) { + Column(Modifier.fillMaxWidth(), verticalArrangement = Arrangement.spacedBy(4.dp)) + { + Text(event.localTime(), style = MaterialTheme.typography.labelMedium, color = MaterialTheme.colorScheme.onSurfaceVariant) + Text( + event.title(), style = MaterialTheme.typography.titleSmall, + color = if (event.isProblem()) MaterialTheme.colorScheme.error else MaterialTheme.colorScheme.onSurface + ) + Text(event.detail(), style = MaterialTheme.typography.bodyMedium) + HorizontalDivider(Modifier.padding(top = 8.dp)) + } +} diff --git a/scanner-host/src/main/java/io/qrun/mobile/scanner/ForegroundLocation.kt b/scanner-host/src/main/java/io/qrun/mobile/scanner/ForegroundLocation.kt new file mode 100644 index 0000000..cfb88ce --- /dev/null +++ b/scanner-host/src/main/java/io/qrun/mobile/scanner/ForegroundLocation.kt @@ -0,0 +1,193 @@ +/* Copyright (c) 2026 QRunIO. SPDX-License-Identifier: Apache-2.0 */ +package io.qrun.mobile.scanner + +import android.Manifest +import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent +import android.content.IntentFilter +import android.content.pm.PackageManager +import android.location.Location +import android.location.LocationListener +import android.location.LocationManager +import android.os.Bundle +import android.net.Uri +import android.provider.Settings +import androidx.activity.compose.rememberLauncherForActivityResult +import androidx.activity.result.contract.ActivityResultContracts +import androidx.compose.material3.Text +import androidx.compose.material3.TextButton +import androidx.compose.material3.Switch +import androidx.compose.foundation.layout.Row +import androidx.compose.runtime.Composable +import androidx.compose.runtime.DisposableEffect +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.platform.LocalContext +import androidx.core.content.ContextCompat +import androidx.lifecycle.Lifecycle +import androidx.lifecycle.LifecycleEventObserver +import androidx.lifecycle.compose.LocalLifecycleOwner +import java.time.Instant + +/******************************************************************************* + ** Represent availability separately from a fix so disabled or denied reporting cannot reuse stale coordinates. + *******************************************************************************/ +internal data class LocationReport(val status: String = "UNAVAILABLE", val fix: LocationFix? = null) + +/******************************************************************************* + ** Carry only the foreground provider fix and its accuracy/time for the session heartbeat. + *******************************************************************************/ +internal data class LocationFix(val latitude: Double, val longitude: Double, val accuracyMeters: Double, val capturedAt: String) + +/******************************************************************************* + ** Default-on foreground-only telemetry. Denying permission never prevents scanning. + *******************************************************************************/ +internal class ForegroundLocationState { + var report by mutableStateOf(LocationReport()) + var permissionRevision by mutableStateOf(0) + var enabled by mutableStateOf(true) + var permitted by mutableStateOf(false) + var precise by mutableStateOf(false) + var providersEnabled by mutableStateOf(false) + var active by mutableStateOf(false) + var setEnabled: (Boolean) -> Unit = {} +} + +/******************************************************************************* + ** Attach permission and provider listeners to the foreground host and remove updates on disposal. + *******************************************************************************/ +@Composable +internal fun rememberForegroundLocation(active: Boolean): ForegroundLocationState { + val context = LocalContext.current + val lifecycleOwner = LocalLifecycleOwner.current + val preferences = remember(context) { context.getSharedPreferences("host", Context.MODE_PRIVATE) } + val state = remember { + ForegroundLocationState().apply { + enabled = LocationPolicy.enabled(if (preferences.contains("locationReportingEnabled")) preferences.getBoolean("locationReportingEnabled", true) else null) + setEnabled = { value -> + preferences.edit().putBoolean("locationReportingEnabled", value).apply() + enabled = value + if (!value) report = LocationReport("DISABLED") + } + } + } + val manager = remember { context.getSystemService(LocationManager::class.java) } + val launcher = rememberLauncherForActivityResult(ActivityResultContracts.RequestMultiplePermissions()) + { state.permissionRevision++ } + DisposableEffect(lifecycleOwner, context) + { + val observer = LifecycleEventObserver { _, event -> if (event == Lifecycle.Event.ON_RESUME) state.permissionRevision++ } + val receiver = object : BroadcastReceiver() { + /******************************************************************************* + ** Reevaluate provider and permission state after Android changes location availability. + *******************************************************************************/ + override fun onReceive(context: Context?, intent: Intent?) { + state.permissionRevision++ + } + } + lifecycleOwner.lifecycle.addObserver(observer) + ContextCompat.registerReceiver(context, receiver, IntentFilter().apply { + addAction(LocationManager.MODE_CHANGED_ACTION) + addAction(LocationManager.PROVIDERS_CHANGED_ACTION) + }, ContextCompat.RECEIVER_NOT_EXPORTED) + onDispose { lifecycleOwner.lifecycle.removeObserver(observer); context.unregisterReceiver(receiver) } + } + val permissionRevision = state.permissionRevision + val permitted = ContextCompat.checkSelfPermission(context, Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED + LaunchedEffect(active, state.enabled, permitted, permissionRevision) + { + if (LocationPolicy.shouldRequestPermission(active, state.enabled, permitted, preferences.getBoolean("locationPermissionRequested", false))) { + // Record before launching: recreation, resume and denial must not prompt again. + preferences.edit().putBoolean("locationPermissionRequested", true).apply() + launcher.launch(arrayOf(Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION)) + } + } + DisposableEffect(active, state.enabled, permitted, permissionRevision) + { + state.active = active + state.permitted = permitted + state.precise = ContextCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED + val providers = manager.getProviders(true).filter { it == LocationManager.GPS_PROVIDER || it == LocationManager.NETWORK_PROVIDER } + state.providersEnabled = providers.isNotEmpty() + var listening = true + val listener = object : LocationListener { + /******************************************************************************* + ** Publish a fix only while the current foreground subscription remains eligible and accurate. + *******************************************************************************/ + override fun onLocationChanged(location: Location) { + if (!listening || !active || !state.enabled || !location.hasAccuracy()) return + state.report = LocationReport( + "AVAILABLE", LocationFix( + location.latitude, location.longitude, + location.accuracy.toDouble(), Instant.ofEpochMilli(location.time).toString() + ) + ) + } + + /******************************************************************************* + ** Refresh provider eligibility instead of assuming a newly enabled provider already has a fix. + *******************************************************************************/ + override fun onProviderEnabled(provider: String) { + state.permissionRevision++ + } + + /******************************************************************************* + ** Refresh availability so a disabled provider cannot leave the previous status displayed. + *******************************************************************************/ + override fun onProviderDisabled(provider: String) { + state.permissionRevision++ + } + + /******************************************************************************* + ** Retain the legacy Android callback without treating its obsolete status as a location fix. + *******************************************************************************/ + @Deprecated("Legacy callback") + override fun onStatusChanged(provider: String?, status: Int, extras: Bundle?) = Unit + } + state.report = LocationReport( + when { + !state.enabled -> "DISABLED" + !permitted -> "PERMISSION_DENIED" + !state.providersEnabled -> "DISABLED" + else -> "UNAVAILABLE" + } + ) + if (active && state.enabled && permitted) { + for (provider in providers.filter { state.precise || it != LocationManager.GPS_PROVIDER }) { + try { + manager.requestLocationUpdates(provider, 10000L, 10f, listener) + } catch (exception: SecurityException) { + state.report = LocationReport("PERMISSION_DENIED"); state.permitted = false + } + } + } + onDispose { listening = false; manager.removeUpdates(listener); state.report = LocationReport() } + } + return state +} + +/******************************************************************************* + ** Expose independent reporting and Android permission controls without blocking barcode scanning. + *******************************************************************************/ +@Composable +internal fun LocationPermissionControl(state: ForegroundLocationState) { + val context = LocalContext.current + Row { + Text("Report foreground location") + Switch(checked = state.enabled, onCheckedChange = state.setEnabled) + } + Text(LocationPolicy.status(state.enabled, state.permitted, state.providersEnabled, state.active, state.report.status)) + if (state.permitted) Text(if (state.precise) "Android permission: precise location" else "Android permission: approximate location") + Text("Default on. Reporting requires Android permission and an approved signed-in foreground session. Scanning works without location.") + if (state.enabled && !state.permitted) { + TextButton(onClick = { context.startActivity(Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS, Uri.parse("package:${context.packageName}"))) }) + { Text("Open location permission settings") } + } else if (state.enabled && !state.providersEnabled) { + TextButton(onClick = { context.startActivity(Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS)) }) + { Text("Open device location settings") } + } +} diff --git a/scanner-host/src/main/java/io/qrun/mobile/scanner/HostChrome.kt b/scanner-host/src/main/java/io/qrun/mobile/scanner/HostChrome.kt new file mode 100644 index 0000000..32464ce --- /dev/null +++ b/scanner-host/src/main/java/io/qrun/mobile/scanner/HostChrome.kt @@ -0,0 +1,156 @@ +/* Copyright (c) 2026 QRunIO. SPDX-License-Identifier: Apache-2.0 */ +package io.qrun.mobile.scanner + +import com.kingsrook.qqq.frontend.android.core.controllers.UiApiCompatibility +import com.kingsrook.qqq.frontend.android.core.controllers.UiApiCompatibilityException +import com.kingsrook.qqq.frontend.android.mobileapp.ui.horseshoe.LocalOpenDiagnostics +import com.kingsrook.qqq.frontend.android.mobileapp.ui.LocalProcessInputAllowed +import kotlinx.coroutines.CancellationException +import android.net.ConnectivityManager +import android.net.Network +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.material3.Button +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Surface +import androidx.compose.material3.Text +import androidx.compose.material3.TextButton +import androidx.compose.material3.lightColorScheme +import androidx.compose.runtime.Composable +import androidx.compose.runtime.CompositionLocalProvider +import androidx.compose.runtime.DisposableEffect +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableIntStateOf +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Modifier +import androidx.compose.ui.Alignment +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.lerp +import androidx.compose.ui.platform.LocalContext +import androidx.lifecycle.compose.LocalLifecycleOwner +import androidx.compose.ui.text.style.TextOverflow +import androidx.compose.ui.unit.dp +import androidx.lifecycle.Lifecycle +import androidx.lifecycle.repeatOnLifecycle +import coil3.ImageLoader +import coil3.compose.AsyncImage +import coil3.svg.SvgDecoder +import kotlinx.coroutines.channels.Channel +import kotlinx.coroutines.isActive +import kotlinx.coroutines.withTimeoutOrNull + +/******************************************************************************* + ** Lifetime is keyed by selected server: presentation and diagnostics cannot bleed across customers. + *******************************************************************************/ +@Composable +internal fun HostChrome(server: String, onChangeServer: () -> Unit, content: @Composable (HostBrand, DiagnosticLog, UiApiCompatibility, () -> Unit) -> Unit) { + val runtime = remember(server) { HostRuntime(server) } + var compatible by remember(server) { mutableStateOf(false) } + var compatibilityError by remember(server) { mutableStateOf<String?>(null) } + var attempt by remember(server) { mutableIntStateOf(0) } + var brand by remember(server) { mutableStateOf(HostBrand()) } + var logo by remember(server) { mutableStateOf<ByteArray?>(null) } + var connection by remember(server) { mutableStateOf("Checking") } + var showDiagnostics by remember(server) { mutableStateOf(false) } + val parentInputAllowed = LocalProcessInputAllowed.current + val context = LocalContext.current + val lifecycle = LocalLifecycleOwner.current.lifecycle + val imageLoader = remember(context) { ImageLoader.Builder(context).components { add(SvgDecoder.Factory()) }.build() } + DisposableEffect(imageLoader) { onDispose { imageLoader.shutdown() } } + LaunchedEffect(runtime, attempt) + { + compatibilityError = null + try { + runtime.verifyCompatibility() + } catch (exception: CancellationException) { + throw exception + } catch (exception: Exception) { + compatibilityError = if (exception is UiApiCompatibilityException) exception.message else "Unable to check QQQ UI API compatibility. Check the server address and connection, then retry." + connection = if (exception is UiApiCompatibilityException) "Incompatible server" else "Disconnected" + runtime.diagnostics.record(DiagnosticCode.COMPATIBILITY_FAILED, null, 0) + return@LaunchedEffect + } + brand = runtime.branding() + compatible = true + logo = brand.logoUrl?.let { runtime.logo(it) } + } + LaunchedEffect(runtime, lifecycle, compatible) + { + if (!compatible) return@LaunchedEffect + lifecycle.repeatOnLifecycle(Lifecycle.State.STARTED) + { + val changed = Channel<Unit>(Channel.CONFLATED) + val connectivity = context.getSystemService(ConnectivityManager::class.java) + val callback = object : ConnectivityManager.NetworkCallback() { + /******************************************************************************* + ** Schedule a fresh explicit reachability check when Android reports an available network. + *******************************************************************************/ + override fun onAvailable(network: Network) { + changed.trySend(Unit) + } + + /******************************************************************************* + ** Recheck reachability after network loss instead of retaining an old connection indication. + *******************************************************************************/ + override fun onLost(network: Network) { + changed.trySend(Unit) + } + } + connectivity.registerDefaultNetworkCallback(callback) + try { + connection = "Checking" + while (isActive) { + connection = if (runtime.connected()) "Connected" else "Disconnected" + withTimeoutOrNull(5000) { changed.receive() } + } + } finally { + connectivity.unregisterNetworkCallback(callback); changed.close() + } + } + } + val primary = Color(0xFF000000 or brand.primaryColor.drop(1).toLong(16)) + val onPrimary = if (useBlackOnPrimary(brand.primaryColor)) Color.Black else Color.White + MaterialTheme( + colorScheme = lightColorScheme( + primary = primary, onPrimary = onPrimary, + primaryContainer = lerp(primary, Color.White, 0.85f), onPrimaryContainer = Color.Black + ) + ) + { + Surface() + { + Column(Modifier.fillMaxSize()) + { + Row(Modifier.fillMaxWidth().padding(horizontal = 12.dp), horizontalArrangement = Arrangement.spacedBy(8.dp), verticalAlignment = Alignment.CenterVertically) + { + logo?.let { AsyncImage(model = it, imageLoader = imageLoader, contentDescription = "${brand.displayName} logo", modifier = Modifier.size(40.dp)) } + Text(brand.displayName, Modifier.weight(1f), style = MaterialTheme.typography.labelLarge, maxLines = 1, overflow = TextOverflow.Ellipsis) + if (compatible) TextButton(onClick = { showDiagnostics = true }) { Text(connection, style = MaterialTheme.typography.labelMedium) } + if (!compatible) TextButton(onClick = onChangeServer) { Text("Change server") } + } + Box(Modifier.weight(1f)) + { + if (compatible) CompositionLocalProvider( + LocalOpenDiagnostics provides { showDiagnostics = true }, + LocalProcessInputAllowed provides { parentInputAllowed() && !showDiagnostics }) + { content(brand, runtime.diagnostics, runtime.compatibility, onChangeServer) } + else Column(Modifier.padding(24.dp), verticalArrangement = Arrangement.spacedBy(12.dp)) + { + Text(compatibilityError ?: "Checking QQQ UI API compatibility…") + if (compatibilityError != null) Button(onClick = { attempt++ }) { Text("Retry compatibility check") } + } + } + } + } + if (showDiagnostics) DiagnosticScreen(runtime.diagnostics, onBack = { showDiagnostics = false }) + } +} diff --git a/scanner-host/src/main/java/io/qrun/mobile/scanner/HostRuntime.kt b/scanner-host/src/main/java/io/qrun/mobile/scanner/HostRuntime.kt new file mode 100644 index 0000000..197d3ad --- /dev/null +++ b/scanner-host/src/main/java/io/qrun/mobile/scanner/HostRuntime.kt @@ -0,0 +1,193 @@ +/* Copyright (c) 2026 QRunIO. SPDX-License-Identifier: Apache-2.0 */ +package io.qrun.mobile.scanner + +import com.kingsrook.qqq.frontend.android.core.controllers.UiApiCompatibility +import com.kingsrook.qqq.frontend.android.core.controllers.MOBILE_SCANNERS_PATH +import com.kingsrook.qqq.frontend.android.core.controllers.ANDROID_CLIENT +import java.net.URI +import java.time.Instant +import java.util.ArrayDeque +import java.util.concurrent.TimeUnit +import kotlin.math.pow +import kotlinx.coroutines.CancellationException +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.withContext +import kotlinx.serialization.json.Json +import kotlinx.serialization.json.JsonObject +import kotlinx.serialization.json.JsonPrimitive +import okhttp3.OkHttpClient +import okhttp3.Request +import com.kingsrook.qqq.frontend.android.core.controllers.RequestOutcome + +/******************************************************************************* + ** Public presentation data; never mixed with a session or device credential. + *******************************************************************************/ +internal data class HostBrand(val displayName: String = "QQQ Mobile Scanners", val primaryColor: String = "#1565C0", val logoUrl: String? = null) { + /******************************************************************************* + ** Centralize public branding validation so every host applies the same safe presentation defaults. + *******************************************************************************/ + companion object { + /******************************************************************************* + ** Accept bounded presentation fields independently so malformed branding safely falls back to local defaults. + *******************************************************************************/ + fun parse(payload: String): HostBrand { + val fields = runCatching { Json.parseToJsonElement(payload) as? JsonObject }.getOrNull() ?: return HostBrand() + + /******************************************************************************* + ** Read only JSON strings; coercing other values would bypass the presentation-field validation. + *******************************************************************************/ + fun string(name: String): String? = (fields[name] as? JsonPrimitive)?.takeIf { it.isString }?.content + val name = string("displayName")?.trim()?.takeIf { it.length in 1..80 && it.none { c -> c.isISOControl() || c == '<' || c == '>' } } + val color = string("primaryColor")?.takeIf { Regex("#[0-9a-fA-F]{6}").matches(it) }?.uppercase() + val logo = string("logoUrl")?.takeIf { isSafeLogoUrl(it) } + return HostBrand(name ?: HostBrand().displayName, color ?: HostBrand().primaryColor, logo) + } + } +} + +/******************************************************************************* + ** Allow only credential-free HTTPS image URLs with a host and no fragment. + *******************************************************************************/ +internal fun isSafeLogoUrl(value: String): Boolean = runCatching { + val uri = URI(value) + value.length <= 2048 && uri.scheme == "https" && uri.host != null && uri.userInfo == null && uri.fragment == null +}.getOrDefault(false) + +/******************************************************************************* + ** Choose the higher WCAG contrast of black/white against the supplied opaque color. + *******************************************************************************/ +internal fun useBlackOnPrimary(hex: String): Boolean { + val channels = listOf(1, 3, 5).map { hex.substring(it, it + 2).toInt(16) / 255.0 } + .map { if (it <= 0.04045) it / 12.92 else ((it + 0.055) / 1.055).pow(2.4) } + val luminance = channels[0] * 0.2126 + channels[1] * 0.7152 + channels[2] * 0.0722 + return (luminance + 0.05) / 0.05 >= 1.05 / (luminance + 0.05) +} + +/******************************************************************************* + ** Restrict diagnostic categories so server bodies and credentials cannot become event messages. + *******************************************************************************/ +internal enum class DiagnosticCode { COMPATIBILITY_RESPONSE, COMPATIBILITY_FAILED, BRAND_LOADED, BRAND_DEFAULT, LOGO_LOADED, LOGO_UNAVAILABLE, CONNECTION_OK, CONNECTION_FAILED, NATIVE_RESPONSE, NATIVE_TRANSPORT_FAILED, DEVICE_RESPONSE, DEVICE_TRANSPORT_FAILED, SESSION_RESPONSE, SESSION_TRANSPORT_FAILED } + +/******************************************************************************* + ** Retain only a timestamp, fixed category, status and duration for operator diagnostics. + *******************************************************************************/ +internal data class DiagnosticEvent(val time: Instant, val code: DiagnosticCode, val httpStatus: Int?, val elapsedMillis: Long) + +/******************************************************************************* + ** No free-form messages: raw responses, URLs, credentials, and barcode data cannot enter this log. + *******************************************************************************/ +internal class DiagnosticLog(private val capacity: Int = 100) { + private val events = ArrayDeque<DiagnosticEvent>() + + /******************************************************************************* + ** Bound retained activity and synchronize writers so diagnostics cannot grow with session duration. + *******************************************************************************/ + @Synchronized + fun record(code: DiagnosticCode, status: Int?, elapsedMillis: Long) { + events.addLast(DiagnosticEvent(Instant.now(), code, status, elapsedMillis.coerceAtLeast(0))) + while (events.size > capacity) events.removeFirst() + } + + /******************************************************************************* + ** Export only fixed event fields; never include request URLs, response bodies or credentials. + *******************************************************************************/ + @Synchronized + fun text(): String = events.joinToString("\n") { "${it.time} ${it.code} HTTP=${it.httpStatus ?: "none"} ${it.elapsedMillis}ms" } + + /******************************************************************************* + ** Return an independent ordered snapshot so callers cannot mutate the bounded diagnostic queue. + *******************************************************************************/ + @Synchronized + fun snapshot(): List<DiagnosticEvent> = events.toList() + + /******************************************************************************* + ** Clear retained events under the same lock used by concurrent request observers. + *******************************************************************************/ + @Synchronized + fun clear() { + events.clear() + } + + /******************************************************************************* + ** Classify native API outcomes without retaining the request or any authentication material. + *******************************************************************************/ + fun nativeRequest(outcome: RequestOutcome) = record(if (outcome.httpStatus == null) DiagnosticCode.NATIVE_TRANSPORT_FAILED else DiagnosticCode.NATIVE_RESPONSE, outcome.httpStatus, outcome.elapsedMillis) + + /******************************************************************************* + ** Classify enrollment outcomes using only transport status and elapsed time. + *******************************************************************************/ + fun deviceRequest(outcome: RequestOutcome) = record(if (outcome.httpStatus == null) DiagnosticCode.DEVICE_TRANSPORT_FAILED else DiagnosticCode.DEVICE_RESPONSE, outcome.httpStatus, outcome.elapsedMillis) + + /******************************************************************************* + ** Classify session telemetry outcomes without retaining transmitted metadata or pixels. + *******************************************************************************/ + fun sessionRequest(outcome: RequestOutcome) = record(if (outcome.httpStatus == null) DiagnosticCode.SESSION_TRANSPORT_FAILED else DiagnosticCode.SESSION_RESPONSE, outcome.httpStatus, outcome.elapsedMillis) +} + +/******************************************************************************* + ** Dedicated unauthenticated client with no cookie jar, redirects, or disk cache. + *******************************************************************************/ +internal class HostRuntime(private val server: String, val diagnostics: DiagnosticLog = DiagnosticLog()) { + val compatibility = UiApiCompatibility(server, requireMobileScanners = true) { outcome -> + diagnostics.record(if (outcome.httpStatus == 200) DiagnosticCode.COMPATIBILITY_RESPONSE else DiagnosticCode.COMPATIBILITY_FAILED, outcome.httpStatus, outcome.elapsedMillis) + } + + /******************************************************************************* + ** Discover required server capabilities before any host operation can send credentials. + *******************************************************************************/ + suspend fun verifyCompatibility() = withContext(Dispatchers.IO) { compatibility.verify() } + + private val client = OkHttpClient.Builder().followRedirects(false).followSslRedirects(false) + .callTimeout(5, TimeUnit.SECONDS).build() + + /******************************************************************************* + ** Bound presentation responses and record safe outcomes while preserving coroutine cancellation. + *******************************************************************************/ + private suspend fun fetch(url: String, limit: Long, success: DiagnosticCode, failure: DiagnosticCode, validate: (ByteArray) -> Boolean = { true }): ByteArray? = withContext(Dispatchers.IO) + { + val start = System.nanoTime() + var status: Int? = null + try { + if (url.startsWith(server.trimEnd('/') + MOBILE_SCANNERS_PATH)) compatibility.verify() + client.newCall( + Request.Builder().url(url).header("Cache-Control", "no-store") + .apply { if (url.startsWith(server.trimEnd('/') + MOBILE_SCANNERS_PATH)) header("X-QQQ-Client", ANDROID_CLIENT) }.build() + ).execute().use { response -> + status = response.code + val body = response.body + if (!response.isSuccessful || body == null || body.contentLength() > limit) error("Unavailable") + val source = body.source() + source.request(limit + 1) + if (source.buffer.size > limit) error("Oversized") + val bytes = source.readByteArray() + if (!validate(bytes)) error("Unexpected response") + diagnostics.record(success, status, (System.nanoTime() - start) / 1_000_000) + bytes + } + } catch (exception: CancellationException) { + throw exception + } catch (exception: Exception) { + diagnostics.record(failure, status, (System.nanoTime() - start) / 1_000_000) + null + } + } + + /******************************************************************************* + ** Fetch public branding with local defaults when transport or field validation fails. + *******************************************************************************/ + suspend fun branding(): HostBrand = fetch(server.trimEnd('/') + MOBILE_SCANNERS_PATH + "/branding", 8192, DiagnosticCode.BRAND_LOADED, DiagnosticCode.BRAND_DEFAULT) + ?.toString(Charsets.UTF_8)?.let { HostBrand.parse(it) } ?: HostBrand() + + /******************************************************************************* + ** Apply the public HTTPS URL policy and byte limit before decoding remote artwork. + *******************************************************************************/ + suspend fun logo(url: String): ByteArray? = if (isSafeLogoUrl(url)) fetch(url, 1_048_576, DiagnosticCode.LOGO_LOADED, DiagnosticCode.LOGO_UNAVAILABLE) else null + + /******************************************************************************* + ** Require the extension's explicit reachable response instead of treating any HTTP response as success. + *******************************************************************************/ + suspend fun connected(): Boolean = fetch(server.trimEnd('/') + MOBILE_SCANNERS_PATH + "/status", 1024, DiagnosticCode.CONNECTION_OK, DiagnosticCode.CONNECTION_FAILED) { + val fields = Json.parseToJsonElement(it.toString(Charsets.UTF_8)) as? JsonObject + (fields?.get("status") as? JsonPrimitive)?.let { status -> status.isString && status.content == "ok" } == true + } != null +} diff --git a/scanner-host/src/main/java/io/qrun/mobile/scanner/LatestScreenImage.kt b/scanner-host/src/main/java/io/qrun/mobile/scanner/LatestScreenImage.kt new file mode 100644 index 0000000..f5a23e9 --- /dev/null +++ b/scanner-host/src/main/java/io/qrun/mobile/scanner/LatestScreenImage.kt @@ -0,0 +1,27 @@ +/* Copyright (c) 2026 QRunIO. SPDX-License-Identifier: Apache-2.0 */ +package io.qrun.mobile.scanner + +/******************************************************************************* + ** Main-thread owner of one captured image. Replacing or clearing releases the old buffer. + *******************************************************************************/ +internal class LatestScreenImage<T : AutoCloseable> : AutoCloseable { + var image: T? = null + private set + + /******************************************************************************* + ** Adopt the replacement and close the previous image, keeping retained image ownership bounded. + *******************************************************************************/ + fun replace(next: T?) { + if (image === next) return + val previous = image + image = next + previous?.close() + } + + /******************************************************************************* + ** Release the retained image through the same replacement path used for incoming frames. + *******************************************************************************/ + override fun close() { + replace(null) + } +} diff --git a/scanner-host/src/main/java/io/qrun/mobile/scanner/LocationPolicy.kt b/scanner-host/src/main/java/io/qrun/mobile/scanner/LocationPolicy.kt new file mode 100644 index 0000000..67bed53 --- /dev/null +++ b/scanner-host/src/main/java/io/qrun/mobile/scanner/LocationPolicy.kt @@ -0,0 +1,30 @@ +/* Copyright (c) 2026 QRunIO. SPDX-License-Identifier: Apache-2.0 */ +package io.qrun.mobile.scanner + +/******************************************************************************* + ** The reporting preference and Android permission are independent controls. + *******************************************************************************/ +internal object LocationPolicy { + /******************************************************************************* + ** Use the product default only when no explicit operator reporting preference exists. + *******************************************************************************/ + fun enabled(saved: Boolean?) = saved ?: true + + /******************************************************************************* + ** Request Android permission once for an eligible host; denial must not trigger repeated prompts. + *******************************************************************************/ + fun shouldRequestPermission(active: Boolean, enabled: Boolean, permitted: Boolean, previouslyRequested: Boolean) = + active && enabled && !permitted && !previouslyRequested + + /******************************************************************************* + ** Distinguish reporting preference, permission, provider state and foreground eligibility for the operator. + *******************************************************************************/ + fun status(enabled: Boolean, permitted: Boolean, providersEnabled: Boolean, active: Boolean, report: String): String = when { + !enabled -> "Location reporting is off" + !permitted -> "Location reporting is on; Android location permission is not granted" + !providersEnabled -> "Location reporting is on; device location providers are off" + !active -> "Location reporting is on; waiting for an approved signed-in foreground session" + report == "AVAILABLE" -> "Location reporting is on; foreground location is available" + else -> "Location reporting is on; waiting for a foreground location fix" + } +} diff --git a/scanner-host/src/main/java/io/qrun/mobile/scanner/ManagedConfiguration.kt b/scanner-host/src/main/java/io/qrun/mobile/scanner/ManagedConfiguration.kt new file mode 100644 index 0000000..3dbda38 --- /dev/null +++ b/scanner-host/src/main/java/io/qrun/mobile/scanner/ManagedConfiguration.kt @@ -0,0 +1,90 @@ +/* Copyright (c) 2026 QRunIO. SPDX-License-Identifier: Apache-2.0 */ +package io.qrun.mobile.scanner + +import android.content.Context +import android.content.RestrictionsManager +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.material3.TextButton +import androidx.compose.runtime.Composable + +/** Android managed-configuration keys; they must match res/xml/app_restrictions.xml and the company profile generator. */ +internal const val MANAGED_SERVER_URL = "qqq_server_url" +internal const val MANAGED_ORIENTATION = "qqq_orientation" + +/******************************************************************************* + ** Validated administrator bootstrap values. Absent or rejected keys are null, which leaves unmanaged behaviour unchanged. + ** Only key names, never values, are recorded for rejected input. + *******************************************************************************/ +internal data class ManagedValues(val serverUrl: String? = null, val orientation: OrientationPolicy? = null, val rejectedKeys: List<String> = emptyList()) + +/******************************************************************************* + ** What a managed server URL means for the current installation. + *******************************************************************************/ +internal enum class ManagedServerAction { NONE, PREFILL, OFFER_CHANGE } + +/******************************************************************************* + ** Pure validation and reconciliation rules for managed configuration. + *******************************************************************************/ +internal object ManagedConfiguration { + private const val MAX_URL = 2048 + + /******************************************************************************* + ** Accept only an HTTPS origin without credentials, path, query or fragment (managed values never allow HTTP, even + ** in debug builds), and only an exact existing orientation name. Anything else is rejected, never defaulted. + *******************************************************************************/ + fun parse(serverUrl: String?, orientation: String?): ManagedValues { + val rejected = mutableListOf<String>() + val url = serverUrl?.takeIf { it.isNotBlank() }?.let { raw -> + try { + require(raw.length <= MAX_URL) { "URL too long" } + normalizeServerUrl(raw, allowHttp = false) + } catch (exception: Exception) { + rejected += MANAGED_SERVER_URL + null + } + } + val policy = orientation?.takeIf { it.isNotBlank() }?.let { raw -> + OrientationPolicy.entries.firstOrNull { it.name == raw } ?: run { rejected += MANAGED_ORIENTATION; null } + } + return ManagedValues(url, policy, rejected) + } + + /******************************************************************************* + ** No saved server: offer the managed URL in the connect form. A different saved server is never switched silently; + ** the person is offered the existing change-server path (confirm, end session, sign out). + *******************************************************************************/ + fun serverAction(savedServer: String?, managedServer: String?): ManagedServerAction = when { + managedServer == null -> ManagedServerAction.NONE + savedServer == null -> ManagedServerAction.PREFILL + savedServer == managedServer -> ManagedServerAction.NONE + else -> ManagedServerAction.OFFER_CHANGE + } + + /******************************************************************************* + ** Managed orientation is a bootstrap default applied only when the administrator's value changes. A later local + ** choice stands until the managed value changes again. Null means nothing to apply. + *******************************************************************************/ + fun orientationToApply(managed: OrientationPolicy?, lastApplied: String?): OrientationPolicy? = + managed?.takeIf { it.name != lastApplied } +} + +/******************************************************************************* + ** Read this application's current restrictions; a missing service or no restrictions yields no managed values. + *******************************************************************************/ +internal fun readManagedValues(context: Context): ManagedValues { + val manager = context.getSystemService(Context.RESTRICTIONS_SERVICE) as? RestrictionsManager ?: return ManagedValues() + val restrictions = manager.applicationRestrictions + return ManagedConfiguration.parse(restrictions.getString(MANAGED_SERVER_URL), restrictions.getString(MANAGED_ORIENTATION)) +} + +/******************************************************************************* + ** Settings notice shown only when the managed server differs from the connected one. The button runs the caller's + ** existing confirmed change-server flow; this composable changes nothing itself. + *******************************************************************************/ +@Composable +internal fun ManagedServerNotice(connectedServer: String, managedServer: String?, onChange: () -> Unit) { + if (ManagedConfiguration.serverAction(connectedServer, managedServer) != ManagedServerAction.OFFER_CHANGE) return + Text("Your administrator configured a different server: $managedServer", style = MaterialTheme.typography.bodySmall) + TextButton(onClick = onChange) { Text("Use administrator's server") } +} diff --git a/scanner-host/src/main/java/io/qrun/mobile/scanner/MobileSessionApi.kt b/scanner-host/src/main/java/io/qrun/mobile/scanner/MobileSessionApi.kt new file mode 100644 index 0000000..d36e1cc --- /dev/null +++ b/scanner-host/src/main/java/io/qrun/mobile/scanner/MobileSessionApi.kt @@ -0,0 +1,155 @@ +/* Copyright (c) 2026 QRunIO. SPDX-License-Identifier: Apache-2.0 */ +package io.qrun.mobile.scanner + +import com.kingsrook.qqq.frontend.android.core.controllers.ANDROID_CLIENT +import com.kingsrook.qqq.frontend.android.core.controllers.MOBILE_SCANNERS_PATH +import com.kingsrook.qqq.frontend.android.core.controllers.RequestOutcome +import com.kingsrook.qqq.frontend.android.core.controllers.RequestOutcomeInterceptor +import com.kingsrook.qqq.frontend.android.core.controllers.SameOriginInterceptor +import com.kingsrook.qqq.frontend.android.core.controllers.UiApiCompatibility +import com.kingsrook.qqq.frontend.android.core.controllers.UiApiException +import android.os.Build +import java.io.IOException +import java.util.concurrent.TimeUnit +import kotlin.coroutines.resume +import kotlin.coroutines.resumeWithException +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.suspendCancellableCoroutine +import kotlinx.coroutines.withContext +import okhttp3.Call +import okhttp3.Callback +import okhttp3.MediaType.Companion.toMediaType +import okhttp3.OkHttpClient +import okhttp3.Request +import okhttp3.RequestBody.Companion.toRequestBody +import okhttp3.Response +import org.json.JSONObject + +/******************************************************************************* + ** Session and screen traffic uses the registered extension and the existing QQQ/device identity. + *******************************************************************************/ +internal interface MobileSessionTransport { + /******************************************************************************* + ** Send the current eligible session metadata and accept only the server's bounded lease policy. + *******************************************************************************/ + suspend fun heartbeat(session: String, state: SessionScreen): SessionHeartbeat + + /******************************************************************************* + ** End only the captured authenticated session with an explicit sign-out or server-change reason. + *******************************************************************************/ + suspend fun end(session: String, reason: String) + + /******************************************************************************* + ** Upload a frame under its exact server lease and sequence; pixels never become process values. + *******************************************************************************/ + suspend fun screen(session: String, leaseId: String, sequence: Long, frame: ScreenFrame) +} + +/******************************************************************************* + ** Bind extension traffic to one server and its existing session/device headers without following redirects. + *******************************************************************************/ +internal class MobileSessionApi( + private val server: String, + private val headers: () -> Map<String, String>, + private val compatibility: UiApiCompatibility, + onOutcome: (RequestOutcome) -> Unit = {}, + private val deviceInfo: Map<String, String?> = installedVersions(), +) : MobileSessionTransport { + companion object { + /******************************************************************************* + ** The same software versions enrollment reported, so an in-place update refreshes the device record and later scan receipts. + *******************************************************************************/ + fun installedVersions(): Map<String, String?> = mapOf("osVersion" to Build.VERSION.RELEASE, "appVersion" to BuildConfig.VERSION_NAME) + } + + private val client = OkHttpClient.Builder().followRedirects(false).followSslRedirects(false) + .callTimeout(5, TimeUnit.SECONDS).addInterceptor(RequestOutcomeInterceptor(onOutcome)).addInterceptor(SameOriginInterceptor()).build() + + /******************************************************************************* + ** Send the current eligible session metadata and accept only the server's bounded lease policy. + *******************************************************************************/ + override suspend fun heartbeat(session: String, state: SessionScreen): SessionHeartbeat { + val locationAvailable = state.foreground && state.location.status == "AVAILABLE" && state.location.fix != null + val locationStatus = if (!state.foreground || (state.location.status == "AVAILABLE" && !locationAvailable)) "UNAVAILABLE" else state.location.status + val json = JSONObject().put("foreground", state.foreground).put("screenAvailable", state.available) + .put("locationStatus", locationStatus) + if (state.captureMode != CaptureMode.APP_CONTENT) json.put("captureMode", state.captureMode.name) + // Omitted versions leave the enrolled values unchanged on the server (mobile-scanners 1.6); blank ones are never sent. + deviceInfo.forEach { (name, value) -> if (!value.isNullOrBlank()) json.put(name, value.take(200)) } + state.location.fix?.takeIf { locationAvailable }?.let { fix -> + json.put( + "location", JSONObject().put("latitude", fix.latitude).put("longitude", fix.longitude) + .put("accuracyMeters", fix.accuracyMeters).put("capturedAt", fix.capturedAt) + ) + } + mapOf( + "appName" to state.appName, "processName" to state.processName, "processInstanceId" to state.processInstanceId, + "stepName" to state.stepName, "screenLabel" to state.label, "captureBlockedReason" to state.blockedReason + ) + .forEach { (name, value) -> json.put(name, value ?: JSONObject.NULL) } + return SessionHeartbeat.parse(post(session, "/sessions/heartbeat", json, 200)) + } + + /******************************************************************************* + ** End only the captured authenticated session with an explicit sign-out or server-change reason. + *******************************************************************************/ + override suspend fun end(session: String, reason: String) { + require(reason == "SIGN_OUT" || reason == "SERVER_CHANGE") + post(session, "/sessions/current/end", JSONObject().put("reason", reason), 200) + } + + /******************************************************************************* + ** Upload a frame under its exact server lease and sequence; pixels never become process values. + *******************************************************************************/ + override suspend fun screen(session: String, leaseId: String, sequence: Long, frame: ScreenFrame) { + val json = JSONObject().put("leaseId", leaseId).put("sequence", sequence).put("capturedAt", frame.capturedAt) + .put("width", frame.width).put("height", frame.height).put("mimeType", "image/jpeg") + .put("imageBase64", java.util.Base64.getEncoder().encodeToString(frame.jpeg)) + if (frame.captureMode != CaptureMode.APP_CONTENT) json.put("captureMode", frame.captureMode.name) + post(session, "/sessions/current/screen", json, 204) + } + + /******************************************************************************* + ** Verify compatibility and close bounded responses while connecting coroutine cancellation to the HTTP call. + *******************************************************************************/ + private suspend fun post(session: String, path: String, body: JSONObject, expected: Int): String = withContext(Dispatchers.IO) + { + require(session.isNotBlank()) + require(compatibility.server == server) + compatibility.verify() + val request = Request.Builder().url(server.trimEnd('/') + MOBILE_SCANNERS_PATH + path) + .header("X-QQQ-Client", ANDROID_CLIENT).header("Cookie", "sessionUUID=$session") + .header("Cache-Control", "no-store") + headers().forEach { (name, value) -> request.header(name, value) } + request.post(body.toString().toRequestBody("application/json".toMediaType())) + val call = client.newCall(request.build()) + val response = suspendCancellableCoroutine<Response> { continuation -> + continuation.invokeOnCancellation { call.cancel() } + call.enqueue(object : Callback { + /******************************************************************************* + ** Resume only an active continuation so cancellation cannot revive the abandoned HTTP operation. + *******************************************************************************/ + override fun onFailure(call: Call, e: IOException) { + if (continuation.isActive) continuation.resumeWithException(e) + } + + /******************************************************************************* + ** Transfer response ownership to the continuation and close it if cancellation wins the race. + *******************************************************************************/ + override fun onResponse(call: Call, response: Response) { + continuation.resume(response) { _, value, _ -> value.close() } + } + }) + } + response.use { + if (!it.isSuccessful) throw UiApiException.from(it) + check(it.code == expected) { "Unexpected mobile session response." } + if (expected == 204) "" else { + val source = it.body?.source() ?: error("Empty mobile session response.") + source.request(16385) + check(source.buffer.size <= 16384) { "Oversized mobile session response." } + source.readUtf8() + } + } + } +} diff --git a/scanner-host/src/main/java/io/qrun/mobile/scanner/MobileSessionController.kt b/scanner-host/src/main/java/io/qrun/mobile/scanner/MobileSessionController.kt new file mode 100644 index 0000000..818ccba --- /dev/null +++ b/scanner-host/src/main/java/io/qrun/mobile/scanner/MobileSessionController.kt @@ -0,0 +1,197 @@ +/* Copyright (c) 2026 QRunIO. SPDX-License-Identifier: Apache-2.0 */ +package io.qrun.mobile.scanner + +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.setValue +import androidx.compose.runtime.snapshotFlow +import com.kingsrook.qqq.frontend.android.core.controllers.UiApiException +import kotlinx.coroutines.CancellationException +import kotlinx.coroutines.Job +import kotlinx.coroutines.cancelAndJoin +import kotlinx.coroutines.channels.Channel +import kotlinx.coroutines.coroutineScope +import kotlinx.coroutines.currentCoroutineContext +import kotlinx.coroutines.flow.collect +import kotlinx.coroutines.isActive +import kotlinx.coroutines.launch +import kotlinx.coroutines.withTimeoutOrNull + +/******************************************************************************* + ** One authenticated session. No screenshots or telemetry survive this controller's lifetime. + *******************************************************************************/ +internal class MobileSessionController( + private val session: String, + private val api: MobileSessionTransport, + private val readScreen: () -> SessionScreen, + private val capture: suspend (ScreenLease) -> ScreenFrame?, + private val onUnauthorized: () -> Unit, + private val now: () -> Long = android.os.SystemClock::elapsedRealtime, + private val onDeviceViewingStopped: () -> Unit = {}, + private val onDeviceLease: (Long) -> Unit = {}, +) { + var operatorPaused by mutableStateOf(false) + private set + var viewing by mutableStateOf(false) + private set + var supportsDeviceScreen by mutableStateOf(false) + private set + private var ended = false + private var generation = 0L + private var running: Job? = null + private var lease: ScreenLease? = null + private var leaseExpiresAt = 0L + private var sequence = 0L + + /******************************************************************************* + ** Overlay the live operator pause on the current host state before lease and upload decisions. + *******************************************************************************/ + private fun screen() = readScreen().copy(paused = operatorPaused) + + /******************************************************************************* + ** Invalidate in-flight capture immediately and stop device projection when the operator pauses. + *******************************************************************************/ + fun pauseViewing() { + operatorPaused = true; generation++; viewing = false; onDeviceViewingStopped() + } + + /******************************************************************************* + ** Invalidate prior capture tickets when viewing is allowed again; a fresh lease check still governs upload. + *******************************************************************************/ + fun allowViewing() { + operatorPaused = false; generation++ + } + + /******************************************************************************* + ** Invalidating synchronously prevents a completed PixelCopy callback from uploading after exit. + *******************************************************************************/ + fun invalidate() { + ended = true; generation++; lease = null; viewing = false; onDeviceViewingStopped(); running?.cancel() + } + + /******************************************************************************* + ** Cancel the heartbeat owner before ending the captured server session; ordinary logout can continue on failure. + *******************************************************************************/ + suspend fun end(reason: String) { + if (ended) return + ended = true + generation++ + lease = null + viewing = false + onDeviceViewingStopped() + val job = running + if (job != currentCoroutineContext()[Job]) job?.cancelAndJoin() + if (session.isNotBlank()) try { + api.end(session, reason) + } catch (exception: CancellationException) { + throw exception + } catch (exception: Exception) { /* Standard logout still runs and always clears this device. */ + } + } + + /******************************************************************************* + ** Own heartbeats and leased frame uploads for one authenticated lifetime, rejecting changed-state capture tickets. + *******************************************************************************/ + suspend fun run() = coroutineScope() + { + if (session.isBlank() || ended) return@coroutineScope + running = currentCoroutineContext()[Job] + val changed = Channel<Unit>(Channel.CONFLATED) + val observer = launch { snapshotFlow { screen() }.collect { changed.trySend(Unit) } } + var previous: SessionScreen? = null + var nextHeartbeat = 0L + var nextFrame = 0L + var heartbeatInterval = 5000L + var deviceStartedAt = 0L + var deviceHadLease = false + try { + while (isActive && !ended) { + val state = screen() + if (state != previous) { + if (state.captureMode != previous?.captureMode) { + lease = null + deviceStartedAt = now() + deviceHadLease = false + } + generation++ + previous = state + nextHeartbeat = 0L + if (!state.available) { + lease = null; viewing = false + } + } + if (!state.authenticated || !state.approved) break + if (now() >= nextHeartbeat) { + val started = now() + try { + val response = api.heartbeat(session, state) + heartbeatInterval = response.intervalMillis + supportsDeviceScreen = CaptureMode.DEVICE_SCREEN in response.supportedCaptureModes + // A slow response cannot extend the lease beyond its server-derived remaining lifetime. + val newLease = response.lease?.takeIf { it.captureMode == state.captureMode } + leaseExpiresAt = started + (newLease?.durationMillis ?: 0) + if (newLease?.id != lease?.id) sequence = newLease?.nextSequence ?: 0L + else sequence = maxOf(sequence, newLease?.nextSequence ?: 0L) + lease = newLease + } catch (exception: CancellationException) { + throw exception + } catch (exception: Exception) { + lease = null + if (state.captureMode == CaptureMode.DEVICE_SCREEN) pauseViewing() + if (exception is UiApiException && exception.httpStatus in setOf(401, 403)) { + onUnauthorized(); break + } + } + nextHeartbeat = if (state.foreground || state.captureMode == CaptureMode.DEVICE_SCREEN) now() + heartbeatInterval else Long.MAX_VALUE + } + val activeLease = lease + if (screen() != state) continue + viewing = activeLease != null && state.available && now() < leaseExpiresAt + if (state.captureMode == CaptureMode.DEVICE_SCREEN) { + if (viewing) { + deviceHadLease = true; onDeviceLease(leaseExpiresAt) + } + if (!state.available || !supportsDeviceScreen || (!viewing && (deviceHadLease || now() - deviceStartedAt >= 30000))) { + pauseViewing() + lease = null + viewing = false + continue + } + } + if (viewing && activeLease != null && now() >= nextFrame) { + val ticket = ScreenTicket(generation, state, activeLease.id) + val frame = try { + capture(activeLease) + } catch (exception: CancellationException) { + throw exception + } catch (exception: Exception) { + null + } + if (frame != null && frame.captureMode == state.captureMode && ticket.valid(generation, screen(), lease?.id, now(), leaseExpiresAt) && !ended) { + try { + // This check is deliberately adjacent to the cancellable upload, after JPEG encoding. + if (ticket.valid(generation, screen(), lease?.id, now(), leaseExpiresAt) && !ended) + api.screen(session, activeLease.id, sequence++, frame) + } catch (exception: CancellationException) { + throw exception + } catch (exception: Exception) { + lease = null + viewing = false + if (state.captureMode == CaptureMode.DEVICE_SCREEN) pauseViewing() + nextHeartbeat = now() + heartbeatInterval + if (exception is UiApiException && exception.httpStatus == 401) { + onUnauthorized(); break + } + } + } + nextFrame = now() + activeLease.intervalMillis + } + val deadline = if (viewing) minOf(nextHeartbeat, nextFrame, leaseExpiresAt) else + if (state.captureMode == CaptureMode.DEVICE_SCREEN) minOf(nextHeartbeat, deviceStartedAt + 30000) else nextHeartbeat + withTimeoutOrNull((deadline - now()).coerceIn(1, 15000)) { changed.receive() } + } + } finally { + observer.cancel(); changed.close(); viewing = false; lease = null; running = null; onDeviceViewingStopped() + } + } +} diff --git a/scanner-host/src/main/java/io/qrun/mobile/scanner/OpenSourceLicenses.kt b/scanner-host/src/main/java/io/qrun/mobile/scanner/OpenSourceLicenses.kt new file mode 100644 index 0000000..f9bcb31 --- /dev/null +++ b/scanner-host/src/main/java/io/qrun/mobile/scanner/OpenSourceLicenses.kt @@ -0,0 +1,60 @@ +/* Copyright (c) 2026 QRunIO. SPDX-License-Identifier: Apache-2.0 */ +package io.qrun.mobile.scanner + +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.safeDrawingPadding +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Surface +import androidx.compose.material3.Text +import androidx.compose.material3.TextButton +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.saveable.rememberSaveable +import androidx.compose.runtime.setValue +import androidx.compose.ui.Modifier +import androidx.compose.ui.unit.dp +import androidx.compose.ui.window.Dialog +import androidx.compose.ui.window.DialogProperties +import com.mikepenz.aboutlibraries.ui.compose.LibrariesContainer +import com.mikepenz.aboutlibraries.ui.compose.LibraryDefaults + +/******************************************************************************* + ** Secondary settings entry; library definitions and complete license texts are bundled resources. + *******************************************************************************/ +@Composable +fun OpenSourceLicensesButton() { + var visible by rememberSaveable { mutableStateOf(false) } + TextButton(onClick = { visible = true }) { Text("Open-source licenses") } + if (visible) { + Dialog(onDismissRequest = { visible = false }, properties = DialogProperties(usePlatformDefaultWidth = false)) + { + Surface(modifier = Modifier.fillMaxSize()) + { + Column(Modifier.fillMaxSize().safeDrawingPadding()) + { + Row(Modifier.fillMaxWidth().padding(horizontal = 16.dp)) + { + Text("Open-source licenses", modifier = Modifier.weight(1f).padding(vertical = 16.dp), style = MaterialTheme.typography.titleLarge) + TextButton(onClick = { visible = false }) { Text("Close") } + } + // AboutLibraries owns parsing and license rendering; no network or authentication is involved. + LibrariesContainer( + modifier = Modifier.fillMaxWidth().weight(1f), + colors = LibraryDefaults.libraryColors( + backgroundColor = MaterialTheme.colorScheme.surface, + contentColor = MaterialTheme.colorScheme.onSurface, + badgeBackgroundColor = MaterialTheme.colorScheme.primary, + badgeContentColor = MaterialTheme.colorScheme.onPrimary, + dialogConfirmButtonColor = MaterialTheme.colorScheme.primary + ) + ) + } + } + } + } +} diff --git a/scanner-host/src/main/java/io/qrun/mobile/scanner/OrientationPolicy.kt b/scanner-host/src/main/java/io/qrun/mobile/scanner/OrientationPolicy.kt new file mode 100644 index 0000000..bfeaf95 --- /dev/null +++ b/scanner-host/src/main/java/io/qrun/mobile/scanner/OrientationPolicy.kt @@ -0,0 +1,81 @@ +/* Copyright (c) 2026 QRunIO. SPDX-License-Identifier: Apache-2.0 */ +package io.qrun.mobile.scanner + +import android.app.Activity +import android.content.Context +import android.content.pm.ActivityInfo +import androidx.compose.foundation.layout.Box +import androidx.compose.material3.DropdownMenu +import androidx.compose.material3.DropdownMenuItem +import androidx.compose.material3.Text +import androidx.compose.material3.TextButton +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue + +/******************************************************************************* + ** Device-local display policy; never changes Android's global rotation setting. + *******************************************************************************/ +enum class OrientationPolicy(val label: String, val requested: Int) { + SYSTEM("System default", ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED), + PORTRAIT("Portrait", ActivityInfo.SCREEN_ORIENTATION_PORTRAIT), + LANDSCAPE("Landscape", ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE), + REVERSE_PORTRAIT("Reverse portrait", ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT), + REVERSE_LANDSCAPE("Reverse landscape", ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE); + + /******************************************************************************* + ** Share preference parsing between startup restoration and the operator's display controls. + *******************************************************************************/ + companion object { + /******************************************************************************* + ** Fall back to portrait for missing or invalid preferences while preserving every explicit supported choice. + *******************************************************************************/ + fun parse(value: String?) = entries.firstOrNull { it.name == value } ?: PORTRAIT + + /******************************************************************************* + ** Read only this application's local display preference, leaving Android's global rotation setting untouched. + *******************************************************************************/ + fun read(context: Context) = parse(context.getSharedPreferences("host", Context.MODE_PRIVATE).getString("orientation", null)) + } + + /******************************************************************************* + ** Persist the choice before changing orientation because Android may immediately recreate the activity. + *******************************************************************************/ + fun select(activity: Activity) { + // Persist before the platform potentially recreates the Activity. Its ViewModels survive rotation. + activity.getSharedPreferences("host", Context.MODE_PRIVATE).edit().putString("orientation", name).apply() + apply(activity) + } + + /******************************************************************************* + ** Avoid requesting redundant orientation changes that could recreate the host unnecessarily. + *******************************************************************************/ + fun apply(activity: Activity) { + if (activity.requestedOrientation != requested) activity.requestedOrientation = requested + } +} + +/******************************************************************************* + ** Offer device-local orientation choices through the same persisted policy used at activity startup. + *******************************************************************************/ +@Composable +fun OrientationSetting(activity: Activity) { + var selection by remember(activity) { mutableStateOf(OrientationPolicy.read(activity)) } + var expanded by remember { mutableStateOf(false) } + Box() + { + TextButton(onClick = { expanded = true }) { Text("Orientation: ${selection.label}") } + DropdownMenu(expanded = expanded, onDismissRequest = { expanded = false }) + { + OrientationPolicy.entries.forEach { policy -> + DropdownMenuItem(text = { Text(policy.label) }, onClick = { + expanded = false + selection = policy + policy.select(activity) + }) + } + } + } +} diff --git a/scanner-host/src/main/java/io/qrun/mobile/scanner/PhotoUploadViewModel.kt b/scanner-host/src/main/java/io/qrun/mobile/scanner/PhotoUploadViewModel.kt new file mode 100644 index 0000000..230bad6 --- /dev/null +++ b/scanner-host/src/main/java/io/qrun/mobile/scanner/PhotoUploadViewModel.kt @@ -0,0 +1,368 @@ +/* Copyright (c) 2026 QRunIO. SPDX-License-Identifier: Apache-2.0 */ +package io.qrun.mobile.scanner + +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.setValue +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import java.io.File +import java.io.InputStream +import java.io.Closeable +import java.io.RandomAccessFile +import java.security.MessageDigest +import java.util.UUID +import java.util.concurrent.ConcurrentHashMap +import java.util.concurrent.atomic.AtomicReference +import kotlinx.coroutines.CancellationException +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.CoroutineDispatcher +import kotlinx.coroutines.Job +import kotlinx.coroutines.ensureActive +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext +import org.json.JSONObject + +/******************************************************************************* + ** One photo intent belongs to one authenticated process. Rotation retains it; logout never reassigns its actor. + *******************************************************************************/ +internal class PhotoUploadViewModel( + private val api: RecordFilesTransport, private val session: String, + private val target: RecordPhotoTarget, private val directory: File, private val io: CoroutineDispatcher = Dispatchers.IO, + private val isCurrentSession: () -> Boolean +) : ViewModel() { + var limits by mutableStateOf<PhotoUploadLimits?>(null) + private set + var checking by mutableStateOf(true) + private set + var busy by mutableStateOf(false) + private set + var message by mutableStateOf("") + private set + var intent by mutableStateOf<PhotoUploadIntent?>(null) + private set + var captureFile by mutableStateOf<File?>(null) + private set + var uploadId by mutableStateOf<String?>(null) + private set + var saved by mutableStateOf(false) + private set + private var createAttempted = false + val hasAttemptedUpload: Boolean get() = createAttempted + private var operation: Job? = null + private var released = false + private val ownedFiles = ConcurrentHashMap.newKeySet<File>() + private val copyingInput = AtomicReference<Closeable?>() + val pending: Boolean get() = captureFile != null || intent != null && !saved + + init { + checkCapabilities() + } + + /******************************************************************************* + ** Capability denial hides photo actions without disabling the rest of the process. + *******************************************************************************/ + fun checkCapabilities() { + if (busy || released) return + operation = viewModelScope.launch { + checking = true + try { + checkSession(); limits = api.capabilities(session, target) + } catch (exception: CancellationException) { + throw exception + } catch (exception: Exception) { + limits = null; message = "Photo upload is unavailable. Check the connection or ask your administrator." + } finally { + checking = false + } + } + } + + /******************************************************************************* + ** Allocate only a private app-cache original for the camera's temporary URI grant. + *******************************************************************************/ + fun prepareCamera(): File { + checkSession() + check(!pending && !busy && limits?.mediaTypes?.contains("image/jpeg") == true) + clearSavedIntent() + directory.mkdirs() + saved = false + message = "" + return File(directory, "photo-${UUID.randomUUID()}.jpg").also { ownedFiles.add(it); captureFile = it } + } + + /******************************************************************************* + ** A cancelled camera produces no upload; successful originals are hashed without transformation. + *******************************************************************************/ + fun cameraResult(success: Boolean) { + val file = captureFile ?: return + if (released || !isCurrentSession()) { + deleteOwned(file) + captureFile = null + return + } + if (!success) { + deleteOwned(file) + captureFile = null + message = "Photo capture cancelled." + return + } + stage(file, "image/jpeg", "CAMERA") + } + + /******************************************************************************* + ** The selected URI is read immediately under its temporary grant; no broad media permission is needed. + *******************************************************************************/ + fun galleryResult(mediaType: String, open: () -> InputStream?) { + if (pending || busy || released || !isCurrentSession()) return + val policy = limits ?: return + if (!mediaType.startsWith("image/") || mediaType !in policy.mediaTypes) { + message = "This photo type is not accepted by the server." + return + } + clearSavedIntent() + directory.mkdirs() + val extension = when (mediaType) { + "image/jpeg" -> "jpg"; "image/png" -> "png"; "image/webp" -> "webp"; else -> "image" + } + val file = File(directory, "photo-${UUID.randomUUID()}.$extension") + ownedFiles.add(file) + captureFile = file + stage(file, mediaType, "GALLERY", open) + } + + /******************************************************************************* + ** Copy/hash with a strict server/local byte bound and delete only this newly created temporary file on failure. + *******************************************************************************/ + private fun stage(file: File, mediaType: String, origin: String, open: (() -> InputStream?)? = null) { + val policy = limits ?: return + busy = true + operation = viewModelScope.launch { + var startCameraUpload = false + try { + checkSession() + val staged = withContext(io) { + if (open != null) (open() ?: error("Photo could not be opened.")).use { input -> + copyingInput.set(input) + file.outputStream().use { output -> + val buffer = ByteArray(65536) + var total = 0L + while (true) { + ensureActive() + val count = input.read(buffer) + if (count < 0) break + total += count + require(total <= policy.maximumFileBytes) { "Photo exceeds the server limit." } + output.write(buffer, 0, count) + } + } + copyingInput.compareAndSet(input, null) + } + require(file.length() in 1..policy.maximumFileBytes) { "Photo is empty or exceeds the server limit." } + PhotoUploadIntent(target, file, mediaType, origin, file.length(), hash(file)) + } + checkSession() + intent = staged + saved = false + uploadId = null + createAttempted = false + message = if (origin == "CAMERA") "Uploading photo…" else "Photo ready to upload." + startCameraUpload = origin == "CAMERA" + } catch (exception: CancellationException) { + deleteOwned(file); throw exception + } catch (exception: Exception) { + deleteOwned(file) + message = "The photo could not be prepared or exceeds the server's size limit. Choose another photo." + } finally { + copyingInput.set(null); captureFile = null; busy = false + } + if (startCameraUpload) upload() + } + } + + /******************************************************************************* + ** Reconnect by recovering the same manifest/status; never allocate a second intent after a lost response. + *******************************************************************************/ + fun upload() { + val original = intent ?: return + if (busy || saved || released) return + busy = true + operation = viewModelScope.launch { + try { + checkSession() + var status = recover(original) + if (status.getString("state") == "COMPLETE") { + acceptReceipt(original, status); return@launch + } + require(status.getString("state") in setOf("OPEN", "FAILED", "FINALIZING")) + if (status.getString("state") != "FINALIZING") { + withContext(io) { require(original.file.length() == original.size && hash(original.file) == original.sha256) } + val frozen = PhotoUploadLimits.parse(status.getJSONObject("limits")) + require(original.size <= frozen.maximumFileBytes && original.mediaType in frozen.mediaTypes) + val items = status.getJSONArray("items") + require(items.length() == 1 && items.getJSONObject(0).getString("itemId") == original.itemId) + val received = items.getJSONObject(0).getJSONArray("receivedChunks") + val known = (0 until received.length()).map { received.getInt(it) }.toSet() + val count = ((original.size + frozen.chunkBytes - 1) / frozen.chunkBytes).toInt() + require(known.all { it in 0 until count }) + withContext(io) { + RandomAccessFile(original.file, "r").use { file -> + for (index in 0 until count) { + ensureActive() + checkSession() + if (index in known) continue + val offset = index.toLong() * frozen.chunkBytes + val bytes = ByteArray(minOf(frozen.chunkBytes.toLong(), original.size - offset).toInt()) + file.seek(offset) + file.readFully(bytes) + status = api.chunk(session, uploadId!!, original.itemId, index, bytes) + } + } + } + } + checkSession() + status = api.finalize(session, uploadId!!, original.requestId) + acceptReceipt(original, status) + } catch (exception: CancellationException) { + message = "Upload paused. Check the same upload when connected."; throw exception + } catch (exception: Exception) { + message = "Upload is not confirmed. Retry/check the same upload when connected. Do not select the photo again." + } finally { + busy = false + } + } + } + + /******************************************************************************* + ** Discard recovers an uncertain create before cancelling; it never claims to delete retained originals. + *******************************************************************************/ + fun discard() { + val original = intent ?: return + if (busy || released) return + busy = true + operation = viewModelScope.launch { + try { + checkSession() + if (createAttempted) { + val status = recover(original) + if (status.getString("state") == "COMPLETE") { + acceptReceipt(original, status); return@launch + } + val cancelled = api.cancel(session, uploadId!!) + if (cancelled.getString("state") == "COMPLETE") { + acceptReceipt(original, cancelled); return@launch + } + require(cancelled.getString("state") in setOf("CANCELLED", "EXPIRED")) + } + deleteOwned(original.file) + intent = null + uploadId = null + createAttempted = false + message = "Photo discarded." + } catch (exception: CancellationException) { + throw exception + } catch (exception: Exception) { + message = "Cancellation is not confirmed. Keep this screen and retry when connected." + } finally { + busy = false + } + } + } + + /******************************************************************************* + ** Backgrounding cancels transport but preserves the exact intent for explicit foreground recovery. + *******************************************************************************/ + fun pause() { + operation?.cancel() + } + + /******************************************************************************* + ** A new capture cannot reactivate a completed intent whose temporary original was already removed. + *******************************************************************************/ + private fun clearSavedIntent() { + if (saved) { + intent = null + uploadId = null + createAttempted = false + saved = false + } + } + + /******************************************************************************* + ** Recover creation only with the same actor and immutable request; record its server identity immediately. + *******************************************************************************/ + private suspend fun recover(original: PhotoUploadIntent): JSONObject { + checkSession() + val id = uploadId + val status = if (id == null) { + createAttempted = true + api.create(session, original) + } else api.status(session, id) + val returned = status.getString("uploadId") + require(UUID.fromString(returned).toString() == returned && (id == null || id == returned)) + uploadId = returned + return status + } + + /******************************************************************************* + ** A matching COMPLETE receipt alone permits local cleanup and the Saved label. + *******************************************************************************/ + private fun acceptReceipt(original: PhotoUploadIntent, status: JSONObject) { + checkSession() + require(status.getString("uploadId") == uploadId) + val receipt = original.verifyReceipt(status) + saved = true + deleteOwned(original.file) + message = if (receipt.getJSONArray("items").getJSONObject(0).getString("lifecycleAtCommit") == "QUARANTINED") + "Saved photo. Awaiting server review." else "Saved photo." + } + + /******************************************************************************* + ** A rotated Activity is allowed; a changed/expired authenticated session is not. + *******************************************************************************/ + private fun checkSession() { + check(!released && isCurrentSession()) { "The photo session has ended." } + } + + /******************************************************************************* + ** Only files allocated by this instance are eligible for cleanup; the selected gallery original is never owned. + *******************************************************************************/ + private fun deleteOwned(file: File) { + if (file !in ownedFiles) return + if (file.delete() || !file.exists()) ownedFiles.remove(file) + } + + /******************************************************************************* + ** Destruction differs from rotation/background: cancel I/O, close the active source, then remove our temporary originals. + *******************************************************************************/ + override fun onCleared() { + released = true + val work = operation + work?.cancel() + runCatching { copyingInput.getAndSet(null)?.close() } + // Completion runs after the copy's use/finally has closed its writer, avoiding delete/write races. + if (work == null) ownedFiles.toList().forEach(::deleteOwned) + else work.invokeOnCompletion { ownedFiles.toList().forEach(::deleteOwned) } + captureFile = null + intent = null + uploadId = null + busy = false + super.onCleared() + } + + /******************************************************************************* + ** Hash originals using fixed memory, preserving camera/gallery bytes exactly. + *******************************************************************************/ + private fun hash(file: File): String { + val digest = MessageDigest.getInstance("SHA-256") + file.inputStream().use { input -> + val buffer = ByteArray(65536) + while (true) { + val size = input.read(buffer) + if (size < 0) break + digest.update(buffer, 0, size) + } + } + return digest.digest().joinToString("") { "%02x".format(it) } + } +} diff --git a/scanner-host/src/main/java/io/qrun/mobile/scanner/QqqStatusWallpaperService.kt b/scanner-host/src/main/java/io/qrun/mobile/scanner/QqqStatusWallpaperService.kt new file mode 100644 index 0000000..57e91b4 --- /dev/null +++ b/scanner-host/src/main/java/io/qrun/mobile/scanner/QqqStatusWallpaperService.kt @@ -0,0 +1,297 @@ +/* Copyright (c) 2026 QRunIO. SPDX-License-Identifier: Apache-2.0 */ +package io.qrun.mobile.scanner + +import android.app.Activity +import android.app.KeyguardManager +import android.app.WallpaperManager +import android.content.ActivityNotFoundException +import android.content.BroadcastReceiver +import android.content.ComponentName +import android.content.Context +import android.content.Intent +import android.content.IntentFilter +import android.graphics.Canvas +import android.graphics.Color +import android.graphics.Paint +import android.graphics.Typeface +import android.net.ConnectivityManager +import android.net.LinkProperties +import android.net.Network +import android.os.Build +import android.os.Handler +import android.os.Looper +import android.os.SystemClock +import android.service.wallpaper.WallpaperService +import android.view.SurfaceHolder +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.material3.TextButton +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.core.content.ContextCompat +import java.time.Instant +import java.time.ZoneId +import java.time.format.DateTimeFormatter + +/******************************************************************************* + ** The one in-process publisher. The wallpaper engine runs in this application's main process, so the snapshot + ** is shared by reference and disappears with the process; nothing is written to disk. + *******************************************************************************/ +internal object WallpaperStatus { + val store = WallpaperStatusStore(SystemClock::elapsedRealtime, System::currentTimeMillis) +} + +/******************************************************************************* + ** Optional live wallpaper showing the company name and, on the unlocked home screen only, the approved session + ** display name and current IP. Inactive until a person selects it in Android's wallpaper chooser. + *******************************************************************************/ +class QqqStatusWallpaperService : WallpaperService() { + /******************************************************************************* + ** One engine per wallpaper surface; the framework destroys it when the wallpaper is replaced. + *******************************************************************************/ + override fun onCreateEngine(): Engine = StatusEngine() + + /******************************************************************************* + ** Draws text with a single Canvas pass. Network, keyguard and store observation exist only while visible. + *******************************************************************************/ + private inner class StatusEngine : Engine(), WallpaperStatusListener { + private val main = Handler(Looper.getMainLooper()) + private val connectivity = getSystemService(Context.CONNECTIVITY_SERVICE) as? ConnectivityManager + private val keyguard = getSystemService(Context.KEYGUARD_SERVICE) as? KeyguardManager + private val paint = Paint(Paint.ANTI_ALIAS_FLAG) + private val timeFormat = DateTimeFormatter.ofPattern("HH:mm").withZone(ZoneId.systemDefault()) + private var observing = false + private var destroyed = false + private var networkCallback: ConnectivityManager.NetworkCallback? = null + private var currentNetwork: Network? = null + private var networkKnown = false + private var networkAddresses: String? = null + private val redraw = Runnable { draw() } + private val screenReceiver = object : BroadcastReceiver() { + /******************************************************************************* + ** Withdraw identity the moment the screen turns off; redraw once the user unlocks. + *******************************************************************************/ + override fun onReceive(context: Context, intent: Intent) { + if (intent.action == Intent.ACTION_SCREEN_OFF) drawBrandOnly() else draw() + } + } + + /******************************************************************************* + ** Observe only while visible. Becoming invisible first paints brand-only so a stale frame cannot flash on wake. + *******************************************************************************/ + override fun onVisibilityChanged(visible: Boolean) { + if (destroyed) return + if (visible) { + startObserving() + draw() + } else { + drawBrandOnly() + stopObserving() + } + } + + /******************************************************************************* + ** Repaint when the surface size changes. + *******************************************************************************/ + override fun onSurfaceChanged(holder: SurfaceHolder, format: Int, width: Int, height: Int) { + super.onSurfaceChanged(holder, format, width, height) + if (observing) draw() else drawBrandOnly() + } + + /******************************************************************************* + ** Release the network callback, receiver, store listener and pending timers; nothing outlives the engine. + *******************************************************************************/ + override fun onDestroy() { + destroyed = true + stopObserving() + super.onDestroy() + } + + /******************************************************************************* + ** The store may notify from any thread; repaint on the main looper. + *******************************************************************************/ + override fun changed() { + main.post(redraw) + } + + /******************************************************************************* + ** Start network, unlock and store observation once per visible period. + *******************************************************************************/ + private fun startObserving() { + if (observing) return + observing = true + WallpaperStatus.store.addListener(this) + ContextCompat.registerReceiver( + this@QqqStatusWallpaperService, screenReceiver, + IntentFilter().apply { addAction(Intent.ACTION_USER_PRESENT); addAction(Intent.ACTION_SCREEN_OFF) }, + ContextCompat.RECEIVER_NOT_EXPORTED + ) + val callback = object : ConnectivityManager.NetworkCallback() { + /******************************************************************************* + ** Addresses are reported here after the default network becomes available and whenever they change. + *******************************************************************************/ + override fun onLinkPropertiesChanged(network: Network, linkProperties: LinkProperties) { + val text = formatNetworkAddresses(linkProperties.interfaceName, linkProperties.linkAddresses.mapNotNull { it.address.hostAddress }) + main.post { if (observing) { currentNetwork = network; networkKnown = true; networkAddresses = text; draw() } } + } + + /******************************************************************************* + ** Ignore the loss of a network that already stopped being the default. + *******************************************************************************/ + override fun onLost(network: Network) { + main.post { if (observing && network == currentNetwork) { currentNetwork = null; networkKnown = true; networkAddresses = null; draw() } } + } + } + try { + connectivity?.registerDefaultNetworkCallback(callback) + networkCallback = callback + } catch (exception: RuntimeException) { + networkKnown = false + } + } + + /******************************************************************************* + ** Undo everything startObserving did and cancel scheduled work. Safe to call repeatedly. + *******************************************************************************/ + private fun stopObserving() { + main.removeCallbacks(redraw) + if (!observing) return + observing = false + WallpaperStatus.store.removeListener(this) + try { + unregisterReceiver(screenReceiver) + } catch (exception: IllegalArgumentException) { /* Already unregistered. */ + } + networkCallback?.let { + try { + connectivity?.unregisterNetworkCallback(it) + } catch (exception: IllegalArgumentException) { /* Already unregistered. */ + } + } + networkCallback = null + currentNetwork = null + networkKnown = false + networkAddresses = null + } + + /******************************************************************************* + ** Preview and lock-only wallpaper never show identity. A locked keyguard, or no keyguard service, is treated + ** as locked. The wallpaper-flag check is additive: only an engine bound to the lock screen alone is certain. + *******************************************************************************/ + private fun currentContext(): WallpaperContext { + if (isPreview) return WallpaperContext.PREVIEW + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE && getWallpaperFlags() == WallpaperManager.FLAG_LOCK) return WallpaperContext.LOCKED + return if (keyguard?.isKeyguardLocked == false) WallpaperContext.HOME else WallpaperContext.LOCKED + } + + /******************************************************************************* + ** Paint the frame for the current context and schedule the single timer that withdraws an aging name. + *******************************************************************************/ + private fun draw() { + if (destroyed) return + main.removeCallbacks(redraw) + val snapshot = WallpaperStatus.store.snapshot + val now = SystemClock.elapsedRealtime() + val context = currentContext() + val frame = WallpaperPresentation.render( + snapshot, context, WallpaperPresentation.networkLine(networkKnown, networkAddresses), now + ) { timeFormat.format(Instant.ofEpochMilli(it)) } + paintFrame(frame) + if (context == WallpaperContext.HOME && observing) WallpaperPresentation.millisUntilStale(snapshot, now)?.let { main.postDelayed(redraw, it + 50) } + } + + /******************************************************************************* + ** Brand-only frame used on invisibility, screen off and teardown. + *******************************************************************************/ + private fun drawBrandOnly() { + if (destroyed) return + main.removeCallbacks(redraw) + val snapshot = WallpaperStatus.store.snapshot + paintFrame(WallpaperPresentation.render(snapshot, WallpaperContext.LOCKED, "", 0L) { "" }) + } + + /******************************************************************************* + ** Draw the header and lines centred in the upper third, shortening any line to fit. Never logs text. + *******************************************************************************/ + private fun paintFrame(frame: WallpaperFrame) { + val holder = surfaceHolder + if (!holder.surface.isValid) return + val canvas: Canvas? = try { + holder.lockCanvas() + } catch (exception: RuntimeException) { + null + } + if (canvas == null) return + try { + draw(canvas, frame) + } finally { + holder.unlockCanvasAndPost(canvas) + } + } + + /******************************************************************************* + ** Canvas layout kept deliberately plain: solid brand colour, bold header, regular status lines. + *******************************************************************************/ + private fun draw(canvas: Canvas, frame: WallpaperFrame) { + val width = canvas.width.toFloat() + canvas.drawColor(Color.parseColor(frame.colorHex)) + paint.color = if (frame.darkText) Color.BLACK else Color.WHITE + paint.textAlign = Paint.Align.CENTER + val maxWidth = width * 0.9f + var y = canvas.height * 0.22f + paint.typeface = Typeface.DEFAULT_BOLD + paint.textSize = width * 0.07f + canvas.drawText(fit(frame.header, maxWidth), width / 2, y, paint) + paint.typeface = Typeface.DEFAULT + paint.textSize = width * 0.045f + frame.lines.forEach { line -> + y += paint.textSize * 1.6f + canvas.drawText(fit(line, maxWidth), width / 2, y, paint) + } + } + + /******************************************************************************* + ** Truncate with an ellipsis so long names cannot run off the display. + *******************************************************************************/ + private fun fit(text: String, maxWidth: Float): String { + val count = paint.breakText(text, true, maxWidth, null) + return if (count >= text.length) text else text.take((count - 1).coerceAtLeast(0)) + "…" + } + } +} + +/******************************************************************************* + ** The standard Android live-wallpaper chooser, preselected to this wallpaper. Activation still needs the person's + ** confirmation there; nothing is applied silently. + *******************************************************************************/ +internal fun wallpaperChooserIntent(context: Context): Intent = Intent(WallpaperManager.ACTION_CHANGE_LIVE_WALLPAPER) + .putExtra(WallpaperManager.EXTRA_LIVE_WALLPAPER_COMPONENT, ComponentName(context, QqqStatusWallpaperService::class.java)) + +/******************************************************************************* + ** Open the chooser; false when the device offers none or refuses the request. + *******************************************************************************/ +internal fun openWallpaperChooser(activity: Activity): Boolean = try { + activity.startActivity(wallpaperChooserIntent(activity)) + true +} catch (exception: ActivityNotFoundException) { + false +} catch (exception: SecurityException) { + false +} + +/******************************************************************************* + ** Settings entry that opens the wallpaper chooser. It states exactly what the wallpaper will and will not show. + *******************************************************************************/ +@Composable +internal fun WallpaperSetting(activity: Activity) { + var unavailable by remember { mutableStateOf(false) } + TextButton(onClick = { unavailable = !openWallpaperChooser(activity) }) { Text("Status wallpaper…") } + Text( + "Optional live wallpaper: company name only on the lock screen; your name and this device's IP on the unlocked home screen. You confirm it in Android.", + style = MaterialTheme.typography.bodySmall + ) + if (unavailable) Text("This device has no live wallpaper chooser.") +} diff --git a/scanner-host/src/main/java/io/qrun/mobile/scanner/RecordFilesApi.kt b/scanner-host/src/main/java/io/qrun/mobile/scanner/RecordFilesApi.kt new file mode 100644 index 0000000..7de29dc --- /dev/null +++ b/scanner-host/src/main/java/io/qrun/mobile/scanner/RecordFilesApi.kt @@ -0,0 +1,329 @@ +/* Copyright (c) 2026 QRunIO. SPDX-License-Identifier: Apache-2.0 */ +package io.qrun.mobile.scanner + +import com.kingsrook.qqq.frontend.android.core.controllers.ANDROID_CLIENT +import com.kingsrook.qqq.frontend.android.core.controllers.RequestOutcome +import com.kingsrook.qqq.frontend.android.core.controllers.RequestOutcomeInterceptor +import com.kingsrook.qqq.frontend.android.core.controllers.SameOriginInterceptor +import com.kingsrook.qqq.frontend.android.core.controllers.UiApiCompatibility +import com.kingsrook.qqq.frontend.android.core.controllers.UiApiException +import java.io.File +import java.io.IOException +import java.security.MessageDigest +import java.time.Instant +import java.util.UUID +import java.util.concurrent.TimeUnit +import kotlin.coroutines.resume +import kotlin.coroutines.resumeWithException +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.suspendCancellableCoroutine +import kotlinx.coroutines.withContext +import okhttp3.Call +import okhttp3.Callback +import okhttp3.HttpUrl.Companion.toHttpUrl +import okhttp3.MediaType.Companion.toMediaType +import okhttp3.OkHttpClient +import okhttp3.Request +import okhttp3.RequestBody +import okhttp3.RequestBody.Companion.toRequestBody +import okhttp3.Response +import org.json.JSONArray +import org.json.JSONObject + +/******************************************************************************* + ** The semantic widget supplies the parent; the server independently authorizes it on every operation. + *******************************************************************************/ +internal data class RecordPhotoTarget(val tableName: String, val recordId: String, val title: String?, val instructions: String?) { + /******************************************************************************* + ** Keep record-file boundary validation and manifest utilities alongside their transport data contracts. + *******************************************************************************/ + companion object { + /******************************************************************************* + ** Refuse missing/coerced identities; never derive a parent from an arbitrary form field. + *******************************************************************************/ + fun parse(values: Map<String, Any?>): RecordPhotoTarget { + val parent = values["parent"] as? Map<*, *> ?: error("Missing photo target.") + val table = parent["tableName"] as? String ?: error("Invalid photo target.") + val record = parent["recordId"] as? String ?: error("Invalid photo target.") + require(table.isNotBlank() && table.length <= 200 && record.isNotBlank() && record.length <= 1000) + require(values["title"] == null || values["title"] is String) + require(values["instructions"] == null || values["instructions"] is String) + val title = values["title"] as? String + require(title == null || title.length <= 255) + return RecordPhotoTarget(table, record, title, values["instructions"] as? String) + } + } +} + +/******************************************************************************* + ** Frozen server limits are bounded again locally before allocating or reading original bytes. + *******************************************************************************/ +internal data class PhotoUploadLimits(val maximumFileBytes: Long, val chunkBytes: Int, val mediaTypes: Set<String>) { + /******************************************************************************* + ** Keep record-file boundary validation and manifest utilities alongside their transport data contracts. + *******************************************************************************/ + companion object { + /******************************************************************************* + ** This client sends one original at a time; both per-file and total limits still apply. + *******************************************************************************/ + fun parse(value: JSONObject): PhotoUploadLimits { + val maximum = minOf(value.getLong("maximumFileBytes"), value.getLong("maximumTotalBytes")) + val chunk = value.getInt("chunkBytes") + require(maximum in 1..20L * 1024 * 1024 && chunk in 65536..4 * 1024 * 1024 && value.getInt("maximumItems") >= 1) + val media = value.getJSONArray("acceptedMediaTypes") + return PhotoUploadLimits(maximum, chunk, (0 until media.length()).map { media.getString(it) }.toSet()) + } + } +} + +/******************************************************************************* + ** Immutable intent survives retries; source bytes are private temporary originals, never resized. + *******************************************************************************/ +internal data class PhotoUploadIntent( + val target: RecordPhotoTarget, val file: File, val mediaType: String, + val origin: String, val size: Long, val sha256: String, val requestId: String = UUID.randomUUID().toString(), + val itemId: String = UUID.randomUUID().toString() +) { + /******************************************************************************* + ** Replays use exactly this manifest and identity. + *******************************************************************************/ + fun manifest(): JSONObject { + require(origin in setOf("CAMERA", "GALLERY")) + val item = JSONObject().put("itemId", itemId).put("position", 0).put("fileName", file.name) + .put("declaredMediaType", mediaType).put("sizeBytes", size).put("sha256", sha256).put("origin", origin) + return JSONObject().put("requestId", requestId) + .put("parent", JSONObject().put("tableName", target.tableName).put("recordId", target.recordId)) + .put("items", JSONArray().put(item)).also { target.title?.let { title -> it.put("title", title) } } + } + + /******************************************************************************* + ** Saved requires the complete exact-original association receipt, not only a successful HTTP status. + *******************************************************************************/ + fun verifyReceipt(status: JSONObject): JSONObject { + require(status.getString("state") == "COMPLETE") { "The upload is not complete." } + val receipt = status.getJSONObject("receipt") + require(receipt.getString("uploadId") == status.getString("uploadId") && receipt.getString("state") == "COMPLETE") + require(receipt.getLong("collectionId") > 0) + Instant.parse(receipt.getString("completedAt")) + val items = receipt.getJSONArray("items") + require(items.length() == 1) + val item = items.getJSONObject(0) + require(item.getString("itemId") == itemId && item.getInt("position") == 0 && item.getLong("sizeBytes") == size && item.getString("sha256") == sha256) + require(item.getString("fileId").isNotBlank() && item.getLong("versionId") > 0 && item.getLong("attachmentId") > 0 && item.getString("lifecycleAtCommit").isNotBlank()) + return receipt + } +} + +/******************************************************************************* + ** Native Record Files 1.x client. It shares QQQ authentication and the registered semantic extension. + *******************************************************************************/ +internal interface RecordFilesTransport { + /******************************************************************************* + ** Discover upload eligibility and bounded limits for this authenticated target before staging media. + *******************************************************************************/ + suspend fun capabilities(session: String, target: RecordPhotoTarget): PhotoUploadLimits? + + /******************************************************************************* + ** Create or recover the upload intent using its existing identity rather than starting a duplicate upload. + *******************************************************************************/ + suspend fun create(session: String, intent: PhotoUploadIntent): JSONObject + + /******************************************************************************* + ** Read the existing upload's authoritative receipt so retry decisions preserve event identity. + *******************************************************************************/ + suspend fun status(session: String, uploadId: String): JSONObject + + /******************************************************************************* + ** Send one indexed bounded chunk for the existing upload item without changing its manifest. + *******************************************************************************/ + suspend fun chunk(session: String, uploadId: String, itemId: String, index: Int, bytes: ByteArray): JSONObject + + /******************************************************************************* + ** Commit the existing upload with its stable request identity so a lost response remains recoverable. + *******************************************************************************/ + suspend fun finalize(session: String, uploadId: String, requestId: String): JSONObject + + /******************************************************************************* + ** Ask the server to cancel the existing upload; local deletion waits for authoritative confirmation. + *******************************************************************************/ + suspend fun cancel(session: String, uploadId: String): JSONObject +} + +/******************************************************************************* + ** Transport-only implementation keeps capture and retry lifecycle independent of HTTP. + *******************************************************************************/ +internal class RecordFilesApi( + private val server: String, private val headers: () -> Map<String, String>, + private val compatibility: UiApiCompatibility, onOutcome: (RequestOutcome) -> Unit = {} +) : RecordFilesTransport { + private val client = OkHttpClient.Builder().followRedirects(false).followSslRedirects(false) + .callTimeout(30, TimeUnit.SECONDS).addInterceptor(RequestOutcomeInterceptor(onOutcome)).addInterceptor(SameOriginInterceptor()).build() + + @Volatile + private var captureContractVerified = false + + /******************************************************************************* + ** Absence is optional: hide capture actions, while ordinary scanner functionality remains available. + *******************************************************************************/ + override suspend fun capabilities(session: String, target: RecordPhotoTarget): PhotoUploadLimits? = withContext(Dispatchers.IO) + { + val version = compatibility.verify() + val extension = version.extensions.singleOrNull { it.name == "record-files" } ?: return@withContext null + if (extension.pathPrefix != "/qbit/record-files" || !Regex("1\\.(0|[1-9][0-9]*)\\.(0|[1-9][0-9]*)").matches(extension.version)) return@withContext null + val bridge = version.extensions.singleOrNull { it.name == "mobile-record-files" } ?: return@withContext null + if (bridge.pathPrefix != "/qbit/mobile-record-files" || !supportedVersion(bridge.version)) return@withContext null + val descriptor = execute(null, Request.Builder().url(server.trimEnd('/') + "/qqq/v1/qbit/mobile-record-files/contract").get()) + if (!supportedVersion(descriptor.getString("version")) || descriptor.getString("blockType") != "RECORD_FILES_CAPTURE" || descriptor.getString("widgetType") != "composite") return@withContext null + captureContractVerified = true + val url = endpoint("/capabilities").toHttpUrl().newBuilder().addQueryParameter("tableName", target.tableName).addQueryParameter("recordId", target.recordId).build() + val value = execute(session, Request.Builder().url(url).get()) + if (!value.getBoolean("canUpload")) return@withContext null + require(supportedVersion(value.getString("version")) && value.getBoolean("resumable") && !value.getBoolean("offline")) + PhotoUploadLimits.parse(value.getJSONObject("limits")) + } + + /******************************************************************************* + ** Create is idempotent under the immutable actor/request manifest. + *******************************************************************************/ + override suspend fun create(session: String, intent: PhotoUploadIntent): JSONObject = execute( + session, + mutation("/uploads").post(intent.manifest().toString().toRequestBody(JSON)) + ) + + /******************************************************************************* + ** Status is safe after a lost chunk or finalize response and never creates a second upload. + *******************************************************************************/ + override suspend fun status(session: String, uploadId: String): JSONObject = execute( + session, + Request.Builder().url(endpoint("/uploads/${uuid(uploadId)}")).get() + ) + + /******************************************************************************* + ** Binary chunks carry exact length and checksum; repeating the same index/bytes is safe. + *******************************************************************************/ + override suspend fun chunk(session: String, uploadId: String, itemId: String, index: Int, bytes: ByteArray): JSONObject { + require(index >= 0 && bytes.isNotEmpty() && bytes.size <= 4 * 1024 * 1024) + return execute( + session, mutation("/uploads/${uuid(uploadId)}/items/${uuid(itemId)}/chunks/$index") + .header("X-Chunk-SHA256", sha256(bytes)).put(bytes.toRequestBody(BINARY)) + ) + } + + /******************************************************************************* + ** Finalization repeats only with the original request identity. + *******************************************************************************/ + override suspend fun finalize(session: String, uploadId: String, requestId: String): JSONObject = execute( + session, + mutation("/uploads/${uuid(uploadId)}/finalize").header("Idempotency-Key", uuid(requestId)).post(EMPTY) + ) + + /******************************************************************************* + ** Cancellation only removes server staging; committed originals remain retained. + *******************************************************************************/ + override suspend fun cancel(session: String, uploadId: String): JSONObject = execute( + session, + mutation("/uploads/${uuid(uploadId)}/cancel").post(EMPTY) + ) + + /******************************************************************************* + ** Protocol headers never substitute for the user's current session and verified device. + *******************************************************************************/ + private fun mutation(path: String) = Request.Builder().url(endpoint(path)).header("X-Record-Files-Request", "1") + + /******************************************************************************* + ** Routes are fixed contract paths; opaque upload IDs are validated before interpolation. + *******************************************************************************/ + private fun endpoint(path: String) = server.trimEnd('/') + "/qqq/v1/qbit/record-files" + path + + /******************************************************************************* + ** Canonical UUID spelling prevents path injection and accidental identity changes. + *******************************************************************************/ + private fun uuid(value: String): String { + require(UUID.fromString(value).toString() == value) + return value + } + + /******************************************************************************* + ** Cancellation closes transport; bounded JSON parsing cannot allocate an arbitrary server body. + *******************************************************************************/ + private suspend fun send(session: String?, builder: Request.Builder): Response = withContext(Dispatchers.IO) + { + require(session?.isNotBlank() != false && compatibility.server == server) + val extension = compatibility.verify().extensions.singleOrNull { it.name == "record-files" } + require(extension != null && extension.pathPrefix == "/qbit/record-files" && supportedVersion(extension.version)) { "Record Files is unavailable on this server." } + builder.header("X-QQQ-Client", ANDROID_CLIENT).header("Cache-Control", "no-store") + if (session != null) { + check(captureContractVerified) { "The mobile photo contract has not been verified." } + builder.header("Cookie", "sessionUUID=$session") + headers().forEach { (name, value) -> builder.header(name, value) } + } + val call = client.newCall(builder.build()) + val response = suspendCancellableCoroutine<Response> { continuation -> + continuation.invokeOnCancellation { call.cancel() } + call.enqueue(object : Callback { + /******************************************************************************* + ** Deliver transport failure only to a live continuation so cancelled work stays cancelled. + *******************************************************************************/ + override fun onFailure(call: Call, e: IOException) { + if (continuation.isActive) continuation.resumeWithException(e) + } + + /******************************************************************************* + ** Transfer response ownership and close the response if coroutine cancellation races delivery. + *******************************************************************************/ + override fun onResponse(call: Call, response: Response) { + continuation.resume(response) { _, value, _ -> value.close() } + } + }) + } + response + } + + private suspend fun execute(session: String?, builder: Request.Builder): JSONObject = withContext(Dispatchers.IO) { + send(session, builder).use { + if (!it.isSuccessful) throw UiApiException.from(it) + require(it.code == 200) { "Unexpected upload response status." } + val source = it.body?.source() ?: error("Missing upload response.") + source.request(262145) + require(source.buffer.size <= 262144) { "Oversized upload response." } + JSONObject(source.readUtf8()) + } + } + + /** Tracked owner delivery rechecks the parent and lifecycle. Never follow presigned or external URLs. */ + suspend fun image(session: String, file: SavedRecordPhoto): ByteArray = withContext(Dispatchers.IO) { + require(file.lifecycle == "AVAILABLE" && file.mediaType in setOf("image/jpeg", "image/png", "image/webp")) + require(file.id.toLong() > 0 && file.size in 1..20L * 1024 * 1024) + val builder = Request.Builder().url(endpoint("/files/" + file.id + "/downloads/" + UUID.randomUUID())) + .header("X-Record-Files-Download", "1").get() + send(session, builder).use { response -> + if (!response.isSuccessful) throw UiApiException.from(response) + require(response.code == 200) + val source = response.body?.source() ?: error("Missing photo") + source.request(file.size + 1) + require(source.buffer.size == file.size) { "Invalid photo length" } + val bytes = source.readByteArray() + require(sha256(bytes) == file.sha256) { "Invalid photo checksum" } + bytes + } + } + + /******************************************************************************* + ** Keep record-file boundary validation and manifest utilities alongside their transport data contracts. + *******************************************************************************/ + companion object { + private val JSON = "application/json".toMediaType() + private val BINARY = "application/octet-stream".toMediaType() + private val EMPTY: RequestBody = ByteArray(0).toRequestBody(null) + + /******************************************************************************* + ** Additive 1.x contracts preserve the six tested ingestion operations. + *******************************************************************************/ + private fun supportedVersion(value: String) = Regex("1\\.(0|[1-9][0-9]*)\\.(0|[1-9][0-9]*)").matches(value) + + /******************************************************************************* + ** Checksums are lowercase SHA-256 as required by the registered ingestion contract. + *******************************************************************************/ + fun sha256(bytes: ByteArray): String = MessageDigest.getInstance("SHA-256").digest(bytes).joinToString("") { "%02x".format(it) } + } +} diff --git a/scanner-host/src/main/java/io/qrun/mobile/scanner/RecordPhotoWidget.kt b/scanner-host/src/main/java/io/qrun/mobile/scanner/RecordPhotoWidget.kt new file mode 100644 index 0000000..46722a7 --- /dev/null +++ b/scanner-host/src/main/java/io/qrun/mobile/scanner/RecordPhotoWidget.kt @@ -0,0 +1,162 @@ +/* Copyright (c) 2026 QRunIO. SPDX-License-Identifier: Apache-2.0 */ +package io.qrun.mobile.scanner + +import androidx.activity.compose.rememberLauncherForActivityResult +import androidx.activity.result.PickVisualMediaRequest +import androidx.activity.result.contract.ActivityResultContracts +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.padding +import androidx.compose.material3.AlertDialog +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.verticalScroll +import com.kingsrook.qqq.frontend.android.mobileapp.ui.records.RecordAttachmentUi +import androidx.compose.material3.Button +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.material3.TextButton +import androidx.compose.runtime.Composable +import androidx.compose.runtime.DisposableEffect +import androidx.compose.runtime.SideEffect +import androidx.compose.runtime.remember +import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.unit.dp +import androidx.core.content.FileProvider +import androidx.lifecycle.Lifecycle +import androidx.lifecycle.LifecycleEventObserver +import androidx.lifecycle.ViewModel +import androidx.lifecycle.ViewModelProvider +import androidx.lifecycle.compose.LocalLifecycleOwner +import androidx.lifecycle.viewmodel.compose.viewModel +import androidx.lifecycle.viewmodel.compose.LocalViewModelStoreOwner +import androidx.navigation.NavBackStackEntry +import com.kingsrook.qqq.frontend.android.mobileapp.ui.widgets.blocks.WidgetBlockParameters +import java.io.File + +/******************************************************************************* + ** Native capture is opt-in metadata plus current server capabilities; receipts do not advance business steps. + *******************************************************************************/ +@Composable +internal fun RecordPhotoWidget(parameters: WidgetBlockParameters, api: RecordFilesApi, modifier: Modifier, disabled: Boolean) { + val target = runCatching { RecordPhotoTarget.parse(parameters.widgetBlock.values) }.getOrNull() + val host = parameters.qViewModel + val process = host?.activeProcessViewModel + if (target == null || host == null || process == null) { + Text("This photo control has unsupported metadata or no active process.", modifier.padding(16.dp)) + return + } + RecordPhotoCapture(host, target, api, modifier, disabled, parameters.widgetBlock.blockId, process) +} + +/******************************************************************************* + ** Record details and process widgets share the same capability-gated upload implementation. + *******************************************************************************/ +@Composable +internal fun RecordPhotoCapture( + host: com.kingsrook.qqq.frontend.android.mobileapp.viewmodel.QViewModel, + target: RecordPhotoTarget, api: RecordFilesApi, modifier: Modifier = Modifier, disabled: Boolean = false, + blockId: String = "record-photos", + process: com.kingsrook.qqq.frontend.android.mobileapp.viewmodel.ProcessViewModel? = null, + recordUi: RecordAttachmentUi? = null, +) { + val context = LocalContext.current + val application = context.applicationContext + val session = host.sessionUUID + val processId = if (process == null) "record" else process.processUUID ?: return + val processOwner = LocalViewModelStoreOwner.current as? NavBackStackEntry + if (processOwner == null) { + Text("Photo capture requires a record or process navigation scope.", modifier.padding(16.dp)) + return + } + val key = "photo:$session:$processId:$blockId:${target.tableName.length}:${target.tableName}:${target.recordId}" + val factory = remember(key, api) + { + object : ViewModelProvider.Factory { + /******************************************************************************* + ** Construct upload state for the captured record/session rather than sharing it across unrelated widgets. + *******************************************************************************/ + override fun <T : ViewModel> create(modelClass: Class<T>): T { + @Suppress("UNCHECKED_CAST") + return PhotoUploadViewModel(api, session, target, File(application.cacheDir, "record-photos")) { + host.sessionUUID == session && host.isAuthenticated && !host.isLogoutRequested && host.activeProcessViewModel === process + && processOwner.lifecycle.currentState.isAtLeast(Lifecycle.State.CREATED) + } as T + } + } + } + val upload: PhotoUploadViewModel = viewModel(viewModelStoreOwner = processOwner, key = key, factory = factory) + val owner = LocalLifecycleOwner.current + fun setWork(message: String?) { + if (process != null) process.setClientWork(key, message) else host.qNavigator.recordWorkBlock = message + } + SideEffect { + setWork(if (upload.pending || upload.busy) "Finish, retry/check, or discard the pending photo before leaving or continuing." else null) + } + DisposableEffect(owner, upload) + { + val observer = LifecycleEventObserver { _, event -> if (event == Lifecycle.Event.ON_STOP) upload.pause() } + owner.lifecycle.addObserver(observer) + onDispose { + owner.lifecycle.removeObserver(observer) + upload.pause() + // A disposed configuration must not clear the retained upload's navigation guard. + // Authentication teardown clears record work separately in the host. + if (!upload.pending) setWork(null) + } + } + val camera = rememberLauncherForActivityResult(ActivityResultContracts.TakePicture()) { success -> upload.cameraResult(success) } + val gallery = rememberLauncherForActivityResult(ActivityResultContracts.PickVisualMedia()) { uri -> + if (uri != null) { + val media = runCatching { application.contentResolver.getType(uri) }.getOrNull().orEmpty() + upload.galleryResult(media) { application.contentResolver.openInputStream(uri) } + } + } + SideEffect { recordUi?.available?.invoke(upload.limits != null) } + if (recordUi?.photosVisible == true) SavedRecordPhotos(host, target, api, upload.saved) + val controls: @Composable () -> Unit = { + Column((if (recordUi == null) modifier else modifier.verticalScroll(rememberScrollState())).padding(16.dp), verticalArrangement = Arrangement.spacedBy(8.dp)) + { + if (recordUi == null) Text(target.title ?: "Record photos", style = MaterialTheme.typography.titleMedium) + if (recordUi != null) Text(recordUi.recordLabel, style = MaterialTheme.typography.labelLarge) + target.instructions?.let { Text(it) } + when { + upload.checking -> Text("Checking photo permissions…") + upload.limits == null -> { + Text("Photo upload is not available for this record.") + TextButton(onClick = upload::checkCapabilities, enabled = !disabled && !upload.busy) { Text("Check photo availability") } + } + + else -> { + val available = !disabled && !upload.busy && !upload.pending + if ("image/jpeg" in upload.limits!!.mediaTypes) + Button(enabled = available, onClick = { + val file = upload.prepareCamera() + setWork("Return from the camera and finish or discard the photo before leaving.") + val uri = FileProvider.getUriForFile(context, context.packageName + ".photos", file) + try { + camera.launch(uri) + } catch (exception: Exception) { + upload.cameraResult(false) + } + }) { Text("Take photo") } + if (upload.limits!!.mediaTypes.any { it.startsWith("image/") }) + Button(enabled = available, onClick = { gallery.launch(PickVisualMediaRequest(ActivityResultContracts.PickVisualMedia.ImageOnly)) }) { Text("Choose photo") } + if (upload.intent != null && !upload.saved) { + Button(enabled = !disabled && !upload.busy, onClick = upload::upload) { Text(if (upload.hasAttemptedUpload) "Retry/check upload" else "Upload photo") } + TextButton(enabled = !disabled && !upload.busy, onClick = upload::discard) { Text("Discard photo") } + } + } + } + if (upload.busy) Text("Working on photo…") + if (upload.message.isNotBlank()) Text(upload.message) + if (upload.pending) Text("This app uploads while open and connected. Keep this screen open until the server confirms the photo.") + } + } + if (recordUi == null) controls() + else if (recordUi.captureVisible) AlertDialog( + onDismissRequest = { if (!upload.pending && !upload.busy) recordUi.closeCapture() }, + title = { Text("Add photo") }, text = controls, + confirmButton = { TextButton(enabled = !upload.pending && !upload.busy, onClick = recordUi.closeCapture) { Text("Done") } } + ) +} diff --git a/scanner-host/src/main/java/io/qrun/mobile/scanner/SavedRecordPhotos.kt b/scanner-host/src/main/java/io/qrun/mobile/scanner/SavedRecordPhotos.kt new file mode 100644 index 0000000..7faa651 --- /dev/null +++ b/scanner-host/src/main/java/io/qrun/mobile/scanner/SavedRecordPhotos.kt @@ -0,0 +1,138 @@ +/* Copyright (c) 2026 QRunIO. SPDX-License-Identifier: Apache-2.0 */ +package io.qrun.mobile.scanner + +import android.graphics.Bitmap +import android.graphics.BitmapFactory +import androidx.compose.foundation.Image +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items +import androidx.compose.material3.AlertDialog +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.material3.TextButton +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.saveable.rememberSaveable +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.asImageBitmap +import androidx.compose.ui.layout.ContentScale +import androidx.compose.ui.platform.testTag +import androidx.compose.ui.text.style.TextOverflow +import androidx.compose.ui.unit.dp +import com.kingsrook.qqq.frontend.android.core.model.RecordData +import com.kingsrook.qqq.frontend.android.core.model.RecordSearch +import com.kingsrook.qqq.frontend.android.mobileapp.viewmodel.QViewModel +import kotlinx.coroutines.CancellationException +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.sync.Semaphore +import kotlinx.coroutines.sync.withPermit +import kotlinx.coroutines.withContext +import kotlinx.serialization.json.JsonPrimitive + +/** Only retained file identity and public display metadata reach the gallery. */ +internal data class SavedRecordPhoto(val id: String, val name: String, val mediaType: String, val size: Long, val sha256: String, val lifecycle: String) { + companion object { + fun parse(row: RecordData, target: RecordPhotoTarget): SavedRecordPhoto { + require(row.id("tableName") == target.tableName && row.id("recordId") == target.recordId) + return SavedRecordPhoto(requireNotNull(row.id("id")), row.display("fileName"), row.id("mediaType").orEmpty(), + requireNotNull(row.id("sizeBytes")).toLong(), row.id("sha256").orEmpty(), row.id("lifecycle").orEmpty()) + } + } +} + +/** Parent-scoped metadata is visible even while the original awaits review. */ +@Composable +internal fun SavedRecordPhotos(host: QViewModel, target: RecordPhotoTarget, api: RecordFilesApi, saved: Boolean) { + var offset by rememberSaveable(target.tableName, target.recordId, host.sessionUUID) { mutableStateOf(0) } + var refresh by remember { mutableStateOf(0) } + var rows by remember { mutableStateOf<List<SavedRecordPhoto>>(emptyList()) } + var hasNext by remember { mutableStateOf(false) } + var loading by remember { mutableStateOf(true) } + var failed by remember { mutableStateOf(false) } + var preview by remember { mutableStateOf<SavedRecordPhoto?>(null) } + val admission = remember { Semaphore(1) } + LaunchedEffect(target, host.sessionUUID, offset, refresh, saved) { + loading = true; failed = false + try { + val predicate = RecordSearch("image/", listOf("mediaType"), mapOf("tableName" to JsonPrimitive(target.tableName), "recordId" to JsonPrimitive(target.recordId))) + // Record Files intentionally denies aggregate counts. One look-ahead row keeps paging bounded. + val page = host.qqqRepository.searchRecords("record_files_file", "id", predicate, offset, 11).map { SavedRecordPhoto.parse(it, target) } + hasNext = page.size > 10 + rows = page.take(10) + } catch (cancelled: CancellationException) { throw cancelled } + catch (exception: Exception) { failed = true; rows = emptyList() } + finally { loading = false } + } + Column(Modifier.fillMaxSize().padding(horizontal = 16.dp).testTag("record.photos")) { + Row(verticalAlignment = Alignment.CenterVertically, modifier = Modifier.fillMaxWidth()) { + Text(if (loading) "Loading photos…" else if (failed) "Photos unavailable" else "${offset + rows.size}${if (hasNext) "+" else ""} photos", Modifier.weight(1f), style = MaterialTheme.typography.titleMedium) + TextButton(onClick = { refresh++ }) { Text("Refresh photos") } + } + if (failed) Text("Photos could not be loaded. Check your connection and access, then refresh.") + if (!failed && !loading && rows.isEmpty()) Text("No photos attached. Use Actions → Add photo.") + LazyColumn(Modifier.weight(1f).testTag("record.photos.list"), verticalArrangement = Arrangement.spacedBy(12.dp)) { + items(rows, key = { it.id }) { file -> + Row(Modifier.testTag("record.photo:${file.id}"), verticalAlignment = Alignment.CenterVertically) { + if (file.lifecycle == "AVAILABLE") PhotoImage(api, host.sessionUUID, file, admission, 256, Modifier.size(72.dp)) + else Text("Photo", Modifier.size(72.dp).padding(8.dp), style = MaterialTheme.typography.labelMedium) + Column(Modifier.weight(1f).padding(start = 8.dp)) { + Text(file.name, maxLines = 2, overflow = TextOverflow.Ellipsis, style = MaterialTheme.typography.bodyMedium) + Text(if (file.lifecycle == "QUARANTINED") "Awaiting review" else if (file.lifecycle == "AVAILABLE") "Available" else "Unavailable", style = MaterialTheme.typography.labelMedium) + if (file.lifecycle == "AVAILABLE") TextButton(onClick = { preview = file }) { Text("Preview photo") } + } + } + } + } + Row(Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.SpaceBetween) { + TextButton(enabled = !loading && offset > 0, onClick = { offset = (offset - 10).coerceAtLeast(0) }) { Text("Previous photos") } + TextButton(enabled = !loading && !failed && hasNext, onClick = { offset += 10 }) { Text("Next photos") } + } + } + preview?.let { file -> + AlertDialog(onDismissRequest = { preview = null }, title = { Text("Photo preview") }, text = { + Column { Text(file.name); PhotoImage(api, host.sessionUUID, file, admission, 1600, Modifier.fillMaxWidth()) } + }, confirmButton = { TextButton(onClick = { preview = null }) { Text("Close preview") } }) + } +} + +/** Decode a bounded bitmap in memory, without an image-loader disk cache or external URL. */ +@Composable +private fun PhotoImage(api: RecordFilesApi, session: String, file: SavedRecordPhoto, admission: Semaphore, edge: Int, modifier: Modifier) { + var bitmap by remember(session, file, edge) { mutableStateOf<Bitmap?>(null) } + var failed by remember(session, file) { mutableStateOf(false) } + var retry by remember { mutableStateOf(0) } + LaunchedEffect(session, file, edge, retry) { + failed = false + try { + bitmap = admission.withPermit { + val bytes = api.image(session, file) + withContext(Dispatchers.Default) { + val options = BitmapFactory.Options().apply { inJustDecodeBounds = true } + BitmapFactory.decodeByteArray(bytes, 0, bytes.size, options) + require(options.outWidth in 1..100000 && options.outHeight in 1..100000) + options.inSampleSize = 1 + while (maxOf(options.outWidth, options.outHeight) / options.inSampleSize > edge) options.inSampleSize *= 2 + options.inJustDecodeBounds = false + requireNotNull(BitmapFactory.decodeByteArray(bytes, 0, bytes.size, options)) + } + } + } catch (cancelled: CancellationException) { throw cancelled } + catch (exception: Exception) { failed = true } + } + val image = bitmap + if (image != null) Image(image.asImageBitmap(), "Attached photo", modifier.testTag("photo.image:$edge"), contentScale = ContentScale.Fit) + else if (failed) TextButton(onClick = { retry++ }, modifier = modifier) { Text("Retry image") } + else Text("Loading image…", modifier, style = MaterialTheme.typography.labelSmall) +} diff --git a/scanner-host/src/main/java/io/qrun/mobile/scanner/ScanEvent.kt b/scanner-host/src/main/java/io/qrun/mobile/scanner/ScanEvent.kt new file mode 100644 index 0000000..96d65d4 --- /dev/null +++ b/scanner-host/src/main/java/io/qrun/mobile/scanner/ScanEvent.kt @@ -0,0 +1,42 @@ +/* Copyright (c) 2026 QRunIO. SPDX-License-Identifier: Apache-2.0 */ +package io.qrun.mobile.scanner + +import java.time.Instant +import java.util.UUID + +/******************************************************************************* + ** One physical scan remains one event even when its HTTP request is retried. + *******************************************************************************/ +internal data class ScanEvent( + val capture: ScannerCapture, + val scanSource: String, + val eventId: String = UUID.randomUUID().toString(), + val capturedAt: String = Instant.now().toString() +) { + constructor(barcode: String, symbology: String, scanSource: String) : + this(ScannerCapture.of(barcode, symbology), scanSource) + + val barcode: String get() = capture.barcode + val symbology: String get() = capture.symbology + + /******************************************************************************* + ** A fixed schema prevents arbitrary intent extras becoming process inputs. The optional fidelity + ** keys are added only for servers verified to accept them; absent values are omitted, never blank. + *******************************************************************************/ + fun values(includeFidelity: Boolean = false): Map<String, Any> { + val values = linkedMapOf<String, Any>( + "barcode" to barcode, "symbology" to symbology, "scanSource" to scanSource, + "eventId" to eventId, "capturedAt" to capturedAt + ) + if (includeFidelity) { + capture.aimIdentifier?.let { values["aimIdentifier"] = it } + capture.rawDataBase64?.let { values["rawDataBase64"] = it } + } + return values + } + + /******************************************************************************* + ** Scan content must not appear in logs; the event identity is an opaque correlation value. + *******************************************************************************/ + override fun toString(): String = "ScanEvent(redacted, source=$scanSource, eventId=$eventId)" +} diff --git a/scanner-host/src/main/java/io/qrun/mobile/scanner/ScanFidelityCapability.kt b/scanner-host/src/main/java/io/qrun/mobile/scanner/ScanFidelityCapability.kt new file mode 100644 index 0000000..c7ebedd --- /dev/null +++ b/scanner-host/src/main/java/io/qrun/mobile/scanner/ScanFidelityCapability.kt @@ -0,0 +1,28 @@ +/* Copyright (c) 2026 QRunIO. SPDX-License-Identifier: Apache-2.0 */ +package io.qrun.mobile.scanner + +import com.kingsrook.qqq.frontend.android.core.controllers.UiApiVersion + +/******************************************************************************* + ** The optional aimIdentifier/rawDataBase64 inputs exist from mobile-scanners 1.5.0; older servers + ** must receive exactly the legacy keys. Derived only from already-verified discovery data. + *******************************************************************************/ +internal object ScanFidelityCapability { + private val VERSION = Regex("(0|[1-9][0-9]*)\\.(0|[1-9][0-9]*)\\.(0|[1-9][0-9]*)") + + /******************************************************************************* + ** Require the single registered mobile-scanners extension at its fixed path with version >=1.5.0,<2. + *******************************************************************************/ + fun supports(version: UiApiVersion?): Boolean { + val extension = version?.extensions?.singleOrNull { it.name == "mobile-scanners" } ?: return false + if (extension.pathPrefix != "/qbit/mobile-scanners") return false + val parts = VERSION.matchEntire(extension.version)?.groupValues ?: return false + return parts[1] == "1" && (parts[2].toIntOrNull() ?: return false) >= 5 && parts[3].toIntOrNull() != null + } + + /******************************************************************************* + ** Discovery data from another server never grants capability to this server's widgets. + *******************************************************************************/ + fun available(server: String, discoveredServer: String, version: UiApiVersion?): Boolean = + server == discoveredServer && supports(version) +} diff --git a/scanner-host/src/main/java/io/qrun/mobile/scanner/ScannerActivity.kt b/scanner-host/src/main/java/io/qrun/mobile/scanner/ScannerActivity.kt new file mode 100644 index 0000000..5b55917 --- /dev/null +++ b/scanner-host/src/main/java/io/qrun/mobile/scanner/ScannerActivity.kt @@ -0,0 +1,449 @@ +/* Copyright (c) 2026 QRunIO. SPDX-License-Identifier: Apache-2.0 */ +package io.qrun.mobile.scanner + +import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent +import android.content.IntentFilter +import android.os.Build +import android.os.Bundle +import android.graphics.Rect +import androidx.core.content.ContextCompat +import androidx.activity.ComponentActivity +import androidx.activity.compose.setContent +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.WindowInsets +import androidx.compose.foundation.layout.safeDrawing +import androidx.compose.foundation.layout.windowInsetsPadding +import androidx.compose.foundation.layout.imePadding +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.verticalScroll +import androidx.compose.material3.Button +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.OutlinedTextField +import androidx.compose.material3.Surface +import androidx.compose.material3.Text +import androidx.compose.material3.TextButton +import androidx.compose.runtime.Composable +import androidx.compose.runtime.CompositionLocalProvider +import com.kingsrook.qqq.frontend.android.mobileapp.ui.authentication.LocalCompanySignOutEnabled +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.key +import androidx.compose.runtime.SideEffect +import androidx.compose.runtime.withFrameNanos +import androidx.compose.runtime.DisposableEffect +import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.mutableIntStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Modifier +import androidx.compose.ui.layout.boundsInWindow +import androidx.compose.ui.layout.onGloballyPositioned +import androidx.compose.ui.unit.dp +import androidx.datastore.preferences.core.PreferenceDataStoreFactory +import androidx.datastore.core.DataStore +import androidx.datastore.preferences.core.Preferences +import androidx.lifecycle.ViewModel +import androidx.lifecycle.ViewModelProvider +import androidx.lifecycle.viewmodel.compose.viewModel +import androidx.navigation.compose.rememberNavController +import com.kingsrook.qqq.frontend.android.core.controllers.UiApiCompatibility +import com.kingsrook.qqq.frontend.android.core.controllers.NetworkQQQRepository +import com.kingsrook.qqq.frontend.android.core.model.Environment +import com.kingsrook.qqq.frontend.android.core.model.metadata.authentication.TableBasedAuthenticationMetaData +import com.kingsrook.qqq.frontend.android.core.model.metadata.authentication.OAuth2AuthenticationMetaData +import com.kingsrook.qqq.frontend.android.mobileapp.QMobileAppMain +import com.kingsrook.qqq.frontend.android.mobileapp.container.QAppContainer +import com.kingsrook.qqq.frontend.android.mobileapp.ui.LocalAuthenticatedContent +import com.kingsrook.qqq.frontend.android.mobileapp.ui.LocalCustomWidgetRenderer +import com.kingsrook.qqq.frontend.android.mobileapp.ui.horseshoe.LocalDeviceSettings +import com.kingsrook.qqq.frontend.android.mobileapp.ui.horseshoe.LocalBusinessNavigationEnabled +import com.kingsrook.qqq.frontend.android.mobileapp.viewmodel.QViewModel +import com.kingsrook.qqq.frontend.android.mobileapp.viewmodel.LoadState +import java.io.File +import java.net.URI +import java.security.MessageDigest +import kotlinx.coroutines.CancellationException +import kotlinx.coroutines.launch + +/******************************************************************************* + ** Deployable generic host: select a server, authenticate, enroll, then run its QQQ mobile apps. + *******************************************************************************/ +class ScannerActivity : ComponentActivity() { + private var resumed by mutableStateOf(false) + private var focused by mutableStateOf(false) + private var captureBounds by mutableStateOf<Rect?>(null) + private val windowFocusObserver = android.view.ViewTreeObserver.OnWindowFocusChangeListener { focused = it } + private var managed by mutableStateOf(ManagedValues()) + private var watchingManagedConfiguration = false + private val restrictionsReceiver = object : BroadcastReceiver() { + /******************************************************************************* + ** Reread administrator restrictions when the system reports a change while this host is visible. + *******************************************************************************/ + override fun onReceive(context: Context, intent: Intent) = refreshManagedConfiguration() + } + + /******************************************************************************* + ** Mark the host resumed so visible scanner ownership and foreground telemetry can be reevaluated. + *******************************************************************************/ + override fun onResume() { + super.onResume() + resumed = true + window.decorView.post { if (resumed) focused = window.decorView.hasWindowFocus() } + startWatchingManagedConfiguration() + } + + /******************************************************************************* + ** Withdraw foreground eligibility before Android pauses the activity and scanner input. + *******************************************************************************/ + override fun onPause() { + resumed = false; stopWatchingManagedConfiguration(); super.onPause() + } + + /******************************************************************************* + ** Reread managed values (also covers changes missed while paused) and apply a changed orientation default. + *******************************************************************************/ + private fun refreshManagedConfiguration() { + managed = readManagedValues(this) + val preferences = getSharedPreferences("host", MODE_PRIVATE) + val target = ManagedConfiguration.orientationToApply(managed.orientation, preferences.getString("managed_orientation_applied", null)) ?: return + preferences.edit().putString("managed_orientation_applied", target.name).apply() + target.select(this) + } + + /******************************************************************************* + ** Observe restriction changes only while the host is resumed; the system broadcast is not exported to other apps. + *******************************************************************************/ + private fun startWatchingManagedConfiguration() { + refreshManagedConfiguration() + if (watchingManagedConfiguration) return + ContextCompat.registerReceiver(this, restrictionsReceiver, IntentFilter(Intent.ACTION_APPLICATION_RESTRICTIONS_CHANGED), ContextCompat.RECEIVER_NOT_EXPORTED) + watchingManagedConfiguration = true + } + + /******************************************************************************* + ** Stop observing before the activity leaves the foreground. + *******************************************************************************/ + private fun stopWatchingManagedConfiguration() { + if (!watchingManagedConfiguration) return + unregisterReceiver(restrictionsReceiver) + watchingManagedConfiguration = false + } + + /******************************************************************************* + ** Reflect focus changes so obscured windows cannot keep accepting scanner input. + *******************************************************************************/ + override fun onWindowFocusChanged(hasFocus: Boolean) { + super.onWindowFocusChanged(hasFocus); focused = hasFocus + } + + /******************************************************************************* + ** Detach window focus observation before Android destroys the activity; composed host disposal owns session cleanup. + *******************************************************************************/ + override fun onDestroy() { + val observer = window.decorView.viewTreeObserver + if (observer.isAlive) observer.removeOnWindowFocusChangeListener(windowFocusObserver) + super.onDestroy() + } + + /******************************************************************************* + ** Retain server-scoped client dependencies across activity recreation without sharing credentials between servers. + *******************************************************************************/ + companion object { + private val credentialsByServer = mutableMapOf<String, DeviceCredentials>() + private val storesByServer = mutableMapOf<String, DataStore<Preferences>>() + } + + /******************************************************************************* + ** Restore local host policy and compose the existing QQQ client around enrollment and scanner controls. + *******************************************************************************/ + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + window.decorView.viewTreeObserver.addOnWindowFocusChangeListener(windowFocusObserver) + refreshManagedConfiguration() + OrientationPolicy.read(this).apply(this) + val preferences = getSharedPreferences("host", MODE_PRIVATE) + setContent() + { + MaterialTheme() + { + Surface(Modifier.windowInsetsPadding(WindowInsets.safeDrawing).onGloballyPositioned { coordinates -> + val bounds = coordinates.boundsInWindow() + captureBounds = Rect(bounds.left.toInt(), bounds.top.toInt(), bounds.right.toInt(), bounds.bottom.toInt()) + }) + { + var server by remember { mutableStateOf(preferences.getString("server", null)) } + val currentServer = server + if (currentServer == null) { + ServerForm(managed.serverUrl) { value -> preferences.edit().putString("server", value).apply(); server = value } + } else { + key(currentServer) + { + val scope = rememberCoroutineScope() + var beforeChange by remember { mutableStateOf<suspend () -> Unit>({}) } + var changing by remember { mutableStateOf(false) } + HostChrome(currentServer, onChangeServer = { + if (!changing) scope.launch { + changing = true + beforeChange() + preferences.edit().remove("server").apply() + server = null + } + }) + { brand, diagnostics, compatibility, changeServer -> ScannerHost(currentServer, brand, diagnostics, compatibility, changeServer) { beforeChange = it } } + } + } + } + } + } + } + + /******************************************************************************* + ** Server-scoped stores ensure switching installations cannot reuse a credential accidentally. + *******************************************************************************/ + @Composable + private fun ScannerHost( + server: String, brand: HostBrand, diagnostics: DiagnosticLog, compatibility: UiApiCompatibility, changeServer: () -> Unit, + registerBeforeChange: (suspend () -> Unit) -> Unit + ) { + val credentialsResult = remember(server) { runCatching { credentialsByServer.getOrPut(server) { DeviceCredentials(applicationContext, server) } } } + val credentials = credentialsResult.getOrNull() + if (credentials == null) { + Text("Device credentials could not be opened. Ask your administrator to reset this installation.", Modifier.padding(24.dp)) + return + } + val factory = remember(server) + { + QAppContainer.availableEnvironments = listOf(Environment("QQQ server", server)) + QViewModel.applicationName = "qqq-mobile-scanners" + QViewModel.applicationVersion = BuildConfig.VERSION_NAME + object : ViewModelProvider.Factory { + /******************************************************************************* + ** Capture this server's repository and preference store in its ViewModel instead of reusing another host's state. + *******************************************************************************/ + override fun <T : ViewModel> create(modelClass: Class<T>): T { + val hash = MessageDigest.getInstance("SHA-256").digest(server.toByteArray()).joinToString("") { "%02x".format(it) } + val dataStore = storesByServer.getOrPut(server) { PreferenceDataStoreFactory.create { File(noBackupFilesDir, "session-$hash.preferences_pb") } } + val repository = NetworkQQQRepository(server, requestObserver = diagnostics::nativeRequest, compatibility = compatibility) { requestedServer -> + if (requestedServer == server) credentials.headers() else emptyMap() + } + @Suppress("UNCHECKED_CAST") + return QViewModel(repository, dataStore).apply { supportedCustomWidgetTypes = setOf("SCANNER", "RECORD_FILES_CAPTURE") } as T + } + } + } + val qViewModel: QViewModel = viewModel(key = server, factory = factory) + // A retained per-server ViewModel must write into this visit's fresh diagnostics log. + SideEffect { + (qViewModel.qqqRepository as NetworkQQQRepository).requestObserver = diagnostics::nativeRequest + qViewModel.changeServerAction = changeServer + } + qViewModel.setNavController(rememberNavController()) + val authentication = qViewModel.authenticationMetaDataLoadState + if (authentication is LoadState.Success && authentication.value !is TableBasedAuthenticationMetaData && authentication.value !is OAuth2AuthenticationMetaData) { + Text("This app supports QQQ password sign-in and server-advertised OAuth2 browser sign-in. This server uses an unsupported provider.", Modifier.padding(24.dp)) + return + } + val api = remember(server, diagnostics) { DeviceApi(server, credentials, diagnostics::deviceRequest, compatibility) } + val recordFiles = remember(server, diagnostics) { RecordFilesApi(server, credentials::headers, compatibility, diagnostics::nativeRequest) } + var approved by remember(qViewModel.sessionUUID) { mutableStateOf(false) } + val location = rememberForegroundLocation(resumed && approved && qViewModel.isAuthenticated && !qViewModel.isLogoutRequested) + val currentScreen = sessionScreen(qViewModel, resumed, focused, approved, captureBounds != null) + var renderedScreen by remember(qViewModel.sessionUUID) { mutableStateOf<SessionScreen?>(null) } + LaunchedEffect(currentScreen) + { + // Metadata may change before Compose replaces the previous screen's pixels. + withFrameNanos { } + withFrameNanos { } + renderedScreen = currentScreen + } + // Display-only wallpaper status: approved name and sign-in state, never the session id. Cleared when this host leaves composition. + val signedIn = approved && qViewModel.isAuthenticated && !qViewModel.isLogoutRequested + val serverHost = remember(server) { runCatching { URI(server).host }.getOrNull() } + LaunchedEffect(signedIn, resumed, qViewModel.sessionUserFullName, brand) + { + WallpaperStatus.store.setBrand(brand.displayName, brand.primaryColor) + if (signedIn) WallpaperStatus.store.signedIn(qViewModel.sessionUserFullName, serverHost, resumed) + else WallpaperStatus.store.signedOutIfSignedIn() + } + DisposableEffect(server) { onDispose { WallpaperStatus.store.clear() } } + val sessionApi = remember(server, diagnostics) { MobileSessionApi(server, credentials::headers, compatibility, diagnostics::sessionRequest) } + val deviceSharing = remember(server, qViewModel.sessionUUID) { DeviceScreenSharing(applicationContext) } + val sessions = remember(sessionApi, qViewModel.sessionUUID) + { + val monitoredSession = qViewModel.sessionUUID + MobileSessionController( + qViewModel.sessionUUID, sessionApi, + readScreen = { + val screen = sessionScreen(qViewModel, resumed, focused, approved, captureBounds != null) + if (deviceSharing.active) screen.copy(ready = true, captureMode = CaptureMode.DEVICE_SCREEN, location = location.report) + else screen.copy(ready = screen.ready && screen == renderedScreen, location = location.report) + }, + capture = { lease -> + if (lease.captureMode == CaptureMode.DEVICE_SCREEN) deviceSharing.frame(lease) + else captureBounds?.let { captureAppScreen(window, it, lease) } + }, + onUnauthorized = { + runOnUiThread { + if (qViewModel.sessionUUID == monitoredSession) qViewModel.requestLogout() + } + }, onDeviceViewingStopped = deviceSharing::stop, onDeviceLease = deviceSharing::boundLease + ) + } + DisposableEffect(sessions) + { + qViewModel.beforeLogout = { deviceSharing.stop(); sessions.end("SIGN_OUT") } + registerBeforeChange { sessions.end("SERVER_CHANGE"); qViewModel.logOut().join() } + onDispose { deviceSharing.stop(); sessions.invalidate() } + } + SideEffect { + deviceSharing.onSystemStop = sessions::pauseViewing + deviceSharing.onStarted = sessions::allowViewing + } + LaunchedEffect(sessions, approved, qViewModel.isAuthenticated, qViewModel.isLogoutRequested) + { + if (approved && qViewModel.isAuthenticated && !qViewModel.isLogoutRequested) sessions.run() + } + CompositionLocalProvider( + LocalCompanySignOutEnabled provides true, + LocalBusinessNavigationEnabled provides approved, + LocalDeviceSettings provides { + OrientationSetting(this@ScannerActivity) + WallpaperSetting(this@ScannerActivity) + ManagedServerNotice(server, managed.serverUrl) { + qViewModel.qNavigator.requestLeave("Change server and sign out?", "Change server", alwaysConfirm = true) { qViewModel.changeServerAction?.invoke() } + } + DeviceScreenSharingControl(deviceSharing, sessions) { + approved && qViewModel.isAuthenticated && !qViewModel.isLogoutRequested + } + if (api.shortName.isNotBlank()) Text("Device: ${api.shortName}") + if (api.displayName.isNotBlank()) Text("Name: ${api.displayName}") + Text("Device permissions", style = MaterialTheme.typography.titleSmall) + LocationPermissionControl(location) + AboutButton() + TextButton(onClick = { + qViewModel.qNavigator.requestLeave("Change server and sign out?", "Change server", alwaysConfirm = true) { qViewModel.changeServerAction?.invoke() } + }) { Text("Change server") } + }, + LocalAuthenticatedContent provides { model, content -> + DeviceGate(model, api, credentials, { approved = it }) { + Column { + ScreenViewingIndicator(sessions) + content() + } + } + }, + com.kingsrook.qqq.frontend.android.mobileapp.ui.records.LocalRecordAttachments provides { model, tableName, recordId, recordUi -> + RecordPhotoCapture(model, RecordPhotoTarget(tableName, recordId, "Record photos", null), recordFiles, recordUi = recordUi, + disabled = !com.kingsrook.qqq.frontend.android.mobileapp.ui.LocalProcessInputAllowed.current()) + }, + LocalCustomWidgetRenderer provides { parameters, modifier, disabled -> + if (parameters.widgetBlock.blockType == "SCANNER") { + ScannerWidget( + parameters, modifier, disabled, + fidelityAvailable = { ScanFidelityCapability.available(server, compatibility.server, compatibility.verifiedVersion()) } + ) + true + } else if (parameters.widgetBlock.blockType == "RECORD_FILES_CAPTURE") { + RecordPhotoWidget(parameters, recordFiles, modifier, disabled) + true + } else false + } + ) + { + // HostChrome checks the actual server; an INTERNET network is not required for local USB forwarding. + QMobileAppMain(qViewModel, title = brand.displayName, splashImage = null, showNetworkDialog = false) + } + } +} + +/******************************************************************************* + ** URLs are origins only; release builds require HTTPS. + *******************************************************************************/ +internal fun normalizeServerUrl(input: String, allowHttp: Boolean): String { + val uri = URI(input.trim()) + require(uri.scheme == "https" || (allowHttp && uri.scheme == "http")) { "Use an HTTPS server URL." } + require(uri.host != null && uri.userInfo == null && uri.query == null && uri.fragment == null) { "Use a server URL without credentials, query, or fragment." } + require(uri.path.isNullOrEmpty() || uri.path == "/") { "Use the server origin without a path." } + return URI(uri.scheme.lowercase(), null, uri.host.lowercase(), uri.port, "/", null, null).toASCIIString() +} + +/******************************************************************************* + ** Initial server configuration is editable until the host connects. + *******************************************************************************/ +@Composable +private fun ServerForm(managedUrl: String?, onConnect: (String) -> Unit) { + var url by remember(managedUrl) { mutableStateOf(managedUrl ?: if (BuildConfig.DEBUG) "http://127.0.0.1:8080/" else "https://") } + var error by remember { mutableStateOf("") } + Column(Modifier.imePadding().verticalScroll(rememberScrollState()).padding(24.dp), verticalArrangement = Arrangement.spacedBy(16.dp)) + { + Text("Connect QQQ Mobile", style = MaterialTheme.typography.headlineMedium) + if (managedUrl != null) Text("Your administrator configured this server. Review it, then connect.") + OutlinedTextField(url, { url = it }, label = { Text("QQQ server URL") }, singleLine = true) + Button(onClick = { + try { + onConnect(normalizeServerUrl(url, BuildConfig.DEBUG)) + } catch (exception: Exception) { + error = exception.message ?: "Invalid server URL" + } + }) { Text("Connect") } + if (error.isNotBlank()) Text(error) + if (BuildConfig.DEBUG) Text("Development build: HTTP is allowed for the local demo. The default URL uses USB port forwarding; see the TC22 setup guide.") + } +} + +/******************************************************************************* + ** Pending, revoked, or unavailable devices cannot expose application screens. + *******************************************************************************/ +@Composable +private fun DeviceGate( + viewModel: QViewModel, api: DeviceApi, credentials: DeviceCredentials, onApproval: (Boolean) -> Unit, + content: @Composable () -> Unit +) { + var attempt by remember { mutableIntStateOf(0) } + var status by remember(viewModel.sessionUUID) { mutableStateOf("CHECKING") } + var error by remember { mutableStateOf("") } + var enrollmentConflict by remember { mutableStateOf(false) } + LaunchedEffect(viewModel.sessionUUID, attempt) + { + status = "CHECKING" + onApproval(false) + error = "" + enrollmentConflict = false + try { + status = api.status(viewModel.sessionUUID, "${Build.MANUFACTURER} ${Build.MODEL}") + onApproval(status == "APPROVED") + if (status == "APPROVED") viewModel.loadQInstance() + } catch (exception: CancellationException) { + throw exception + } catch (exception: EnrollmentConflict) { + status = "ERROR"; error = exception.message ?: "Registration conflict"; enrollmentConflict = true + } catch (exception: Exception) { + status = "ERROR"; error = exception.message ?: "Device check failed." + } + } + if (status == "APPROVED") content() + else Column(Modifier.verticalScroll(rememberScrollState()).padding(24.dp), verticalArrangement = Arrangement.spacedBy(16.dp)) + { + Text("Device approval", style = MaterialTheme.typography.headlineMedium) + Text( + when (status) { + "CHECKING" -> "Checking device registration…" + "PENDING" -> "An administrator must approve this device before you can run mobile apps." + "REVOKED" -> "This device has been revoked. Contact your administrator." + else -> error.ifBlank { "Device status: $status" } + }) + if (credentials.deviceId.isNotBlank()) Text("Device ID: ${credentials.deviceId}") + if (api.shortName.isNotBlank()) Text("Device: ${api.shortName}") + if (api.displayName.isNotBlank()) Text("Name: ${api.displayName}") + Text("Your administrator can edit this device’s name, short name and description in QQQ before approval.") + Button(enabled = status != "CHECKING", onClick = { attempt++ }) { Text("Check approval") } + if (enrollmentConflict) Button(onClick = { credentials.restartPendingEnrollment(); attempt++ }) { Text("Start new registration") } + Button(onClick = { viewModel.qNavigator.requestSignOut() }) { Text("Sign out") } + } +} diff --git a/scanner-host/src/main/java/io/qrun/mobile/scanner/ScannerCapture.kt b/scanner-host/src/main/java/io/qrun/mobile/scanner/ScannerCapture.kt new file mode 100644 index 0000000..92991b5 --- /dev/null +++ b/scanner-host/src/main/java/io/qrun/mobile/scanner/ScannerCapture.kt @@ -0,0 +1,46 @@ +/* Copyright (c) 2026 QRunIO. SPDX-License-Identifier: Apache-2.0 */ +package io.qrun.mobile.scanner + +import java.util.Base64 + +/******************************************************************************* + ** One immutable decoded read: the SDK's text and symbology, the SDK's raw bytes already encoded once as + ** canonical padded Base64, and an AIM identifier only when a qualified driver supplied it explicitly. + ** Raw bytes are exact SDK output (possibly with SDK framing), not a claim of complete symbol capture. + *******************************************************************************/ +internal data class ScannerCapture( + val barcode: String, val symbology: String, val rawDataBase64: String? = null, val aimIdentifier: String? = null +) { + init { + require(aimIdentifier == null || AIM.matches(aimIdentifier)) { "Invalid AIM identifier." } + } + + /******************************************************************************* + ** Scan content is business data and must not reach logs or crash reports. + *******************************************************************************/ + override fun toString(): String = "ScannerCapture(redacted, raw=${if (rawDataBase64 == null) "absent" else "present"}, aim=${if (aimIdentifier == null) "absent" else "present"})" + + /******************************************************************************* + ** Raw limits live here so every source builds captures under the same transport limits. + *******************************************************************************/ + companion object { + const val MAX_RAW_BYTES = 8192 + private val AIM = Regex("\\][A-Za-z][0-9A-Za-z]") + + /******************************************************************************* + ** Encode SDK bytes once; the caller's array is never retained. Null, empty or oversize raw data is + ** omitted rather than truncated, so an optional field is either exact SDK output or absent. + *******************************************************************************/ + fun of(barcode: String, symbology: String, rawData: ByteArray? = null, aimIdentifier: String? = null): ScannerCapture = + ScannerCapture( + barcode, symbology, + if (rawData == null || rawData.isEmpty() || rawData.size > MAX_RAW_BYTES) null else Base64.getEncoder().encodeToString(rawData), + aimIdentifier + ) + + /******************************************************************************* + ** Manual entry has no scanner evidence, so it carries neither raw bytes nor an AIM identifier. + *******************************************************************************/ + fun manual(barcode: String) = ScannerCapture(barcode, "MANUAL") + } +} diff --git a/scanner-host/src/main/java/io/qrun/mobile/scanner/ScannerFeedback.kt b/scanner-host/src/main/java/io/qrun/mobile/scanner/ScannerFeedback.kt new file mode 100644 index 0000000..79440b9 --- /dev/null +++ b/scanner-host/src/main/java/io/qrun/mobile/scanner/ScannerFeedback.kt @@ -0,0 +1,85 @@ +/* Copyright (c) 2026 QRunIO. SPDX-License-Identifier: Apache-2.0 */ +package io.qrun.mobile.scanner + +import com.kingsrook.qqq.frontend.android.mobileapp.viewmodel.ProcessAcknowledgment + +/******************************************************************************* + ** The most recent submitted read, kept in memory only so it stays visible while awaiting the next scan. + ** Manual entry has no symbology; it is never labelled with a guessed one. + *******************************************************************************/ +internal data class LastScan(val eventId: String, val barcode: String, val symbology: String?) { + /******************************************************************************* + ** Scan content is business data and must not reach logs or crash reports. + *******************************************************************************/ + override fun toString(): String = "LastScan(redacted, eventId=$eventId)" + + /******************************************************************************* + *******************************************************************************/ + companion object { + /******************************************************************************* + ** Manual submissions carry no scanner evidence, so their symbology is absent. + *******************************************************************************/ + fun of(event: ScanEvent) = LastScan(event.eventId, event.barcode, if (event.scanSource == "manual") null else event.symbology) + } +} + +/******************************************************************************* + ** What the read-only scan display shows: the exact value, its symbology, and where the request stands. + *******************************************************************************/ +internal data class ScanFeedback(val barcode: String, val symbology: String, val details: String, val status: String) { + /******************************************************************************* + ** Scan content is business data and must not reach logs or crash reports. + *******************************************************************************/ + override fun toString(): String = "ScanFeedback(redacted, status=$status)" +} + +/******************************************************************************* + ** Derives scan feedback from the process's own pending/acknowledgment state; it adds no state machine. + *******************************************************************************/ +internal object ScannerFeedback { + const val WAITING = "Waiting for scan" + const val STATE_KEY = "scanner.lastScan" + + /******************************************************************************* + ** The one receipt definition: submission and display must agree on what counts as confirmation. + *******************************************************************************/ + fun acknowledgment(eventId: String) = ProcessAcknowledgment( + "acknowledgedEventId", eventId, requiredValues = mapOf("scanSaved" to true), nonEmptyStringFields = setOf("scanId") + ) + const val MANUAL_SYMBOLOGY = "Not applicable (manual entry)" + + /******************************************************************************* + ** A pending request (including a retryable one) is authoritative because retries resend it unchanged; + ** otherwise the last submitted read stays visible, whether confirmed, rejected or cancelled. + *******************************************************************************/ + fun derive( + last: LastScan?, pendingValues: Map<String, Any?>?, responseValues: Map<String, Any?>, waiting: Boolean, cancelling: Boolean + ): ScanFeedback? { + val pendingId = pendingValues?.get("eventId") as? String + val pendingBarcode = pendingValues?.get("barcode") as? String + val shown = if (pendingId != null && pendingBarcode != null) + LastScan( + pendingId, pendingBarcode, + if (pendingValues["scanSource"] == "manual") null else pendingValues["symbology"] as? String + ) + else last + if (shown == null) return null + val status = when { + acknowledgment(shown.eventId).matches(responseValues) -> "Confirmed by server" + cancelling -> "Cancelling. Scan was not confirmed." + pendingId == shown.eventId && waiting -> "Sending scan…" + pendingId == shown.eventId -> "Not confirmed. Retry the same request or leave the process; do not assume it was saved." + else -> "Not confirmed. Follow the process message before submitting again." + } + return ScanFeedback(shown.barcode, shown.symbology ?: MANUAL_SYMBOLOGY, describe(shown.barcode), status) + } + + /******************************************************************************* + ** Control characters are invisible in a text field, so report them without altering the value. + *******************************************************************************/ + fun describe(barcode: String): String { + val controls = barcode.count { Character.isISOControl(it) } + val length = "${barcode.length} ${if (barcode.length == 1) "character" else "characters"}" + return if (controls == 0) length else "$length, $controls control ${if (controls == 1) "character" else "characters"}" + } +} diff --git a/scanner-host/src/main/java/io/qrun/mobile/scanner/ScannerInputSession.kt b/scanner-host/src/main/java/io/qrun/mobile/scanner/ScannerInputSession.kt new file mode 100644 index 0000000..ff4520d --- /dev/null +++ b/scanner-host/src/main/java/io/qrun/mobile/scanner/ScannerInputSession.kt @@ -0,0 +1,235 @@ +/* Copyright (c) 2026 QRunIO. SPDX-License-Identifier: Apache-2.0 */ +package io.qrun.mobile.scanner + +/******************************************************************************* + ** Device boundary; implementations deliver callbacks on the main thread. + *******************************************************************************/ +internal interface ScannerDriver { + /******************************************************************************* + ** Deliver scanner lifecycle outcomes on the main thread so widget ownership checks remain serialized. + *******************************************************************************/ + interface Listener { + /******************************************************************************* + ** Use hardware idle and pending-read state together before arming the current visible widget. + *******************************************************************************/ + fun idle() + + /******************************************************************************* + ** Preserve raw barcode data and reject callbacks after ownership, readiness or generation changes. + *******************************************************************************/ + fun scanned(capture: ScannerCapture) + + /******************************************************************************* + ** Distinguish ordinary empty reads from rejected multi-barcode reads without fabricating a scan. + *******************************************************************************/ + fun noData(multipleBarcodes: Boolean) + + /******************************************************************************* + ** Report hardware failure only for the active generation so stale callbacks cannot disable a replacement. + *******************************************************************************/ + fun failed() + } + + /******************************************************************************* + ** Acquire the device for this listener; implementations must not deliver callbacks from a released owner. + *******************************************************************************/ + fun open(listener: Listener) + + /******************************************************************************* + ** Expose the device's actual read state so an idle callback cannot arm a duplicate read. + *******************************************************************************/ + fun isReadPending(): Boolean + + /******************************************************************************* + ** Arm hardware capture only after the owning session has established readiness. + *******************************************************************************/ + fun read() + + /******************************************************************************* + ** Cancel any outstanding read before leaving the accepting state or releasing scanner ownership. + *******************************************************************************/ + fun cancelRead() + + /******************************************************************************* + ** Release callbacks and hardware ownership; failure must remain visible to the session owner. + *******************************************************************************/ + fun close() +} + +/******************************************************************************* + ** One visible, resumed scanner owns the hardware; released generations cannot submit scans. + *******************************************************************************/ +internal class ScannerInputSession( + private val createDriver: () -> ScannerDriver?, + private val onScan: (ScannerCapture) -> Unit, + private val onStatus: (String, Boolean) -> Unit, + private val canAcceptInput: () -> Boolean = { true }, +) { + private var driver: ScannerDriver? = null + private var generation = 0L + private var active = false + private var accepting = false + private var idle = false + private var armed = false + private var releaseFailed = false + private var readNotice: String? = null + + /******************************************************************************* + ** Advance the ownership generation before releasing or acquiring the scanner for a resumed widget. + *******************************************************************************/ + fun setActive(value: Boolean) { + if (active == value) return + active = value + generation++ + release() + if (!value) return + if (releaseFailed) return + val current = try { + createDriver() + } catch (exception: Exception) { + null + } + if (current == null) { + onStatus("Hardware scanning is unavailable. Enter a barcode and submit it manually.", false) + return + } + driver = current + readNotice = null + val token = generation + onStatus("Connecting to scanner…", false) + try { + current.open(object : ScannerDriver.Listener { + /******************************************************************************* + ** Bind callbacks to the exact driver and active generation that opened them. + *******************************************************************************/ + private fun isCurrent() = active && generation == token && driver === current + + /******************************************************************************* + ** Use hardware idle and pending-read state together before arming the current visible widget. + *******************************************************************************/ + override fun idle() { + if (!isCurrent()) return + try { + // A read can finish without data (for example, trigger release or timeout). + if (!current.isReadPending()) armed = false + idle = true + arm() + } catch (exception: Exception) { + fail() + } + } + + /******************************************************************************* + ** Preserve raw barcode data and reject callbacks after ownership, readiness or generation changes. + *******************************************************************************/ + override fun scanned(capture: ScannerCapture) { + if (!isCurrent() || !accepting || !armed || !canAcceptInput()) return + armed = false + accepting = false + readNotice = null + onStatus("Waiting for scan confirmation…", false) + onScan(capture) + // IDLE may precede data. Stop any read armed in that interval before accepting more input. + try { + if (driver === current && current.isReadPending()) current.cancelRead() + } catch (exception: Exception) { + fail() + } + } + + /******************************************************************************* + ** Distinguish ordinary empty reads from rejected multi-barcode reads without fabricating a scan. + *******************************************************************************/ + override fun noData(multipleBarcodes: Boolean) { + if (!isCurrent() || !accepting) return + // Cancellation/empty collections are ordinary read completion. Only IDLE + // and the driver's pending state may rearm; never release the hardware here. + if (multipleBarcodes) { + readNotice = "Multiple barcodes were rejected. Scan one barcode at a time." + onStatus(requireNotNull(readNotice), false) + } + } + + /******************************************************************************* + ** Report hardware failure only for the active generation so stale callbacks cannot disable a replacement. + *******************************************************************************/ + override fun failed() { + if (isCurrent()) fail() + } + }) + } catch (exception: Exception) { + fail() + } + } + + /******************************************************************************* + ** Retry acquisition only when the prior hardware release was confirmed. + *******************************************************************************/ + fun reconnect() { + if (!active || releaseFailed) return + setActive(false) + setActive(true) + } + + /******************************************************************************* + ** Stop outstanding reads while server acknowledgment or UI readiness prevents another submission. + *******************************************************************************/ + fun setAccepting(value: Boolean) { + accepting = value + if (!value && armed) { + armed = false + try { + driver?.cancelRead() + } catch (exception: Exception) { + fail() + } + } + if (value) arm() + } + + /******************************************************************************* + ** Start at most one read after ownership, widget readiness and hardware idle agree. + *******************************************************************************/ + private fun arm() { + val current = driver ?: return + if (!active || !accepting || !idle || armed || !canAcceptInput()) return + try { + if (current.isReadPending()) return + armed = true + idle = false + current.read() + if (driver === current && armed) onStatus(readNotice ?: "Scanner ready. Press the handheld trigger.", false) + } catch (exception: Exception) { + fail() + } + } + + /******************************************************************************* + ** Invalidate callbacks before release and distinguish retryable hardware loss from unconfirmed ownership release. + *******************************************************************************/ + private fun fail() { + generation++ + val released = release() + onStatus( + if (released) "Hardware scanning is unavailable. Reconnect the scanner or enter a barcode manually." + else "Scanner release could not be confirmed. Restart QQQ Mobile before using the scanner.", released + ) + } + + /******************************************************************************* + ** Clear local ownership before closing the driver; an unconfirmed close prevents later acquisition. + *******************************************************************************/ + private fun release(): Boolean { + val previous = driver + driver = null + idle = false + armed = false + return try { + previous?.close(); true + } catch (exception: Exception) { + releaseFailed = true + onStatus("Scanner release could not be confirmed. Restart QQQ Mobile before using the scanner.", false) + false + } + } +} diff --git a/scanner-host/src/main/java/io/qrun/mobile/scanner/ScannerMetaData.kt b/scanner-host/src/main/java/io/qrun/mobile/scanner/ScannerMetaData.kt new file mode 100644 index 0000000..1904995 --- /dev/null +++ b/scanner-host/src/main/java/io/qrun/mobile/scanner/ScannerMetaData.kt @@ -0,0 +1,46 @@ +/* Copyright (c) 2026 QRunIO. SPDX-License-Identifier: Apache-2.0 */ +package io.qrun.mobile.scanner + +/******************************************************************************* + ** The optional presentation hints published by mobile-scanners 1.x. + *******************************************************************************/ +internal data class ScannerMetaData(val manualLabel: String = "Manual barcode", val submitLabel: String = "Submit barcode", val maxLength: Int = 4096, val acknowledgmentLabel: String = "Saved scan", val manualEntryEnabled: Boolean = true) { + /******************************************************************************* + ** Centralize scanner metadata validation before the widget accepts server-provided controls. + *******************************************************************************/ + companion object { + /******************************************************************************* + ** Validate scanner length limits and read optional display labels from server widget metadata with local defaults. + *******************************************************************************/ + fun parse(values: Map<String, Any?>): ScannerMetaData { + val suppliedLength = values["maxLength"] + val maxLength = if (!values.containsKey("maxLength")) 4096 else { + require(suppliedLength is Number) { "SCANNER maxLength must be an integer between 1 and 4096." } + val number = suppliedLength.toDouble() + require(number.isFinite() && number in 1.0..4096.0 && number == number.toInt().toDouble()) + { "SCANNER maxLength must be an integer between 1 and 4096." } + number.toInt() + } + val acknowledgmentLabel = if (!values.containsKey("acknowledgmentLabel")) "Saved scan" else { + val label = values["acknowledgmentLabel"] + require(label is String && label.length in 1..80 && label.isNotBlank() && label == label.trim() && label.none { + it.isISOControl() || it.category == CharCategory.FORMAT || it.category == CharCategory.LINE_SEPARATOR || + it.category == CharCategory.PARAGRAPH_SEPARATOR || it == '<' || it == '>' + }) { "SCANNER acknowledgmentLabel must be a plain, single-line label between 1 and 80 characters." } + label + } + val manualEntryEnabled = if (!values.containsKey("manualEntryEnabled")) true else { + val enabled = values["manualEntryEnabled"] + require(enabled is Boolean) { "SCANNER manualEntryEnabled must be a boolean." } + enabled + } + return ScannerMetaData( + manualLabel = (values["manualLabel"] as? String)?.takeIf { it.isNotBlank() } ?: "Manual barcode", + submitLabel = (values["submitLabel"] as? String)?.takeIf { it.isNotBlank() } ?: "Submit barcode", + maxLength = maxLength, + acknowledgmentLabel = acknowledgmentLabel, + manualEntryEnabled = manualEntryEnabled, + ) + } + } +} diff --git a/scanner-host/src/main/java/io/qrun/mobile/scanner/ScannerWidget.kt b/scanner-host/src/main/java/io/qrun/mobile/scanner/ScannerWidget.kt new file mode 100644 index 0000000..0b381dd --- /dev/null +++ b/scanner-host/src/main/java/io/qrun/mobile/scanner/ScannerWidget.kt @@ -0,0 +1,186 @@ +/* Copyright (c) 2026 QRunIO. SPDX-License-Identifier: Apache-2.0 */ +package io.qrun.mobile.scanner + +import android.content.Context +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.text.KeyboardActions +import androidx.compose.foundation.text.KeyboardOptions +import androidx.compose.material3.Button +import androidx.compose.material3.OutlinedTextField +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.DisposableEffect +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.SideEffect +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.saveable.rememberSaveable +import androidx.compose.runtime.rememberUpdatedState +import androidx.compose.runtime.setValue +import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.platform.testTag +import androidx.compose.ui.platform.LocalView +import androidx.compose.ui.platform.LocalWindowInfo +import androidx.compose.ui.platform.LocalFocusManager +import androidx.compose.ui.platform.LocalSoftwareKeyboardController +import androidx.compose.ui.text.input.ImeAction +import androidx.compose.ui.unit.dp +import androidx.lifecycle.Lifecycle +import androidx.lifecycle.LifecycleEventObserver +import androidx.lifecycle.compose.LocalLifecycleOwner +import com.kingsrook.qqq.frontend.android.mobileapp.ui.widgets.blocks.WidgetBlockParameters +import com.kingsrook.qqq.frontend.android.mobileapp.ui.LocalProcessInputAllowed + +/******************************************************************************* + ** A server-defined SCANNER widget accepts device-owned callbacks only while visible and resumed. + *******************************************************************************/ +@Composable +internal fun ScannerWidget( + parameters: WidgetBlockParameters, modifier: Modifier, disabled: Boolean, + driverFactory: (Context) -> ScannerDriver? = ::createScannerDriver, + fidelityAvailable: () -> Boolean = { false } +) { + val context = LocalContext.current + val view = LocalView.current + val windowFocused = LocalWindowInfo.current.isWindowFocused + val inputAllowed = LocalProcessInputAllowed.current + val focusManager = LocalFocusManager.current + val keyboard = LocalSoftwareKeyboardController.current + val lifecycle = LocalLifecycleOwner.current.lifecycle + var manual by rememberSaveable { mutableStateOf("") } + var notice by remember { mutableStateOf("") } + var scannerStatus by remember { mutableStateOf("") } + var canReconnect by remember { mutableStateOf(false) } + val currentDisabled by rememberUpdatedState(disabled) + val metadataResult = runCatching { ScannerMetaData.parse(parameters.widgetBlock.values) } + if (metadataResult.isFailure) { + Text("This scanner control has unsupported metadata. Contact your administrator.", modifier.padding(20.dp)) + return + } + val scannerMetaData = metadataResult.getOrThrow() + val process = parameters.qViewModel?.activeProcessViewModel + + /******************************************************************************* + ** Bind input eligibility to the same active process and loaded server step that rendered this widget. + *******************************************************************************/ + fun processReady() = process != null && parameters.qViewModel?.activeProcessViewModel === process && + !currentDisabled && !process.cancelling && !process.waitingOnBackend && process.pendingStepValues == null + + /******************************************************************************* + ** Combine operator focus, lifecycle and process readiness before accepting hardware or manual input. + *******************************************************************************/ + fun inputReady() = inputAllowed() && view.hasWindowFocus() && + lifecycle.currentState.isAtLeast(Lifecycle.State.RESUMED) && processReady() + + val ready = windowFocused && inputAllowed() && processReady() + val currentInputReady by rememberUpdatedState<() -> Boolean>(::inputReady) + LaunchedEffect(parameters.values["acknowledgedEventId"]) { notice = "" } + + /******************************************************************************* + ** Each new physical scan has an identity; retries are handled by ProcessViewModel. + *******************************************************************************/ + fun submit(capture: ScannerCapture, source: String): Boolean { + val barcode = capture.barcode + if (process == null) { + notice = "This scanner control requires an active process." + return false + } + if (!inputReady()) { + notice = "Wait for the previous scan to be confirmed." + return false + } + if (barcode.isEmpty() || barcode.length > scannerMetaData.maxLength) { + notice = "Scan must contain between 1 and ${scannerMetaData.maxLength} characters." + return false + } + notice = "Sending scan…" + val event = ScanEvent(capture, source) + process.widgetState[ScannerFeedback.STATE_KEY] = LastScan.of(event) + // Capability is read from cached verified discovery on the UI thread; it never triggers HTTP. + process.runStep( + event.values(includeFidelity = fidelityAvailable()), ScannerFeedback.acknowledgment(event.eventId) + ) + // runStep can reject local metadata/validation before accepting an event. + // A synchronous test repository can also finish and acknowledge it immediately. + val accepted = process.pendingStepValues?.get("eventId") == event.eventId || + process.processValues["acknowledgedEventId"] == event.eventId + if (!accepted) notice = "Scan was not submitted. Review the process message and try again." + return accepted + } + + val currentSubmit by rememberUpdatedState<(ScannerCapture, String) -> Boolean>(::submit) + val input = remember(context, process, driverFactory) + { + ScannerInputSession( + { driverFactory(context) }, + { capture -> currentSubmit(capture, HARDWARE_SCAN_SOURCE) }, + { message, reconnect -> scannerStatus = message; canReconnect = reconnect }, + canAcceptInput = { currentInputReady() }) + } + SideEffect { input.setAccepting(ready) } + DisposableEffect(input, lifecycle) + { + /******************************************************************************* + ** Let the current lifecycle decide hardware ownership rather than retaining capture after pause. + *******************************************************************************/ + fun syncRegistration() { + input.setActive(lifecycle.currentState.isAtLeast(Lifecycle.State.RESUMED)) + } + + val observer = LifecycleEventObserver { _, _ -> syncRegistration() } + lifecycle.addObserver(observer) + syncRegistration() + onDispose { lifecycle.removeObserver(observer); input.setActive(false) } + } + + Column(modifier.padding(20.dp), verticalArrangement = Arrangement.spacedBy(12.dp)) + { + Text(parameters.widgetBlock.values["title"]?.toString() ?: "Scan a barcode") + Text(parameters.widgetBlock.values["instructions"]?.toString() ?: "Press the handheld scan trigger. Wait for server confirmation before scanning again.") + val feedback = ScannerFeedback.derive( + process?.widgetState?.get(ScannerFeedback.STATE_KEY) as? LastScan, process?.pendingStepValues, parameters.values, + process?.waitingOnBackend == true, process?.cancelling == true + ) + ScanFeedbackPanel(feedback) + if (parameters.values["scanSaved"] == true && notice.isEmpty()) { + Text("${scannerMetaData.acknowledgmentLabel} ${parameters.values["scanId"] ?: ""}") + } + if (notice.isNotEmpty()) Text(notice) + if (scannerStatus.isNotEmpty()) Text(scannerStatus) + if (canReconnect) Button( + enabled = ready, + onClick = { input.reconnect() }) { Text("Reconnect scanner") } + if (scannerMetaData.manualEntryEnabled) { + OutlinedTextField( + manual, { manual = it }, label = { Text(scannerMetaData.manualLabel) }, enabled = ready, singleLine = true, + keyboardOptions = KeyboardOptions(imeAction = ImeAction.Done), + keyboardActions = KeyboardActions(onDone = { focusManager.clearFocus(); keyboard?.hide() }) + ) + Button(enabled = ready && manual.isNotEmpty(), onClick = { + focusManager.clearFocus(); keyboard?.hide() + if (submit(ScannerCapture.manual(manual), "manual")) manual = "" + }) { Text(scannerMetaData.submitLabel) } + } + } +} + +/******************************************************************************* + ** Shown for every SCANNER widget, including those with manual entry disabled. A read-only field never + ** requests focus or opens the keyboard, and the value is displayed exactly as received. + *******************************************************************************/ +@Composable +internal fun ScanFeedbackPanel(feedback: ScanFeedback?) { + OutlinedTextField( + feedback?.barcode ?: "", {}, modifier = Modifier.fillMaxWidth().testTag("scanner-barcode"), + label = { Text("Barcode") }, readOnly = true, singleLine = true, + placeholder = { Text(ScannerFeedback.WAITING) }, + supportingText = feedback?.let { { Text(it.details) } } + ) + Text("Symbology: ${feedback?.symbology ?: "—"}", Modifier.testTag("scanner-symbology")) + Text(feedback?.status ?: ScannerFeedback.WAITING, Modifier.testTag("scanner-status")) +} diff --git a/scanner-host/src/main/java/io/qrun/mobile/scanner/ScreenConsentAttempt.kt b/scanner-host/src/main/java/io/qrun/mobile/scanner/ScreenConsentAttempt.kt new file mode 100644 index 0000000..e5d6db2 --- /dev/null +++ b/scanner-host/src/main/java/io/qrun/mobile/scanner/ScreenConsentAttempt.kt @@ -0,0 +1,38 @@ +/* Copyright (c) 2026 QRunIO. SPDX-License-Identifier: Apache-2.0 */ +package io.qrun.mobile.scanner + +/******************************************************************************* + ** Single-use, memory-only binding for the Android result and subsequent service connection. + *******************************************************************************/ +internal class ScreenConsentAttempt { + private var generation: String? = null + private var pending = false + + /******************************************************************************* + ** Issue a fresh memory-only ticket so a result from an earlier consent attempt cannot activate sharing. + *******************************************************************************/ + fun begin(): String { + val ticket = java.util.UUID.randomUUID().toString(); generation = ticket; pending = true; return ticket + } + + /******************************************************************************* + ** Revoke pending consent before host shutdown or a new sharing attempt. + *******************************************************************************/ + fun invalidate() { + generation = null; pending = false + } + + /******************************************************************************* + ** Check ticket identity independently of consumption for subsequent asynchronous service callbacks. + *******************************************************************************/ + fun current(ticket: String) = ticket == generation + + /******************************************************************************* + ** Accept a consent result at most once and only while its host remains authenticated and approved. + *******************************************************************************/ + fun consume(ticket: String, granted: Boolean, authenticatedAndApproved: Boolean): Boolean { + if (!current(ticket) || !pending) return false + pending = false + return granted && authenticatedAndApproved + } +} diff --git a/scanner-host/src/main/java/io/qrun/mobile/scanner/SessionHostUi.kt b/scanner-host/src/main/java/io/qrun/mobile/scanner/SessionHostUi.kt new file mode 100644 index 0000000..2bd21cb --- /dev/null +++ b/scanner-host/src/main/java/io/qrun/mobile/scanner/SessionHostUi.kt @@ -0,0 +1,57 @@ +/* Copyright (c) 2026 QRunIO. SPDX-License-Identifier: Apache-2.0 */ +package io.qrun.mobile.scanner + +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Surface +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.unit.dp +import com.kingsrook.qqq.frontend.android.core.model.metadata.QFieldType +import com.kingsrook.qqq.frontend.android.mobileapp.viewmodel.LoadState +import com.kingsrook.qqq.frontend.android.mobileapp.viewmodel.QViewModel + +/******************************************************************************* + ** Derive capture eligibility from actual QQQ state and password metadata without transmitting field values. + *******************************************************************************/ +internal fun sessionScreen(model: QViewModel, foreground: Boolean, focused: Boolean, approved: Boolean, laidOut: Boolean): SessionScreen { + val process = model.activeProcessViewModel + val step = process?.activeStep + val hasPassword = (step?.formFields.orEmpty() + step?.viewFields.orEmpty()).any { !it.isHidden && it.type == QFieldType.PASSWORD } || + containsPasswordWidget(step?.components?.map { it.values }) || containsPasswordWidget(process?.processValues) + return SessionScreen( + foreground, model.isAuthenticated && !model.isLogoutRequested && model.sessionUUID.isNotBlank(), + focused, approved, hasPassword, laidOut && model.qInstanceLoadState is LoadState.Success && + (process == null || step != null || process.getNoMoreSteps()), false, + model.qNavigator.navigationRevision, process?.stepInstanceCounter ?: 0, + model.qNavigator.currentAppName, process?.processName, process?.processUUID, process?.activeStepName?.ifEmpty { null }, + (step?.label ?: model.qNavigator.titleStack.lastOrNull() ?: "Apps").take(200) + ) +} + +/******************************************************************************* + ** Widget field metadata is nested in composite blocks; inspect types without transmitting any values. + *******************************************************************************/ +private fun containsPasswordWidget(value: Any?): Boolean = when (value) { + is Map<*, *> -> (value["fieldMetaData"] as? Map<*, *>)?.get("type") == "PASSWORD" || value.values.any(::containsPasswordWidget) + is List<*> -> value.any(::containsPasswordWidget) + else -> false +} + +/******************************************************************************* + ** Keep the operator informed of active or suspended viewing; this indicator is informational and offers no operator control. + *******************************************************************************/ +@Composable +internal fun ScreenViewingIndicator(controller: MobileSessionController) { + if (controller.viewing || controller.operatorPaused) Surface(color = MaterialTheme.colorScheme.secondaryContainer) + { + Row(Modifier.fillMaxWidth().padding(horizontal = 12.dp, vertical = 8.dp), verticalAlignment = Alignment.CenterVertically) + { + Text(if (controller.operatorPaused) "Screen viewing paused" else "Screen being viewed by an administrator", Modifier.weight(1f)) + } + } +} diff --git a/scanner-host/src/main/java/io/qrun/mobile/scanner/SessionScreen.kt b/scanner-host/src/main/java/io/qrun/mobile/scanner/SessionScreen.kt new file mode 100644 index 0000000..5004d9a --- /dev/null +++ b/scanner-host/src/main/java/io/qrun/mobile/scanner/SessionScreen.kt @@ -0,0 +1,109 @@ +/* Copyright (c) 2026 QRunIO. SPDX-License-Identifier: Apache-2.0 */ +package io.qrun.mobile.scanner + +import java.time.Instant +import org.json.JSONObject + +/******************************************************************************* + ** Distinguish application-only pixels from separately consented device projection in every lease and frame. + *******************************************************************************/ +internal enum class CaptureMode { APP_CONTENT, DEVICE_SCREEN } + +/******************************************************************************* + ** Metadata only. Authentication credentials and field/scan values never enter telemetry. + *******************************************************************************/ +internal data class SessionScreen( + val foreground: Boolean, + val authenticated: Boolean, + val focused: Boolean, + val approved: Boolean, + val hasPassword: Boolean, + val ready: Boolean, + val paused: Boolean, + val navigationRevision: Long, + val stepRevision: Int, + val appName: String? = null, + val processName: String? = null, + val processInstanceId: String? = null, + val stepName: String? = null, + val label: String? = null, + val location: LocationReport = LocationReport(), + val captureMode: CaptureMode = CaptureMode.APP_CONTENT, +) { + val blockedReason: String? + get() = when { + !authenticated -> "SIGNED_OUT" + !approved -> "DEVICE_NOT_APPROVED" + !foreground && captureMode == CaptureMode.APP_CONTENT -> "APP_BACKGROUND" + !focused && captureMode == CaptureMode.APP_CONTENT -> "APP_NOT_FOCUSED" + paused -> "OPERATOR_PAUSED" + hasPassword -> "PASSWORD_SCREEN" + !ready -> "SCREEN_LOADING" + else -> null + } + val available: Boolean get() = blockedReason == null +} + +/******************************************************************************* + ** Carry one bounded encoded capture with its dimensions, timestamp and consent mode. + *******************************************************************************/ +internal data class ScreenFrame( + val jpeg: ByteArray, val width: Int, val height: Int, val capturedAt: String, + val captureMode: CaptureMode = CaptureMode.APP_CONTENT +) + +/******************************************************************************* + ** Carry server-issued capture limits and sequence continuity for the current authenticated viewer. + *******************************************************************************/ +internal data class ScreenLease( + val id: String, val durationMillis: Long, val intervalMillis: Long, + val maxWidth: Int, val maxHeight: Int, val maxBytes: Int, val nextSequence: Long, + val captureMode: CaptureMode = CaptureMode.APP_CONTENT +) + +/******************************************************************************* + ** Represent the authoritative session and optional bounded viewing lease returned by a heartbeat. + *******************************************************************************/ +internal data class SessionHeartbeat( + val sessionId: String, val intervalMillis: Long, val lease: ScreenLease?, + val supportedCaptureModes: Set<CaptureMode> = setOf(CaptureMode.APP_CONTENT) +) { + /******************************************************************************* + ** Parse server heartbeat limits at the boundary before they govern capture scheduling. + *******************************************************************************/ + companion object { + /******************************************************************************* + ** Require an active server session and clamp advertised timing and size limits before any capture. + *******************************************************************************/ + fun parse(payload: String): SessionHeartbeat { + val value = JSONObject(payload) + require(value.getString("status") == "ACTIVE") { "Inactive mobile session." } + val serverTime = Instant.parse(value.getString("serverTime")) + val lease = value.optJSONObject("screenMirror")?.let { + ScreenLease( + it.getString("leaseId"), + (Instant.parse(it.getString("expiresAt")).toEpochMilli() - serverTime.toEpochMilli()).coerceIn(0, 30000), + it.getLong("frameIntervalMillis").coerceIn(1000, 30000), + it.getInt("maxWidth").coerceIn(1, 640), it.getInt("maxHeight").coerceIn(1, 1280), + it.getInt("maxBytes").coerceIn(1, 262144), it.getLong("nextSequence").coerceAtLeast(0), + CaptureMode.valueOf(it.optString("captureMode", "APP_CONTENT")) + ) + } + val advertised = value.optJSONArray("supportedCaptureModes") + val modes = if (advertised == null) setOf(CaptureMode.APP_CONTENT) else + (0 until advertised.length()).mapNotNull { index -> CaptureMode.entries.find { it.name == advertised.optString(index) } }.toSet() + return SessionHeartbeat(value.getString("sessionId"), value.getLong("heartbeatIntervalMillis").coerceIn(1000, 15000), lease, modes) + } + } +} + +/******************************************************************************* + ** A frame is usable only for the exact state and session generation in which capture began. + *******************************************************************************/ +internal data class ScreenTicket(val generation: Long, val state: SessionScreen, val leaseId: String) { + /******************************************************************************* + ** Reject completed capture when host state, generation, lease identity or monotonic expiry has changed. + *******************************************************************************/ + fun valid(generation: Long, state: SessionScreen, leaseId: String?, now: Long, expiresAt: Long) = + this.generation == generation && this.state == state && state.available && this.leaseId == leaseId && now < expiresAt +} diff --git a/scanner-host/src/main/java/io/qrun/mobile/scanner/WallpaperStatus.kt b/scanner-host/src/main/java/io/qrun/mobile/scanner/WallpaperStatus.kt new file mode 100644 index 0000000..92830c5 --- /dev/null +++ b/scanner-host/src/main/java/io/qrun/mobile/scanner/WallpaperStatus.kt @@ -0,0 +1,193 @@ +/* Copyright (c) 2026 QRunIO. SPDX-License-Identifier: Apache-2.0 */ +package io.qrun.mobile.scanner + +/******************************************************************************* + ** What this process currently knows about the operator's session. Never persisted: a new process starts UNKNOWN. + *******************************************************************************/ +internal enum class WallpaperSessionState { UNKNOWN, SIGNED_OUT, SIGNED_IN } + +/******************************************************************************* + ** Immutable display-only snapshot. Holds no credential, token, cookie or session identifier. + *******************************************************************************/ +internal data class WallpaperSnapshot( + val state: WallpaperSessionState = WallpaperSessionState.UNKNOWN, + val displayName: String? = null, + val serverHost: String? = null, + val brandName: String = HostBrand().displayName, + val brandColor: String = HostBrand().primaryColor, + val foreground: Boolean = false, + val confirmedAtElapsed: Long = 0L, + val confirmedAtWall: Long = 0L, +) + +/******************************************************************************* + ** Observer notified after a snapshot changes; it may be called on any thread. + *******************************************************************************/ +internal fun interface WallpaperStatusListener { + /******************************************************************************* + ** Read the new snapshot from the store; the callback carries no data. + *******************************************************************************/ + fun changed() +} + +/******************************************************************************* + ** In-memory publisher of the approved session display name. Identity is dropped on sign-out and clear. + *******************************************************************************/ +internal class WallpaperStatusStore(private val elapsed: () -> Long, private val wall: () -> Long) { + private val lock = Any() + private val listeners = LinkedHashSet<WallpaperStatusListener>() + @Volatile + var snapshot = WallpaperSnapshot() + private set + + /******************************************************************************* + ** Register until removed; the wallpaper engine removes itself when it stops being visible or is destroyed. + *******************************************************************************/ + fun addListener(listener: WallpaperStatusListener) = synchronized(lock) { listeners.add(listener) } + + /******************************************************************************* + ** Stop notifying a listener; safe to call when it was never added. + *******************************************************************************/ + fun removeListener(listener: WallpaperStatusListener) = synchronized(lock) { listeners.remove(listener) } + + /******************************************************************************* + ** Apply the validated public brand of the selected server; invalid values keep the current brand. + *******************************************************************************/ + fun setBrand(name: String, color: String) { + val cleanName = cleanText(name, 80) ?: return + if (!BRAND_COLOR.matches(color)) return + update { it.copy(brandName = cleanName, brandColor = color.uppercase()) } + } + + /******************************************************************************* + ** Record a signed-in, device-approved session. Each call confirms the session as of now; the caller invokes it + ** again with foreground=false as the app leaves the screen, which is the last time the server was reachable. + *******************************************************************************/ + fun signedIn(displayName: String?, serverHost: String?, foreground: Boolean) { + update { + it.copy( + state = WallpaperSessionState.SIGNED_IN, displayName = cleanText(displayName, MAX_NAME), serverHost = cleanText(serverHost, 80), + foreground = foreground, confirmedAtElapsed = elapsed(), confirmedAtWall = wall() + ) + } + } + + /******************************************************************************* + ** Drop identity when a signed-in session ends (logout, unauthorized, revocation); leave other states alone so + ** startup does not claim "signed out" before restoration finishes. + *******************************************************************************/ + fun signedOutIfSignedIn() { + if (snapshot.state == WallpaperSessionState.SIGNED_IN) update { it.signedOutCopy() } + } + + /******************************************************************************* + ** Forget everything session-related (activity destroyed, server change): the state becomes UNKNOWN, not signed out. + *******************************************************************************/ + fun clear() = update { it.copy(state = WallpaperSessionState.UNKNOWN, displayName = null, serverHost = null, foreground = false, confirmedAtElapsed = 0L, confirmedAtWall = 0L) } + + private fun WallpaperSnapshot.signedOutCopy() = + copy(state = WallpaperSessionState.SIGNED_OUT, displayName = null, serverHost = null, foreground = false, confirmedAtElapsed = 0L, confirmedAtWall = 0L) + + /******************************************************************************* + ** Swap the snapshot and notify outside the lock so a listener cannot deadlock the publisher. + *******************************************************************************/ + private fun update(change: (WallpaperSnapshot) -> WallpaperSnapshot) { + val toNotify = synchronized(lock) { + val next = change(snapshot) + if (next == snapshot) return + snapshot = next + listeners.toList() + } + toNotify.forEach { it.changed() } + } + + /******************************************************************************* + ** Single-line presentation text only: no control characters, bounded length, null when empty. + *******************************************************************************/ + companion object { + const val MAX_NAME = 40 + private val BRAND_COLOR = Regex("#[0-9a-fA-F]{6}") + + /******************************************************************************* + ** Normalize display text before it can reach a canvas. + *******************************************************************************/ + fun cleanText(raw: String?, max: Int): String? = raw?.filterNot { it.isISOControl() }?.trim()?.take(max)?.takeIf { it.isNotEmpty() } + } +} + +/******************************************************************************* + ** Where the wallpaper is being drawn. Identity and IP are shown only for HOME. + *******************************************************************************/ +internal enum class WallpaperContext { PREVIEW, LOCKED, HOME } + +/******************************************************************************* + ** Text and colours for one frame. + *******************************************************************************/ +internal data class WallpaperFrame(val header: String, val lines: List<String>, val colorHex: String, val darkText: Boolean) + +/******************************************************************************* + ** Pure rules that decide what the wallpaper may say, so they can be tested without a device. + *******************************************************************************/ +internal object WallpaperPresentation { + /** The heartbeat only runs while the app is foreground; beyond this the name is no longer shown. */ + const val STALE_AFTER_MILLIS = 15 * 60 * 1000L + + /******************************************************************************* + ** A signed-in session whose app has been in the background past the window is unverified, not signed in. + *******************************************************************************/ + fun isStale(snapshot: WallpaperSnapshot, nowElapsed: Long) = + snapshot.state == WallpaperSessionState.SIGNED_IN && !snapshot.foreground && nowElapsed - snapshot.confirmedAtElapsed >= STALE_AFTER_MILLIS + + /******************************************************************************* + ** Milliseconds until a displayed, not-yet-stale name must be withdrawn, or null when no timer is needed. + *******************************************************************************/ + fun millisUntilStale(snapshot: WallpaperSnapshot, nowElapsed: Long): Long? = + if (snapshot.state == WallpaperSessionState.SIGNED_IN && !snapshot.foreground && !isStale(snapshot, nowElapsed)) + STALE_AFTER_MILLIS - (nowElapsed - snapshot.confirmedAtElapsed) else null + + /******************************************************************************* + ** Compose the IP line from what the network callback last reported. + *******************************************************************************/ + fun networkLine(known: Boolean, addresses: String?) = when { + !known -> "IP: unknown" + addresses == null -> "IP: no network address" + else -> "IP: $addresses" + } + + /******************************************************************************* + ** Brand only for PREVIEW and LOCKED. HOME adds session state, the approved display name only while it is fresh, + ** the server host, and the IP. The wording never claims the server just verified a background session. + *******************************************************************************/ + fun render(snapshot: WallpaperSnapshot, context: WallpaperContext, networkLine: String, nowElapsed: Long, formatTime: (Long) -> String): WallpaperFrame { + val dark = useBlackOnPrimary(snapshot.brandColor) + if (context != WallpaperContext.HOME) return WallpaperFrame(snapshot.brandName, emptyList(), snapshot.brandColor, dark) + val lines = mutableListOf<String>() + when (snapshot.state) { + WallpaperSessionState.UNKNOWN -> lines += "Session: not available" + WallpaperSessionState.SIGNED_OUT -> lines += "Signed out" + WallpaperSessionState.SIGNED_IN -> if (isStale(snapshot, nowElapsed)) { + lines += "Session unverified" + lines += "Last confirmed ${formatTime(snapshot.confirmedAtWall)}" + } else { + lines += snapshot.displayName?.let { "Signed in: $it" } ?: "Signed in" + if (!snapshot.foreground) lines += "Last confirmed ${formatTime(snapshot.confirmedAtWall)} (app in background)" + snapshot.serverHost?.let { lines += "Server: $it" } + } + } + lines += networkLine + return WallpaperFrame(snapshot.brandName, lines, snapshot.brandColor, dark) + } +} + +/******************************************************************************* + ** Summarize the default network's link addresses for display: interface label plus up to two usable addresses, + ** IPv4 first. Loopback and IPv6 link-local addresses are omitted; scope suffixes are stripped. Null when none remain. + *******************************************************************************/ +internal fun formatNetworkAddresses(interfaceName: String?, addresses: List<String>): String? { + val usable = addresses.map { it.substringBefore('%') } + .filter { it.isNotBlank() && !it.startsWith("fe80", ignoreCase = true) && it != "::1" && !it.startsWith("127.") } + .distinct() + if (usable.isEmpty()) return null + val label = interfaceName?.filter { it.isLetterOrDigit() || it == '.' || it == '_' || it == '-' }?.take(16)?.takeIf { it.isNotEmpty() } + return (label?.let { "$it " } ?: "") + usable.sortedBy { it.contains(':') }.take(2).joinToString(", ") +} diff --git a/scanner-host/src/main/java/io/qrun/mobile/scanner/ZebraScannerDriver.kt b/scanner-host/src/main/java/io/qrun/mobile/scanner/ZebraScannerDriver.kt new file mode 100644 index 0000000..b9a6b3f --- /dev/null +++ b/scanner-host/src/main/java/io/qrun/mobile/scanner/ZebraScannerDriver.kt @@ -0,0 +1,300 @@ +/* Copyright (c) 2026 QRunIO. SPDX-License-Identifier: Apache-2.0 */ +package io.qrun.mobile.scanner + +import android.content.Context +import android.os.Handler +import android.os.Looper +import com.symbol.emdk.EMDKManager +import com.symbol.emdk.EMDKResults +import com.symbol.emdk.barcode.BarcodeManager +import com.symbol.emdk.barcode.Scanner +import com.symbol.emdk.barcode.ScannerConfig +import com.symbol.emdk.barcode.StatusData + +/******************************************************************************* + ** Loaded only after checking Zebra's device-provided library and preinstalled service. + *******************************************************************************/ +internal class ZebraScannerDriver(private val context: Context) : ScannerDriver { + /******************************************************************************* + ** Serialize the application-wide EMDK manager claim across asynchronous driver lifetimes. + *******************************************************************************/ + companion object { + // EMDK supports one manager per application, including a bind that has not completed yet. + private var managerClaimed = false + } + + private val main = Handler(Looper.getMainLooper()) + private var listener: ScannerDriver.Listener? = null + private var manager: EMDKManager? = null + private var scanner: Scanner? = null + private var closed = false + private var opening = false + private var ownsClaim = false + + /******************************************************************************* + ** The scanner's output format as this driver has proven it. Text is accepted only in AIM (prefix present and + ** confirmed by read-back) or PLAIN (unchanged or restored, confirmed by read-back); PENDING and FAILED are + ** indeterminate, so any decode, and any readiness signal, is withheld. + *******************************************************************************/ + private enum class Profile { PENDING, AIM, PLAIN, FAILED } + + // Application-owned, temporary: AIM is set only after applying codeIdType=AIM and reading the same value back. + // The original value is restored (and read back) before the scanner is released. + @Volatile private var profile = Profile.PENDING + private var idleSeenBeforeProfile = false + private var originalCodeIdType: ScannerConfig.CodeIdType? = null + private var codeIdTypeChanged = false + private val dataListener = Scanner.DataListener { collection -> + // Copy SDK-owned data now; the collection must not be read after this callback returns. AIM is read only + // under the confirmed profile, by AimOutputProfile; without it the text is user payload and stays untouched. + // This runs on an SDK thread, possibly while the open sequence is still configuring: an unresolved or failed + // format drops the decode instead of guessing. The hardware read completes and the next IDLE re-arms it. + val mode = profile + if (mode != Profile.AIM && mode != Profile.PLAIN) return@DataListener + val scans = collection?.scanData + var capture: ScannerCapture? = null + var multiple = false + if (collection?.result == com.symbol.emdk.barcode.ScannerResults.SUCCESS && !scans.isNullOrEmpty()) { + if (scans.size != 1) multiple = true + else { + val scan = scans.single() + val barcode = scan?.data + val label = scan?.labelType?.toString() ?: "UNKNOWN" + if (!barcode.isNullOrEmpty()) { + if (mode == Profile.PLAIN) capture = ScannerCapture.of(barcode, label, scan.rawData) + else { + // A missing or inconsistent prefix under the confirmed profile drops the read; it is never guessed. + // Raw bytes stay exactly what the SDK returned, whether or not they carry the same prefix. + val split = AimOutputProfile.split(barcode, label) + if (split != null) capture = ScannerCapture.of(split.payload, label, scan.rawData, split.aimIdentifier) + } + } + } + } + val delivered = capture + main.post { + if (!closed) { + if (delivered != null) listener?.scanned(delivered) else listener?.noData(multiple) + } + } + } + private val statusListener = Scanner.StatusListener { status -> + main.post { + if (!closed) { + if (status.state == StatusData.ScannerStates.IDLE) { + // Readiness arms a read. It is withheld until the output format is proven, then replayed once. + if (profile == Profile.AIM || profile == Profile.PLAIN) listener?.idle() + else if (profile == Profile.PENDING) idleSeenBeforeProfile = true + } else if (status.state == StatusData.ScannerStates.ERROR) listener?.failed() + } + } + } + + /******************************************************************************* + ** Claim the single EMDK manager before asynchronous binding and report unavailable ownership explicitly. + *******************************************************************************/ + override fun open(listener: ScannerDriver.Listener) { + check(!closed && this.listener == null) + this.listener = listener + if (managerClaimed) { + listener.failed(); return + } + managerClaimed = true + ownsClaim = true + opening = true + val result = try { + EMDKManager.getEMDKManager(context, object : EMDKManager.EMDKListener { + /******************************************************************************* + ** Release a late EMDK bind after closure; otherwise attach scanner listeners only for the current owner. + *******************************************************************************/ + override fun onOpened(opened: EMDKManager) { + main.post { + opening = false + if (closed) { + // The asynchronous bind can complete after the widget has already left. + try { + opened.release(); releaseClaim() + } catch (exception: Exception) { + android.util.Log.w("Scanner", "Late scanner release could not be confirmed") + } + } else { + manager = opened + try { + val barcodeManager = opened.getInstance(EMDKManager.FEATURE_TYPE.BARCODE) as BarcodeManager + val device = barcodeManager.getDevice(BarcodeManager.DeviceIdentifier.DEFAULT) + scanner = device + device.addDataListener(dataListener) + device.addStatusListener(statusListener) + device.triggerType = Scanner.TriggerType.HARD + device.enable() + if (!applyAimProfile(device)) { + profile = Profile.FAILED + this@ZebraScannerDriver.listener?.failed() + } else if (idleSeenBeforeProfile) { + idleSeenBeforeProfile = false + this@ZebraScannerDriver.listener?.idle() + } + } catch (exception: Exception) { + profile = Profile.FAILED + this@ZebraScannerDriver.listener?.failed() + } + } + } + } + + /******************************************************************************* + ** Resolve asynchronous manager loss on the main thread without reviving the released scanner. + *******************************************************************************/ + override fun onClosed() { + main.post { + opening = false + if (closed) releaseClaim() else this@ZebraScannerDriver.listener?.failed() + } + } + }) + } catch (exception: Exception) { + opening = false + releaseClaim() + throw exception + } + if (result.statusCode != EMDKResults.STATUS_CODE.SUCCESS) { + opening = false + releaseClaim() + listener.failed() + } + } + + /******************************************************************************* + ** Read EMDK's pending state rather than inferring it from callback order. + *******************************************************************************/ + override fun isReadPending(): Boolean = scanner?.isReadPending ?: false + + /******************************************************************************* + ** Delegate a read only after the session has acquired and enabled the hardware scanner. + *******************************************************************************/ + override fun read() { + requireNotNull(scanner).read() + } + + /******************************************************************************* + ** Avoid cancelling an idle scanner while still stopping any active hardware read. + *******************************************************************************/ + override fun cancelRead() { + scanner?.let { if (it.isReadPending) it.cancelRead() } + } + + /******************************************************************************* + ** Detach every listener and release device/manager resources before relinquishing the application-wide claim. + *******************************************************************************/ + override fun close() { + if (closed) return + closed = true + listener = null + val device = scanner + val owner = manager + scanner = null + manager = null + var failure: Exception? = null + var releaseFailure: Exception? = null + + /******************************************************************************* + ** Attempt every resource release even when an earlier cleanup fails, then propagate the recorded failure. + ** Only a failed device or manager release means ownership is unknown; other failures are still reported. + *******************************************************************************/ + fun attempt(isRelease: Boolean = false, action: () -> Unit) { + try { + action() + } catch (exception: Exception) { + failure = exception + if (isRelease) releaseFailure = exception + } + } + if (device != null) { + attempt { device.removeDataListener(dataListener) } + attempt { device.removeStatusListener(statusListener) } + attempt { if (device.isReadPending) device.cancelRead() } + attempt { check(restoreCodeIdType(device)) { "Scanner output profile restoration could not be verified" } } + attempt(isRelease = true) { device.release() } + } + if (owner != null) { + attempt(isRelease = true) { owner.release(EMDKManager.FEATURE_TYPE.BARCODE) } + attempt(isRelease = true) { owner.release() } + } + // A confirmed device and manager release frees the application-wide claim even when restoring the scanner's + // output format failed; an unconfirmed release keeps it, and a pending asynchronous bind still resolves it later. + if (!opening && releaseFailure == null) releaseClaim() + failure?.let { throw it } + } + + /******************************************************************************* + ** Ask the enabled scanner to prefix each decode with its AIM identifier and prove the resulting format by + ** reading it back, whatever the setter reported. A setter that threw is not trusted either way: the read-back + ** decides. AIM confirmed -> AIM; unchanged or restored-and-verified -> PLAIN; anything else -> false (the caller + ** fails the open), because prefixed text would then be indistinguishable from user data. An unsupported setting + ** changes nothing and leaves AIM absent (PLAIN). Reading the original value may throw; the caller fails the open. + *******************************************************************************/ + private fun applyAimProfile(device: Scanner): Boolean { + val config = device.config + if (!config.isParamSupported("config.scanParams.codeIdType")) { + profile = Profile.PLAIN + return true + } + val original = config.scanParams.codeIdType + originalCodeIdType = original + codeIdTypeChanged = true + config.scanParams.codeIdType = ScannerConfig.CodeIdType.AIM + try { + device.config = config + } catch (exception: Exception) { + android.util.Log.w("Scanner", "AIM output profile could not be applied") + } + val effective = try { + device.config.scanParams.codeIdType + } catch (exception: Exception) { + null + } + return when (classifyAimReadback(original, ScannerConfig.CodeIdType.AIM, effective)) { + AimReadback.CONFIRMED -> { + // Nothing to undo when the scanner already reported AIM before this driver touched it. + codeIdTypeChanged = original != ScannerConfig.CodeIdType.AIM + profile = Profile.AIM + true + } + AimReadback.UNCHANGED -> { + codeIdTypeChanged = false + profile = Profile.PLAIN + true + } + AimReadback.INDETERMINATE -> restoreCodeIdType(device).also { if (it) profile = Profile.PLAIN } + } + } + + /******************************************************************************* + ** Put back the value read before this driver changed it and prove it by reading it back; setter success alone is + ** not proof. The profile is FAILED until proven, so no decode is trusted while the format is indeterminate. + *******************************************************************************/ + private fun restoreCodeIdType(device: Scanner): Boolean { + val original = originalCodeIdType + if (!codeIdTypeChanged || original == null) return true + profile = Profile.FAILED + val verified = try { + val config = device.config + config.scanParams.codeIdType = original + device.config = config + device.config.scanParams.codeIdType == original + } catch (exception: Exception) { + false + } + if (verified) codeIdTypeChanged = false + return verified + } + + /******************************************************************************* + ** Relinquish only this driver's manager claim after asynchronous opening and cleanup are resolved. + *******************************************************************************/ + private fun releaseClaim() { + if (ownsClaim) { + ownsClaim = false; managerClaimed = false + } + } +} diff --git a/scanner-host/src/main/res/drawable-nodpi/query_mascot.png b/scanner-host/src/main/res/drawable-nodpi/query_mascot.png new file mode 100644 index 0000000..84add48 Binary files /dev/null and b/scanner-host/src/main/res/drawable-nodpi/query_mascot.png differ diff --git a/scanner-host/src/main/res/drawable/ic_scanner.xml b/scanner-host/src/main/res/drawable/ic_scanner.xml new file mode 100644 index 0000000..960df1b --- /dev/null +++ b/scanner-host/src/main/res/drawable/ic_scanner.xml @@ -0,0 +1,5 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="48dp" android:height="48dp" android:viewportWidth="48" android:viewportHeight="48"> + <path android:fillColor="#174EA6" android:pathData="M0,0h48v48h-48z" /> + <path android:fillColor="#FFFFFF" android:pathData="M8,8h10v3h-7v7h-3zM30,8h10v10h-3v-7h-7zM8,30h3v7h7v3h-10zM37,30h3v10h-10v-3h7zM15,16h3v16h-3zM21,16h2v16h-2zM26,16h4v16h-4zM33,16h1v16h-1z" /> +</vector> diff --git a/scanner-host/src/main/res/values/company_profile.xml b/scanner-host/src/main/res/values/company_profile.xml new file mode 100644 index 0000000..2a49923 --- /dev/null +++ b/scanner-host/src/main/res/values/company_profile.xml @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <string name="status_wallpaper_label">QQQ status wallpaper</string> + <string name="status_wallpaper_description">Company name on the lock screen. On the unlocked home screen it also shows the signed-in display name and the device IP address.</string> + <string name="restriction_server_url_title">QQQ server URL</string> + <string name="restriction_server_url_description">HTTPS origin only, for example https://qqq.example.com/. No credentials, path, query or fragment. A different connected server is never switched silently.</string> + <string name="restriction_orientation_title">Screen orientation</string> + <string name="restriction_orientation_description">Applied when this value changes; the operator may change it locally afterwards.</string> + <string-array name="restriction_orientation_entries"> + <item>System default</item> + <item>Portrait</item> + <item>Landscape</item> + <item>Reverse portrait</item> + <item>Reverse landscape</item> + </string-array> + <string-array name="restriction_orientation_values"> + <item>SYSTEM</item> + <item>PORTRAIT</item> + <item>LANDSCAPE</item> + <item>REVERSE_PORTRAIT</item> + <item>REVERSE_LANDSCAPE</item> + </string-array> +</resources> diff --git a/scanner-host/src/main/res/xml/app_restrictions.xml b/scanner-host/src/main/res/xml/app_restrictions.xml new file mode 100644 index 0000000..4820aba --- /dev/null +++ b/scanner-host/src/main/res/xml/app_restrictions.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8"?> +<restrictions xmlns:android="http://schemas.android.com/apk/res/android"> + <restriction android:key="qqq_server_url" android:title="@string/restriction_server_url_title" + android:description="@string/restriction_server_url_description" android:restrictionType="string" /> + <restriction android:key="qqq_orientation" android:title="@string/restriction_orientation_title" + android:description="@string/restriction_orientation_description" android:restrictionType="choice" + android:entries="@array/restriction_orientation_entries" android:entryValues="@array/restriction_orientation_values" /> +</restrictions> diff --git a/scanner-host/src/main/res/xml/data_extraction_rules.xml b/scanner-host/src/main/res/xml/data_extraction_rules.xml new file mode 100644 index 0000000..2c6bad3 --- /dev/null +++ b/scanner-host/src/main/res/xml/data_extraction_rules.xml @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="utf-8"?> +<data-extraction-rules> + <cloud-backup> + <exclude domain="root" path="." /> + <exclude domain="file" path="." /> + <exclude domain="database" path="." /> + <exclude domain="sharedpref" path="." /> + <exclude domain="external" path="." /> + </cloud-backup> + <device-transfer> + <exclude domain="root" path="." /> + <exclude domain="file" path="." /> + <exclude domain="database" path="." /> + <exclude domain="sharedpref" path="." /> + <exclude domain="external" path="." /> + </device-transfer> +</data-extraction-rules> diff --git a/scanner-host/src/main/res/xml/photo_paths.xml b/scanner-host/src/main/res/xml/photo_paths.xml new file mode 100644 index 0000000..864e79f --- /dev/null +++ b/scanner-host/src/main/res/xml/photo_paths.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8"?> +<paths xmlns:android="http://schemas.android.com/apk/res/android"> + <cache-path name="record_photos" path="record-photos/" /> +</paths> diff --git a/scanner-host/src/main/res/xml/status_wallpaper.xml b/scanner-host/src/main/res/xml/status_wallpaper.xml new file mode 100644 index 0000000..812e096 --- /dev/null +++ b/scanner-host/src/main/res/xml/status_wallpaper.xml @@ -0,0 +1,3 @@ +<?xml version="1.0" encoding="utf-8"?> +<wallpaper xmlns:android="http://schemas.android.com/apk/res/android" + android:thumbnail="@drawable/ic_scanner" android:description="@string/status_wallpaper_description" /> diff --git a/scanner-host/src/production/java/io/qrun/mobile/scanner/ScannerDriverFactory.kt b/scanner-host/src/production/java/io/qrun/mobile/scanner/ScannerDriverFactory.kt new file mode 100644 index 0000000..af59242 --- /dev/null +++ b/scanner-host/src/production/java/io/qrun/mobile/scanner/ScannerDriverFactory.kt @@ -0,0 +1,33 @@ +/* Copyright (c) 2026 QRunIO. SPDX-License-Identifier: Apache-2.0 */ +package io.qrun.mobile.scanner + +import android.content.ComponentName +import android.content.Context +import android.content.pm.ApplicationInfo + +internal const val HARDWARE_SCAN_SOURCE = "zebra-emdk" + +/******************************************************************************* + ** Never load optional vendor classes on other devices or trust an ordinary installed lookalike. + *******************************************************************************/ +internal fun createScannerDriver(context: Context): ScannerDriver? { + val application = context.applicationContext + val packages = application.packageManager + return try { + if (packages.systemSharedLibraryNames?.contains("com.symbol.emdk") != true) return null + val service = packages.getServiceInfo( + ComponentName( + "com.symbol.emdk.emdkservice", + "com.symbol.emdk.emdkservice.EMDKService" + ), 0 + ) + val systemFlags = ApplicationInfo.FLAG_SYSTEM or ApplicationInfo.FLAG_UPDATED_SYSTEM_APP + if (!service.enabled || !service.applicationInfo.enabled || service.applicationInfo.flags and systemFlags == 0) return null + Class.forName("io.qrun.mobile.scanner.ZebraScannerDriver").getDeclaredConstructor(Context::class.java) + .newInstance(application) as ScannerDriver + } catch (exception: Exception) { + null + } catch (error: LinkageError) { + null + } +} diff --git a/scanner-host/src/qa/AndroidManifest.xml b/scanner-host/src/qa/AndroidManifest.xml new file mode 100644 index 0000000..8d04aca --- /dev/null +++ b/scanner-host/src/qa/AndroidManifest.xml @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="utf-8"?> +<manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools"> + <!-- Isolated production-path acceptance, never the operator's normal package. --> + <queries><package android:name="io.qrun.mobile.scanner.probe" /></queries> + <application android:usesCleartextTraffic="true" android:label="QQQ Mobile QA" + tools:replace="android:usesCleartextTraffic,android:label"> + <!-- Empty host for isolated production-widget instrumentation; not externally launchable. --> + <activity android:name="androidx.activity.ComponentActivity" android:exported="false" /> + </application> +</manifest> diff --git a/scanner-host/src/qaAndroidTest/AndroidManifest.xml b/scanner-host/src/qaAndroidTest/AndroidManifest.xml new file mode 100644 index 0000000..3505ae0 --- /dev/null +++ b/scanner-host/src/qaAndroidTest/AndroidManifest.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8"?> +<manifest xmlns:android="http://schemas.android.com/apk/res/android"> + <queries> + <package android:name="io.qrun.mobile.scanner.probe" /> + <intent><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.HOME" /></intent> + </queries> +</manifest> diff --git a/scanner-host/src/qaAndroidTest/java/io/qrun/mobile/scanner/DeviceScreenAcceptanceTest.kt b/scanner-host/src/qaAndroidTest/java/io/qrun/mobile/scanner/DeviceScreenAcceptanceTest.kt new file mode 100644 index 0000000..e7d14e2 --- /dev/null +++ b/scanner-host/src/qaAndroidTest/java/io/qrun/mobile/scanner/DeviceScreenAcceptanceTest.kt @@ -0,0 +1,391 @@ +/* Copyright (c) 2026 QRunIO. SPDX-License-Identifier: Apache-2.0 */ +package io.qrun.mobile.scanner + +import android.Manifest +import android.app.KeyguardManager +import android.app.NotificationManager +import android.content.Intent +import android.content.pm.PackageManager +import android.graphics.Bitmap +import android.graphics.BitmapFactory +import android.graphics.Color +import android.os.Build +import android.os.Bundle +import android.os.PowerManager +import android.util.Base64 +import androidx.compose.ui.test.hasClickAction +import androidx.compose.ui.test.hasText +import androidx.compose.ui.test.isEnabled +import androidx.compose.ui.test.assertIsEnabled +import androidx.compose.ui.test.junit4.createAndroidComposeRule +import androidx.compose.ui.test.onAllNodesWithTag +import androidx.compose.ui.test.onAllNodesWithText +import androidx.compose.ui.test.onNodeWithTag +import androidx.compose.ui.test.onNodeWithText +import androidx.compose.ui.test.performClick +import androidx.compose.ui.test.performImeAction +import androidx.compose.ui.test.performScrollTo +import androidx.compose.ui.test.performTextReplacement +import androidx.core.content.ContextCompat +import androidx.test.ext.junit.runners.AndroidJUnit4 +import androidx.test.platform.app.InstrumentationRegistry +import java.io.File +import java.net.URI +import java.util.concurrent.TimeUnit +import kotlin.math.abs +import kotlin.math.sqrt +import okhttp3.OkHttpClient +import org.json.JSONObject +import org.junit.Assert.assertEquals +import org.junit.Assert.assertFalse +import org.junit.Assert.assertTrue +import org.junit.Rule +import org.junit.Test +import org.junit.runner.RunWith + +/******************************************************************************* + ** Manual-only acceptance. Android permission UI is exclusively operated by the person holding the TC22. + *******************************************************************************/ +@RunWith(AndroidJUnit4::class) +class DeviceScreenAcceptanceTest { + @get:Rule + val ui = createAndroidComposeRule<ScannerActivity>() + private val instrumentation = InstrumentationRegistry.getInstrumentation() + private val context get() = instrumentation.targetContext + private val client = OkHttpClient.Builder().callTimeout(10, TimeUnit.SECONDS).build() + private lateinit var admin: SessionAcceptanceClient + private lateinit var sessionId: String + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun operatorConsentCapturesHomeAndStopsAtEverySessionBoundary() { + check(context.packageName == "io.qrun.mobile.scanner.qa" && BuildConfig.BUILD_TYPE == "qa") + check(InstrumentationRegistry.getArguments().getString("operatorConsent") == "true") + check(Build.MANUFACTURER.startsWith("Zebra", true) && Build.MODEL.startsWith("TC22", true)) + check( + context.getSystemService(PowerManager::class.java).isInteractive && + !context.getSystemService(KeyguardManager::class.java).isDeviceLocked + ) + val file = File(context.filesDir, "qa-screen.json") + val config = JSONObject(file.readText()) + check(file.delete()) + check(config.getString("purpose") == "device-screen-qa") + val server = URI(config.getString("serverUrl")) + check( + server.scheme == "http" && server.host == "127.0.0.1" && server.port > 0 && + server.userInfo == null && server.query == null && server.fragment == null && server.path == "/" + ) + val origin = server.toString().trimEnd('/') + comparatorControls() + waitFor("QQQ server URL") + ui.onNodeWithText("QQQ server URL").performTextReplacement("$origin/") + click("Connect") + signIn(config.getString("scannerPassword")) + waitFor("An administrator must approve this device before you can run mobile apps.") + val device = DeviceCredentials(context, "$origin/") + admin = SessionAcceptanceClient(origin, SessionAcceptanceClient.login(origin, config.getString("adminPassword"), client), client) + try { + admin.apply("mobileDeviceApprove", JSONObject().put("deviceId", device.deviceId)) + click("Check approval") + await("approved-catalog") { ui.onAllNodesWithTag("appHome.rowForApp:mobileScanApp").fetchSemanticsNodes().isNotEmpty() } + await("initial-session") { + val current = admin.sessions().singleOrNull { it.optString("deviceId") == device.deviceId && it.optString("status") == "ACTIVE" } + if (current != null) sessionId = current.getString("id") + current != null && current.optString("captureMode") == "APP_CONTENT" + } + + consent("initial") + assertDeviceFrame() + stage("screen-app-frame") + val launcher = instrumentation.context.packageManager.resolveActivity( + Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_HOME), + PackageManager.MATCH_DEFAULT_ONLY + )?.activityInfo?.packageName + assertTrue("An unambiguous Android Home launcher must be available", !launcher.isNullOrBlank() && launcher != context.packageName) + stage("screen-home-ready") + await("operator-Home-and-matching-frame", 120) { + val widget = admin.widget(sessionId) // This is the actual administrator's renewable viewing demand. + val atHome = activePackage() == launcher + atHome && !row().optBoolean("foreground") && row().optString("captureMode") == "DEVICE_SCREEN" && + matchesDisplay(SessionAcceptanceClient.image(widget)) + } + stage("screen-home-verified") + + stage("screen-stop-ready") + await("operator-system-Stop", 120) { + // Reading the widget keeps demand alive: only the operator's Stop may end this round. + val image = SessionAcceptanceClient.image(admin.widget(sessionId)) + !row().optBoolean("screenAvailable") && image == null && !projectionNotification() + } + stage("screen-stop-verified") + stage("screen-return-app-ready") + await("operator-return-via-Recents", 120) { activityFocused() } + waitFor("Screen viewing paused") + + consent("expiry") + assertDeviceFrame() + // Deliberately query ONLY the session table here. A widget read would renew the lease under test. + await("viewer-lease-expiry", 60) { !row().optBoolean("screenAvailable") && !projectionNotification() } + assertTrue("Expired viewing demand must purge its frame", SessionAcceptanceClient.image(admin.widget(sessionId)) == null) + waitFor("Screen viewing paused") + stage("screen-expiry-verified") + + consent("logout") + assertDeviceFrame() + admin.apply("mobileSessionEnd", JSONObject().put("sessionId", sessionId)) + await("administrator-session-end") { + row().optString("status") == "ENDED" && !projectionNotification() && + SessionAcceptanceClient.image(admin.widget(sessionId)) == null + } + waitFor("Log back in") + stage("screen-logout-verified") + click("Log back in") + signIn(config.getString("scannerPassword")) + await("fresh-session-without-projection") { + val fresh = admin.sessions().singleOrNull { it.optString("deviceId") == device.deviceId && it.optString("status") == "ACTIVE" } + fresh != null && fresh.getString("id") != sessionId && fresh.optString("captureMode") == "APP_CONTENT" && !projectionNotification() + } + stage("screen-fresh-login-verified") + } finally { + admin.logout() + } + } + + /******************************************************************************* + ** + *******************************************************************************/ + private fun consent(round: String) { + assertFalse("Each round must begin without a running projection", projectionNotification()) + ui.onNodeWithTag("topBar.menuIcon").performClick() + ui.onNodeWithTag("drawer.settings").performClick() + if (Build.VERSION.SDK_INT >= 33 && ContextCompat.checkSelfPermission(context, Manifest.permission.POST_NOTIFICATIONS) != PackageManager.PERMISSION_GRANTED) { + waitFor("Enable sharing notification") + stage("screen-notification-permission-ready") + click("Enable sharing notification") // Own app requests permission; the operator grants/denies Android's dialog. + await("operator-notification-permission", 120) { + ContextCompat.checkSelfPermission(context, Manifest.permission.POST_NOTIFICATIONS) == PackageManager.PERMISSION_GRANTED && activePackage() == context.packageName + } + } + assertTrue("Sharing requires enabled notifications", context.getSystemService(NotificationManager::class.java).areNotificationsEnabled()) + waitFor("Share device screen…") + click("Share device screen…") + waitFor("Share this device screen?") + stage("screen-consent-$round-ready") + click("Continue to Android permission") // Never inspect or click the system permission window. + await("operator-consent-$round", 120) { + admin.widget(sessionId) + row().optString("captureMode") == "DEVICE_SCREEN" && row().optBoolean("screenAvailable") && projectionNotification() && activePackage() == context.packageName + } + stage("screen-consent-$round-granted") + click("Close") + } + + /******************************************************************************* + ** + *******************************************************************************/ + private fun assertDeviceFrame() { + await("actual-device-frame") { + val image = SessionAcceptanceClient.image(admin.widget(sessionId)) + val value = row() + image != null && value.optString("captureMode") == "DEVICE_SCREEN" && value.optBoolean("screenAvailable") && decoded(image) { bitmap -> + bitmap.width in 1..640 && bitmap.height in 1..1280 && nonblank(blocks(bitmap)) + } + } + } + + /******************************************************************************* + ** + *******************************************************************************/ + private fun row() = admin.sessions().single { it.getString("id") == sessionId } + + /******************************************************************************* + ** + *******************************************************************************/ + private fun projectionNotification() = context.getSystemService(NotificationManager::class.java).activeNotifications.any { + it.notification.channelId == "qqq-device-screen" + } + + /******************************************************************************* + ** + *******************************************************************************/ + private fun activityFocused(): Boolean { + var focused = false + instrumentation.runOnMainSync { focused = ui.activity.hasWindowFocus() } + return focused + } + + /******************************************************************************* + ** + *******************************************************************************/ + private fun activePackage(): String? { + val root = instrumentation.uiAutomation.rootInActiveWindow ?: return null + return try { + root.packageName?.toString() + } finally { + @Suppress("DEPRECATION") root.recycle() + } + } + + /******************************************************************************* + ** + *******************************************************************************/ + private fun signIn(password: String) { + waitFor("Username") + ui.onNodeWithText("Username").performTextReplacement("scanner") + ui.onNodeWithText("Password").performTextReplacement(password) + ui.onNodeWithText("Password").performImeAction() + click("Sign in", scroll = true) + } + + /******************************************************************************* + ** + *******************************************************************************/ + private fun click(text: String, scroll: Boolean = false) { + if (text == "Log back in") await("completed-logout", 15) { + ui.onAllNodesWithText("Signed out.").fetchSemanticsNodes().isNotEmpty() || + ui.onAllNodesWithText("Signed out on this device.", substring = true).fetchSemanticsNodes().isNotEmpty() + } + await("enabled-app-control", 15) { + ui.onAllNodes(hasText(text, substring = false) and hasClickAction() and isEnabled()).fetchSemanticsNodes().isNotEmpty() + } + val node = ui.onNode(hasText(text, substring = false) and hasClickAction()) + if (scroll) node.performScrollTo() + node.assertIsEnabled().performClick() + } + + /******************************************************************************* + ** + *******************************************************************************/ + private fun waitFor(text: String) = await("app-control") { ui.onAllNodesWithText(text, substring = false).fetchSemanticsNodes().isNotEmpty() } + + /******************************************************************************* + ** + *******************************************************************************/ + private fun stage(name: String) = instrumentation.sendStatus(0, Bundle().apply { putString("qqqStage", name) }) + + /******************************************************************************* + ** + *******************************************************************************/ + private fun await(name: String, seconds: Long = 40, predicate: () -> Boolean) { + val deadline = System.nanoTime() + TimeUnit.SECONDS.toNanos(seconds) + var previous = System.nanoTime() + do { + val now = System.nanoTime() + ui.mainClock.advanceTimeBy(TimeUnit.NANOSECONDS.toMillis(now - previous).coerceAtLeast(16)) + previous = now + if (predicate()) return + Thread.sleep(250) + } while (System.nanoTime() < deadline) + throw AssertionError("Device-screen stage did not complete within its bound: $name") + } + + /******************************************************************************* + ** + *******************************************************************************/ + private fun decoded(image: String, predicate: (Bitmap) -> Boolean): Boolean { + val bytes = Base64.decode(image.substringAfter(','), Base64.DEFAULT) + val bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.size) ?: return false + return try { + predicate(bitmap) + } finally { + bitmap.recycle() + } + } + + /******************************************************************************* + ** Display pixels are an independent in-memory oracle, never uploaded or written as an artifact. + *******************************************************************************/ + private fun matchesDisplay(image: String?): Boolean { + if (image == null) return false + val before = instrumentation.uiAutomation.takeScreenshot() ?: return false + try { + val first = blocks(before) + if (!nonblank(first)) return false + val agrees = decoded(image) { frame -> + frame.width in 1..640 && frame.height in 1..1280 && + abs(frame.width.toDouble() / frame.height - before.width.toDouble() / before.height) < 0.01 && + compatible(first, blocks(frame)) + } + val after = instrumentation.uiAutomation.takeScreenshot() ?: return false + return try { + agrees && error(first, blocks(after)).maxOrNull()!! <= 3.0 + } finally { + after.recycle() + } + } finally { + before.recycle() + } + } + + // 24x40 spatial block means preserve launcher structure while averaging JPEG ringing and resize interpolation. + // Exclude outer10% (status/navigation/consent indicators); require mean RGB error<=12/255 and95%<=24/255. + // This deliberately fails changed layouts/blank screens; it is not a perceptual hash or exact-pixel claim. + /******************************************************************************* + ** + *******************************************************************************/ + private fun blocks(bitmap: Bitmap): DoubleArray { + val result = DoubleArray(24 * 40 * 3) + for (y in 0 until 40) for (x in 0 until 24) { + val left = (bitmap.width * (0.1 + 0.8 * x / 24)).toInt() + val right = (bitmap.width * (0.1 + 0.8 * (x + 1) / 24)).toInt().coerceAtLeast(left + 1) + val top = (bitmap.height * (0.1 + 0.8 * y / 40)).toInt() + val bottom = (bitmap.height * (0.1 + 0.8 * (y + 1) / 40)).toInt().coerceAtLeast(top + 1) + val i = (y * 24 + x) * 3 + for (py in top until bottom) for (px in left until right) { + val pixel = bitmap.getPixel(px, py) + result[i] = result[i] + Color.red(pixel).toDouble() + result[i + 1] = result[i + 1] + Color.green(pixel).toDouble() + result[i + 2] = result[i + 2] + Color.blue(pixel).toDouble() + } + val count = (right - left) * (bottom - top) + for (channel in 0..2) result[i + channel] = result[i + channel] / count.toDouble() + } + return result + } + + /******************************************************************************* + ** + *******************************************************************************/ + private fun nonblank(values: DoubleArray): Boolean { + // Spatial variation, not variation between RGB channels: a solid red frame must also fail. + return (0..2).any { channel -> + val samples = values.indices.filter { it % 3 == channel }.map { values[it] } + val average = samples.average() + sqrt(samples.map { (it - average) * (it - average) }.average()) >= 18.0 && + samples.maxOrNull()!! - samples.minOrNull()!! >= 48.0 + } + } + + /******************************************************************************* + ** + *******************************************************************************/ + private fun error(first: DoubleArray, second: DoubleArray) = first.indices.map { abs(first[it] - second[it]) }.sorted() + + /******************************************************************************* + ** + *******************************************************************************/ + private fun compatible(first: DoubleArray, second: DoubleArray): Boolean { + val errors = error(first, second) + return nonblank(first) && nonblank(second) && errors.average() <= 12.0 && errors[(errors.size * 0.95).toInt()] <= 24.0 + } + + /******************************************************************************* + ** + *******************************************************************************/ + private fun comparatorControls() { + val pattern = Bitmap.createBitmap(240, 400, Bitmap.Config.ARGB_8888) + val blank = Bitmap.createBitmap(240, 400, Bitmap.Config.ARGB_8888) + try { + for (y in 0 until pattern.height) for (x in 0 until pattern.width) + pattern.setPixel(x, y, if ((x / 24 + y / 40) % 2 == 0) Color.WHITE else Color.BLACK) + val reference = blocks(pattern) + assertTrue("Comparator accepts identical nonblank control", compatible(reference, reference)) + assertFalse("Comparator rejects blank frame", compatible(reference, blocks(blank))) + assertFalse("Comparator rejects a wrong spatial layout", compatible(reference, reference.map { 255.0 - it }.toDoubleArray())) + } finally { + pattern.recycle(); blank.recycle() + } + } +} diff --git a/scanner-host/src/qaAndroidTest/java/io/qrun/mobile/scanner/ScannerInjectionTest.kt b/scanner-host/src/qaAndroidTest/java/io/qrun/mobile/scanner/ScannerInjectionTest.kt new file mode 100644 index 0000000..674e101 --- /dev/null +++ b/scanner-host/src/qaAndroidTest/java/io/qrun/mobile/scanner/ScannerInjectionTest.kt @@ -0,0 +1,377 @@ +/* Copyright (c) 2026 QRunIO. SPDX-License-Identifier: Apache-2.0 */ +package io.qrun.mobile.scanner + +import android.app.KeyguardManager +import android.content.BroadcastReceiver +import android.content.ComponentName +import android.content.Context +import android.content.Intent +import android.content.IntentFilter +import android.content.pm.PackageManager +import android.os.Bundle +import android.os.PowerManager +import androidx.compose.ui.test.assertIsDisplayed +import androidx.compose.ui.test.assertIsEnabled +import androidx.compose.ui.test.hasClickAction +import androidx.compose.ui.test.hasText +import androidx.compose.ui.test.junit4.createAndroidComposeRule +import androidx.compose.ui.test.onAllNodesWithText +import androidx.compose.ui.test.onNodeWithTag +import androidx.compose.ui.test.onNodeWithText +import androidx.compose.ui.test.performClick +import androidx.compose.ui.test.performImeAction +import androidx.compose.ui.test.performScrollTo +import androidx.compose.ui.test.performTextReplacement +import androidx.core.content.ContextCompat +import androidx.lifecycle.Lifecycle +import androidx.test.ext.junit.runners.AndroidJUnit4 +import androidx.test.platform.app.InstrumentationRegistry +import java.io.File +import java.net.URI +import java.security.MessageDigest +import java.util.UUID +import java.util.concurrent.CountDownLatch +import java.util.concurrent.TimeUnit +import java.util.concurrent.atomic.AtomicReference +import okhttp3.Credentials +import okhttp3.MediaType.Companion.toMediaType +import okhttp3.MultipartBody +import okhttp3.OkHttpClient +import okhttp3.Request +import okhttp3.RequestBody.Companion.toRequestBody +import org.json.JSONObject +import org.junit.Assert.assertEquals +import org.junit.Assert.assertFalse +import org.junit.Assert.assertTrue +import org.junit.Rule +import org.junit.Test +import org.junit.runner.RunWith + +/******************************************************************************* + ** Real production scanner factory + separate ordinary UID. Only the disposable .qa host is permitted. + *******************************************************************************/ +@RunWith(AndroidJUnit4::class) +class ScannerInjectionTest { + @get:Rule + val ui = createAndroidComposeRule<ScannerActivity>() + private val client = OkHttpClient.Builder().callTimeout(20, TimeUnit.SECONDS).build() + private lateinit var origin: String + private lateinit var adminCookie: String + private val probePackage = "io.qrun.mobile.scanner.probe" + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun unrelatedUidCannotSubmitAProductionScan() { + val instrumentation = InstrumentationRegistry.getInstrumentation() + val context = instrumentation.targetContext + check(context.packageName == "io.qrun.mobile.scanner.qa" && BuildConfig.BUILD_TYPE == "qa") + assertEquals("QA must compile the production factory", "zebra-emdk", HARDWARE_SCAN_SOURCE) + check(android.os.Build.VERSION.SDK_INT >= 28) + val packages = context.packageManager + val probe = packages.getPackageInfo(probePackage, PackageManager.GET_SIGNING_CERTIFICATES or PackageManager.GET_PERMISSIONS) + val target = packages.getPackageInfo(context.packageName, PackageManager.GET_SIGNING_CERTIFICATES) + val probeUid = requireNotNull(probe.applicationInfo).uid + assertTrue("Probe must have an ordinary unrelated UID", probeUid >= 10000 && probeUid != context.applicationInfo.uid) + assertTrue("Probe may not hold target or network permissions", probe.requestedPermissions.isNullOrEmpty()) + /******************************************************************************* + ** + *******************************************************************************/ + fun signers(info: android.content.pm.PackageInfo) = requireNotNull(info.signingInfo).apkContentsSigners + .map { MessageDigest.getInstance("SHA-256").digest(it.toByteArray()).toList() }.toSet() + assertTrue("Root must re-sign the probe with a distinct throwaway test key", signers(probe).intersect(signers(target)).isEmpty()) + + val configFile = File(context.filesDir, "qa-injection.json") + val config = JSONObject(configFile.readText()) + configFile.delete() + val expectedBarcode = if (config.has("expectedBarcode")) { + val value = config.get("expectedBarcode") + check(value is String && value.length in 1..4096 && value.all { it.code in 32..126 }) + value + } else null + val server = URI(config.getString("serverUrl")) + check( + server.scheme == "http" && server.host == "127.0.0.1" && server.port > 0 && + server.userInfo == null && server.query == null && server.fragment == null && server.path == "/" + ) + origin = server.toString().trimEnd('/') + waitFor("QQQ server URL") + ui.onNodeWithText("QQQ server URL").performTextReplacement("$origin/") + ui.onNodeWithText("Connect", substring = false).performClick() + waitFor("Username") + ui.onNodeWithText("Username").performTextReplacement("scanner") + ui.onNodeWithText("Password").performTextReplacement(config.getString("scannerPassword")) + ui.onNodeWithText("Password").performImeAction() + ui.onNode(hasText("Sign in") and hasClickAction()).performScrollTo().assertIsDisplayed().assertIsEnabled().performClick() + waitFor("An administrator must approve this device before you can run mobile apps.") + val device = DeviceCredentials(context, "$origin/") + adminCookie = client.newCall( + Request.Builder().url("$origin/qqq/v1/manageSession") + .header("Authorization", Credentials.basic("admin", config.getString("adminPassword"))) + .post("{}".toRequestBody("application/json".toMediaType())).build() + ).execute().use { + assertEquals(200, it.code) + it.headers("Set-Cookie").first { cookie -> cookie.startsWith("sessionUUID=") }.substringBefore(';') + } + val launch = process("mobileDeviceApprove", "/init", JSONObject()) + val id = launch.getString("processUUID") + val applied = process("mobileDeviceApprove", "/$id/step/input", JSONObject().put("deviceId", device.deviceId)) + if (applied.optString("nextStep") == "result") process("mobileDeviceApprove", "/$id/step/result", JSONObject()) + ui.onNodeWithText("Check approval").performScrollTo().performClick() + waitForTag("appHome.rowForApp:mobileScanApp") + ui.onNodeWithTag("appHome.rowForApp:mobileScanApp").performClick() + waitForTag("appHome.rowForProcess:mobileScanCapture") + ui.onNodeWithTag("appHome.rowForProcess:mobileScanCapture").performClick() + waitFor("Scanner ready. Press the handheld trigger.") + val control = "manual-control-${UUID.randomUUID()}" + ui.onNodeWithText("Manual barcode").performScrollTo().performTextReplacement(control) + ui.onNodeWithText("Manual barcode").performImeAction() + ui.onNodeWithText("Submit barcode").performScrollTo().performClick() + waitFor("Saved scan ", substring = true) + waitFor("Scanner ready. Press the handheld trigger.") + val before = scans() + assertEquals(1, before.count { it.optString("barcode") == control && it.optString("scanSource") == "manual" }) + foreground(context) + + val marker = "probe-${UUID.randomUUID()}" + val routed = java.util.concurrent.CopyOnWriteArrayList<Intent>() + val delivered = CountDownLatch(4) + // Route control in instrumentation only; it observes payloads and NEVER invokes a process/driver. + val observer = object : BroadcastReceiver() { + /******************************************************************************* + ** + *******************************************************************************/ + override fun onReceive(receiverContext: Context?, intent: Intent?) { + if (intent?.getStringExtra("com.symbol.datawedge.data_string")?.startsWith("$marker-route-") == true) { + routed.add(Intent(intent)) + delivered.countDown() + } + } + } + instrumentation.sendStatus(0, Bundle().apply { putString("qqqStage", "injection-baseline") }) + ContextCompat.registerReceiver(context, observer, IntentFilter("io.qrun.mobile.scanner.SCAN").apply { + addCategory(Intent.CATEGORY_DEFAULT) + }, ContextCompat.RECEIVER_EXPORTED) + try { + emitProbe(context, "$marker-route", probeUid) + assertTrue("Actual SCAN payload must reach the route observer", delivered.await(10, TimeUnit.SECONDS)) + assertEquals((0 until 4).map { "$marker-route-$it" }.toSet(), routed.map { it.getStringExtra("com.symbol.datawedge.data_string") }.toSet()) + assertTrue(routed.all { + it.action == "io.qrun.mobile.scanner.SCAN" && + it.getStringExtra("com.symbol.datawedge.label_type") == "LABEL-TYPE-CODE128" && + it.getStringExtra("com.symbol.datawedge.decode_mode") == "single" + }) + foreground(context) + } finally { + context.unregisterReceiver(observer) + } + // The route observer is absent during the actual negative attempt. + emitProbe(context, "$marker-negative", probeUid) + val deadline = System.nanoTime() + TimeUnit.SECONDS.toNanos(3) + while (System.nanoTime() < deadline) { + foreground(context); Thread.sleep(100) + } + val after = scans() + assertEquals("Unrelated-UID broadcasts must not create any scan", before.size, after.size) + assertFalse(after.any { it.optString("barcode").startsWith(marker) }) + waitFor("Scanner ready. Press the handheld trigger.") + foreground(context) + instrumentation.sendStatus(0, Bundle().apply { + putString("qqqStage", "injection-complete") + putInt("qqqProbeUid", probeUid) + putInt("qqqTargetUid", context.applicationInfo.uid) + putInt("qqqForgedScanCount", 8) + }) + if (expectedBarcode != null) { + val events = mutableSetOf<String>() + physicalScan(context, device.deviceId, expectedBarcode, "initial", after.size, events) + ui.activityRule.scenario.recreate() + physicalScan(context, device.deviceId, expectedBarcode, "recreated", after.size + 1, events) + // Exercise only this disposable Activity's real stop/resume lifecycle, without touching other apps/settings. + ui.activityRule.scenario.moveToState(Lifecycle.State.CREATED) + Thread.sleep(500) + ui.activityRule.scenario.moveToState(Lifecycle.State.RESUMED) + physicalScan(context, device.deviceId, expectedBarcode, "resumed", after.size + 2, events) + assertEquals(3, events.size) + instrumentation.sendStatus(0, Bundle().apply { + putString("qqqStage", "hardware-complete") + putInt("qqqHardwareScans", 3) + putString("qqqHardwareEventIds", events.joinToString(",")) + }) + } + } + + /******************************************************************************* + ** + *******************************************************************************/ + private fun physicalScan( + context: Context, deviceId: String, expectedBarcode: String, phase: String, + expectedBefore: Int, events: MutableSet<String> + ) { + waitFor("Scanner ready. Press the handheld trigger.") + foreground(context) + val before = scans() + assertEquals("No extra scan may occur between operator phases", expectedBefore, before.size) + val priorIds = before.map { it.getString("id") }.toSet() + val priorEvents = before.map { it.getString("eventId") }.toSet() + val deadline = System.nanoTime() + TimeUnit.SECONDS.toNanos(120) + + /******************************************************************************* + ** + *******************************************************************************/ + fun remainingMillis() = TimeUnit.NANOSECONDS.toMillis(deadline - System.nanoTime()).coerceAtLeast(1) + + /******************************************************************************* + ** + *******************************************************************************/ + fun pollScans(stage: String): List<JSONObject> { + val remaining = remainingMillis() + // Do not start a near-deadline 1ms HTTP call that hides the actual operator wait failure. + if (remaining < 1000) { + Thread.sleep(remaining) + throw AssertionError("Physical trigger deadline reached during $stage; no additional polling budget remains") + } + return try { + scans(remaining.coerceAtMost(20_000)) + } catch (error: java.io.InterruptedIOException) { + if (System.nanoTime() >= deadline) + throw AssertionError("Physical trigger deadline reached during $stage; the final status poll did not complete", error) + throw error + } + } + InstrumentationRegistry.getInstrumentation().sendStatus(0, Bundle().apply { putString("qqqStage", "hardware-$phase-ready") }) + var saved: JSONObject? = null + while (saved == null) { + assertTrue("Timed out waiting for the operator's physical trigger", System.nanoTime() < deadline) + foreground(context, remainingMillis().coerceAtMost(5000)) + val current = pollScans("waiting for the operator's acknowledged scan") + val added = current.filter { it.getString("id") !in priorIds } + assertTrue("One trigger must not create multiple records", added.size <= 1 && current.size <= before.size + 1) + if (added.isNotEmpty()) saved = added.single() else Thread.sleep(200) + } + val row = requireNotNull(saved) + assertTrue("Hardware barcode must exactly match the configured synthetic value", row.getString("barcode") == expectedBarcode) + assertEquals("zebra-emdk", row.getString("scanSource")) + assertTrue("Hardware scan must belong to the approved QA device", row.getString("deviceId") == deviceId) + assertEquals("scanner", row.getString("userId")) + val event = row.getString("eventId") + UUID.fromString(event) + assertTrue("Each physical trigger needs its own event identity", event !in priorEvents && events.add(event)) + waitFor("Saved scan ${row.getString("id")}", timeoutMillis = remainingMillis()) + waitFor("Scanner ready. Press the handheld trigger.", timeoutMillis = remainingMillis()) + assertEquals(before.size + 1, pollScans("final saved-scan verification").size) + foreground(context, remainingMillis().coerceAtMost(5000)) + InstrumentationRegistry.getInstrumentation().sendStatus(0, Bundle().apply { putString("qqqStage", "hardware-$phase-saved") }) + } + + /******************************************************************************* + ** + *******************************************************************************/ + private fun emitProbe(context: Context, marker: String, probeUid: Int) { + val completed = CountDownLatch(1) + val result = AtomicReference<Bundle?>() + context.sendOrderedBroadcast( + Intent("io.qrun.mobile.scanner.probe.EMIT") + .setComponent(ComponentName(probePackage, "$probePackage.ScanProbeReceiver")) + .putExtra("targetPackage", context.packageName).putExtra("marker", marker), null, + object : BroadcastReceiver() { + /******************************************************************************* + ** + *******************************************************************************/ + override fun onReceive(receiverContext: Context?, intent: Intent?) { + result.set(getResultExtras(false)?.apply { putInt("resultCode", resultCode) }) + completed.countDown() + } + }, null, 0, null, null + ) + assertTrue("Separate probe must finish", completed.await(10, TimeUnit.SECONDS)) + assertEquals(1, result.get()?.getInt("resultCode")) + assertEquals(probeUid, result.get()?.getInt("senderUid")) + assertEquals(4, result.get()?.getInt("sent")) + assertEquals(marker, result.get()?.getString("marker")) + } + + /******************************************************************************* + ** + *******************************************************************************/ + private fun foreground(context: Context, timeoutMillis: Long = 5000) { + val deadline = System.nanoTime() + TimeUnit.MILLISECONDS.toNanos(timeoutMillis) + var ready = false + var flags = "unavailable" + do { + ui.activityRule.scenario.onActivity { + val resumed = it.lifecycle.currentState.isAtLeast(Lifecycle.State.RESUMED) + val focused = it.window.decorView.hasWindowFocus() + val interactive = context.getSystemService(PowerManager::class.java).isInteractive + val locked = context.getSystemService(KeyguardManager::class.java).isKeyguardLocked + flags = "resumed=$resumed, focused=$focused, interactive=$interactive, locked=$locked" + ready = resumed && focused && interactive && !locked + } + if (ready) return + val remaining = TimeUnit.NANOSECONDS.toMillis(deadline - System.nanoTime()) + if (remaining > 0) Thread.sleep(remaining.coerceAtMost(50)) + } while (System.nanoTime() < deadline) + assertTrue("Target must regain resumed, unlocked foreground focus: $flags", ready) + } + + /******************************************************************************* + ** + *******************************************************************************/ + private fun scans(timeoutMillis: Long = 20_000): List<JSONObject> { + val rows = json( + Request.Builder().url("$origin/qqq/v1/table/mobileScan/query").header("Cookie", adminCookie) + .post("{}".toRequestBody("application/json".toMediaType())).build(), timeoutMillis + ).getJSONArray("records") + return (0 until rows.length()).map { rows.getJSONObject(it).getJSONObject("values") } + } + + /******************************************************************************* + ** + *******************************************************************************/ + private fun process(name: String, suffix: String, values: JSONObject): JSONObject { + var result = json( + Request.Builder().url("$origin/qqq/v1/processes/$name$suffix").header("Cookie", adminCookie) + .post( + MultipartBody.Builder().setType(MultipartBody.FORM).addFormDataPart("values", values.toString()) + .addFormDataPart("stepTimeoutMillis", "10000").build() + ).build() + ) + val processId = result.optString("processUUID") + val jobId = result.optString("jobUUID") + val deadline = System.nanoTime() + TimeUnit.SECONDS.toNanos(30) + while (result.optString("type") in listOf("JOB_STARTED", "RUNNING")) { + assertTrue(System.nanoTime() < deadline) + Thread.sleep(50) + result = json(Request.Builder().url("$origin/qqq/v1/processes/$name/$processId/status/$jobId").header("Cookie", adminCookie).build()) + } + assertFalse(result.has("error")) + return result + } + + /******************************************************************************* + ** + *******************************************************************************/ + private fun json(request: Request, timeoutMillis: Long = 20_000): JSONObject { + val call = client.newCall(request) + call.timeout().timeout(timeoutMillis, TimeUnit.MILLISECONDS) + return call.execute().use { + assertEquals("Semantic fixture request must succeed", 200, it.code) + JSONObject(requireNotNull(it.body).string()) + } + } + + /******************************************************************************* + ** + *******************************************************************************/ + private fun waitFor(text: String, substring: Boolean = false, timeoutMillis: Long = 60_000) { + ui.waitUntil(timeoutMillis) { ui.onAllNodesWithText(text, substring = substring).fetchSemanticsNodes().isNotEmpty() } + } + + /******************************************************************************* + ** + *******************************************************************************/ + private fun waitForTag(tag: String) { + ui.waitUntil(60_000) { runCatching { ui.onNodeWithTag(tag).fetchSemanticsNode() }.isSuccess } + } +} diff --git a/scanner-host/src/qaAndroidTest/java/io/qrun/mobile/scanner/ScannerOverlayTest.kt b/scanner-host/src/qaAndroidTest/java/io/qrun/mobile/scanner/ScannerOverlayTest.kt new file mode 100644 index 0000000..60a399b --- /dev/null +++ b/scanner-host/src/qaAndroidTest/java/io/qrun/mobile/scanner/ScannerOverlayTest.kt @@ -0,0 +1,411 @@ +/* Copyright (c) 2026 QRunIO. SPDX-License-Identifier: Apache-2.0 */ +package io.qrun.mobile.scanner + +import android.content.Context +import android.view.KeyEvent +import androidx.activity.ComponentActivity +import androidx.lifecycle.viewModelScope +import androidx.compose.material3.AlertDialog +import androidx.compose.material3.Text +import androidx.compose.material3.TextButton +import androidx.compose.runtime.CompositionLocalProvider +import androidx.compose.runtime.SideEffect +import androidx.compose.runtime.mutableStateOf +import androidx.compose.ui.test.ComposeTimeoutException +import androidx.compose.ui.test.assertIsDisplayed +import androidx.compose.ui.test.assertIsNotDisplayed +import androidx.compose.ui.test.assertTextContains +import androidx.compose.ui.test.onAllNodesWithText +import androidx.compose.ui.test.onNodeWithContentDescription +import androidx.compose.ui.test.onNodeWithTag +import androidx.compose.ui.test.onNodeWithText +import androidx.compose.ui.test.performClick +import androidx.compose.ui.test.performImeAction +import androidx.compose.ui.test.performTextReplacement +import androidx.compose.ui.test.junit4.createAndroidComposeRule +import androidx.navigation.compose.rememberNavController +import androidx.core.view.ViewCompat +import androidx.core.view.WindowInsetsCompat +import androidx.test.platform.app.InstrumentationRegistry +import com.kingsrook.qqq.frontend.android.core.controllers.QQQRepository +import com.kingsrook.qqq.frontend.android.core.model.Environment +import com.kingsrook.qqq.frontend.android.core.model.metadata.QAppMetaData +import com.kingsrook.qqq.frontend.android.core.model.metadata.QAppNodeType +import com.kingsrook.qqq.frontend.android.core.model.metadata.QAppSection +import com.kingsrook.qqq.frontend.android.core.model.metadata.QAppTreeNode +import com.kingsrook.qqq.frontend.android.core.model.metadata.QComponentType +import com.kingsrook.qqq.frontend.android.core.model.metadata.QFrontendComponent +import com.kingsrook.qqq.frontend.android.core.model.metadata.QFrontendStepMetaData +import com.kingsrook.qqq.frontend.android.core.model.metadata.QInstance +import com.kingsrook.qqq.frontend.android.core.model.metadata.QProcessMetaData +import com.kingsrook.qqq.frontend.android.core.model.metadata.authentication.BaseAuthenticationMetaData +import com.kingsrook.qqq.frontend.android.core.model.metadata.authentication.FullyAnonymousAuthenticationMetaData +import com.kingsrook.qqq.frontend.android.core.model.metadata.authentication.ManageSessionRequest +import com.kingsrook.qqq.frontend.android.core.model.metadata.authentication.ManageSessionResponse +import com.kingsrook.qqq.frontend.android.core.model.processes.ProcessStepResult +import com.kingsrook.qqq.frontend.android.core.model.processes.QJobComplete +import com.kingsrook.qqq.frontend.android.mobileapp.QMobileAppMain +import com.kingsrook.qqq.frontend.android.mobileapp.data.MockPreferencesDataStore +import com.kingsrook.qqq.frontend.android.mobileapp.container.QAppContainer +import com.kingsrook.qqq.frontend.android.mobileapp.ui.LocalCustomWidgetRenderer +import com.kingsrook.qqq.frontend.android.mobileapp.ui.LocalProcessInputAllowed +import com.kingsrook.qqq.frontend.android.mobileapp.viewmodel.QViewModel +import org.junit.Assert.assertEquals +import org.junit.Assert.assertNull +import org.junit.Assert.assertSame +import org.junit.Assert.assertTrue +import org.junit.After +import org.junit.Before +import org.junit.Rule +import org.junit.Test +import kotlinx.coroutines.cancel +import java.util.concurrent.atomic.AtomicReference + +/******************************************************************************* + ** Production widget and navigation surfaces; only the private hardware driver is synthetic. + *******************************************************************************/ +class ScannerOverlayTest { + @get:Rule + val ui = createAndroidComposeRule<ComponentActivity>() + private var previousEnvironments: List<Environment>? = null + private var fixtureModel: QViewModel? = null + + /******************************************************************************* + ** + *******************************************************************************/ + @Before + fun configureSyntheticEnvironment() { + previousEnvironments = runCatching { QAppContainer.availableEnvironments }.getOrNull() + QAppContainer.availableEnvironments = listOf(Environment("QA overlay", "https://overlay.invalid/")) + } + + /******************************************************************************* + ** + *******************************************************************************/ + @After + fun disposeSyntheticEnvironment() { + ui.activityRule.scenario.onActivity { + fixtureModel?.activeProcessViewModel?.reset() + fixtureModel?.viewModelScope?.cancel() + fixtureModel = null + QAppContainer.availableEnvironments = previousEnvironments ?: listOf(Environment("Unconfigured", "https://unused.invalid/")) + } + } + + /******************************************************************************* + ** + *******************************************************************************/ + private class Device : ScannerDriver { + lateinit var listener: ScannerDriver.Listener + var pending = false + var closed = false + var reads = 0 + var cancels = 0 + + /******************************************************************************* + ** + *******************************************************************************/ + override fun open(listener: ScannerDriver.Listener) { + this.listener = listener; listener.idle() + } + + /******************************************************************************* + ** + *******************************************************************************/ + override fun isReadPending() = pending + + /******************************************************************************* + ** + *******************************************************************************/ + override fun read() { + check(!closed); reads++; pending = true + } + + /******************************************************************************* + ** + *******************************************************************************/ + override fun cancelRead() { + cancels++; pending = false; listener.idle() + } + + /******************************************************************************* + ** + *******************************************************************************/ + override fun close() { + closed = true; pending = false + } + + /******************************************************************************* + ** + *******************************************************************************/ + fun emit(value: String) { + pending = false; listener.scanned(ScannerCapture.of(value, "QRCODE")); listener.idle() + } + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun overlaysAndLostWindowFocusBlockScansWithoutLosingDraftOrTrappingResume() { + check(InstrumentationRegistry.getInstrumentation().targetContext.packageName == "io.qrun.mobile.scanner.qa") + val repository = Repository() + val model = QViewModel(repository, MockPreferencesDataStore()).apply { supportedCustomWidgetTypes = setOf("SCANNER") } + fixtureModel = model + val devices = mutableListOf<Device>() + val driverFactory: (Context) -> ScannerDriver? = { Device().also { devices.add(it) } } + val externalDialog = mutableStateOf(false) + val parentAllowed = mutableStateOf(true) + val observedInputAllowed = AtomicReference<(() -> Boolean)?>(null) + ui.setContent { + model.setNavController(rememberNavController()) + CompositionLocalProvider( + LocalProcessInputAllowed provides { parentAllowed.value }, + LocalCustomWidgetRenderer provides { parameters, modifier, disabled -> + if (parameters.widgetBlock.blockType == "SCANNER") { + val availability = LocalProcessInputAllowed.current + SideEffect { observedInputAllowed.set(availability) } + ScannerWidget(parameters, modifier, disabled, driverFactory) + true + } else false + }) { QMobileAppMain(model, "Scanner overlay test", showNetworkDialog = false) } + // Deliberately outside semantic availability: proves actual window focus is independently checked. + if (externalDialog.value) AlertDialog( + onDismissRequest = { externalDialog.value = false }, + title = { Text("External window") }, confirmButton = { + TextButton(onClick = { externalDialog.value = false }) { Text("Close external") } + }) + } + waitFor("Log In") + ui.onNodeWithText("Log In").performClick() + ui.waitUntil(5000) { model.isAuthenticated } + ui.onNodeWithTag("appHome.rowForApp:app").performClick() + ui.onNodeWithTag("appHome.rowForProcess:scan").performClick() + /******************************************************************************* + ** + *******************************************************************************/ + fun imeHidden() = ViewCompat.getRootWindowInsets(ui.activity.window.decorView) + ?.isVisible(WindowInsetsCompat.Type.ime()) == false + + /******************************************************************************* + ** + *******************************************************************************/ + fun ready(phase: String) { + try { + ui.waitUntil(5000) { devices.lastOrNull()?.pending == true && ui.activity.hasWindowFocus() } + } catch (error: ComposeTimeoutException) { + val drawerVisible = runCatching { ui.onNodeWithTag("drawer.settings").assertIsDisplayed(); true }.getOrDefault(false) + val closeVisible = runCatching { ui.onNodeWithText("Close").assertIsDisplayed(); true }.getOrDefault(false) + var flags = "unavailable" + ui.activityRule.scenario.onActivity { activity -> + val device = devices.lastOrNull() + flags = "focus=${activity.hasWindowFocus()}, lifecycle=${activity.lifecycle.currentState}, " + + "imeHidden=${imeHidden()}, inputAllowed=${observedInputAllowed.get()?.invoke()}, " + + "driverPending=${device?.pending}, driverClosed=${device?.closed}, reads=${device?.reads}, cancels=${device?.cancels}, " + + "drivers=${devices.size}, drawerVisible=$drawerVisible, closeVisible=$closeVisible, " + + "waiting=${model.activeProcessViewModel?.waitingOnBackend}, pendingEvent=${model.activeProcessViewModel?.pendingStepValues != null}, " + + "leaveOpen=${model.qNavigator.leaveRequest != null}, parentAllowed=${parentAllowed.value}" + } + throw AssertionError("Scanner did not resume at $phase: $flags", error) + } + } + + /******************************************************************************* + ** + *******************************************************************************/ + fun reject() { + val count = repository.events.size + ui.runOnIdle { devices.last().emit("blocked") } + ui.waitForIdle() + assertEquals("Overlay must not submit a step", count, repository.events.size) + } + + /******************************************************************************* + ** + *******************************************************************************/ + fun resumeAndScan(phase: String) { + ready(phase) + ui.onNodeWithText("Manual barcode").assertTextContains("draft") + val count = repository.events.size + ui.runOnIdle { devices.last().emit("00123") } + ui.waitUntil(5000) { repository.events.size == count + 1 && model.activeProcessViewModel?.pendingStepValues == null } + ready("$phase-acknowledged") + } + + /******************************************************************************* + ** + *******************************************************************************/ + fun seedDraft(phase: String) { + // Each successful scan submits/remounts the step; preservation applies within that step. + ready("$phase-before-overlay") + ui.onNodeWithText("Manual barcode").performTextReplacement("draft") + ui.onNodeWithText("Manual barcode").performImeAction() + ui.waitUntil(5000) { imeHidden() } + ui.onNodeWithText("Manual barcode").assertTextContains("draft") + } + ready("initial") + val initialProcess = model.activeProcessViewModel + seedDraft("drawer-back") + ui.onNodeWithTag("topBar.menuIcon").performClick() + ui.onNodeWithTag("drawer.settings").assertIsDisplayed() + reject() + ui.waitForIdle() + ui.waitUntil(5000) { imeHidden() && ui.activity.hasWindowFocus() } + InstrumentationRegistry.getInstrumentation().sendKeyDownUpSync(KeyEvent.KEYCODE_BACK) + resumeAndScan("drawer-back") + ui.onNodeWithTag("drawer.settings").assertIsNotDisplayed() + ui.runOnIdle { + assertNull("Drawer Back must not open Leave behind the drawer", model.qNavigator.leaveRequest) + assertSame(initialProcess, model.activeProcessViewModel) + assertEquals(0, repository.cancellations) + } + + for (destination in listOf("settings", "diagnostics")) { + seedDraft(destination) + ui.onNodeWithTag("topBar.menuIcon").performClick() + ui.onNodeWithTag("drawer.$destination").performClick() + waitFor("Close") + reject() + ui.onNodeWithText("Close").performClick() + resumeAndScan(destination) + } + seedDraft("account") + ui.onNodeWithTag("topBar.accountIcon").performClick() + ui.onNodeWithTag("accountDialog.title").assertIsDisplayed() + reject() + ui.onNodeWithText("Close").performClick() + resumeAndScan("account") + + seedDraft("leave-stay") + ui.onNodeWithContentDescription("Go Back").performClick() + waitFor("Stay") + reject() + ui.onNodeWithText("Stay").performClick() + resumeAndScan("leave-stay") + seedDraft("signout-stay") + ui.onNodeWithTag("topBar.accountIcon").performClick() + ui.onNodeWithText("Sign out").performClick() + waitFor("Stay") + reject() + ui.onNodeWithText("Stay").performClick() + resumeAndScan("signout-stay") + + seedDraft("external-window") + ui.runOnIdle { externalDialog.value = true } + waitFor("Close external") + ui.waitUntil(5000) { !ui.activity.hasWindowFocus() } + reject() + ui.onNodeWithText("Close external").performClick() + resumeAndScan("external-window") + + // A host-owned secondary surface blocks input even when it does not create another window. + seedDraft("host-surface") + ui.runOnIdle { parentAllowed.value = false; devices.last().emit("blocked-before-recomposition") } + ui.waitForIdle() + assertEquals(7, repository.events.size) + ui.runOnIdle { parentAllowed.value = true } + resumeAndScan("host-surface") + assertEquals(8, repository.events.size) + assertEquals(8, repository.events.map { it["eventId"] }.toSet().size) + assertTrue(repository.events.all { it["barcode"] == "00123" }) + assertEquals(0, repository.cancellations) + assertTrue(model.isAuthenticated) + } + + /******************************************************************************* + ** + *******************************************************************************/ + private fun waitFor(text: String) { + ui.waitUntil(5000) { ui.onAllNodesWithText(text).fetchSemanticsNodes().isNotEmpty() } + } + + /******************************************************************************* + ** + *******************************************************************************/ + private class Repository : QQQRepository { + val events = mutableListOf<Map<String, Any?>>() + var cancellations = 0 + + // Match decoded server JSON containers: WidgetBlock owns mutable values/styles. + private val scannerComponent = QFrontendComponent( + QComponentType.WIDGET, + mutableMapOf( + "isAdHocWidget" to true, "blocks" to listOf( + mutableMapOf( + "blockId" to "scan", "blockType" to "SCANNER", + "styles" to mutableMapOf<String, Any?>(), "values" to mutableMapOf<String, Any?>() + ) + ) + ) + ) + private val metadata = QProcessMetaData( + "scan", "Scan", frontendSteps = listOf( + QFrontendStepMetaData("input", "Input", components = listOf(scannerComponent)) + ) + ) + + /******************************************************************************* + ** + *******************************************************************************/ + override fun setEnvironment(environment: Environment) {} + + /******************************************************************************* + ** + *******************************************************************************/ + override fun setSessionUUID(sessionUUID: String) {} + + /******************************************************************************* + ** + *******************************************************************************/ + override fun getURI(path: String) = "https://unused.invalid/$path" + + /******************************************************************************* + ** + *******************************************************************************/ + override suspend fun getAuthenticationMetaData(): BaseAuthenticationMetaData = FullyAnonymousAuthenticationMetaData("FULLY_ANONYMOUS") + + /******************************************************************************* + ** + *******************************************************************************/ + override suspend fun manageSession(body: ManageSessionRequest) = ManageSessionResponse("synthetic-overlay-session") + + /******************************************************************************* + ** + *******************************************************************************/ + override suspend fun getMetaData(frontendName: String, frontendVersion: String, applicationName: String, applicationVersion: String) = QInstance( + appTree = listOf(QAppTreeNode("app", "App", QAppNodeType.APP)), + apps = mapOf("app" to QAppMetaData("app", "App", sections = listOf(QAppSection("section", "Section", processes = listOf("scan"))))), + processes = mapOf("scan" to metadata) + ) + + /******************************************************************************* + ** + *******************************************************************************/ + override suspend fun getProcessMetaData(processName: String) = metadata + + /******************************************************************************* + ** + *******************************************************************************/ + override suspend fun processInit(processName: String, values: Map<String, Any?>, recordsParam: String?, recordIds: String?, filterJSON: String?, stepTimeoutMillis: Int?) = QJobComplete("synthetic-process", nextStep = "input") + + /******************************************************************************* + ** + *******************************************************************************/ + override suspend fun processStep(processName: String, processUUID: String, stepName: String, values: Map<String, Any?>, stepTimeoutMillis: Int?): ProcessStepResult { + events.add(values.toMap()) + return QJobComplete(processUUID, mapOf("acknowledgedEventId" to values["eventId"], "scanSaved" to true, "scanId" to events.size.toString()), "input") + } + + /******************************************************************************* + ** + *******************************************************************************/ + override suspend fun processCancel(processName: String, processUUID: String) { + cancellations++ + } + + /******************************************************************************* + ** + *******************************************************************************/ + override suspend fun processJobStatus(processName: String, processUUID: String, jobUUID: String): ProcessStepResult = error("No jobs in this fixture") + } +} diff --git a/scanner-host/src/test/java/io/qrun/mobile/scanner/AimOutputProfileTest.kt b/scanner-host/src/test/java/io/qrun/mobile/scanner/AimOutputProfileTest.kt new file mode 100644 index 0000000..8e52152 --- /dev/null +++ b/scanner-host/src/test/java/io/qrun/mobile/scanner/AimOutputProfileTest.kt @@ -0,0 +1,61 @@ +/* Copyright (c) 2026 QRunIO. SPDX-License-Identifier: Apache-2.0 */ +package io.qrun.mobile.scanner + +import org.junit.Assert.assertEquals +import org.junit.Assert.assertNull +import org.junit.Test + +/******************************************************************************* + ** The confirmed AIM output profile removes only a consistent three-character prefix. + *******************************************************************************/ +class AimOutputProfileTest { + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun splitsConsistentPrefixAndKeepsPayloadExact() { + assertEquals(AimOutputProfile.Split("]C0", "001234"), AimOutputProfile.split("]C0001234", "LABEL-TYPE-CODE128")) + assertEquals(AimOutputProfile.Split("]Q1", "001234567890"), AimOutputProfile.split("]Q1001234567890", "QRCODE")) + assertEquals(AimOutputProfile.Split("]E0", "5901234123457"), AimOutputProfile.split("]E05901234123457", "LABEL-TYPE-EAN13")) + assertEquals(AimOutputProfile.Split("]E4", "12345670"), AimOutputProfile.split("]E412345670", "EAN8")) + assertEquals(AimOutputProfile.Split("]d1", " A "), AimOutputProfile.split("]d1 A ", "DATAMATRIX")) + assertEquals(AimOutputProfile.Split("]X0", "x"), AimOutputProfile.split("]X0x", "LABEL-TYPE-SOMETHING-ELSE")) + } + + /******************************************************************************* + ** Only the first three characters are removed, even when the user payload looks like an identifier. + *******************************************************************************/ + @Test + fun payloadBeginningWithAnIdentifierIsNotStrippedTwice() { + assertEquals(AimOutputProfile.Split("]C0", "]C0123"), AimOutputProfile.split("]C0]C0123", "CODE128")) + assertEquals(AimOutputProfile.Split("]C0", "]Q1abc"), AimOutputProfile.split("]C0]Q1abc", "CODE128")) + assertEquals(AimOutputProfile.Split("]Q1", "]"), AimOutputProfile.split("]Q1]", "QRCODE")) + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun malformedOrInconsistentPrefixIsNotTrusted() { + for (text in listOf("", "]", "]C", "]C0", "C0001234", "[C0001234", "]00001234", "]C-001234", "]éC0123", " ]C0123", "001234")) { + assertNull(text, AimOutputProfile.split(text, "CODE128")) + } + // A well-formed prefix that belongs to another symbology family means the label or prefix is not what was configured. + assertNull(AimOutputProfile.split("]Q1001234", "CODE128")) + assertNull(AimOutputProfile.split("]E0001234567890", "LABEL-TYPE-CODE128")) + assertNull(AimOutputProfile.split("]C0001234", "QRCODE")) + assertNull(AimOutputProfile.split("]C0001234", "EAN13")) + } + + /******************************************************************************* + ** The capture constructor accepts exactly what the parser produces. + *******************************************************************************/ + @Test + fun parsedIdentifierIsAValidCaptureIdentifier() { + val split = AimOutputProfile.split("]z0Hello", "AZTEC")!! + val capture = ScannerCapture.of(split.payload, "AZTEC", "]z0Hello".toByteArray(), split.aimIdentifier) + assertEquals("Hello", capture.barcode) + assertEquals("]z0", capture.aimIdentifier) + assertEquals(java.util.Base64.getEncoder().encodeToString("]z0Hello".toByteArray()), capture.rawDataBase64) + } +} diff --git a/scanner-host/src/test/java/io/qrun/mobile/scanner/AimReadbackTest.kt b/scanner-host/src/test/java/io/qrun/mobile/scanner/AimReadbackTest.kt new file mode 100644 index 0000000..999a2d6 --- /dev/null +++ b/scanner-host/src/test/java/io/qrun/mobile/scanner/AimReadbackTest.kt @@ -0,0 +1,47 @@ +/* Copyright (c) 2026 QRunIO. SPDX-License-Identifier: Apache-2.0 */ +package io.qrun.mobile.scanner + +import org.junit.Assert.assertEquals +import org.junit.Test + +/******************************************************************************* + ** The driver may accept scanner text only in a format proven by read-back; everything else must fail closed. + *******************************************************************************/ +class AimReadbackTest { + private val aim = "AIM" + private val original = "NONE" + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun reportedAimIsConfirmedEvenIfTheSetterThrew() { + assertEquals(AimReadback.CONFIRMED, classifyAimReadback(original, aim, aim)) + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun aScannerAlreadyReportingAimIsConfirmedNotUnchanged() { + assertEquals(AimReadback.CONFIRMED, classifyAimReadback(aim, aim, aim)) + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun exactlyTheOriginalValueIsUnchanged() { + assertEquals(AimReadback.UNCHANGED, classifyAimReadback(original, aim, original)) + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun anUnreadableOrForeignValueIsIndeterminate() { + assertEquals(AimReadback.INDETERMINATE, classifyAimReadback(original, aim, null)) + assertEquals(AimReadback.INDETERMINATE, classifyAimReadback(original, aim, "SYMBOL")) + assertEquals(AimReadback.INDETERMINATE, classifyAimReadback(aim, aim, null)) + } +} diff --git a/scanner-host/src/test/java/io/qrun/mobile/scanner/DiagnosticPresentationTest.kt b/scanner-host/src/test/java/io/qrun/mobile/scanner/DiagnosticPresentationTest.kt new file mode 100644 index 0000000..ce2a415 --- /dev/null +++ b/scanner-host/src/test/java/io/qrun/mobile/scanner/DiagnosticPresentationTest.kt @@ -0,0 +1,80 @@ +/* Copyright (c) 2026 QRunIO. SPDX-License-Identifier: Apache-2.0 */ +package io.qrun.mobile.scanner + +import java.time.Instant +import java.time.ZoneId +import org.junit.Assert.assertEquals +import org.junit.Assert.assertFalse +import org.junit.Assert.assertNull +import org.junit.Assert.assertTrue +import org.junit.Test + +/******************************************************************************* + ** + *******************************************************************************/ +class DiagnosticPresentationTest { + /******************************************************************************* + ** + *******************************************************************************/ + private fun event(code: DiagnosticCode, status: Int? = 200) = DiagnosticEvent(Instant.parse("2026-11-01T18:00:00Z"), code, status, 12) + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun problemsIncludeTransportHttpAndInvalidSuccessfulResponses() { + val success = event(DiagnosticCode.CONNECTION_OK) + val forbidden = event(DiagnosticCode.DEVICE_RESPONSE, 403) + val malformed = event(DiagnosticCode.CONNECTION_FAILED) + val transport = event(DiagnosticCode.NATIVE_TRANSPORT_FAILED, null) + assertEquals(listOf(transport, malformed, forbidden), diagnosticRows(listOf(success, forbidden, malformed, transport), true)) + assertEquals(listOf(transport, malformed, forbidden, success), diagnosticRows(listOf(success, forbidden, malformed, transport), false)) + assertTrue(malformed.detail().contains("Unexpected status response")) + assertTrue(transport.detail().contains("No HTTP response")) + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun connectionSummaryNeverUsesAppDeviceOrSessionResponses() { + val check = event(DiagnosticCode.CONNECTION_FAILED, 503) + val activity = listOf(event(DiagnosticCode.DEVICE_RESPONSE), event(DiagnosticCode.SESSION_RESPONSE), event(DiagnosticCode.NATIVE_RESPONSE)) + assertNull(latestConnectionCheck(activity)) + assertEquals(check, latestConnectionCheck(listOf(check) + activity)) + assertEquals("Device request completed", activity[0].title()) + assertEquals("Session request completed", activity[1].title()) + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun exportUsesFriendlyLabelsLocalDateAndFixedFieldsOnly() { + val events = DiagnosticCode.values().map { event(it, 401) } + val report = diagnosticReport(events, false, ZoneId.of("America/Chicago")) + assertTrue(report.contains("2026-11-01 12:00:00 CST")) + assertTrue(report.contains("Sign-in required or expired")) + assertTrue(report.contains("reachability only")) + DiagnosticCode.values().forEach { assertFalse(report.contains(it.name)) } + listOf("http://", "https://", "Cookie", "Authorization", "token=", "password=", "?").forEach { assertFalse(report.contains(it)) } + assertTrue(diagnosticReport(emptyList(), true).endsWith("No events.")) + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun snapshotsAreIndependentBoundedAndClearable() { + val log = DiagnosticLog(2) + log.record(DiagnosticCode.CONNECTION_OK, 200, 1) + val saved = log.snapshot() + log.record(DiagnosticCode.DEVICE_RESPONSE, 403, 2) + log.record(DiagnosticCode.SESSION_RESPONSE, 500, 3) + assertEquals(1, saved.size) + assertEquals(listOf(DiagnosticCode.DEVICE_RESPONSE, DiagnosticCode.SESSION_RESPONSE), log.snapshot().map { it.code }) + log.clear() + assertTrue(log.snapshot().isEmpty()) + assertEquals(1, saved.size) + } +} diff --git a/scanner-host/src/test/java/io/qrun/mobile/scanner/HostRuntimeTest.kt b/scanner-host/src/test/java/io/qrun/mobile/scanner/HostRuntimeTest.kt new file mode 100644 index 0000000..67230d3 --- /dev/null +++ b/scanner-host/src/test/java/io/qrun/mobile/scanner/HostRuntimeTest.kt @@ -0,0 +1,117 @@ +/* Copyright (c) 2026 QRunIO. SPDX-License-Identifier: Apache-2.0 */ +package io.qrun.mobile.scanner + +import kotlinx.coroutines.runBlocking +import okhttp3.mockwebserver.MockResponse +import okhttp3.mockwebserver.MockWebServer +import org.junit.Assert.assertEquals +import org.junit.Assert.assertFalse +import org.junit.Assert.assertNull +import org.junit.Assert.assertTrue +import org.junit.Test +import com.kingsrook.qqq.frontend.android.core.controllers.RequestOutcome + +/******************************************************************************* + ** + *******************************************************************************/ +class HostRuntimeTest { + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun requestDiagnosticsDistinguishNativeAndDeviceOutcomes() { + val log = DiagnosticLog() + log.nativeRequest(RequestOutcome(401, 10)) + log.nativeRequest(RequestOutcome(null, 20)) + log.deviceRequest(RequestOutcome(403, 30)) + log.deviceRequest(RequestOutcome(null, 40)) + assertTrue(log.text().contains("NATIVE_RESPONSE HTTP=401 10ms")) + assertTrue(log.text().contains("NATIVE_TRANSPORT_FAILED HTTP=none 20ms")) + assertTrue(log.text().contains("DEVICE_RESPONSE HTTP=403 30ms")) + assertTrue(log.text().contains("DEVICE_TRANSPORT_FAILED HTTP=none 40ms")) + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun malformedBrandFallsBackAndUnsafeLogoIsDiscarded() { + for (payload in listOf("not json", "[]", "null", "{\"displayName\":12,\"primaryColor\":\"red\"}")) + assertEquals(HostBrand(), HostBrand.parse(payload)) + assertEquals(HostBrand("Acme", "#AB12FF"), HostBrand.parse("{\"displayName\":\" Acme \",\"primaryColor\":\"#ab12ff\",\"logoUrl\":\"http://example.com/logo.png\"}")) + assertEquals(HostBrand().displayName, HostBrand.parse("{\"displayName\":\"<script>\"}").displayName) + listOf("file:///secret", "content://secret", "https://user:pass@example.com/logo", "https://example.com/logo#secret").forEach { assertFalse(isSafeLogoUrl(it)) } + assertTrue(isSafeLogoUrl("https://example.com/logo.png")) + assertTrue(useBlackOnPrimary("#FFFFFF")) + assertTrue(useBlackOnPrimary("#FFFF00")) + assertFalse(useBlackOnPrimary("#000000")) + assertFalse(useBlackOnPrimary("#1565C0")) + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun serverSwitchDoesNotReuseBrandAndPublicRequestsContainNoCredentials() = runBlocking() + { + MockWebServer().use { first -> + MockWebServer().use { second -> + first.enqueue(MockResponse().setBody(VERSION_FIXTURE)) + first.enqueue(MockResponse().setBody("{\"displayName\":\"Customer A\",\"primaryColor\":\"#123456\"}")) + second.enqueue(MockResponse().setBody(VERSION_FIXTURE)) + second.enqueue(MockResponse().setResponseCode(404)) + val firstRuntime = HostRuntime(first.url("/").toString()) + val secondRuntime = HostRuntime(second.url("/").toString()) + assertEquals("Customer A", firstRuntime.branding().displayName) + assertEquals(HostBrand(), secondRuntime.branding()) + assertEquals("/qqq/v1/version", first.takeRequest().path) + assertEquals("/qqq/v1/version", second.takeRequest().path) + for (request in listOf(first.takeRequest(), second.takeRequest())) { + assertEquals("/qqq/v1/qbit/mobile-scanners/branding", request.path) + assertNull(request.getHeader("Authorization")) + assertNull(request.getHeader("Cookie")) + assertNull(request.getHeader("X-QQQ-Device-Token")) + assertEquals("no-store", request.getHeader("Cache-Control")) + } + assertFalse(secondRuntime.diagnostics.text().contains("BRAND_LOADED")) + } + } + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun reachabilityRequiresExpectedStatusAndNeverLogsResponseData() = runBlocking() + { + MockWebServer().use { server -> + server.enqueue(MockResponse().setBody(VERSION_FIXTURE)) + server.enqueue(MockResponse().setBody("{\"status\":\"ok\"}")) + server.enqueue(MockResponse().setBody("<html>private-barcode-and-token</html>")) + server.enqueue(MockResponse().setResponseCode(503).setBody("private-password")) + val runtime = HostRuntime(server.url("/").toString()) + assertTrue(runtime.connected()) + assertFalse(runtime.connected()) + assertFalse(runtime.connected()) + assertFalse(runtime.diagnostics.text().contains("private")) + assertTrue(runtime.diagnostics.text().contains("CONNECTION_FAILED HTTP=503")) + } + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun diagnosticsAreBoundedAndClearable() { + val log = DiagnosticLog(2) + log.record(DiagnosticCode.CONNECTION_OK, 200, 1) + log.record(DiagnosticCode.CONNECTION_FAILED, 500, 2) + log.record(DiagnosticCode.CONNECTION_FAILED, null, 3) + assertEquals(2, log.text().lines().size) + assertFalse(log.text().contains("CONNECTION_OK")) + log.clear() + assertEquals("", log.text()) + } +} + +private const val VERSION_FIXTURE = """{"apiVersion":"1.8.0","features":["version","metaData","processes","processCancel","extensions","widgets"],"clientChannels":["web","api","android"],"extensions":[{"name":"mobile-scanners","version":"1.1.0","pathPrefix":"/qbit/mobile-scanners"}]}""" diff --git a/scanner-host/src/test/java/io/qrun/mobile/scanner/LatestScreenImageTest.kt b/scanner-host/src/test/java/io/qrun/mobile/scanner/LatestScreenImageTest.kt new file mode 100644 index 0000000..f417a3b --- /dev/null +++ b/scanner-host/src/test/java/io/qrun/mobile/scanner/LatestScreenImageTest.kt @@ -0,0 +1,65 @@ +/* Copyright (c) 2026 QRunIO. SPDX-License-Identifier: Apache-2.0 */ +package io.qrun.mobile.scanner + +import org.junit.Assert.assertEquals +import org.junit.Assert.assertNull +import org.junit.Assert.assertSame +import org.junit.Test + +/******************************************************************************* + ** + *******************************************************************************/ +class LatestScreenImageTest { + /******************************************************************************* + ** + *******************************************************************************/ + private class Image : AutoCloseable { + var closes = 0 + + /******************************************************************************* + ** + *******************************************************************************/ + override fun close() { + closes++ + } + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun replacingFramesRetainsOnlyTheNewestAndReleasesPreviousBuffers() { + val latest = LatestScreenImage<Image>() + val first = Image() + val second = Image() + latest.replace(first) + latest.replace(second) + assertSame(second, latest.image) + assertEquals(1, first.closes) + assertEquals(0, second.closes) + latest.close() + assertNull(latest.image) + assertEquals(1, second.closes) + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun repeatedStopAndDuplicateNotificationDoNotCloseAnOwnedBufferTwice() { + val latest = LatestScreenImage<Image>() + val image = Image() + latest.replace(image) + latest.replace(image) + assertEquals(0, image.closes) + latest.close() + latest.close() + assertEquals(1, image.closes) + assertNull(latest.image) + val nextSession = Image() + latest.replace(nextSession) + assertSame(nextSession, latest.image) + latest.close() + assertEquals(1, nextSession.closes) + } +} diff --git a/scanner-host/src/test/java/io/qrun/mobile/scanner/LocationPolicyTest.kt b/scanner-host/src/test/java/io/qrun/mobile/scanner/LocationPolicyTest.kt new file mode 100644 index 0000000..e0f0c5e --- /dev/null +++ b/scanner-host/src/test/java/io/qrun/mobile/scanner/LocationPolicyTest.kt @@ -0,0 +1,57 @@ +/* Copyright (c) 2026 QRunIO. SPDX-License-Identifier: Apache-2.0 */ +package io.qrun.mobile.scanner + +import org.junit.Assert.assertEquals +import org.junit.Assert.assertFalse +import org.junit.Assert.assertTrue +import org.junit.Test + +/******************************************************************************* + ** + *******************************************************************************/ +class LocationPolicyTest { + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun missingPreferenceEnablesReportingAndExplicitChoicesArePreserved() { + assertTrue(LocationPolicy.enabled(null)) + assertTrue(LocationPolicy.enabled(true)) + assertFalse(LocationPolicy.enabled(false)) + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun initialPermissionRequestRequiresActiveSessionAndEnabledPreference() { + assertTrue(LocationPolicy.shouldRequestPermission(true, true, false, false)) + assertFalse(LocationPolicy.shouldRequestPermission(false, true, false, false)) + assertFalse(LocationPolicy.shouldRequestPermission(true, false, false, false)) + assertFalse(LocationPolicy.shouldRequestPermission(true, true, true, false)) + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun denialDoesNotPromptAgainOnResumeRecreationOrNextSession() { + listOf(false, true, false, true).forEach { active -> + assertFalse(LocationPolicy.shouldRequestPermission(active, true, false, true)) + } + assertTrue(LocationPolicy.enabled(null)) + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun settingsDistinguishOptOutPermissionProvidersAndAnActualFix() { + assertEquals("Location reporting is off", LocationPolicy.status(false, true, true, true, "AVAILABLE")) + assertEquals("Location reporting is on; Android location permission is not granted", LocationPolicy.status(true, false, true, true, "UNAVAILABLE")) + assertEquals("Location reporting is on; device location providers are off", LocationPolicy.status(true, true, false, true, "AVAILABLE")) + assertEquals("Location reporting is on; waiting for an approved signed-in foreground session", LocationPolicy.status(true, true, true, false, "AVAILABLE")) + assertEquals("Location reporting is on; waiting for a foreground location fix", LocationPolicy.status(true, true, true, true, "UNAVAILABLE")) + assertEquals("Location reporting is on; foreground location is available", LocationPolicy.status(true, true, true, true, "AVAILABLE")) + } +} diff --git a/scanner-host/src/test/java/io/qrun/mobile/scanner/ManagedConfigurationTest.kt b/scanner-host/src/test/java/io/qrun/mobile/scanner/ManagedConfigurationTest.kt new file mode 100644 index 0000000..e2de791 --- /dev/null +++ b/scanner-host/src/test/java/io/qrun/mobile/scanner/ManagedConfigurationTest.kt @@ -0,0 +1,100 @@ +/* Copyright (c) 2026 QRunIO. SPDX-License-Identifier: Apache-2.0 */ +package io.qrun.mobile.scanner + +import org.junit.Assert.assertEquals +import org.junit.Assert.assertNull +import org.junit.Test + +/******************************************************************************* + ** Managed configuration is a bootstrap only: HTTPS origins and exact known orientation names, never silently defaulted. + *******************************************************************************/ +class ManagedConfigurationTest { + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun noRestrictionsLeavesEverythingUnmanaged() { + assertEquals(ManagedValues(), ManagedConfiguration.parse(null, null)) + assertEquals(ManagedValues(), ManagedConfiguration.parse("", " ")) + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun acceptsOnlyANormalizedHttpsOrigin() { + assertEquals("https://qqq.example.com/", ManagedConfiguration.parse(" https://QQQ.example.com ", null).serverUrl) + assertEquals("https://qqq.example.com:8443/", ManagedConfiguration.parse("https://qqq.example.com:8443/", null).serverUrl) + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun rejectsHttpCredentialsPathsQueriesAndGarbageWithoutRecordingTheValue() { + listOf( + "http://qqq.example.com", "http://127.0.0.1:8080/", "https://user:pw@qqq.example.com", "https://qqq.example.com/app", + "https://qqq.example.com/?t=1", "https://qqq.example.com/#f", "ftp://qqq.example.com", "not a url", "https://", "https://" + "a".repeat(2100) + ).forEach { value -> + val parsed = ManagedConfiguration.parse(value, null) + assertNull(value, parsed.serverUrl) + assertEquals(listOf(MANAGED_SERVER_URL), parsed.rejectedKeys) + } + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun orientationAcceptsEveryExistingNameExactly() { + OrientationPolicy.entries.forEach { assertEquals(it, ManagedConfiguration.parse(null, it.name).orientation) } + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun unknownOrientationIsRejectedNotDefaultedToPortrait() { + listOf("portrait", "Landscape", "AUTO", "SENSOR", "90", "REVERSE-PORTRAIT").forEach { value -> + val parsed = ManagedConfiguration.parse(null, value) + assertNull(value, parsed.orientation) + assertEquals(listOf(MANAGED_ORIENTATION), parsed.rejectedKeys) + } + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun aBadValueDoesNotBlockTheGoodOne() { + val parsed = ManagedConfiguration.parse("http://bad.example.com", "LANDSCAPE") + assertNull(parsed.serverUrl) + assertEquals(OrientationPolicy.LANDSCAPE, parsed.orientation) + assertEquals(listOf(MANAGED_SERVER_URL), parsed.rejectedKeys) + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun serverIsNeverSwitchedSilently() { + val managed = "https://managed.example.com/" + assertEquals(ManagedServerAction.NONE, ManagedConfiguration.serverAction("https://other.example.com/", null)) + assertEquals(ManagedServerAction.NONE, ManagedConfiguration.serverAction(null, null)) + assertEquals(ManagedServerAction.PREFILL, ManagedConfiguration.serverAction(null, managed)) + assertEquals(ManagedServerAction.NONE, ManagedConfiguration.serverAction(managed, managed)) + assertEquals(ManagedServerAction.OFFER_CHANGE, ManagedConfiguration.serverAction("https://other.example.com/", managed)) + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun orientationIsAppliedOnlyWhenTheManagedValueChanges() { + assertNull(ManagedConfiguration.orientationToApply(null, null)) + assertNull(ManagedConfiguration.orientationToApply(null, "LANDSCAPE")) + assertEquals(OrientationPolicy.LANDSCAPE, ManagedConfiguration.orientationToApply(OrientationPolicy.LANDSCAPE, null)) + assertNull(ManagedConfiguration.orientationToApply(OrientationPolicy.LANDSCAPE, "LANDSCAPE")) + assertEquals(OrientationPolicy.SYSTEM, ManagedConfiguration.orientationToApply(OrientationPolicy.SYSTEM, "LANDSCAPE")) + } +} diff --git a/scanner-host/src/test/java/io/qrun/mobile/scanner/MobileSessionTest.kt b/scanner-host/src/test/java/io/qrun/mobile/scanner/MobileSessionTest.kt new file mode 100644 index 0000000..ad35bb5 --- /dev/null +++ b/scanner-host/src/test/java/io/qrun/mobile/scanner/MobileSessionTest.kt @@ -0,0 +1,420 @@ +/* Copyright (c) 2026 QRunIO. SPDX-License-Identifier: Apache-2.0 */ +package io.qrun.mobile.scanner + +import androidx.compose.runtime.mutableStateOf +import com.kingsrook.qqq.frontend.android.core.controllers.UiApiCompatibility +import com.kingsrook.qqq.frontend.android.core.controllers.UiApiException +import kotlinx.coroutines.CompletableDeferred +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.launch +import kotlinx.coroutines.runBlocking +import kotlinx.coroutines.test.advanceTimeBy +import kotlinx.coroutines.test.runCurrent +import kotlinx.coroutines.test.runTest +import okhttp3.mockwebserver.MockResponse +import okhttp3.mockwebserver.MockWebServer +import org.json.JSONObject +import org.junit.Assert.assertEquals +import org.junit.Assert.assertFalse +import org.junit.Assert.assertNotNull +import org.junit.Assert.assertNull +import org.junit.Assert.assertThrows +import org.junit.Assert.assertTrue +import org.junit.Test + +/******************************************************************************* + ** + *******************************************************************************/ +@OptIn(ExperimentalCoroutinesApi::class) +class MobileSessionTest { + /******************************************************************************* + ** + *******************************************************************************/ + private fun ready() = SessionScreen( + true, true, true, true, false, true, false, 1, 1, + "warehouse", "count", "process-id", "scan", "Scan items" + ) + + private val lease = ScreenLease("lease-one", 30000, 1000, 640, 1280, 262144, 0) + private val frame = ScreenFrame(byteArrayOf(1, 2, 3), 100, 200, "2026-10-30T12:00:00Z") + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun captureIsBlockedOutsideTheApprovedVisibleApplication() { + val state = ready() + assertTrue(state.available) + listOf( + state.copy(authenticated = false), state.copy(approved = false), state.copy(foreground = false), + state.copy(focused = false), state.copy(hasPassword = true), state.copy(ready = false), state.copy(paused = true) + ) + .forEach { assertFalse(it.available); assertNotNull(it.blockedReason) } + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun frameTicketRejectsStateSessionAndLeaseRaces() { + val state = ready() + val ticket = ScreenTicket(8, state, "lease-one") + assertTrue(ticket.valid(8, state, "lease-one", 100, 200)) + assertFalse(ticket.valid(9, state, "lease-one", 100, 200)) + assertFalse(ticket.valid(8, state.copy(navigationRevision = 2), "lease-one", 100, 200)) + assertFalse(ticket.valid(8, state.copy(hasPassword = true), "lease-one", 100, 200)) + assertFalse(ticket.valid(8, state, "lease-two", 100, 200)) + assertFalse(ticket.valid(8, state, "lease-one", 200, 200)) + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun leaseDurationUsesServerTimeAndRespectsLocalLimits() { + val reply = SessionHeartbeat.parse(heartbeatJson("2099-01-01T00:00:00Z", "2099-01-01T00:00:25Z")) + assertEquals(25000L, reply.lease!!.durationMillis) + assertEquals(640, reply.lease.maxWidth) + assertEquals(1280, reply.lease.maxHeight) + assertEquals(262144, reply.lease.maxBytes) + assertEquals(0L, SessionHeartbeat.parse(heartbeatJson("2099-01-01T00:01:00Z", "2099-01-01T00:00:25Z")).lease!!.durationMillis) + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun absenceOfViewerLeaseNeverInvokesCapture() = runTest() + { + val transport = FakeTransport(null) + var captures = 0 + val controller = MobileSessionController("session-a", transport, { ready() }, { captures++; frame }, {}, { testScheduler.currentTime }) + val job = backgroundScope.launch { controller.run() } + runCurrent(); advanceTimeBy(10000); runCurrent() + assertTrue(transport.states.size >= 2) + assertEquals(0, captures) + controller.end("SIGN_OUT") + assertEquals(listOf("session-a:SIGN_OUT"), transport.ends) + job.cancel() + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun legacyHeartbeatDoesNotEnableDeviceScreenSharing() { + val json = heartbeatJson("2026-10-30T00:00:00Z", "2026-10-30T00:00:30Z") + val legacy = SessionHeartbeat.parse(json) + assertEquals(setOf(CaptureMode.APP_CONTENT), legacy.supportedCaptureModes) + assertEquals(CaptureMode.APP_CONTENT, legacy.lease!!.captureMode) + val device = JSONObject(json).put("supportedCaptureModes", org.json.JSONArray(listOf("APP_CONTENT", "DEVICE_SCREEN"))) + device.getJSONObject("screenMirror").put("captureMode", "DEVICE_SCREEN") + assertTrue(CaptureMode.DEVICE_SCREEN in SessionHeartbeat.parse(device.toString()).supportedCaptureModes) + assertEquals(CaptureMode.DEVICE_SCREEN, SessionHeartbeat.parse(device.toString()).lease!!.captureMode) + device.getJSONObject("screenMirror").put("captureMode", "UNKNOWN") + assertThrows(IllegalArgumentException::class.java) { SessionHeartbeat.parse(device.toString()) } + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun deviceScreenWaitsForViewerAndStopsAfterThirtySecondsWithoutDemand() = runTest() + { + val state = mutableStateOf(ready().copy(foreground = false, focused = false, captureMode = CaptureMode.DEVICE_SCREEN)) + val transport = FakeTransport(null, true) + var stopped = 0 + var captured = 0 + val controller = MobileSessionController( + "session", transport, { state.value }, { captured++; frame }, {}, + { testScheduler.currentTime }, { + if (state.value.captureMode == CaptureMode.DEVICE_SCREEN) stopped++ + state.value = state.value.copy(captureMode = CaptureMode.APP_CONTENT) + }) + backgroundScope.launch { controller.run() } + runCurrent(); advanceTimeBy(29999); runCurrent() + assertEquals(0, stopped) + assertEquals(0, captured) + assertTrue(transport.states.size >= 5) + advanceTimeBy(1); runCurrent() + assertEquals(1, stopped) + assertEquals(0, captured) + controller.invalidate() + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun deviceScreenContinuesBackgroundHeartbeatsButStopsOnLostViewerLease() = runTest() + { + val state = mutableStateOf(ready().copy(foreground = false, focused = false, captureMode = CaptureMode.DEVICE_SCREEN)) + val transport = FakeTransport(lease.copy(captureMode = CaptureMode.DEVICE_SCREEN), true) + val controller = MobileSessionController( + "session", transport, { state.value }, { frame.copy(captureMode = CaptureMode.DEVICE_SCREEN) }, {}, + { testScheduler.currentTime }, { state.value = state.value.copy(captureMode = CaptureMode.APP_CONTENT) }) + backgroundScope.launch { controller.run() }; runCurrent() + assertEquals(1, transport.uploads.size) + transport.lease = null + advanceTimeBy(5000); runCurrent() + assertEquals(CaptureMode.APP_CONTENT, state.value.captureMode) + assertFalse(controller.viewing) + val uploaded = transport.uploads.size + advanceTimeBy(10000); runCurrent() + assertEquals(uploaded, transport.uploads.size) + controller.invalidate() + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun deviceModeCannotUseAppLeaseOrUploadAppFrame() = runTest() + { + val state = mutableStateOf(ready().copy(captureMode = CaptureMode.DEVICE_SCREEN)) + val transport = FakeTransport(lease, true) + var captured = 0 + val controller = MobileSessionController( + "session", transport, { state.value }, { captured++; frame }, {}, + { testScheduler.currentTime }, { state.value = state.value.copy(captureMode = CaptureMode.APP_CONTENT) }) + backgroundScope.launch { controller.run() }; runCurrent() + assertEquals(0, captured) + transport.lease = lease.copy(captureMode = CaptureMode.DEVICE_SCREEN) + advanceTimeBy(5000); runCurrent() + assertTrue(captured > 0) + assertTrue(transport.uploads.isEmpty()) + controller.invalidate() + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun devicePauseDiscardsEncodingInFlightAndReleasesProjection() = runTest() + { + val state = mutableStateOf(ready().copy(captureMode = CaptureMode.DEVICE_SCREEN)) + val transport = FakeTransport(lease.copy(captureMode = CaptureMode.DEVICE_SCREEN), true) + val captured = CompletableDeferred<ScreenFrame>() + val controller = MobileSessionController( + "session", transport, { state.value }, { captured.await() }, {}, + { testScheduler.currentTime }, { state.value = state.value.copy(captureMode = CaptureMode.APP_CONTENT) }) + backgroundScope.launch { controller.run() }; runCurrent() + controller.pauseViewing() + captured.complete(frame.copy(captureMode = CaptureMode.DEVICE_SCREEN)); runCurrent() + assertEquals(CaptureMode.APP_CONTENT, state.value.captureMode) + assertTrue(transport.uploads.isEmpty()) + assertTrue(controller.operatorPaused) + controller.invalidate() + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun screenChangingToPasswordDuringCaptureDiscardsTheFrame() = runTest() + { + val state = mutableStateOf(ready()) + val transport = FakeTransport(lease) + val captured = CompletableDeferred<ScreenFrame>() + val controller = MobileSessionController("session-a", transport, { state.value }, { captured.await() }, {}, { testScheduler.currentTime }) + backgroundScope.launch { controller.run() } + runCurrent() + state.value = state.value.copy(hasPassword = true) + captured.complete(frame) + runCurrent() + assertTrue(transport.uploads.isEmpty()) + assertEquals("PASSWORD_SCREEN", transport.states.last().blockedReason) + controller.end("SIGN_OUT") + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun endingSessionCancelsAnInFlightCaptureAndStopsUploads() = runTest() + { + val transport = FakeTransport(lease) + val captured = CompletableDeferred<ScreenFrame>() + val controller = MobileSessionController("session-a", transport, { ready() }, { captured.await() }, {}, { testScheduler.currentTime }) + backgroundScope.launch { controller.run() } + runCurrent() + controller.end("SERVER_CHANGE") + captured.complete(frame) + runCurrent() + assertTrue(transport.uploads.isEmpty()) + assertFalse(controller.viewing) + assertEquals(listOf("session-a:SERVER_CHANGE"), transport.ends) + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun expiredLeaseDuringCaptureDiscardsTheFrame() = runTest() + { + val transport = FakeTransport(lease.copy(durationMillis = 1000)) + val captured = CompletableDeferred<ScreenFrame>() + val controller = MobileSessionController("session-a", transport, { ready() }, { captured.await() }, {}, { testScheduler.currentTime }) + backgroundScope.launch { controller.run() } + runCurrent(); advanceTimeBy(1500) + captured.complete(frame); runCurrent() + assertTrue(transport.uploads.isEmpty()) + controller.end("SIGN_OUT") + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun serverEndedSessionRequestsLogoutOnceAndFreshLoginHasSeparateIdentity() = runTest() + { + val transport = FakeTransport(lease) + transport.rejectSession = "ended-session" + var logouts = 0 + val ended = MobileSessionController("ended-session", transport, { ready() }, { frame }, { logouts++ }, { testScheduler.currentTime }) + backgroundScope.launch { ended.run() } + runCurrent(); advanceTimeBy(10000); runCurrent() + assertEquals(1, logouts) + assertTrue(transport.uploads.isEmpty()) + val fresh = MobileSessionController("fresh-session", transport, { ready() }, { frame }, { logouts++ }, { testScheduler.currentTime }) + backgroundScope.launch { fresh.run() }; runCurrent() + assertEquals("fresh-session", transport.uploads.single().first) + assertEquals(1, logouts) + fresh.end("SIGN_OUT") + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun operatorPauseClearsAvailabilityAndRejectsPendingFrame() = runTest() + { + val transport = FakeTransport(lease) + val captured = CompletableDeferred<ScreenFrame>() + val controller = MobileSessionController("session-a", transport, { ready() }, { captured.await() }, {}, { testScheduler.currentTime }) + backgroundScope.launch { controller.run() }; runCurrent() + controller.pauseViewing(); captured.complete(frame); runCurrent() + assertTrue(transport.uploads.isEmpty()) + assertEquals("OPERATOR_PAUSED", transport.states.last().blockedReason) + controller.end("SIGN_OUT") + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun networkPayloadUsesSemanticRoutesAndCarriesOnlyScreenMetadata() = runBlocking() + { + MockWebServer().use { server -> + server.enqueue(MockResponse().setBody(VERSION)) + server.enqueue(MockResponse().setBody(heartbeatJson("2026-10-30T00:00:00Z", "2026-10-30T00:00:30Z"))) + server.enqueue(MockResponse().setResponseCode(204)) + server.enqueue(MockResponse().setBody("{}")) + val origin = server.url("/").toString() + val api = MobileSessionApi( + origin, { mapOf("X-QQQ-Device-Token" to "synthetic-token") }, UiApiCompatibility(origin, true), + deviceInfo = mapOf("osVersion" to "14", "appVersion" to "1.0.1", "manufacturer" to null, "model" to " ") + ) + api.heartbeat("synthetic-session", ready()) + api.screen("synthetic-session", "lease-one", 4, frame) + api.end("synthetic-session", "SIGN_OUT") + val discovery = server.takeRequest() + assertEquals("/qqq/v1/version", discovery.path) + assertNull(discovery.getHeader("Cookie")) + val heartbeat = server.takeRequest() + assertEquals("/qqq/v1/qbit/mobile-scanners/sessions/heartbeat", heartbeat.path) + assertEquals("android/qqq-mobile", heartbeat.getHeader("X-QQQ-Client")) + val body = JSONObject(heartbeat.body.readUtf8()) + assertTrue(body.getBoolean("screenAvailable")) + assertEquals("count", body.getString("processName")) + // Installed versions ride on every heartbeat so an in-place update refreshes the device record; blank/null ones are omitted. + assertEquals("14", body.getString("osVersion")) + assertEquals("1.0.1", body.getString("appVersion")) + listOf("user", "deviceId", "barcode", "sessionUUID", "password", "values", "manufacturer", "model").forEach { assertFalse(body.has(it)) } + val screen = server.takeRequest() + assertEquals("/qqq/v1/qbit/mobile-scanners/sessions/current/screen", screen.path) + assertEquals(4, JSONObject(screen.body.readUtf8()).getLong("sequence")) + val end = server.takeRequest() + assertEquals("/qqq/v1/qbit/mobile-scanners/sessions/current/end", end.path) + // Cookie-bearing native POSTs must present the exact origin of the URL used, like a browser. + val expectedOrigin = origin.trimEnd('/') + listOf(heartbeat, screen, end).forEach { request -> + assertEquals("POST", request.method) + assertEquals("sessionUUID=synthetic-session", request.getHeader("Cookie")) + assertEquals(expectedOrigin, request.getHeader("Origin")) + assertEquals(1, request.headers.values("Origin").size) + } + } + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun locationIsReportedOnlyWithAnAvailableForegroundFix() = runBlocking() + { + MockWebServer().use { server -> + server.enqueue(MockResponse().setBody(VERSION)) + repeat(3) { server.enqueue(MockResponse().setBody(heartbeatJson("2026-10-30T00:00:00Z", "2026-10-30T00:00:30Z"))) } + val api = MobileSessionApi(server.url("/").toString(), { emptyMap() }, UiApiCompatibility(server.url("/").toString(), true)) + val located = ready().copy(location = LocationReport("AVAILABLE", LocationFix(38.5, -90.5, 12.0, "2026-10-30T00:00:00Z"))) + api.heartbeat("session", located) + api.heartbeat("session", located.copy(foreground = false)) + api.heartbeat("session", located.copy(location = LocationReport("PERMISSION_DENIED"))) + server.takeRequest() + val foreground = JSONObject(server.takeRequest().body.readUtf8()) + assertEquals("AVAILABLE", foreground.getString("locationStatus")) + assertEquals(38.5, foreground.getJSONObject("location").getDouble("latitude"), 0.0) + val background = JSONObject(server.takeRequest().body.readUtf8()) + assertEquals("UNAVAILABLE", background.getString("locationStatus")) + assertFalse(background.has("location")) + val denied = JSONObject(server.takeRequest().body.readUtf8()) + assertEquals("PERMISSION_DENIED", denied.getString("locationStatus")) + assertFalse(denied.has("location")) + assertTrue(denied.getBoolean("screenAvailable")) + } + } + + /******************************************************************************* + ** + *******************************************************************************/ + private inner class FakeTransport(var lease: ScreenLease?, private val supportsDevice: Boolean = false) : MobileSessionTransport { + val states = mutableListOf<SessionScreen>() + val uploads = mutableListOf<Pair<String, Long>>() + val ends = mutableListOf<String>() + var rejectSession: String? = null + + /******************************************************************************* + ** + *******************************************************************************/ + override suspend fun heartbeat(session: String, state: SessionScreen): SessionHeartbeat { + if (session == rejectSession) throw UiApiException(401, "SESSION_ENDED", "Ended") + states += state + return SessionHeartbeat( + "public-session-id", 5000, lease, + if (supportsDevice) CaptureMode.entries.toSet() else setOf(CaptureMode.APP_CONTENT) + ) + } + + /******************************************************************************* + ** + *******************************************************************************/ + override suspend fun end(session: String, reason: String) { + ends += "$session:$reason" + } + + /******************************************************************************* + ** + *******************************************************************************/ + override suspend fun screen(session: String, leaseId: String, sequence: Long, frame: ScreenFrame) { + uploads += session to sequence + } + } + + /******************************************************************************* + ** + *******************************************************************************/ + private fun heartbeatJson(server: String, expires: String) = """{"sessionId":"public-id","status":"ACTIVE","serverTime":"$server","heartbeatIntervalMillis":5000,"screenMirror":{"leaseId":"lease-one","expiresAt":"$expires","frameIntervalMillis":1000,"maxWidth":640,"maxHeight":1280,"maxBytes":262144,"nextSequence":0}}""" +} + +private const val VERSION = """{"apiVersion":"1.8.0","features":["version","metaData","processes","processCancel","extensions","widgets"],"clientChannels":["android"],"extensions":[{"name":"mobile-scanners","version":"1.1.0","pathPrefix":"/qbit/mobile-scanners"}]}""" diff --git a/scanner-host/src/test/java/io/qrun/mobile/scanner/OrientationPolicyTest.kt b/scanner-host/src/test/java/io/qrun/mobile/scanner/OrientationPolicyTest.kt new file mode 100644 index 0000000..9a2ddb2 --- /dev/null +++ b/scanner-host/src/test/java/io/qrun/mobile/scanner/OrientationPolicyTest.kt @@ -0,0 +1,51 @@ +/* Copyright (c) 2026 QRunIO. SPDX-License-Identifier: Apache-2.0 */ +package io.qrun.mobile.scanner + +import android.content.pm.ActivityInfo +import org.junit.Assert.assertEquals +import org.junit.Test + +/******************************************************************************* + ** + *******************************************************************************/ +class OrientationPolicyTest { + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun missingSavedValueDefaultsToPortrait() { + assertEquals(OrientationPolicy.PORTRAIT, OrientationPolicy.parse(null)) + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun unrecognizedSavedValuesDefaultToPortrait() { + listOf("unknown", "", " ", "portrait").forEach { value -> + assertEquals(OrientationPolicy.PORTRAIT, OrientationPolicy.parse(value)) + } + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun explicitSavedChoicesIncludingSystemArePreserved() { + assertEquals(OrientationPolicy.SYSTEM, OrientationPolicy.parse("SYSTEM")) + OrientationPolicy.entries.forEach { assertEquals(it, OrientationPolicy.parse(it.name)) } + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun choicesRequestThePlatformOrientationWithoutSensorOverrides() { + assertEquals( + listOf( + ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED, ActivityInfo.SCREEN_ORIENTATION_PORTRAIT, + ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE, ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT, + ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE + ), OrientationPolicy.entries.map { it.requested }) + } +} diff --git a/scanner-host/src/test/java/io/qrun/mobile/scanner/PhotoUploadViewModelTest.kt b/scanner-host/src/test/java/io/qrun/mobile/scanner/PhotoUploadViewModelTest.kt new file mode 100644 index 0000000..28f7798 --- /dev/null +++ b/scanner-host/src/test/java/io/qrun/mobile/scanner/PhotoUploadViewModelTest.kt @@ -0,0 +1,350 @@ +/* Copyright (c) 2026 QRunIO. SPDX-License-Identifier: Apache-2.0 */ +package io.qrun.mobile.scanner + +import java.io.IOException +import java.util.UUID +import androidx.lifecycle.ViewModel +import androidx.lifecycle.ViewModelProvider +import androidx.lifecycle.ViewModelStore +import kotlinx.coroutines.CompletableDeferred +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.test.StandardTestDispatcher +import kotlinx.coroutines.test.advanceUntilIdle +import kotlinx.coroutines.test.runCurrent +import kotlinx.coroutines.test.runTest +import kotlinx.coroutines.test.setMain +import kotlinx.coroutines.test.resetMain +import org.json.JSONArray +import org.json.JSONObject +import org.junit.Assert.assertArrayEquals +import org.junit.Assert.assertEquals +import org.junit.Assert.assertFalse +import org.junit.Assert.assertNull +import org.junit.Assert.assertTrue +import org.junit.Rule +import org.junit.Test +import org.junit.rules.TemporaryFolder + +/******************************************************************************* + ** Lifecycle and lost-response tests preserve the actual original and immutable server identity. + *******************************************************************************/ +@OptIn(ExperimentalCoroutinesApi::class) +class PhotoUploadViewModelTest { + @get:Rule + val files = TemporaryFolder() + private val target = RecordPhotoTarget("document", "1", null, null) + private val original = byteArrayOf(1, 2, 3, 4) + + /******************************************************************************* + ** Returning from the camera saves automatically, with no second upload action. + *******************************************************************************/ + @Test + fun successfulCameraCaptureAutomaticallyUploadsExactOriginal() = runTest() + { + val dispatcher = StandardTestDispatcher(testScheduler) + Dispatchers.setMain(dispatcher) + try { + val transport = FakeTransport() + val model = PhotoUploadViewModel(transport, "session", target, files.newFolder(), dispatcher) { true } + advanceUntilIdle() + model.prepareCamera().writeBytes(original) + model.cameraResult(true) + advanceUntilIdle() + assertTrue(model.saved) + assertEquals(1, transport.creates.size) + assertArrayEquals(original, transport.uploaded) + assertEquals("CAMERA", model.intent!!.origin) + } finally { + Dispatchers.resetMain() + } + } + + /******************************************************************************* + ** A host that does not opt in (generic servers) commits QUARANTINED: the saved photo + ** is reported as awaiting server review, never as available. + *******************************************************************************/ + @Test + fun quarantinedReceiptOnOtherHostsReportsAwaitingReview() = runTest() + { + val dispatcher = StandardTestDispatcher(testScheduler) + Dispatchers.setMain(dispatcher) + try { + val transport = FakeTransport().apply { lifecycle = "QUARANTINED" } + val model = PhotoUploadViewModel(transport, "session", target, files.newFolder(), dispatcher) { true } + advanceUntilIdle() + model.prepareCamera().writeBytes(original) + model.cameraResult(true) + advanceUntilIdle() + assertTrue(model.saved) + assertEquals("Saved photo. Awaiting server review.", model.message) + } finally { + Dispatchers.resetMain() + } + } + + /******************************************************************************* + ** An Echo host that admits approved-device captures commits AVAILABLE: the same unchanged + ** receipt flow reports a plain saved photo, with the exact original still verified. + *******************************************************************************/ + @Test + fun availableReceiptOnEchoHostReportsSavedWithoutReviewWait() = runTest() + { + val dispatcher = StandardTestDispatcher(testScheduler) + Dispatchers.setMain(dispatcher) + try { + val transport = FakeTransport().apply { lifecycle = "AVAILABLE" } + val model = PhotoUploadViewModel(transport, "session", target, files.newFolder(), dispatcher) { true } + advanceUntilIdle() + model.prepareCamera().writeBytes(original) + model.cameraResult(true) + advanceUntilIdle() + assertTrue(model.saved) + assertEquals("Saved photo.", model.message) + assertArrayEquals(original, transport.uploaded) + assertEquals("CAMERA", model.intent!!.origin) + } finally { + Dispatchers.resetMain() + } + } + + /******************************************************************************* + ** Clearing the process cancels in-flight transport before removing only the app-owned temporary original. + *******************************************************************************/ + @Test + fun destructionCleansPrivateOriginalWithoutClaimingServerCancellation() = runTest() + { + val dispatcher = StandardTestDispatcher(testScheduler) + Dispatchers.setMain(dispatcher) + try { + val transport = FakeTransport().apply { chunkGate = CompletableDeferred() } + val model = PhotoUploadViewModel(transport, "session", target, files.newFolder(), dispatcher) { true } + val store = ViewModelStore() + ViewModelProvider(store, object : ViewModelProvider.Factory { + /******************************************************************************* + ** + *******************************************************************************/ + @Suppress("UNCHECKED_CAST") + override fun <T : ViewModel> create(modelClass: Class<T>): T = model as T + })[PhotoUploadViewModel::class.java] + advanceUntilIdle() + model.galleryResult("image/jpeg") { original.inputStream() } + advanceUntilIdle() + val file = model.intent!!.file + model.upload() + runCurrent() + assertTrue(model.busy) + store.clear() + advanceUntilIdle() + assertFalse(file.exists()) + assertEquals(0, transport.cancels) + assertFalse(model.saved) + model.galleryResult("image/jpeg") { original.inputStream() } + model.cameraResult(true) + advanceUntilIdle() + assertNull(model.intent) + assertFalse(model.pending) + assertEquals(1, transport.creates.size) + } finally { + Dispatchers.resetMain() + } + } + + /******************************************************************************* + ** A lost create response recovers the same request, then a lost finalize is checked without duplicate finalization. + *******************************************************************************/ + @Test + fun lostResponsesKeepIdentityAndSavedRequiresReceipt() = runTest() + { + val dispatcher = StandardTestDispatcher(testScheduler) + Dispatchers.setMain(dispatcher) + try { + val transport = FakeTransport().apply { loseCreate = true; loseFinalize = true } + val model = PhotoUploadViewModel(transport, "session", target, files.newFolder(), dispatcher) { true } + advanceUntilIdle() + model.galleryResult("image/jpeg") { original.inputStream() } + advanceUntilIdle() + val intent = model.intent!! + model.upload() + advanceUntilIdle() + assertFalse(model.saved) + assertTrue(model.pending) + assertEquals(intent.requestId, model.intent!!.requestId) + model.upload() + advanceUntilIdle() + assertFalse(model.saved) + assertEquals(2, transport.creates.size) + assertEquals(transport.creates.first(), transport.creates.last()) + assertArrayEquals(original, transport.uploaded) + model.upload() + advanceUntilIdle() + assertTrue(model.saved) + assertFalse(model.pending) + assertFalse(intent.file.exists()) + assertEquals(1, transport.finalizes) + model.prepareCamera() + model.cameraResult(false) + assertFalse(model.pending) + } finally { + Dispatchers.resetMain() + } + } + + /******************************************************************************* + ** Leaving the foreground cancels transport while retaining the original; a new actor cannot resume it. + *******************************************************************************/ + @Test + fun backgroundPauseRetainsOriginalAndChangedSessionCannotResume() = runTest() + { + val dispatcher = StandardTestDispatcher(testScheduler) + Dispatchers.setMain(dispatcher) + try { + var current = true + val transport = FakeTransport().apply { chunkGate = CompletableDeferred() } + val model = PhotoUploadViewModel(transport, "session", target, files.newFolder(), dispatcher) { current } + advanceUntilIdle() + model.galleryResult("image/jpeg") { original.inputStream() } + advanceUntilIdle() + val intent = model.intent!! + model.upload() + runCurrent() + assertTrue(model.busy) + model.pause() + runCurrent() + assertFalse(model.busy) + assertTrue(intent.file.exists()) + assertTrue(model.pending) + val calls = transport.statusCalls + current = false + model.upload() + advanceUntilIdle() + assertEquals(calls, transport.statusCalls) + assertFalse(model.saved) + } finally { + Dispatchers.resetMain() + } + } + + /******************************************************************************* + ** Discard after an uncertain create first recovers that intent, then confirms server staging cancellation. + *******************************************************************************/ + @Test + fun discardRecoversUncertainCreateBeforeRemovingLocalOriginal() = runTest() + { + val dispatcher = StandardTestDispatcher(testScheduler) + Dispatchers.setMain(dispatcher) + try { + val transport = FakeTransport().apply { loseCreate = true } + val model = PhotoUploadViewModel(transport, "session", target, files.newFolder(), dispatcher) { true } + advanceUntilIdle() + model.galleryResult("image/jpeg") { original.inputStream() } + advanceUntilIdle() + val file = model.intent!!.file + model.upload() + advanceUntilIdle() + model.discard() + advanceUntilIdle() + assertEquals(2, transport.creates.size) + assertEquals(1, transport.cancels) + assertFalse(file.exists()) + assertFalse(model.pending) + } finally { + Dispatchers.resetMain() + } + } + + /******************************************************************************* + ** An in-memory server retains state independently from simulated response loss. + *******************************************************************************/ + private class FakeTransport : RecordFilesTransport { + val id = UUID.randomUUID().toString() + val creates = mutableListOf<String>() + var uploaded: ByteArray? = null + var finalizes = 0 + var cancels = 0 + var statusCalls = 0 + var lifecycle = "QUARANTINED" + var loseCreate = false + var loseFinalize = false + var chunkGate: CompletableDeferred<Unit>? = null + private lateinit var intent: PhotoUploadIntent + private var state = "OPEN" + + /******************************************************************************* + ** + *******************************************************************************/ + override suspend fun capabilities(session: String, target: RecordPhotoTarget) = PhotoUploadLimits(1024, 65536, setOf("image/jpeg")) + + /******************************************************************************* + ** + *******************************************************************************/ + override suspend fun create(session: String, intent: PhotoUploadIntent): JSONObject { + this.intent = intent + creates.add(intent.manifest().toString()) + if (loseCreate) { + loseCreate = false; throw IOException("Response lost") + } + return response() + } + + /******************************************************************************* + ** + *******************************************************************************/ + override suspend fun status(session: String, uploadId: String): JSONObject { + statusCalls++; return response() + } + + /******************************************************************************* + ** + *******************************************************************************/ + override suspend fun chunk(session: String, uploadId: String, itemId: String, index: Int, bytes: ByteArray): JSONObject { + chunkGate?.await() + uploaded = bytes.copyOf() + return response() + } + + /******************************************************************************* + ** + *******************************************************************************/ + override suspend fun finalize(session: String, uploadId: String, requestId: String): JSONObject { + finalizes++ + state = "COMPLETE" + if (loseFinalize) { + loseFinalize = false; throw IOException("Response lost") + } + return response() + } + + /******************************************************************************* + ** + *******************************************************************************/ + override suspend fun cancel(session: String, uploadId: String): JSONObject { + cancels++; state = "CANCELLED"; return response() + } + + /******************************************************************************* + ** Frozen status includes the exact original receipt only after commit. + *******************************************************************************/ + private fun response(): JSONObject { + val receipt = if (state == "COMPLETE") JSONObject().put("uploadId", id).put("state", "COMPLETE").put("collectionId", 1) + .put("completedAt", "2026-10-31T12:00:00Z").put( + "items", JSONArray().put( + JSONObject() + .put("itemId", intent.itemId).put("position", 0).put("fileId", "file").put("versionId", 2).put("attachmentId", 3) + .put("sha256", intent.sha256).put("sizeBytes", intent.size).put("lifecycleAtCommit", lifecycle) + ) + ) else JSONObject.NULL + return JSONObject().put("uploadId", id).put("state", state).put("receipt", receipt) + .put( + "limits", JSONObject().put("maximumFileBytes", 1024).put("maximumTotalBytes", 1024).put("maximumItems", 1) + .put("chunkBytes", 65536).put("acceptedMediaTypes", JSONArray().put("image/jpeg")) + ) + .put( + "items", JSONArray().put( + JSONObject().put("itemId", intent.itemId) + .put("receivedChunks", JSONArray().also { if (uploaded != null) it.put(0) }) + ) + ) + } + } +} diff --git a/scanner-host/src/test/java/io/qrun/mobile/scanner/RecordFilesApiTest.kt b/scanner-host/src/test/java/io/qrun/mobile/scanner/RecordFilesApiTest.kt new file mode 100644 index 0000000..ba0ee68 --- /dev/null +++ b/scanner-host/src/test/java/io/qrun/mobile/scanner/RecordFilesApiTest.kt @@ -0,0 +1,229 @@ +/* Copyright (c) 2026 QRunIO. SPDX-License-Identifier: Apache-2.0 */ +package io.qrun.mobile.scanner + +import com.kingsrook.qqq.frontend.android.core.controllers.UiApiCompatibility +import java.io.File +import java.util.UUID +import kotlinx.coroutines.runBlocking +import okhttp3.mockwebserver.MockResponse +import okhttp3.mockwebserver.MockWebServer +import org.json.JSONArray +import org.json.JSONObject +import org.junit.Assert.assertArrayEquals +import org.junit.Assert.assertEquals +import org.junit.Assert.assertNotNull +import org.junit.Assert.assertNull +import org.junit.Assert.assertTrue +import org.junit.Test + +/******************************************************************************* + ** Verify discovery, immutable request replay and exact persistence receipts without a device. + *******************************************************************************/ +class RecordFilesApiTest { + @Test + fun previewsUseTrackedSameOriginDeliveryAndVerifyBytes() = runBlocking() { + MockWebServer().use { server -> + server.enqueue(MockResponse().setBody(version(true))) + server.enqueue(MockResponse().setBody("""{"version":"1.0.0","blockType":"RECORD_FILES_CAPTURE","widgetType":"composite"}""")) + server.enqueue(MockResponse().setBody("""{"canUpload":false}""")) + val origin = server.url("/").toString() + val api = RecordFilesApi(origin, { mapOf("X-QQQ-Device-Token" to "synthetic") }, UiApiCompatibility(origin)) + api.capabilities("synthetic-session", target) + repeat(3) { server.takeRequest() } + val file = SavedRecordPhoto("12", "test.jpg", "image/jpeg", bytes.size.toLong(), RecordFilesApi.sha256(bytes), "AVAILABLE") + server.enqueue(MockResponse().setBody(okio.Buffer().write(bytes))) + assertArrayEquals(bytes, api.image("synthetic-session", file)) + val request = server.takeRequest() + assertTrue(request.path!!.startsWith("/qqq/v1/qbit/record-files/files/12/downloads/")) + assertEquals("1", request.getHeader("X-Record-Files-Download")) + assertEquals("android/qqq-mobile", request.getHeader("X-QQQ-Client")) + assertEquals("synthetic", request.getHeader("X-QQQ-Device-Token")) + assertTrue(runCatching { api.image("synthetic-session", file.copy(lifecycle = "QUARANTINED")) }.isFailure) + server.enqueue(MockResponse().setBody(okio.Buffer().write(byteArrayOf(4, 5, 6)))) + assertTrue(runCatching { api.image("synthetic-session", file) }.isFailure) + server.takeRequest() + server.enqueue(MockResponse().setBody(okio.Buffer().write(byteArrayOf(1, 2, 3, 4)))) + assertTrue(runCatching { api.image("synthetic-session", file) }.isFailure) + } + } + + private val target = RecordPhotoTarget("document", "opaque/key", "Photos", null) + private val bytes = byteArrayOf(1, 2, 3) + + /******************************************************************************* + ** Optional missing extensions must not send any authenticated upload traffic. + *******************************************************************************/ + @Test + fun absentExtensionHidesCaptureWithoutSendingCredentials() = runBlocking() + { + MockWebServer().use { server -> + server.enqueue(MockResponse().setBody(version(false))) + val origin = server.url("/").toString() + val api = RecordFilesApi(origin, { mapOf("X-QQQ-Device-Token" to "synthetic") }, UiApiCompatibility(origin)) + assertNull(api.capabilities("synthetic-session", target)) + val discovery = server.takeRequest() + assertEquals("/qqq/v1/version", discovery.path) + assertNull(discovery.getHeader("Cookie")) + assertNull(discovery.getHeader("X-QQQ-Device-Token")) + assertEquals(1, server.requestCount) + } + } + + /******************************************************************************* + ** Incompatible mobile vocabulary stops before record capabilities or mutations receive credentials. + *******************************************************************************/ + @Test + fun unknownCaptureVocabularyNeverSendsCredentials() = runBlocking() + { + MockWebServer().use { server -> + server.enqueue(MockResponse().setBody(version(true))) + server.enqueue(MockResponse().setBody("""{"version":"2.0.0","blockType":"RECORD_FILES_CAPTURE","widgetType":"composite"}""")) + val origin = server.url("/").toString() + val api = RecordFilesApi(origin, { mapOf("X-QQQ-Device-Token" to "synthetic") }, UiApiCompatibility(origin)) + assertNull(api.capabilities("synthetic-session", target)) + repeat(2) { assertNull(server.takeRequest().getHeader("Cookie")) } + assertEquals(2, server.requestCount) + assertTrue(runCatching { api.create("synthetic-session", intent()) }.isFailure) + assertEquals(2, server.requestCount) + } + } + + /******************************************************************************* + ** Repeated create/finalize use the same intent; chunks carry exact byte count/checksum and device identity. + *******************************************************************************/ + @Test + fun requestsUseRegisteredRoutesAndStableIdentity() = runBlocking() + { + MockWebServer().use { server -> + server.enqueue(MockResponse().setBody(version(true))) + server.enqueue(MockResponse().setBody("""{"version":"1.0.0","blockType":"RECORD_FILES_CAPTURE","widgetType":"composite"}""")) + server.enqueue( + MockResponse().setBody( + JSONObject().put("version", "1.0.0").put("canUpload", true) + .put("resumable", true).put("offline", false).put("limits", limits()).toString() + ) + ) + repeat(5) { server.enqueue(MockResponse().setBody("{}")) } + val origin = server.url("/").toString() + val api = RecordFilesApi(origin, { mapOf("X-QQQ-Device-Token" to "synthetic") }, UiApiCompatibility(origin)) + assertNotNull(api.capabilities("synthetic-session", target)) + val intent = intent() + api.create("synthetic-session", intent) + api.create("synthetic-session", intent) + val upload = UUID.randomUUID().toString() + api.chunk("synthetic-session", upload, intent.itemId, 0, bytes) + api.finalize("synthetic-session", upload, intent.requestId) + api.status("synthetic-session", upload) + server.takeRequest() + val descriptor = server.takeRequest() + assertEquals("/qqq/v1/qbit/mobile-record-files/contract", descriptor.path) + assertNull(descriptor.getHeader("Cookie")) + assertNull(descriptor.getHeader("X-QQQ-Device-Token")) + val capabilities = server.takeRequest() + assertEquals("opaque/key", capabilities.requestUrl!!.queryParameter("recordId")) + assertEquals("sessionUUID=synthetic-session", capabilities.getHeader("Cookie")) + val first = server.takeRequest() + val second = server.takeRequest() + assertEquals(first.body.readUtf8(), second.body.readUtf8()) + assertEquals("1", first.getHeader("X-Record-Files-Request")) + assertEquals("android/qqq-mobile", first.getHeader("X-QQQ-Client")) + assertEquals("synthetic", first.getHeader("X-QQQ-Device-Token")) + val chunk = server.takeRequest() + assertEquals("PUT", chunk.method) + assertEquals("3", chunk.getHeader("Content-Length")) + assertEquals(RecordFilesApi.sha256(bytes), chunk.getHeader("X-Chunk-SHA256")) + assertArrayEquals(bytes, chunk.body.readByteArray()) + val finalize = server.takeRequest() + assertEquals(intent.requestId, finalize.getHeader("Idempotency-Key")) + assertEquals(0L, finalize.bodySize) + val status = server.takeRequest() + assertEquals("GET", status.method) + // Every native record-file request (including the cookie-bearing mutations) presents its own exact origin. + val expectedOrigin = origin.trimEnd('/') + listOf(descriptor, capabilities, first, second, chunk, finalize, status).forEach { + assertEquals(expectedOrigin, it.getHeader("Origin")) + assertEquals(1, it.headers.values("Origin").size) + } + listOf(capabilities, first, second, chunk, finalize, status).forEach { assertEquals("sessionUUID=synthetic-session", it.getHeader("Cookie")) } + } + } + + /******************************************************************************* + ** A partial, mismatched or weak receipt must never display Saved. + *******************************************************************************/ + @Test + fun receiptRequiresEveryExactOriginalIdentity() { + val intent = intent() + val status = complete(intent) + assertEquals("COMPLETE", intent.verifyReceipt(status).getString("state")) + val variants = listOf<(JSONObject) -> Unit>( + { it.put("state", "FINALIZING") }, + { it.getJSONObject("receipt").put("state", "FINALIZING") }, + { it.getJSONObject("receipt").put("uploadId", UUID.randomUUID().toString()) }, + { saved(it).put("itemId", UUID.randomUUID().toString()) }, + { saved(it).put("sha256", "0".repeat(64)) }, + { saved(it).put("sizeBytes", 4) }, + { saved(it).put("position", 1) }, + { saved(it).put("attachmentId", 0) }, + { saved(it).put("fileId", "") }, + { it.getJSONObject("receipt").put("items", JSONArray()) }, + ) + variants.forEach { change -> + val altered = JSONObject(status.toString()) + change(altered) + assertTrue(runCatching { intent.verifyReceipt(altered) }.isFailure) + } + } + + /******************************************************************************* + ** The server cannot expand allocations beyond the supported per-original/chunk bounds. + *******************************************************************************/ + @Test + fun limitsAndParentMetadataFailClosed() { + assertEquals(65536, PhotoUploadLimits.parse(limits()).chunkBytes) + assertTrue(runCatching { PhotoUploadLimits.parse(limits().put("chunkBytes", 32 * 1024 * 1024)) }.isFailure) + assertTrue(runCatching { PhotoUploadLimits.parse(limits().put("maximumItems", 0)) }.isFailure) + assertTrue(runCatching { RecordPhotoTarget.parse(mapOf("parent" to mapOf("tableName" to "document", "recordId" to 1))) }.isFailure) + } + + /******************************************************************************* + ** Synthetic originals do not read or write user files. + *******************************************************************************/ + private fun intent() = PhotoUploadIntent(target, File("photo.jpg"), "image/jpeg", "CAMERA", bytes.size.toLong(), RecordFilesApi.sha256(bytes)) + + /******************************************************************************* + ** A minimal complete response follows the frozen extension schema. + *******************************************************************************/ + private fun complete(intent: PhotoUploadIntent): JSONObject { + val upload = UUID.randomUUID().toString() + val item = JSONObject().put("itemId", intent.itemId).put("fileId", "file-key").put("versionId", 1) + .put("attachmentId", 2).put("sizeBytes", intent.size).put("sha256", intent.sha256).put("position", 0).put("lifecycleAtCommit", "QUARANTINED") + val receipt = JSONObject().put("uploadId", upload).put("collectionId", 3).put("state", "COMPLETE") + .put("completedAt", "2026-10-31T12:00:00Z").put("items", JSONArray().put(item)) + return JSONObject().put("uploadId", upload).put("state", "COMPLETE").put("receipt", receipt) + } + + /******************************************************************************* + ** Locate the only synthetic receipt item for independent corruptions. + *******************************************************************************/ + private fun saved(status: JSONObject) = status.getJSONObject("receipt").getJSONArray("items").getJSONObject(0) + + /******************************************************************************* + ** Small valid limits keep transport tests cheap. + *******************************************************************************/ + private fun limits() = JSONObject().put("maximumFileBytes", 1024).put("maximumTotalBytes", 1024).put("maximumItems", 1) + .put("chunkBytes", 65536).put("lifetimeSeconds", 60).put("acceptedMediaTypes", JSONArray().put("image/jpeg")) + + /******************************************************************************* + ** Discovery remains credential-free even for an absent optional extension. + *******************************************************************************/ + private fun version(recordFiles: Boolean): String = JSONObject().put("apiVersion", "1.8.0") + .put("features", JSONArray(listOf("version", "metaData", "processes", "processCancel", "extensions", "widgets"))) + .put("clientChannels", JSONArray().put("android")) + .put("extensions", JSONArray().also { + if (recordFiles) { + it.put(JSONObject().put("name", "record-files").put("version", "1.0.0").put("pathPrefix", "/qbit/record-files")) + it.put(JSONObject().put("name", "mobile-record-files").put("version", "1.0.0").put("pathPrefix", "/qbit/mobile-record-files")) + } + }).toString() +} diff --git a/scanner-host/src/test/java/io/qrun/mobile/scanner/ScanEventTest.kt b/scanner-host/src/test/java/io/qrun/mobile/scanner/ScanEventTest.kt new file mode 100644 index 0000000..ef42b73 --- /dev/null +++ b/scanner-host/src/test/java/io/qrun/mobile/scanner/ScanEventTest.kt @@ -0,0 +1,161 @@ +/* Copyright (c) 2026 QRunIO. SPDX-License-Identifier: Apache-2.0 */ +package io.qrun.mobile.scanner + +import com.kingsrook.qqq.frontend.android.core.controllers.UiApiExtension +import com.kingsrook.qqq.frontend.android.core.controllers.UiApiVersion +import java.util.Base64 +import org.junit.Assert.assertArrayEquals +import org.junit.Assert.assertEquals +import org.junit.Assert.assertFalse +import org.junit.Assert.assertNotEquals +import org.junit.Assert.assertNull +import org.junit.Assert.assertThrows +import org.junit.Assert.assertTrue +import org.junit.Test + +/******************************************************************************* + ** Retrying a submission must not turn it into a second captured scan. + *******************************************************************************/ +class ScanEventTest { + private val legacyKeys = setOf("barcode", "symbology", "scanSource", "eventId", "capturedAt") + + /******************************************************************************* + ** + *******************************************************************************/ + private fun version(scanners: String?, path: String = "/qbit/mobile-scanners") = UiApiVersion( + "1.8.0", extensions = listOfNotNull(scanners?.let { UiApiExtension("mobile-scanners", it, path) }) + ) + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun retryKeepsIdentityAndOriginalCaptureTime() { + val event = ScanEvent("001234", "LABEL-TYPE-CODE128", "scanner") + assertEquals(event.values(), event.values()) + assertEquals("001234", event.values()["barcode"]) + assertNotEquals(event.eventId, ScanEvent("001234", "LABEL-TYPE-CODE128", "scanner").eventId) + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun oldServerGetsExactlyTheLegacyFiveKeysEvenWhenFidelityIsCaptured() { + val event = ScanEvent(ScannerCapture.of("A", "QRCODE", byteArrayOf(1, 2), "]Q1"), "zebra-emdk") + assertEquals(legacyKeys, event.values().keys) + assertEquals(legacyKeys, event.values(includeFidelity = false).keys) + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun fidelityValuesAreFlatStringsAndMissingKeysAreOmitted() { + val raw = byteArrayOf(0x1d, 0x41) + val full = ScanEvent(ScannerCapture.of("A", "QRCODE", raw, "]Q1"), "zebra-emdk").values(true) + assertEquals("]Q1", full["aimIdentifier"]) + assertEquals(Base64.getEncoder().encodeToString(raw), full["rawDataBase64"]) + val rawOnly = ScanEvent(ScannerCapture.of("A", "QRCODE", raw), "zebra-emdk").values(true) + assertEquals(legacyKeys + "rawDataBase64", rawOnly.keys) + assertEquals(legacyKeys, ScanEvent(ScannerCapture.manual("A"), "manual").values(true).keys) + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun retryPayloadIsUnchangedAcrossRepeatedValueBuilding() { + val source = byteArrayOf(0, 1, 2) + val event = ScanEvent(ScannerCapture.of("A", "QRCODE", source, "]Q1"), "zebra-emdk") + val first = event.values(true) + source[0] = 9 + assertEquals(first, event.values(true)) + assertEquals(first, event.copy().values(true)) + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun captureCopiesInputAndAllByteValuesRoundTrip() { + val all = ByteArray(256) { it.toByte() } + val capture = ScannerCapture.of("A", "QRCODE", all) + all.fill(0) + val expected = ByteArray(256) { it.toByte() } + assertArrayEquals(expected, Base64.getDecoder().decode(capture.rawDataBase64)) + assertEquals(capture, ScannerCapture.of("A", "QRCODE", expected)) + assertEquals(capture.hashCode(), ScannerCapture.of("A", "QRCODE", expected).hashCode()) + assertNotEquals(capture, ScannerCapture.of("A", "QRCODE", expected, "]Q1")) + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun rawLengthLimitsOmitInsteadOfTruncating() { + assertNull(ScannerCapture.of("A", "Q", null).rawDataBase64) + assertNull(ScannerCapture.of("A", "Q", ByteArray(0)).rawDataBase64) + assertNull(ScannerCapture.of("A", "Q", ByteArray(8193)).rawDataBase64) + val max = ScannerCapture.of("A", "Q", ByteArray(8192) { 1 }) + assertEquals(10924, max.rawDataBase64!!.length) + assertEquals("AA==", ScannerCapture.of("A", "Q", ByteArray(1)).rawDataBase64) + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun aimMustBeOriginalWellFormedIdentifier() { + listOf("]Q1", "]c0", "]A0", "]z9").forEach { assertEquals(it, ScannerCapture.of("A", "Q", null, it).aimIdentifier) } + listOf("", "Q1", "]Q", "]Q11", "]11", "]Q!", "]Q1 ", "]Qé").forEach { + assertThrows(IllegalArgumentException::class.java) { ScannerCapture.of("A", "Q", null, it) } + } + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun stringFormsNeverLeakScanContent() { + val event = ScanEvent(ScannerCapture.of("SECRET-BARCODE", "QRCODE", "SECRET-RAW".toByteArray(), "]Q1"), "zebra-emdk") + listOf(event.toString(), event.capture.toString()).forEach { + assertFalse(it, it.contains("SECRET")) + assertFalse(it, it.contains(Base64.getEncoder().encodeToString("SECRET-RAW".toByteArray()))) + assertFalse(it, it.contains("]Q1")) + } + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun capabilityRequiresMobileScanners15WithinMajor1AtRegisteredPath() { + assertTrue(ScanFidelityCapability.supports(version("1.5.0"))) + assertTrue(ScanFidelityCapability.supports(version("1.12.3"))) + listOf("1.4.9", "1.1.0", "2.0.0", "2.5.0", "1.5", "1.5.0-rc1", "01.5.0", "1.5.0.1", "", "1.99999999999.0").forEach { + assertFalse(it, ScanFidelityCapability.supports(version(it))) + } + assertFalse(ScanFidelityCapability.supports(version("1.5.0", "/qbit/other"))) + assertFalse(ScanFidelityCapability.supports(version(null))) + assertFalse(ScanFidelityCapability.supports(null)) + val duplicate = UiApiVersion( + "1.8.0", extensions = listOf( + UiApiExtension("mobile-scanners", "1.5.0", "/qbit/mobile-scanners"), + UiApiExtension("mobile-scanners", "1.5.0", "/qbit/mobile-scanners") + ) + ) + assertFalse(ScanFidelityCapability.supports(duplicate)) + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun capabilityIsScopedToTheServerThatWasDiscovered() { + val v = version("1.5.0") + assertTrue(ScanFidelityCapability.available("https://a/", "https://a/", v)) + assertFalse(ScanFidelityCapability.available("https://b/", "https://a/", v)) + assertFalse(ScanFidelityCapability.available("https://a/", "https://a/", null)) + } +} diff --git a/scanner-host/src/test/java/io/qrun/mobile/scanner/ScannerFeedbackTest.kt b/scanner-host/src/test/java/io/qrun/mobile/scanner/ScannerFeedbackTest.kt new file mode 100644 index 0000000..04aeb9a --- /dev/null +++ b/scanner-host/src/test/java/io/qrun/mobile/scanner/ScannerFeedbackTest.kt @@ -0,0 +1,121 @@ +/* Copyright (c) 2026 QRunIO. SPDX-License-Identifier: Apache-2.0 */ +package io.qrun.mobile.scanner + +import org.junit.Assert.assertEquals +import org.junit.Assert.assertFalse +import org.junit.Assert.assertNull +import org.junit.Assert.assertTrue +import org.junit.Test + +/******************************************************************************* + ** The visible scan must survive acknowledgment and retry unchanged, never invent a symbology, and + ** claim success only on the same receipt the process requires. + *******************************************************************************/ +class ScannerFeedbackTest { + private val event = ScanEvent(ScannerCapture.of("00123\u001d45", "LABEL-TYPE-CODE128"), "zebra-emdk") + private val receipt = mapOf("acknowledgedEventId" to event.eventId, "scanSaved" to true, "scanId" to "7") + + /******************************************************************************* + ** + *******************************************************************************/ + private fun derive(last: LastScan?, pending: Map<String, Any?>?, response: Map<String, Any?>, waiting: Boolean = false, cancelling: Boolean = false) = + ScannerFeedback.derive(last, pending, response, waiting, cancelling) + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun nothingScannedYieldsNoFeedbackSoThePanelShowsWaiting() { + assertNull(derive(null, null, emptyMap())) + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun lastCaptureStaysVisibleAfterFullReceiptClearsPendingState() { + val feedback = derive(LastScan.of(event), null, receipt)!! + assertEquals("00123\u001d45", feedback.barcode) + assertEquals("LABEL-TYPE-CODE128", feedback.symbology) + assertEquals("Confirmed by server", feedback.status) + assertEquals("8 characters, 1 control character", feedback.details) + } + + /******************************************************************************* + ** The event id alone is not a receipt: scanSaved=true and a non-blank scanId are also required. + *******************************************************************************/ + @Test + fun incompleteReceiptsAreNeverReportedAsConfirmed() { + val partial = listOf( + mapOf("acknowledgedEventId" to event.eventId), + receipt + ("scanSaved" to false), + receipt + ("scanId" to " "), + receipt - "scanId", + ) + for (response in partial) assertEquals( + "Not confirmed. Follow the process message before submitting again.", derive(LastScan.of(event), null, response)!!.status + ) + assertEquals( + "Not confirmed. Retry the same request or leave the process; do not assume it was saved.", + derive(null, event.values(), partial[1])!!.status + ) + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun retryShowsTheSameValueAndTypeFromThePendingRequest() { + val pending = event.values() + val sending = derive(null, pending, emptyMap(), waiting = true)!! + val failed = derive(null, pending, emptyMap())!! + assertEquals("Sending scan…", sending.status) + assertTrue(failed.status.startsWith("Not confirmed. Retry the same request")) + for (feedback in listOf(sending, failed)) { + assertEquals(event.barcode, feedback.barcode) + assertEquals(event.symbology, feedback.symbology) + } + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun nextCaptureReplacesAnEarlierConfirmedOne() { + val next = ScanEvent(ScannerCapture.of("999", "QRCODE"), "zebra-emdk") + val feedback = derive(LastScan.of(event), next.values(), receipt, waiting = true)!! + assertEquals("999", feedback.barcode) + assertEquals("QRCODE", feedback.symbology) + assertEquals("Sending scan…", feedback.status) + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun cancellationIsNotReportedAsConfirmation() { + assertEquals("Cancelling. Scan was not confirmed.", derive(LastScan.of(event), event.values(), emptyMap(), cancelling = true)!!.status) + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun manualEntryNeverReceivesAGuessedSymbology() { + val manual = ScanEvent(ScannerCapture.manual("00042"), "manual") + assertNull(LastScan.of(manual).symbology) + assertEquals(ScannerFeedback.MANUAL_SYMBOLOGY, derive(LastScan.of(manual), null, emptyMap())!!.symbology) + val pending = derive(null, manual.values(), emptyMap())!! + assertEquals(ScannerFeedback.MANUAL_SYMBOLOGY, pending.symbology) + assertEquals("00042", pending.barcode) + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun scanContentIsRedactedFromToString() { + assertFalse(LastScan.of(event).toString().contains("00123")) + assertFalse(derive(LastScan.of(event), null, receipt)!!.toString().contains("00123")) + } +} diff --git a/scanner-host/src/test/java/io/qrun/mobile/scanner/ScannerInputSessionTest.kt b/scanner-host/src/test/java/io/qrun/mobile/scanner/ScannerInputSessionTest.kt new file mode 100644 index 0000000..362d28c --- /dev/null +++ b/scanner-host/src/test/java/io/qrun/mobile/scanner/ScannerInputSessionTest.kt @@ -0,0 +1,432 @@ +/* Copyright (c) 2026 QRunIO. SPDX-License-Identifier: Apache-2.0 */ +package io.qrun.mobile.scanner + +import org.junit.Assert.assertEquals +import org.junit.Assert.assertTrue +import org.junit.Test + +/******************************************************************************* + ** + *******************************************************************************/ +class ScannerInputSessionTest { + /******************************************************************************* + ** + *******************************************************************************/ + private class Device : ScannerDriver { + lateinit var listener: ScannerDriver.Listener + var reads = 0 + var cancels = 0 + var releases = 0 + var pending = false + var failRead = false + var failCancel = false + var failRelease = false + + /******************************************************************************* + ** + *******************************************************************************/ + override fun open(listener: ScannerDriver.Listener) { + this.listener = listener + } + + /******************************************************************************* + ** + *******************************************************************************/ + override fun isReadPending() = pending + + /******************************************************************************* + ** + *******************************************************************************/ + override fun read() { + if (failRead) error("Synthetic read error"); reads++; pending = true + } + + /******************************************************************************* + ** + *******************************************************************************/ + override fun cancelRead() { + cancels++; pending = false; if (failCancel) error("Synthetic cancel error") + } + + /******************************************************************************* + ** + *******************************************************************************/ + override fun close() { + releases++; if (failRelease) error("Synthetic close error") + } + + /******************************************************************************* + ** + *******************************************************************************/ + fun idle() { + listener.idle() + } + + /******************************************************************************* + ** + *******************************************************************************/ + fun scan(value: String = "001234567890", raw: ByteArray? = null) { + pending = false; listener.scanned(ScannerCapture.of(value, "QRCODE", raw)) + } + } + + /******************************************************************************* + ** + *******************************************************************************/ + private class Fixture { + val devices = mutableListOf<Device>() + val scans = mutableListOf<Pair<String, String>>() + val captures = mutableListOf<ScannerCapture>() + val statuses = mutableListOf<String>() + val session = ScannerInputSession( + { Device().also { devices.add(it) } }, + { capture -> captures.add(capture); scans.add(capture.barcode to capture.symbology) }, { message, _ -> statuses.add(message) }) + + /******************************************************************************* + ** + *******************************************************************************/ + fun start(): Device { + session.setAccepting(true) + session.setActive(true) + return devices.last() + } + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun missingHardwareKeepsManualFallback() { + val statuses = mutableListOf<String>() + val session = ScannerInputSession({ null }, { error("Unexpected scan") },{ message, _ -> statuses.add(message) }) + session.setAccepting(true) + session.setActive(true) + assertTrue(statuses.single().contains("manually")) + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun liveSurfaceGateRejectsCallbackBeforeRecompositionAndRearmsAfterDismissal() { + val device = Device() + var allowed = true + val scans = mutableListOf<String>() + val session = ScannerInputSession({ device }, { capture -> scans.add(capture.barcode) }, { _, _ -> }, { allowed }) + session.setAccepting(true) + session.setActive(true) + device.idle() + allowed = false // An overlay opened; Compose has not run setAccepting(false) yet. + device.scan() + device.idle() + assertTrue(scans.isEmpty()) + assertEquals(1, device.reads) + session.setAccepting(false) + allowed = true + session.setAccepting(true) + assertEquals(2, device.reads) + device.scan("00123") + assertEquals(listOf("00123"), scans) + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun hiddenSurfaceNeverArmsEvenWhenOldReadinessFlagIsTrue() { + val device = Device() + var allowed = false + val session = ScannerInputSession({ device }, { error("Unexpected scan") }, { _, _ -> }, { allowed }) + session.setAccepting(true) + session.setActive(true) + device.idle() + assertEquals(0, device.reads) + allowed = true + session.setAccepting(true) + assertEquals(1, device.reads) + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun waitsForIdleAndDoesNotDuplicateAnArmedRead() { + val fixture = Fixture() + val device = fixture.start() + assertEquals(0, device.reads) + device.idle() + device.idle() + fixture.session.setAccepting(true) + assertEquals(1, device.reads) + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun preservesRawStringAndWaitsForAcknowledgmentBeforeRearming() { + val fixture = Fixture() + val device = fixture.start() + device.idle() + device.scan(" 001234567890 ") + device.idle() + device.scan("injected-duplicate") + assertEquals(listOf(" 001234567890 " to "QRCODE"), fixture.scans) + assertEquals(1, device.reads) + fixture.session.setAccepting(true) + assertEquals(2, device.reads) + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun rawBytesReachTheSinkUnchangedAndStaleOwnersDeliverNothing() { + val fixture = Fixture() + val first = fixture.start() + first.idle() + val raw = ByteArray(256) { it.toByte() } + fixture.session.setActive(false) + fixture.session.setActive(true) + first.scan("stale", raw) + assertTrue(fixture.captures.isEmpty()) + val second = fixture.devices.last() + second.idle() + second.scan("current", raw) + assertEquals("current", fixture.captures.single().barcode) + assertEquals(java.util.Base64.getEncoder().encodeToString(raw), fixture.captures.single().rawDataBase64) + assertTrue(fixture.captures.single().aimIdentifier == null) + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun idleBeforeDataAlsoRearmsAfterAcknowledgment() { + val fixture = Fixture() + val device = fixture.start() + device.idle() + device.pending = false + device.idle() + assertEquals(2, device.reads) + // Deliver the first read's data while the second read is pending. + device.listener.scanned(ScannerCapture.of("001234567890", "QRCODE")) + assertEquals(1, device.cancels) + assertEquals(1, fixture.scans.size) + device.idle() + fixture.session.setAccepting(true) + assertEquals(3, device.reads) + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun idleWithoutDecodedDataAllowsTheNextTrigger() { + val fixture = Fixture() + val device = fixture.start() + device.idle() + device.pending = false + device.idle() + assertEquals(2, device.reads) + device.scan() + assertEquals(1, fixture.scans.size) + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun explicitReconnectRecoversAfterOldAcquisitionWasBusy() { + val fixture = Fixture() + val first = fixture.start() + fixture.session.setActive(false) + fixture.session.setActive(true) + val busy = fixture.devices.last() + busy.listener.failed() + first.idle() + fixture.session.reconnect() + val recovered = fixture.devices.last() + assertEquals(3, fixture.devices.size) + recovered.idle() + recovered.scan() + assertEquals(1, fixture.scans.size) + assertEquals(1, busy.releases) + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun emptyOrCanceledCollectionWaitsForIdleAndAllowsNextRead() { + val fixture = Fixture() + val device = fixture.start() + device.idle() + device.pending = false + device.listener.noData(false) + assertEquals(1, device.reads) + assertEquals(0, device.releases) + assertTrue(fixture.scans.isEmpty()) + device.idle() + assertEquals(2, device.reads) + device.scan() + assertEquals(1, fixture.scans.size) + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun canceledCollectionAfterAcceptedScanDoesNotClearAcknowledgmentGate() { + val fixture = Fixture() + val device = fixture.start() + device.idle() + device.pending = false + device.idle() + device.listener.scanned(ScannerCapture.of("001234567890", "QRCODE")) + device.listener.noData(false) + device.idle() + assertEquals(1, device.cancels) + assertEquals(2, device.reads) + assertEquals(0, device.releases) + assertTrue(fixture.statuses.last().contains("Waiting for scan confirmation")) + fixture.session.setAccepting(true) + assertEquals(3, device.reads) + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun multipleBarcodesAreRejectedWithNoticeAndNextSingleScanWorks() { + val fixture = Fixture() + val device = fixture.start() + device.idle() + device.pending = false + device.listener.noData(true) + device.idle() + assertTrue(fixture.scans.isEmpty()) + assertEquals(0, device.releases) + assertEquals(2, device.reads) + assertTrue(fixture.statuses.last().contains("Multiple barcodes were rejected")) + device.scan() + assertEquals(1, fixture.scans.size) + assertTrue(fixture.statuses.last().contains("Waiting for scan confirmation")) + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun vendorPendingReadIsNotDuplicated() { + val fixture = Fixture() + val device = fixture.start() + device.pending = true + device.idle() + assertEquals(0, device.reads) + device.pending = false + device.idle() + assertEquals(1, device.reads) + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun blockedWorkCancelsReadAndIgnoresLateData() { + val fixture = Fixture() + val device = fixture.start() + device.idle() + fixture.session.setAccepting(false) + fixture.session.setAccepting(false) + device.scan() + device.idle() + assertEquals(1, device.cancels) + assertTrue(fixture.scans.isEmpty()) + fixture.session.setAccepting(true) + assertEquals(2, device.reads) + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun pauseReleasesOnceAndOldGenerationCannotAffectResumedDevice() { + val fixture = Fixture() + val first = fixture.start() + first.idle() + fixture.session.setActive(false) + fixture.session.setActive(false) + fixture.session.setActive(true) + val second = fixture.devices.last() + first.idle() + first.scan() + first.listener.failed() + assertEquals(1, first.releases) + assertEquals(0, second.releases) + assertTrue(fixture.scans.isEmpty()) + second.idle() + second.scan() + assertEquals(1, fixture.scans.size) + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun lateReadyAfterDisposeNeverArmsOrSubmits() { + val fixture = Fixture() + val device = fixture.start() + fixture.session.setActive(false) + device.idle() + device.scan() + assertEquals(1, device.releases) + assertEquals(0, device.reads) + assertTrue(fixture.scans.isEmpty()) + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun readFailureReleasesAndDoesNotClaimReady() { + val fixture = Fixture() + val device = fixture.start() + device.failRead = true + device.idle() + device.idle() + fixture.session.setAccepting(true) + assertEquals(1, device.releases) + assertEquals(0, device.reads) + assertTrue(fixture.statuses.last().contains("Reconnect")) + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun failedCancellationStillReleasesScanner() { + val fixture = Fixture() + val device = fixture.start() + device.idle() + device.failCancel = true + fixture.session.setAccepting(false) + assertEquals(1, device.releases) + assertTrue(fixture.statuses.last().contains("Reconnect")) + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun failedReleaseDoesNotClaimReadyOrAcquireAnotherDevice() { + val fixture = Fixture() + val device = fixture.start() + device.idle() + device.failRelease = true + fixture.session.setActive(false) + fixture.session.setActive(true) + assertEquals(1, fixture.devices.size) + assertTrue(fixture.statuses.last().contains("release could not be confirmed")) + } +} diff --git a/scanner-host/src/test/java/io/qrun/mobile/scanner/ScannerMetaDataTest.kt b/scanner-host/src/test/java/io/qrun/mobile/scanner/ScannerMetaDataTest.kt new file mode 100644 index 0000000..74d5f73 --- /dev/null +++ b/scanner-host/src/test/java/io/qrun/mobile/scanner/ScannerMetaDataTest.kt @@ -0,0 +1,76 @@ +/* Copyright (c) 2026 QRunIO. SPDX-License-Identifier: Apache-2.0 */ +package io.qrun.mobile.scanner + +import org.junit.Assert.assertEquals +import org.junit.Assert.assertThrows +import org.junit.Test + +/******************************************************************************* + ** + *******************************************************************************/ +class ScannerMetaDataTest { + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun serverDefinesLabelsAndLengthWithContractDefaults() { + assertEquals(ScannerMetaData(), ScannerMetaData.parse(emptyMap())) + assertEquals("Saved scan", ScannerMetaData.parse(emptyMap()).acknowledgmentLabel) + assertEquals(true, ScannerMetaData.parse(emptyMap()).manualEntryEnabled) + assertEquals(ScannerMetaData("Item barcode", "Save item", 30), ScannerMetaData.parse(mapOf("manualLabel" to "Item barcode", "submitLabel" to "Save item", "maxLength" to 30L, "future" to true))) + } + + /******************************************************************************* + ** Manual input stays available by default and can be hidden independently of receipt presentation. + *******************************************************************************/ + @Test + fun manualEntryVisibilityUsesExplicitBooleanHints() { + assertEquals(true, ScannerMetaData.parse(mapOf("manualEntryEnabled" to true)).manualEntryEnabled) + assertEquals(false, ScannerMetaData.parse(mapOf("manualEntryEnabled" to false)).manualEntryEnabled) + assertEquals(ScannerMetaData(acknowledgmentLabel = "Print queued", manualEntryEnabled = false), + ScannerMetaData.parse(mapOf("acknowledgmentLabel" to "Print queued", "manualEntryEnabled" to false))) + } + + /******************************************************************************* + ** Supplied flags must be JSON booleans, without number or string coercion. + *******************************************************************************/ + @Test + fun explicitlyInvalidManualEntryHintsFailClosed() { + for (value in listOf(null, 0, 1, 1.0, "true", "false", "", listOf(true), mapOf("enabled" to true))) { + assertThrows(IllegalArgumentException::class.java) { ScannerMetaData.parse(mapOf("manualEntryEnabled" to value)) } + } + } + + /******************************************************************************* + ** A server may describe accepted work without changing the scan receipt contract. + *******************************************************************************/ + @Test + fun acknowledgmentLabelsDescribeTheAcceptedOperation() { + assertEquals("Print queued", ScannerMetaData.parse(mapOf("acknowledgmentLabel" to "Print queued")).acknowledgmentLabel) + assertEquals("Étiquette prête", ScannerMetaData.parse(mapOf("acknowledgmentLabel" to "Étiquette prête")).acknowledgmentLabel) + val longestLabel = "Q".repeat(80) + assertEquals(longestLabel, ScannerMetaData.parse(mapOf("acknowledgmentLabel" to longestLabel)).acknowledgmentLabel) + } + + /******************************************************************************* + ** Reject malformed supplied hints rather than silently displaying an unrelated success label. + *******************************************************************************/ + @Test + fun explicitlyInvalidAcknowledgmentLabelsFailClosed() { + for (value in listOf(null, 42, false, "", " ", " Print queued", "Print queued ", "Q".repeat(81), + "Print\nqueued", "Print\rqueued", "Print\tqueued", "Print\u0000queued", "Print\u2028queued", "Print\u2029queued", + "Print\u202Equeued", "<b>Print queued</b>")) { + assertThrows(IllegalArgumentException::class.java) { ScannerMetaData.parse(mapOf("acknowledgmentLabel" to value)) } + } + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun explicitlyInvalidLengthFailsClosedInsteadOfBroadeningTheConstraint() { + for (value in listOf(null, -1, 0, 4097, "10", 1.5, Double.NaN, Double.POSITIVE_INFINITY, Long.MAX_VALUE)) { + assertThrows(IllegalArgumentException::class.java) { ScannerMetaData.parse(mapOf("maxLength" to value)) } + } + } +} diff --git a/scanner-host/src/test/java/io/qrun/mobile/scanner/ScreenConsentAttemptTest.kt b/scanner-host/src/test/java/io/qrun/mobile/scanner/ScreenConsentAttemptTest.kt new file mode 100644 index 0000000..43e4601 --- /dev/null +++ b/scanner-host/src/test/java/io/qrun/mobile/scanner/ScreenConsentAttemptTest.kt @@ -0,0 +1,56 @@ +/* Copyright (c) 2026 QRunIO. SPDX-License-Identifier: Apache-2.0 */ +package io.qrun.mobile.scanner + +import org.junit.Assert.assertFalse +import org.junit.Assert.assertTrue +import org.junit.Test + +/******************************************************************************* + ** + *******************************************************************************/ +class ScreenConsentAttemptTest { + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun consentIsSingleUseAndCannotBeReplayedAfterCancellation() { + val attempt = ScreenConsentAttempt() + val first = attempt.begin() + assertFalse(attempt.consume(first, false, true)) + assertFalse(attempt.consume(first, true, true)) + val next = attempt.begin() + assertFalse(attempt.consume(first, true, true)) + assertTrue(attempt.consume(next, true, true)) + assertFalse(attempt.consume(next, true, true)) + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun logoutServerChangeOrDisposalRejectsPendingAndLateServiceCallbacks() { + val attempt = ScreenConsentAttempt() + val ticket = attempt.begin() + attempt.invalidate() + assertFalse(attempt.current(ticket)) + assertFalse(attempt.consume(ticket, true, true)) + val fresh = attempt.begin() + assertTrue(attempt.consume(fresh, true, true)) + attempt.invalidate() + assertFalse(attempt.current(fresh)) + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun approvalLossAndProcessRecreationNeverAdoptAnOldConsentResult() { + val attempt = ScreenConsentAttempt() + val ticket = attempt.begin() + assertFalse(attempt.consume(ticket, true, false)) + assertFalse(attempt.consume(ticket, true, true)) + val recreated = ScreenConsentAttempt() + recreated.begin() + assertFalse(recreated.consume(ticket, true, true)) + } +} diff --git a/scanner-host/src/test/java/io/qrun/mobile/scanner/ServerUrlTest.kt b/scanner-host/src/test/java/io/qrun/mobile/scanner/ServerUrlTest.kt new file mode 100644 index 0000000..60be52e --- /dev/null +++ b/scanner-host/src/test/java/io/qrun/mobile/scanner/ServerUrlTest.kt @@ -0,0 +1,30 @@ +/* Copyright (c) 2026 QRunIO. SPDX-License-Identifier: Apache-2.0 */ +package io.qrun.mobile.scanner + +import org.junit.Assert.assertEquals +import org.junit.Assert.assertThrows +import org.junit.Test + +/******************************************************************************* + ** Credentials must never be sent to user-info URLs, unexpected paths, or release HTTP origins. + *******************************************************************************/ +class ServerUrlTest { + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun normalizesOneCanonicalOrigin() { + assertEquals("https://example.com/", normalizeServerUrl(" https://EXAMPLE.com ", false)) + assertEquals("http://192.168.1.20:8000/", normalizeServerUrl("http://192.168.1.20:8000/", true)) + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun rejectsUnsafeOrigins() { + listOf("http://example.com", "https://user:password@example.com", "https://example.com/path", "https://example.com/?token=x", "https://example.com/#fragment").forEach { url -> + assertThrows(IllegalArgumentException::class.java) { normalizeServerUrl(url, false) } + } + } +} diff --git a/scanner-host/src/test/java/io/qrun/mobile/scanner/WallpaperStatusTest.kt b/scanner-host/src/test/java/io/qrun/mobile/scanner/WallpaperStatusTest.kt new file mode 100644 index 0000000..9e4816f --- /dev/null +++ b/scanner-host/src/test/java/io/qrun/mobile/scanner/WallpaperStatusTest.kt @@ -0,0 +1,189 @@ +/* Copyright (c) 2026 QRunIO. SPDX-License-Identifier: Apache-2.0 */ +package io.qrun.mobile.scanner + +import org.junit.Assert.assertEquals +import org.junit.Assert.assertFalse +import org.junit.Assert.assertNull +import org.junit.Assert.assertTrue +import org.junit.Test + +/******************************************************************************* + ** The wallpaper may show identity and IP only on the unlocked home screen, only while fresh, and never keeps either + ** after the session ends. + *******************************************************************************/ +class WallpaperStatusTest { + private var elapsed = 1_000L + private var wall = 1_700_000_000_000L + private val store = WallpaperStatusStore({ elapsed }, { wall }) + private val ip = "IP: wlan0 10.0.0.5" + + private fun render(context: WallpaperContext, now: Long = elapsed) = + WallpaperPresentation.render(store.snapshot, context, ip, now) { "HH:mm" } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun newProcessIsUnknownAndShowsNoIdentity() { + assertEquals(WallpaperSessionState.UNKNOWN, store.snapshot.state) + assertEquals(listOf("Session: not available", ip), render(WallpaperContext.HOME).lines) + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun previewAndLockedShowBrandOnlyEvenWhenSignedIn() { + store.signedIn("Ada Lovelace", "qqq.example.com", foreground = true) + listOf(WallpaperContext.PREVIEW, WallpaperContext.LOCKED).forEach { + val frame = render(it) + assertEquals(HostBrand().displayName, frame.header) + assertTrue(frame.lines.isEmpty()) + } + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun homeShowsNameServerAndIpWhileForeground() { + store.signedIn("Ada Lovelace", "qqq.example.com", foreground = true) + assertEquals(listOf("Signed in: Ada Lovelace", "Server: qqq.example.com", ip), render(WallpaperContext.HOME).lines) + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun backgroundSessionIsLabelledLastConfirmedNotLive() { + store.signedIn("Ada Lovelace", "qqq.example.com", foreground = true) + store.signedIn("Ada Lovelace", "qqq.example.com", foreground = false) + val lines = render(WallpaperContext.HOME, elapsed + 60_000).lines + assertTrue(lines.contains("Signed in: Ada Lovelace")) + assertTrue(lines.contains("Last confirmed HH:mm (app in background)")) + assertFalse(lines.any { it.contains("verified", ignoreCase = true) && !it.contains("unverified", ignoreCase = true) }) + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun nameIsWithdrawnAfterTheStaleWindow() { + store.signedIn("Ada Lovelace", "qqq.example.com", foreground = false) + val justBefore = elapsed + WallpaperPresentation.STALE_AFTER_MILLIS - 1 + val atWindow = elapsed + WallpaperPresentation.STALE_AFTER_MILLIS + assertTrue(render(WallpaperContext.HOME, justBefore).lines.contains("Signed in: Ada Lovelace")) + assertEquals(1L, WallpaperPresentation.millisUntilStale(store.snapshot, justBefore)) + val stale = render(WallpaperContext.HOME, atWindow).lines + assertEquals(listOf("Session unverified", "Last confirmed HH:mm", ip), stale) + assertNull(WallpaperPresentation.millisUntilStale(store.snapshot, atWindow)) + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun foregroundSessionNeverGoesStaleOrNeedsATimer() { + store.signedIn("Ada Lovelace", null, foreground = true) + assertFalse(WallpaperPresentation.isStale(store.snapshot, elapsed + 10 * WallpaperPresentation.STALE_AFTER_MILLIS)) + assertNull(WallpaperPresentation.millisUntilStale(store.snapshot, elapsed)) + assertEquals(listOf("Signed in: Ada Lovelace", ip), render(WallpaperContext.HOME).lines) + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun signOutDropsNameAndServerButClearReturnsToUnknown() { + store.signedIn("Ada Lovelace", "qqq.example.com", foreground = true) + store.signedOutIfSignedIn() + assertEquals(WallpaperSessionState.SIGNED_OUT, store.snapshot.state) + assertNull(store.snapshot.displayName) + assertNull(store.snapshot.serverHost) + assertEquals(listOf("Signed out", ip), render(WallpaperContext.HOME).lines) + store.signedIn("Grace Hopper", "qqq.example.com", foreground = true) + store.clear() + assertEquals(WallpaperSessionState.UNKNOWN, store.snapshot.state) + assertNull(store.snapshot.displayName) + assertFalse(render(WallpaperContext.HOME).lines.any { it.contains("Grace") }) + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun startupDoesNotClaimSignedOutBeforeAnySession() { + store.signedOutIfSignedIn() + assertEquals(WallpaperSessionState.UNKNOWN, store.snapshot.state) + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun displayTextIsSingleLineAndBounded() { + store.signedIn("Ada\nLovelace\u0007 ${"x".repeat(100)}", "host", foreground = true) + val name = store.snapshot.displayName!! + assertTrue(name.length <= WallpaperStatusStore.MAX_NAME) + assertTrue(name.none { it.isISOControl() }) + store.signedIn(" ", "host", foreground = true) + assertNull(store.snapshot.displayName) + assertEquals(listOf("Signed in", "Server: host", ip), render(WallpaperContext.HOME).lines) + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun brandIsValidatedAndFallsBackToTheDefault() { + store.setBrand("Acme Corp", "#aa5500") + assertEquals("Acme Corp", store.snapshot.brandName) + assertEquals("#AA5500", store.snapshot.brandColor) + store.setBrand("Bad", "red") + store.setBrand("", "#000000") + assertEquals("Acme Corp", store.snapshot.brandName) + assertEquals("#AA5500", store.snapshot.brandColor) + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun listenersAreNotifiedUntilRemovedAndOnlyOnRealChange() { + var calls = 0 + val listener = WallpaperStatusListener { calls++ } + store.addListener(listener) + store.signedIn("Ada", null, foreground = true) + elapsed += 1 + store.signedIn("Ada", null, foreground = true) + store.clear() + assertEquals(3, calls) + store.clear() + assertEquals(3, calls) + store.removeListener(listener) + store.signedIn("Ada", null, foreground = true) + assertEquals(3, calls) + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun networkLineDistinguishesUnknownFromNoAddress() { + assertEquals("IP: unknown", WallpaperPresentation.networkLine(false, null)) + assertEquals("IP: no network address", WallpaperPresentation.networkLine(true, null)) + assertEquals("IP: wlan0 10.0.0.5", WallpaperPresentation.networkLine(true, "wlan0 10.0.0.5")) + } + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + fun addressFormattingOmitsLoopbackAndLinkLocalAndPrefersIpv4() { + assertEquals("wlan0 10.0.0.5, 2001:db8::1", formatNetworkAddresses("wlan0", listOf("fe80::1%wlan0", "2001:db8::1%wlan0", "10.0.0.5", "127.0.0.1", "::1"))) + assertEquals("10.0.0.5", formatNetworkAddresses(null, listOf("10.0.0.5"))) + assertEquals("tun0x 10.8.0.2", formatNetworkAddresses("tun0 \n<x>", listOf("10.8.0.2"))) + assertNull(formatNetworkAddresses("wlan0", listOf("fe80::1%wlan0", "127.0.0.1"))) + assertNull(formatNetworkAddresses("wlan0", emptyList())) + } +} diff --git a/scanner-host/third-party/README.md b/scanner-host/third-party/README.md new file mode 100644 index 0000000..e06e0af --- /dev/null +++ b/scanner-host/third-party/README.md @@ -0,0 +1,28 @@ +# Bundled open-source notices + +AboutLibraries **10.9.2** generates the scanner's variant-specific dependency definitions and renders them with its native Compose UI. Settings → Open-source licenses reads the APK's `res/raw/aboutlibraries.json`; it does not contact a server. Supplemental files use AboutLibraries' supported `libraries/` and `licenses/` schema. There is no project-specific POM/license parser or notice renderer. + +The implementation was selected from [upstream revision `2ff232b9b40c24b8afa23494bc7077e6258b89fe`](https://github.com/mikepenz/AboutLibraries/tree/2ff232b9b40c24b8afa23494bc7077e6258b89fe). That version uses Kotlin 1.9.20, Compose 1.5.4, AGP 8.1.2 and minSdk 21 upstream. Our integration must pass the repository's actual Kotlin 1.9/AGP 8.6/Compose builds and device tests before qualification; matching metadata families alone is not qualification. + +License text is supplied locally. `offlineMode`, disabled remote-license lookup and disabled funding lookup prevent license generation from depending on GitHub/SPDX network requests. Ordinary dependency/POM resolution still uses the configured Maven repositories. The app does not need those repositories at runtime. + +Sources of supplemental notices: + +- `Apache-2.0.json`: the exact Apache license retained from the pinned Google icon source in `docs/third-party/material-design-icons-LICENSE.txt`. +- `MIT.json`: the complete [Auth0 Android 3.0.0 license](https://github.com/auth0/Auth0.Android/blob/dcf37dd3c06421275dcc6cb1e2fbe792354a8a38/LICENSE), including its Auth0 copyright notice. The stable tag's text was byte-identical to the previously reviewed beta text on 2026-10-31 (SHA-256 `beae0f7843273017913b01f0fdd9fe5d63a42f9b3ca2c5cb611bffe8cd8e1cee`). Re-review this text when adding another MIT dependency. +- `Google-Material-Icons.json`: Google artwork attribution, documented integration modifications, and the full Apache license. The 2,142 resource mappings and source/file hashes are in `docs/material-icons-provenance.json`, pinned to `d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b`. +- `MPL-2.0.json`: full Mozilla Public License 2.0 from the [Public Suffix List license](https://github.com/publicsuffix/list/blob/master/LICENSE), retrieved 2026-10-31. A distinct supplemental library explains that this is the list embedded by OkHttp 4.12.0; **OkHttp itself remains Apache-2.0**. Its original embedded NOTICE is retained by APK packaging. +- `QQQ-Android.json`: the repository's project LICENSE/NOTICE. Refresh this content when those source files change. +- `AndroidX-Native-Graphics.json` and `AndroidX-Native-DataStore.json`: native implementation/math/JNI copyright notices and full Apache text, merged into the existing artifact entries. [The native review](../../docs/third-party/NATIVE-NOTICES.md) records pinned release sources, all eight binary hashes and exact AAR verification. +- `Android-NDK-Bionic-CRT.json`: complete BSD-2-Clause startup/termination/build-identification notices for the pinned NDK r25c support objects. +- `Android-NDK-LLVM-Runtime.json`: complete matching libc++ and compiler-rt licenses, including LLVM object-code exceptions and retained historical terms. This separate entry does not relicense either AndroidX dependency or claim that the complete toolchain is bundled. + +## Build and review gates + +The pinned AboutLibraries collector does not declare its resolved dependency graph as a task input. Our wiring supplies sorted resolved component coordinates from each selected variant's compile/runtime classpaths. A version or graph change therefore invalidates dependency collection, then the standard generated cache-file input invalidates notice preparation. Unchanged graphs can remain up-to-date; no generated JSON is manually patched and no verification is bypassed. + +Every scanner variant runs `prepareLibraryDefinitions<Variant>` followed by `verify<Variant>ThirdPartyNotices` before resource merging. AboutLibraries strict mode rejects license IDs outside the reviewed Apache-2.0, MIT, MPL-2.0, BSD-2-Clause and Apache-2.0 WITH LLVM-exception set. The additional verification reads its standard output and compares all Gradle-resolved external runtime coordinates and versions, then requires each listed library to reference nonempty bundled license text and requires the five supplemental entries. MIT is reviewed only for Auth0, MPL only for the embedded Public Suffix List, and BSD/LLVM exceptions only for their named NDK entries; other dependencies require explicit review and suitable copyright text. The embedded-list notice must match the resolved OkHttp version, native dependencies must match the reviewed versions and expose their supplemental notices first, and project notice content must match LICENSE/NOTICE. A missing POM, empty license or stale runtime version fails packaging rather than silently omitting attribution. This is report validation, not a replacement dependency/license generator. + +Unmodified standard JSON plus project LICENSE/NOTICE are copied into `scanner-host/build/reports/third-party/<variant>/` for distribution and inspection. The JSON is also packaged in the APK. Existing assemble tasks therefore enforce the gate in CI and local builds. The license screen instrumentation test uses the actual bundled notices without a server. + +After changing dependencies, regenerate the release variant, review new licenses and embedded/native notices, retain the report with the matching APK, and inspect that APK. Do not add broad license exemptions, placeholder metadata or a fixed old dependency count merely to pass the gate. Standard POM reporting does not discover every embedded native or data component; this inventory and review remain necessary. This configuration is independent of release signing and does not assert legal clearance. diff --git a/scanner-host/third-party/libraries/android.ndk-bionic-crt.json b/scanner-host/third-party/libraries/android.ndk-bionic-crt.json new file mode 100644 index 0000000..2d6340d --- /dev/null +++ b/scanner-host/third-party/libraries/android.ndk-bionic-crt.json @@ -0,0 +1,11 @@ +{ + "name": "Android NDK Bionic startup support", + "artifactVersion": "25.2.9519653", + "licenses": [ + "Android-NDK-Bionic-CRT" + ], + "website": "https://android.googlesource.com/toolchain/prebuilts/ndk/r25/+/1622e087e1b881a0c7c744091d314662d12f0997/", + "description": "Embedded startup/termination and Android identification objects in the bundled AndroidX native libraries.", + "developers": [], + "uniqueId": "android.ndk:bionic-crt" +} diff --git a/scanner-host/third-party/libraries/android.ndk-llvm-runtime.json b/scanner-host/third-party/libraries/android.ndk-llvm-runtime.json new file mode 100644 index 0000000..bb01b67 --- /dev/null +++ b/scanner-host/third-party/libraries/android.ndk-llvm-runtime.json @@ -0,0 +1,11 @@ +{ + "name": "Android NDK LLVM runtime and C++ headers", + "artifactVersion": "25.2.9519653", + "licenses": [ + "Android-NDK-LLVM-Runtime" + ], + "website": "https://android.googlesource.com/toolchain/llvm-project/+/4c603efb0cca074e9238af8b4106c30add4418f6/", + "description": "Compiler runtime and C++ header notices for the bundled AndroidX native objects, including full upstream retained terms.", + "developers": [], + "uniqueId": "android.ndk:llvm-runtime" +} diff --git a/scanner-host/third-party/libraries/androidx.datastore-datastore-core-android.json b/scanner-host/third-party/libraries/androidx.datastore-datastore-core-android.json new file mode 100644 index 0000000..a12e41d --- /dev/null +++ b/scanner-host/third-party/libraries/androidx.datastore-datastore-core-android.json @@ -0,0 +1,7 @@ +{ + "developers": [], + "uniqueId": "androidx.datastore:datastore-core-android", + "licenses": [ + "AndroidX-Native-DataStore" + ] +} diff --git a/scanner-host/third-party/libraries/androidx.graphics-graphics-path.json b/scanner-host/third-party/libraries/androidx.graphics-graphics-path.json new file mode 100644 index 0000000..3952ca7 --- /dev/null +++ b/scanner-host/third-party/libraries/androidx.graphics-graphics-path.json @@ -0,0 +1,7 @@ +{ + "developers": [], + "uniqueId": "androidx.graphics:graphics-path", + "licenses": [ + "AndroidX-Native-Graphics" + ] +} diff --git a/scanner-host/third-party/libraries/google-material-design-icons.json b/scanner-host/third-party/libraries/google-material-design-icons.json new file mode 100644 index 0000000..f2df509 --- /dev/null +++ b/scanner-host/third-party/libraries/google-material-design-icons.json @@ -0,0 +1,12 @@ +{ + "uniqueId": "google:material-design-icons", + "tag": "bundled", + "website": "https://github.com/google/material-design-icons", + "artifactVersion": "d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b", + "licenses": [ + "Google-Material-Icons" + ], + "description": "2,142 bundled vectors; attribution, integration modifications, and license.", + "developers": [], + "name": "Material Design icons by Google" +} diff --git a/scanner-host/third-party/libraries/io.qrun-qqq-android.json b/scanner-host/third-party/libraries/io.qrun-qqq-android.json new file mode 100644 index 0000000..562acaa --- /dev/null +++ b/scanner-host/third-party/libraries/io.qrun-qqq-android.json @@ -0,0 +1,12 @@ +{ + "uniqueId": "io.qrun:qqq-android", + "tag": "bundled", + "website": "https://github.com/QRun-IO/qqq-android", + "artifactVersion": "source distribution", + "licenses": [ + "QQQ-Android" + ], + "description": "Project notices, trademarks, and Apache License 2.0.", + "developers": [], + "name": "QQQ Android project notices" +} diff --git a/scanner-host/third-party/libraries/org.publicsuffix-list.json b/scanner-host/third-party/libraries/org.publicsuffix-list.json new file mode 100644 index 0000000..720fc0a --- /dev/null +++ b/scanner-host/third-party/libraries/org.publicsuffix-list.json @@ -0,0 +1,12 @@ +{ + "uniqueId": "org.publicsuffix:list", + "tag": "bundled", + "website": "https://publicsuffix.org/", + "artifactVersion": "bundled with OkHttp 4.12.0", + "licenses": [ + "MPL-2.0" + ], + "description": "Embedded public-suffix data, separately licensed under MPL 2.0. Source available at publicsuffix.org.", + "developers": [], + "name": "Public Suffix List (embedded in OkHttp)" +} diff --git a/scanner-host/third-party/licenses/Android-NDK-Bionic-CRT.json b/scanner-host/third-party/licenses/Android-NDK-Bionic-CRT.json new file mode 100644 index 0000000..b2d2127 --- /dev/null +++ b/scanner-host/third-party/licenses/Android-NDK-Bionic-CRT.json @@ -0,0 +1,7 @@ +{ + "content": "Android NDK r25c startup/termination and Android build-identification objects used by the bundled native libraries. These notices apply to embedded startup support; the device system libc/libm/libdl implementations are not distributed in this APK.\n\ncrtbegin_so.c\nCopyright (C) 2012 The Android Open Source Project\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions\nare met:\n * Redistributions of source code must retain the above copyright\n notice, this list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above copyright\n notice, this list of conditions and the following disclaimer in\n the documentation and/or other materials provided with the\n distribution.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS\nFOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE\nCOPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\nINCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\nBUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS\nOF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED\nAND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\nOR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT\nOF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\nSUCH DAMAGE.\n\n============================================================\n\ncrtend_so.S\nCopyright (C) 2013 The Android Open Source Project\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions\nare met:\n * Redistributions of source code must retain the above copyright\n notice, this list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above copyright\n notice, this list of conditions and the following disclaimer in\n the documentation and/or other materials provided with the\n distribution.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS\nFOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE\nCOPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\nINCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\nBUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS\nOF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED\nAND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\nOR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT\nOF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\nSUCH DAMAGE.\n\n============================================================\n\ncrtbrand.S\nCopyright (C) 2015 The Android Open Source Project\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions\nare met:\n * Redistributions of source code must retain the above copyright\n notice, this list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above copyright\n notice, this list of conditions and the following disclaimer in\n the documentation and/or other materials provided with the\n distribution.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS\nFOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE\nCOPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\nINCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\nBUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS\nOF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED\nAND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\nOR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT\nOF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\nSUCH DAMAGE.", + "hash": "Android-NDK-Bionic-CRT", + "spdxId": "BSD-2-Clause", + "name": "Android NDK Bionic startup objects — BSD 2-Clause notices", + "url": "https://android.googlesource.com/platform/bionic/+/0b981d1ec055efaef86d8a5d402cf1b3167ba10b/libc/arch-common/bionic/" +} diff --git a/scanner-host/third-party/licenses/Android-NDK-LLVM-Runtime.json b/scanner-host/third-party/licenses/Android-NDK-LLVM-Runtime.json new file mode 100644 index 0000000..7320e87 --- /dev/null +++ b/scanner-host/third-party/licenses/Android-NDK-LLVM-Runtime.json @@ -0,0 +1,7 @@ +{ + "content": "Android NDK r25c compiler runtime and C++ header support used in the bundled AndroidX native objects. Full upstream libc++ and compiler-rt licenses follow, including their retained historical terms. This does not assert that the entire LLVM toolchain or a libc++ shared library is shipped.\n\nLIBC++\n\n==============================================================================\nThe LLVM Project is under the Apache License v2.0 with LLVM Exceptions:\n==============================================================================\n\n Apache License\n Version 2.0, January 2004\n http://www.apache.org/licenses/\n\n TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n 1. Definitions.\n\n \"License\" shall mean the terms and conditions for use, reproduction,\n and distribution as defined by Sections 1 through 9 of this document.\n\n \"Licensor\" shall mean the copyright owner or entity authorized by\n the copyright owner that is granting the License.\n\n \"Legal Entity\" shall mean the union of the acting entity and all\n other entities that control, are controlled by, or are under common\n control with that entity. For the purposes of this definition,\n \"control\" means (i) the power, direct or indirect, to cause the\n direction or management of such entity, whether by contract or\n otherwise, or (ii) ownership of fifty percent (50%) or more of the\n outstanding shares, or (iii) beneficial ownership of such entity.\n\n \"You\" (or \"Your\") shall mean an individual or Legal Entity\n exercising permissions granted by this License.\n\n \"Source\" form shall mean the preferred form for making modifications,\n including but not limited to software source code, documentation\n source, and configuration files.\n\n \"Object\" form shall mean any form resulting from mechanical\n transformation or translation of a Source form, including but\n not limited to compiled object code, generated documentation,\n and conversions to other media types.\n\n \"Work\" shall mean the work of authorship, whether in Source or\n Object form, made available under the License, as indicated by a\n copyright notice that is included in or attached to the work\n (an example is provided in the Appendix below).\n\n \"Derivative Works\" shall mean any work, whether in Source or Object\n form, that is based on (or derived from) the Work and for which the\n editorial revisions, annotations, elaborations, or other modifications\n represent, as a whole, an original work of authorship. For the purposes\n of this License, Derivative Works shall not include works that remain\n separable from, or merely link (or bind by name) to the interfaces of,\n the Work and Derivative Works thereof.\n\n \"Contribution\" shall mean any work of authorship, including\n the original version of the Work and any modifications or additions\n to that Work or Derivative Works thereof, that is intentionally\n submitted to Licensor for inclusion in the Work by the copyright owner\n or by an individual or Legal Entity authorized to submit on behalf of\n the copyright owner. For the purposes of this definition, \"submitted\"\n means any form of electronic, verbal, or written communication sent\n to the Licensor or its representatives, including but not limited to\n communication on electronic mailing lists, source code control systems,\n and issue tracking systems that are managed by, or on behalf of, the\n Licensor for the purpose of discussing and improving the Work, but\n excluding communication that is conspicuously marked or otherwise\n designated in writing by the copyright owner as \"Not a Contribution.\"\n\n \"Contributor\" shall mean Licensor and any individual or Legal Entity\n on behalf of whom a Contribution has been received by Licensor and\n subsequently incorporated within the Work.\n\n 2. Grant of Copyright License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n copyright license to reproduce, prepare Derivative Works of,\n publicly display, publicly perform, sublicense, and distribute the\n Work and such Derivative Works in Source or Object form.\n\n 3. Grant of Patent License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n (except as stated in this section) patent license to make, have made,\n use, offer to sell, sell, import, and otherwise transfer the Work,\n where such license applies only to those patent claims licensable\n by such Contributor that are necessarily infringed by their\n Contribution(s) alone or by combination of their Contribution(s)\n with the Work to which such Contribution(s) was submitted. If You\n institute patent litigation against any entity (including a\n cross-claim or counterclaim in a lawsuit) alleging that the Work\n or a Contribution incorporated within the Work constitutes direct\n or contributory patent infringement, then any patent licenses\n granted to You under this License for that Work shall terminate\n as of the date such litigation is filed.\n\n 4. Redistribution. You may reproduce and distribute copies of the\n Work or Derivative Works thereof in any medium, with or without\n modifications, and in Source or Object form, provided that You\n meet the following conditions:\n\n (a) You must give any other recipients of the Work or\n Derivative Works a copy of this License; and\n\n (b) You must cause any modified files to carry prominent notices\n stating that You changed the files; and\n\n (c) You must retain, in the Source form of any Derivative Works\n that You distribute, all copyright, patent, trademark, and\n attribution notices from the Source form of the Work,\n excluding those notices that do not pertain to any part of\n the Derivative Works; and\n\n (d) If the Work includes a \"NOTICE\" text file as part of its\n distribution, then any Derivative Works that You distribute must\n include a readable copy of the attribution notices contained\n within such NOTICE file, excluding those notices that do not\n pertain to any part of the Derivative Works, in at least one\n of the following places: within a NOTICE text file distributed\n as part of the Derivative Works; within the Source form or\n documentation, if provided along with the Derivative Works; or,\n within a display generated by the Derivative Works, if and\n wherever such third-party notices normally appear. The contents\n of the NOTICE file are for informational purposes only and\n do not modify the License. You may add Your own attribution\n notices within Derivative Works that You distribute, alongside\n or as an addendum to the NOTICE text from the Work, provided\n that such additional attribution notices cannot be construed\n as modifying the License.\n\n You may add Your own copyright statement to Your modifications and\n may provide additional or different license terms and conditions\n for use, reproduction, or distribution of Your modifications, or\n for any such Derivative Works as a whole, provided Your use,\n reproduction, and distribution of the Work otherwise complies with\n the conditions stated in this License.\n\n 5. Submission of Contributions. Unless You explicitly state otherwise,\n any Contribution intentionally submitted for inclusion in the Work\n by You to the Licensor shall be under the terms and conditions of\n this License, without any additional terms or conditions.\n Notwithstanding the above, nothing herein shall supersede or modify\n the terms of any separate license agreement you may have executed\n with Licensor regarding such Contributions.\n\n 6. Trademarks. This License does not grant permission to use the trade\n names, trademarks, service marks, or product names of the Licensor,\n except as required for reasonable and customary use in describing the\n origin of the Work and reproducing the content of the NOTICE file.\n\n 7. Disclaimer of Warranty. Unless required by applicable law or\n agreed to in writing, Licensor provides the Work (and each\n Contributor provides its Contributions) on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n implied, including, without limitation, any warranties or conditions\n of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n PARTICULAR PURPOSE. You are solely responsible for determining the\n appropriateness of using or redistributing the Work and assume any\n risks associated with Your exercise of permissions under this License.\n\n 8. Limitation of Liability. In no event and under no legal theory,\n whether in tort (including negligence), contract, or otherwise,\n unless required by applicable law (such as deliberate and grossly\n negligent acts) or agreed to in writing, shall any Contributor be\n liable to You for damages, including any direct, indirect, special,\n incidental, or consequential damages of any character arising as a\n result of this License or out of the use or inability to use the\n Work (including but not limited to damages for loss of goodwill,\n work stoppage, computer failure or malfunction, or any and all\n other commercial damages or losses), even if such Contributor\n has been advised of the possibility of such damages.\n\n 9. Accepting Warranty or Additional Liability. While redistributing\n the Work or Derivative Works thereof, You may choose to offer,\n and charge a fee for, acceptance of support, warranty, indemnity,\n or other liability obligations and/or rights consistent with this\n License. However, in accepting such obligations, You may act only\n on Your own behalf and on Your sole responsibility, not on behalf\n of any other Contributor, and only if You agree to indemnify,\n defend, and hold each Contributor harmless for any liability\n incurred by, or claims asserted against, such Contributor by reason\n of your accepting any such warranty or additional liability.\n\n END OF TERMS AND CONDITIONS\n\n APPENDIX: How to apply the Apache License to your work.\n\n To apply the Apache License to your work, attach the following\n boilerplate notice, with the fields enclosed by brackets \"[]\"\n replaced with your own identifying information. (Don't include\n the brackets!) The text should be enclosed in the appropriate\n comment syntax for the file format. We also recommend that a\n file or class name and description of purpose be included on the\n same \"printed page\" as the copyright notice for easier\n identification within third-party archives.\n\n Copyright [yyyy] [name of copyright owner]\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n\n---- LLVM Exceptions to the Apache 2.0 License ----\n\nAs an exception, if, as a result of your compiling your source code, portions\nof this Software are embedded into an Object form of such source code, you\nmay redistribute such embedded portions in such Object form without complying\nwith the conditions of Sections 4(a), 4(b) and 4(d) of the License.\n\nIn addition, if you combine or link compiled forms of this Software with\nsoftware that is licensed under the GPLv2 (\"Combined Software\") and if a\ncourt of competent jurisdiction determines that the patent provision (Section\n3), the indemnity provision (Section 9) or other Section of the License\nconflicts with the conditions of the GPLv2, you may retroactively and\nprospectively choose to deem waived or otherwise exclude such Section(s) of\nthe License, but only in their entirety and only with respect to the Combined\nSoftware.\n\n==============================================================================\nSoftware from third parties included in the LLVM Project:\n==============================================================================\nThe LLVM Project contains third party software which is under different license\nterms. All such code will be identified clearly using at least one of two\nmechanisms:\n1) It will be in a separate directory tree with its own `LICENSE.txt` or\n `LICENSE` file at the top containing the specific license and restrictions\n which apply to that software, or\n2) It will contain specific license and restriction terms at the top of every\n file.\n\n==============================================================================\nLegacy LLVM License (https://llvm.org/docs/DeveloperPolicy.html#legacy):\n==============================================================================\n\nThe libc++ library is dual licensed under both the University of Illinois\n\"BSD-Like\" license and the MIT license. As a user of this code you may choose\nto use it under either license. As a contributor, you agree to allow your code\nto be used under both.\n\nFull text of the relevant licenses is included below.\n\n==============================================================================\n\nUniversity of Illinois/NCSA\nOpen Source License\n\nCopyright (c) 2009-2019 by the contributors listed in CREDITS.TXT\n\nAll rights reserved.\n\nDeveloped by:\n\n LLVM Team\n\n University of Illinois at Urbana-Champaign\n\n http://llvm.org\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal with\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies\nof the Software, and to permit persons to whom the Software is furnished to do\nso, subject to the following conditions:\n\n * Redistributions of source code must retain the above copyright notice,\n this list of conditions and the following disclaimers.\n\n * Redistributions in binary form must reproduce the above copyright notice,\n this list of conditions and the following disclaimers in the\n documentation and/or other materials provided with the distribution.\n\n * Neither the names of the LLVM Team, University of Illinois at\n Urbana-Champaign, nor the names of its contributors may be used to\n endorse or promote products derived from this Software without specific\n prior written permission.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\nFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nCONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE\nSOFTWARE.\n\n==============================================================================\n\nCopyright (c) 2009-2014 by the contributors listed in CREDITS.TXT\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\nCOMPILER-RT\n\n==============================================================================\nThe LLVM Project is under the Apache License v2.0 with LLVM Exceptions:\n==============================================================================\n\n Apache License\n Version 2.0, January 2004\n http://www.apache.org/licenses/\n\n TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n 1. Definitions.\n\n \"License\" shall mean the terms and conditions for use, reproduction,\n and distribution as defined by Sections 1 through 9 of this document.\n\n \"Licensor\" shall mean the copyright owner or entity authorized by\n the copyright owner that is granting the License.\n\n \"Legal Entity\" shall mean the union of the acting entity and all\n other entities that control, are controlled by, or are under common\n control with that entity. For the purposes of this definition,\n \"control\" means (i) the power, direct or indirect, to cause the\n direction or management of such entity, whether by contract or\n otherwise, or (ii) ownership of fifty percent (50%) or more of the\n outstanding shares, or (iii) beneficial ownership of such entity.\n\n \"You\" (or \"Your\") shall mean an individual or Legal Entity\n exercising permissions granted by this License.\n\n \"Source\" form shall mean the preferred form for making modifications,\n including but not limited to software source code, documentation\n source, and configuration files.\n\n \"Object\" form shall mean any form resulting from mechanical\n transformation or translation of a Source form, including but\n not limited to compiled object code, generated documentation,\n and conversions to other media types.\n\n \"Work\" shall mean the work of authorship, whether in Source or\n Object form, made available under the License, as indicated by a\n copyright notice that is included in or attached to the work\n (an example is provided in the Appendix below).\n\n \"Derivative Works\" shall mean any work, whether in Source or Object\n form, that is based on (or derived from) the Work and for which the\n editorial revisions, annotations, elaborations, or other modifications\n represent, as a whole, an original work of authorship. For the purposes\n of this License, Derivative Works shall not include works that remain\n separable from, or merely link (or bind by name) to the interfaces of,\n the Work and Derivative Works thereof.\n\n \"Contribution\" shall mean any work of authorship, including\n the original version of the Work and any modifications or additions\n to that Work or Derivative Works thereof, that is intentionally\n submitted to Licensor for inclusion in the Work by the copyright owner\n or by an individual or Legal Entity authorized to submit on behalf of\n the copyright owner. For the purposes of this definition, \"submitted\"\n means any form of electronic, verbal, or written communication sent\n to the Licensor or its representatives, including but not limited to\n communication on electronic mailing lists, source code control systems,\n and issue tracking systems that are managed by, or on behalf of, the\n Licensor for the purpose of discussing and improving the Work, but\n excluding communication that is conspicuously marked or otherwise\n designated in writing by the copyright owner as \"Not a Contribution.\"\n\n \"Contributor\" shall mean Licensor and any individual or Legal Entity\n on behalf of whom a Contribution has been received by Licensor and\n subsequently incorporated within the Work.\n\n 2. Grant of Copyright License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n copyright license to reproduce, prepare Derivative Works of,\n publicly display, publicly perform, sublicense, and distribute the\n Work and such Derivative Works in Source or Object form.\n\n 3. Grant of Patent License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n (except as stated in this section) patent license to make, have made,\n use, offer to sell, sell, import, and otherwise transfer the Work,\n where such license applies only to those patent claims licensable\n by such Contributor that are necessarily infringed by their\n Contribution(s) alone or by combination of their Contribution(s)\n with the Work to which such Contribution(s) was submitted. If You\n institute patent litigation against any entity (including a\n cross-claim or counterclaim in a lawsuit) alleging that the Work\n or a Contribution incorporated within the Work constitutes direct\n or contributory patent infringement, then any patent licenses\n granted to You under this License for that Work shall terminate\n as of the date such litigation is filed.\n\n 4. Redistribution. You may reproduce and distribute copies of the\n Work or Derivative Works thereof in any medium, with or without\n modifications, and in Source or Object form, provided that You\n meet the following conditions:\n\n (a) You must give any other recipients of the Work or\n Derivative Works a copy of this License; and\n\n (b) You must cause any modified files to carry prominent notices\n stating that You changed the files; and\n\n (c) You must retain, in the Source form of any Derivative Works\n that You distribute, all copyright, patent, trademark, and\n attribution notices from the Source form of the Work,\n excluding those notices that do not pertain to any part of\n the Derivative Works; and\n\n (d) If the Work includes a \"NOTICE\" text file as part of its\n distribution, then any Derivative Works that You distribute must\n include a readable copy of the attribution notices contained\n within such NOTICE file, excluding those notices that do not\n pertain to any part of the Derivative Works, in at least one\n of the following places: within a NOTICE text file distributed\n as part of the Derivative Works; within the Source form or\n documentation, if provided along with the Derivative Works; or,\n within a display generated by the Derivative Works, if and\n wherever such third-party notices normally appear. The contents\n of the NOTICE file are for informational purposes only and\n do not modify the License. You may add Your own attribution\n notices within Derivative Works that You distribute, alongside\n or as an addendum to the NOTICE text from the Work, provided\n that such additional attribution notices cannot be construed\n as modifying the License.\n\n You may add Your own copyright statement to Your modifications and\n may provide additional or different license terms and conditions\n for use, reproduction, or distribution of Your modifications, or\n for any such Derivative Works as a whole, provided Your use,\n reproduction, and distribution of the Work otherwise complies with\n the conditions stated in this License.\n\n 5. Submission of Contributions. Unless You explicitly state otherwise,\n any Contribution intentionally submitted for inclusion in the Work\n by You to the Licensor shall be under the terms and conditions of\n this License, without any additional terms or conditions.\n Notwithstanding the above, nothing herein shall supersede or modify\n the terms of any separate license agreement you may have executed\n with Licensor regarding such Contributions.\n\n 6. Trademarks. This License does not grant permission to use the trade\n names, trademarks, service marks, or product names of the Licensor,\n except as required for reasonable and customary use in describing the\n origin of the Work and reproducing the content of the NOTICE file.\n\n 7. Disclaimer of Warranty. Unless required by applicable law or\n agreed to in writing, Licensor provides the Work (and each\n Contributor provides its Contributions) on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n implied, including, without limitation, any warranties or conditions\n of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n PARTICULAR PURPOSE. You are solely responsible for determining the\n appropriateness of using or redistributing the Work and assume any\n risks associated with Your exercise of permissions under this License.\n\n 8. Limitation of Liability. In no event and under no legal theory,\n whether in tort (including negligence), contract, or otherwise,\n unless required by applicable law (such as deliberate and grossly\n negligent acts) or agreed to in writing, shall any Contributor be\n liable to You for damages, including any direct, indirect, special,\n incidental, or consequential damages of any character arising as a\n result of this License or out of the use or inability to use the\n Work (including but not limited to damages for loss of goodwill,\n work stoppage, computer failure or malfunction, or any and all\n other commercial damages or losses), even if such Contributor\n has been advised of the possibility of such damages.\n\n 9. Accepting Warranty or Additional Liability. While redistributing\n the Work or Derivative Works thereof, You may choose to offer,\n and charge a fee for, acceptance of support, warranty, indemnity,\n or other liability obligations and/or rights consistent with this\n License. However, in accepting such obligations, You may act only\n on Your own behalf and on Your sole responsibility, not on behalf\n of any other Contributor, and only if You agree to indemnify,\n defend, and hold each Contributor harmless for any liability\n incurred by, or claims asserted against, such Contributor by reason\n of your accepting any such warranty or additional liability.\n\n END OF TERMS AND CONDITIONS\n\n APPENDIX: How to apply the Apache License to your work.\n\n To apply the Apache License to your work, attach the following\n boilerplate notice, with the fields enclosed by brackets \"[]\"\n replaced with your own identifying information. (Don't include\n the brackets!) The text should be enclosed in the appropriate\n comment syntax for the file format. We also recommend that a\n file or class name and description of purpose be included on the\n same \"printed page\" as the copyright notice for easier\n identification within third-party archives.\n\n Copyright [yyyy] [name of copyright owner]\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n\n---- LLVM Exceptions to the Apache 2.0 License ----\n\nAs an exception, if, as a result of your compiling your source code, portions\nof this Software are embedded into an Object form of such source code, you\nmay redistribute such embedded portions in such Object form without complying\nwith the conditions of Sections 4(a), 4(b) and 4(d) of the License.\n\nIn addition, if you combine or link compiled forms of this Software with\nsoftware that is licensed under the GPLv2 (\"Combined Software\") and if a\ncourt of competent jurisdiction determines that the patent provision (Section\n3), the indemnity provision (Section 9) or other Section of the License\nconflicts with the conditions of the GPLv2, you may retroactively and\nprospectively choose to deem waived or otherwise exclude such Section(s) of\nthe License, but only in their entirety and only with respect to the Combined\nSoftware.\n\n==============================================================================\nSoftware from third parties included in the LLVM Project:\n==============================================================================\nThe LLVM Project contains third party software which is under different license\nterms. All such code will be identified clearly using at least one of two\nmechanisms:\n1) It will be in a separate directory tree with its own `LICENSE.txt` or\n `LICENSE` file at the top containing the specific license and restrictions\n which apply to that software, or\n2) It will contain specific license and restriction terms at the top of every\n file.\n\n==============================================================================\nLegacy LLVM License (https://llvm.org/docs/DeveloperPolicy.html#legacy):\n==============================================================================\n\nThe compiler_rt library is dual licensed under both the University of Illinois\n\"BSD-Like\" license and the MIT license. As a user of this code you may choose\nto use it under either license. As a contributor, you agree to allow your code\nto be used under both.\n\nFull text of the relevant licenses is included below.\n\n==============================================================================\n\nUniversity of Illinois/NCSA\nOpen Source License\n\nCopyright (c) 2009-2019 by the contributors listed in CREDITS.TXT\n\nAll rights reserved.\n\nDeveloped by:\n\n LLVM Team\n\n University of Illinois at Urbana-Champaign\n\n http://llvm.org\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal with\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies\nof the Software, and to permit persons to whom the Software is furnished to do\nso, subject to the following conditions:\n\n * Redistributions of source code must retain the above copyright notice,\n this list of conditions and the following disclaimers.\n\n * Redistributions in binary form must reproduce the above copyright notice,\n this list of conditions and the following disclaimers in the\n documentation and/or other materials provided with the distribution.\n\n * Neither the names of the LLVM Team, University of Illinois at\n Urbana-Champaign, nor the names of its contributors may be used to\n endorse or promote products derived from this Software without specific\n prior written permission.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\nFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nCONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE\nSOFTWARE.\n\n==============================================================================\n\nCopyright (c) 2009-2015 by the contributors listed in CREDITS.TXT\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n", + "hash": "Android-NDK-LLVM-Runtime", + "spdxId": "Apache-2.0 WITH LLVM-exception", + "name": "Android NDK LLVM runtime and C++ headers — Apache 2.0 with LLVM exceptions", + "url": "https://android.googlesource.com/toolchain/llvm-project/+/4c603efb0cca074e9238af8b4106c30add4418f6/" +} diff --git a/scanner-host/third-party/licenses/AndroidX-Native-DataStore.json b/scanner-host/third-party/licenses/AndroidX-Native-DataStore.json new file mode 100644 index 0000000..980f626 --- /dev/null +++ b/scanner-host/third-party/licenses/AndroidX-Native-DataStore.json @@ -0,0 +1,7 @@ +{ + "content": "AndroidX DataStore shared counter and JNI integration.\nCopyright (C) 2022 The Android Open Source Project\nJNI header: Copyright (C) 2006 The Android Open Source Project\n\n\n Apache License\n Version 2.0, January 2004\n http://www.apache.org/licenses/\n\n TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n 1. Definitions.\n\n \"License\" shall mean the terms and conditions for use, reproduction,\n and distribution as defined by Sections 1 through 9 of this document.\n\n \"Licensor\" shall mean the copyright owner or entity authorized by\n the copyright owner that is granting the License.\n\n \"Legal Entity\" shall mean the union of the acting entity and all\n other entities that control, are controlled by, or are under common\n control with that entity. For the purposes of this definition,\n \"control\" means (i) the power, direct or indirect, to cause the\n direction or management of such entity, whether by contract or\n otherwise, or (ii) ownership of fifty percent (50%) or more of the\n outstanding shares, or (iii) beneficial ownership of such entity.\n\n \"You\" (or \"Your\") shall mean an individual or Legal Entity\n exercising permissions granted by this License.\n\n \"Source\" form shall mean the preferred form for making modifications,\n including but not limited to software source code, documentation\n source, and configuration files.\n\n \"Object\" form shall mean any form resulting from mechanical\n transformation or translation of a Source form, including but\n not limited to compiled object code, generated documentation,\n and conversions to other media types.\n\n \"Work\" shall mean the work of authorship, whether in Source or\n Object form, made available under the License, as indicated by a\n copyright notice that is included in or attached to the work\n (an example is provided in the Appendix below).\n\n \"Derivative Works\" shall mean any work, whether in Source or Object\n form, that is based on (or derived from) the Work and for which the\n editorial revisions, annotations, elaborations, or other modifications\n represent, as a whole, an original work of authorship. For the purposes\n of this License, Derivative Works shall not include works that remain\n separable from, or merely link (or bind by name) to the interfaces of,\n the Work and Derivative Works thereof.\n\n \"Contribution\" shall mean any work of authorship, including\n the original version of the Work and any modifications or additions\n to that Work or Derivative Works thereof, that is intentionally\n submitted to Licensor for inclusion in the Work by the copyright owner\n or by an individual or Legal Entity authorized to submit on behalf of\n the copyright owner. For the purposes of this definition, \"submitted\"\n means any form of electronic, verbal, or written communication sent\n to the Licensor or its representatives, including but not limited to\n communication on electronic mailing lists, source code control systems,\n and issue tracking systems that are managed by, or on behalf of, the\n Licensor for the purpose of discussing and improving the Work, but\n excluding communication that is conspicuously marked or otherwise\n designated in writing by the copyright owner as \"Not a Contribution.\"\n\n \"Contributor\" shall mean Licensor and any individual or Legal Entity\n on behalf of whom a Contribution has been received by Licensor and\n subsequently incorporated within the Work.\n\n 2. Grant of Copyright License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n copyright license to reproduce, prepare Derivative Works of,\n publicly display, publicly perform, sublicense, and distribute the\n Work and such Derivative Works in Source or Object form.\n\n 3. Grant of Patent License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n (except as stated in this section) patent license to make, have made,\n use, offer to sell, sell, import, and otherwise transfer the Work,\n where such license applies only to those patent claims licensable\n by such Contributor that are necessarily infringed by their\n Contribution(s) alone or by combination of their Contribution(s)\n with the Work to which such Contribution(s) was submitted. If You\n institute patent litigation against any entity (including a\n cross-claim or counterclaim in a lawsuit) alleging that the Work\n or a Contribution incorporated within the Work constitutes direct\n or contributory patent infringement, then any patent licenses\n granted to You under this License for that Work shall terminate\n as of the date such litigation is filed.\n\n 4. Redistribution. You may reproduce and distribute copies of the\n Work or Derivative Works thereof in any medium, with or without\n modifications, and in Source or Object form, provided that You\n meet the following conditions:\n\n (a) You must give any other recipients of the Work or\n Derivative Works a copy of this License; and\n\n (b) You must cause any modified files to carry prominent notices\n stating that You changed the files; and\n\n (c) You must retain, in the Source form of any Derivative Works\n that You distribute, all copyright, patent, trademark, and\n attribution notices from the Source form of the Work,\n excluding those notices that do not pertain to any part of\n the Derivative Works; and\n\n (d) If the Work includes a \"NOTICE\" text file as part of its\n distribution, then any Derivative Works that You distribute must\n include a readable copy of the attribution notices contained\n within such NOTICE file, excluding those notices that do not\n pertain to any part of the Derivative Works, in at least one\n of the following places: within a NOTICE text file distributed\n as part of the Derivative Works; within the Source form or\n documentation, if provided along with the Derivative Works; or,\n within a display generated by the Derivative Works, if and\n wherever such third-party notices normally appear. The contents\n of the NOTICE file are for informational purposes only and\n do not modify the License. You may add Your own attribution\n notices within Derivative Works that You distribute, alongside\n or as an addendum to the NOTICE text from the Work, provided\n that such additional attribution notices cannot be construed\n as modifying the License.\n\n You may add Your own copyright statement to Your modifications and\n may provide additional or different license terms and conditions\n for use, reproduction, or distribution of Your modifications, or\n for any such Derivative Works as a whole, provided Your use,\n reproduction, and distribution of the Work otherwise complies with\n the conditions stated in this License.\n\n 5. Submission of Contributions. Unless You explicitly state otherwise,\n any Contribution intentionally submitted for inclusion in the Work\n by You to the Licensor shall be under the terms and conditions of\n this License, without any additional terms or conditions.\n Notwithstanding the above, nothing herein shall supersede or modify\n the terms of any separate license agreement you may have executed\n with Licensor regarding such Contributions.\n\n 6. Trademarks. This License does not grant permission to use the trade\n names, trademarks, service marks, or product names of the Licensor,\n except as required for reasonable and customary use in describing the\n origin of the Work and reproducing the content of the NOTICE file.\n\n 7. Disclaimer of Warranty. Unless required by applicable law or\n agreed to in writing, Licensor provides the Work (and each\n Contributor provides its Contributions) on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n implied, including, without limitation, any warranties or conditions\n of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n PARTICULAR PURPOSE. You are solely responsible for determining the\n appropriateness of using or redistributing the Work and assume any\n risks associated with Your exercise of permissions under this License.\n\n 8. Limitation of Liability. In no event and under no legal theory,\n whether in tort (including negligence), contract, or otherwise,\n unless required by applicable law (such as deliberate and grossly\n negligent acts) or agreed to in writing, shall any Contributor be\n liable to You for damages, including any direct, indirect, special,\n incidental, or consequential damages of any character arising as a\n result of this License or out of the use or inability to use the\n Work (including but not limited to damages for loss of goodwill,\n work stoppage, computer failure or malfunction, or any and all\n other commercial damages or losses), even if such Contributor\n has been advised of the possibility of such damages.\n\n 9. Accepting Warranty or Additional Liability. While redistributing\n the Work or Derivative Works thereof, You may choose to offer,\n and charge a fee for, acceptance of support, warranty, indemnity,\n or other liability obligations and/or rights consistent with this\n License. However, in accepting such obligations, You may act only\n on Your own behalf and on Your sole responsibility, not on behalf\n of any other Contributor, and only if You agree to indemnify,\n defend, and hold each Contributor harmless for any liability\n incurred by, or claims asserted against, such Contributor by reason\n of your accepting any such warranty or additional liability.\n\n END OF TERMS AND CONDITIONS\n\n APPENDIX: How to apply the Apache License to your work.\n\n To apply the Apache License to your work, attach the following\n boilerplate notice, with the fields enclosed by brackets \"[]\"\n replaced with your own identifying information. (Don't include\n the brackets!) The text should be enclosed in the appropriate\n comment syntax for the file format. We also recommend that a\n file or class name and description of purpose be included on the\n same \"printed page\" as the copyright notice for easier\n identification within third-party archives.\n\n Copyright [yyyy] [name of copyright owner]\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.", + "hash": "AndroidX-Native-DataStore", + "spdxId": "Apache-2.0", + "name": "AndroidX DataStore native shared counter notices", + "url": "https://android.googlesource.com/platform/frameworks/support/+/4e91af5f5597ac6275559f2ce4bc2f5cc852bddb/datastore/datastore-core/src/androidMain/cpp/" +} diff --git a/scanner-host/third-party/licenses/AndroidX-Native-Graphics.json b/scanner-host/third-party/licenses/AndroidX-Native-Graphics.json new file mode 100644 index 0000000..687ddaa --- /dev/null +++ b/scanner-host/third-party/licenses/AndroidX-Native-Graphics.json @@ -0,0 +1,7 @@ +{ + "content": "AndroidX Graphics Path native implementation and included Filament math headers.\nCopyright 2022 The Android Open Source Project\nCopyright (C) 2006 The Android Open Source Project\nCopyright 2013 The Android Open Source Project\nCopyright (C) 2017 The Android Open Source Project\n\n\n Apache License\n Version 2.0, January 2004\n http://www.apache.org/licenses/\n\n TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n 1. Definitions.\n\n \"License\" shall mean the terms and conditions for use, reproduction,\n and distribution as defined by Sections 1 through 9 of this document.\n\n \"Licensor\" shall mean the copyright owner or entity authorized by\n the copyright owner that is granting the License.\n\n \"Legal Entity\" shall mean the union of the acting entity and all\n other entities that control, are controlled by, or are under common\n control with that entity. For the purposes of this definition,\n \"control\" means (i) the power, direct or indirect, to cause the\n direction or management of such entity, whether by contract or\n otherwise, or (ii) ownership of fifty percent (50%) or more of the\n outstanding shares, or (iii) beneficial ownership of such entity.\n\n \"You\" (or \"Your\") shall mean an individual or Legal Entity\n exercising permissions granted by this License.\n\n \"Source\" form shall mean the preferred form for making modifications,\n including but not limited to software source code, documentation\n source, and configuration files.\n\n \"Object\" form shall mean any form resulting from mechanical\n transformation or translation of a Source form, including but\n not limited to compiled object code, generated documentation,\n and conversions to other media types.\n\n \"Work\" shall mean the work of authorship, whether in Source or\n Object form, made available under the License, as indicated by a\n copyright notice that is included in or attached to the work\n (an example is provided in the Appendix below).\n\n \"Derivative Works\" shall mean any work, whether in Source or Object\n form, that is based on (or derived from) the Work and for which the\n editorial revisions, annotations, elaborations, or other modifications\n represent, as a whole, an original work of authorship. For the purposes\n of this License, Derivative Works shall not include works that remain\n separable from, or merely link (or bind by name) to the interfaces of,\n the Work and Derivative Works thereof.\n\n \"Contribution\" shall mean any work of authorship, including\n the original version of the Work and any modifications or additions\n to that Work or Derivative Works thereof, that is intentionally\n submitted to Licensor for inclusion in the Work by the copyright owner\n or by an individual or Legal Entity authorized to submit on behalf of\n the copyright owner. For the purposes of this definition, \"submitted\"\n means any form of electronic, verbal, or written communication sent\n to the Licensor or its representatives, including but not limited to\n communication on electronic mailing lists, source code control systems,\n and issue tracking systems that are managed by, or on behalf of, the\n Licensor for the purpose of discussing and improving the Work, but\n excluding communication that is conspicuously marked or otherwise\n designated in writing by the copyright owner as \"Not a Contribution.\"\n\n \"Contributor\" shall mean Licensor and any individual or Legal Entity\n on behalf of whom a Contribution has been received by Licensor and\n subsequently incorporated within the Work.\n\n 2. Grant of Copyright License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n copyright license to reproduce, prepare Derivative Works of,\n publicly display, publicly perform, sublicense, and distribute the\n Work and such Derivative Works in Source or Object form.\n\n 3. Grant of Patent License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n (except as stated in this section) patent license to make, have made,\n use, offer to sell, sell, import, and otherwise transfer the Work,\n where such license applies only to those patent claims licensable\n by such Contributor that are necessarily infringed by their\n Contribution(s) alone or by combination of their Contribution(s)\n with the Work to which such Contribution(s) was submitted. If You\n institute patent litigation against any entity (including a\n cross-claim or counterclaim in a lawsuit) alleging that the Work\n or a Contribution incorporated within the Work constitutes direct\n or contributory patent infringement, then any patent licenses\n granted to You under this License for that Work shall terminate\n as of the date such litigation is filed.\n\n 4. Redistribution. You may reproduce and distribute copies of the\n Work or Derivative Works thereof in any medium, with or without\n modifications, and in Source or Object form, provided that You\n meet the following conditions:\n\n (a) You must give any other recipients of the Work or\n Derivative Works a copy of this License; and\n\n (b) You must cause any modified files to carry prominent notices\n stating that You changed the files; and\n\n (c) You must retain, in the Source form of any Derivative Works\n that You distribute, all copyright, patent, trademark, and\n attribution notices from the Source form of the Work,\n excluding those notices that do not pertain to any part of\n the Derivative Works; and\n\n (d) If the Work includes a \"NOTICE\" text file as part of its\n distribution, then any Derivative Works that You distribute must\n include a readable copy of the attribution notices contained\n within such NOTICE file, excluding those notices that do not\n pertain to any part of the Derivative Works, in at least one\n of the following places: within a NOTICE text file distributed\n as part of the Derivative Works; within the Source form or\n documentation, if provided along with the Derivative Works; or,\n within a display generated by the Derivative Works, if and\n wherever such third-party notices normally appear. The contents\n of the NOTICE file are for informational purposes only and\n do not modify the License. You may add Your own attribution\n notices within Derivative Works that You distribute, alongside\n or as an addendum to the NOTICE text from the Work, provided\n that such additional attribution notices cannot be construed\n as modifying the License.\n\n You may add Your own copyright statement to Your modifications and\n may provide additional or different license terms and conditions\n for use, reproduction, or distribution of Your modifications, or\n for any such Derivative Works as a whole, provided Your use,\n reproduction, and distribution of the Work otherwise complies with\n the conditions stated in this License.\n\n 5. Submission of Contributions. Unless You explicitly state otherwise,\n any Contribution intentionally submitted for inclusion in the Work\n by You to the Licensor shall be under the terms and conditions of\n this License, without any additional terms or conditions.\n Notwithstanding the above, nothing herein shall supersede or modify\n the terms of any separate license agreement you may have executed\n with Licensor regarding such Contributions.\n\n 6. Trademarks. This License does not grant permission to use the trade\n names, trademarks, service marks, or product names of the Licensor,\n except as required for reasonable and customary use in describing the\n origin of the Work and reproducing the content of the NOTICE file.\n\n 7. Disclaimer of Warranty. Unless required by applicable law or\n agreed to in writing, Licensor provides the Work (and each\n Contributor provides its Contributions) on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n implied, including, without limitation, any warranties or conditions\n of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n PARTICULAR PURPOSE. You are solely responsible for determining the\n appropriateness of using or redistributing the Work and assume any\n risks associated with Your exercise of permissions under this License.\n\n 8. Limitation of Liability. In no event and under no legal theory,\n whether in tort (including negligence), contract, or otherwise,\n unless required by applicable law (such as deliberate and grossly\n negligent acts) or agreed to in writing, shall any Contributor be\n liable to You for damages, including any direct, indirect, special,\n incidental, or consequential damages of any character arising as a\n result of this License or out of the use or inability to use the\n Work (including but not limited to damages for loss of goodwill,\n work stoppage, computer failure or malfunction, or any and all\n other commercial damages or losses), even if such Contributor\n has been advised of the possibility of such damages.\n\n 9. Accepting Warranty or Additional Liability. While redistributing\n the Work or Derivative Works thereof, You may choose to offer,\n and charge a fee for, acceptance of support, warranty, indemnity,\n or other liability obligations and/or rights consistent with this\n License. However, in accepting such obligations, You may act only\n on Your own behalf and on Your sole responsibility, not on behalf\n of any other Contributor, and only if You agree to indemnify,\n defend, and hold each Contributor harmless for any liability\n incurred by, or claims asserted against, such Contributor by reason\n of your accepting any such warranty or additional liability.\n\n END OF TERMS AND CONDITIONS\n\n APPENDIX: How to apply the Apache License to your work.\n\n To apply the Apache License to your work, attach the following\n boilerplate notice, with the fields enclosed by brackets \"[]\"\n replaced with your own identifying information. (Don't include\n the brackets!) The text should be enclosed in the appropriate\n comment syntax for the file format. We also recommend that a\n file or class name and description of purpose be included on the\n same \"printed page\" as the copyright notice for easier\n identification within third-party archives.\n\n Copyright [yyyy] [name of copyright owner]\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.", + "hash": "AndroidX-Native-Graphics", + "spdxId": "Apache-2.0", + "name": "AndroidX Graphics Path native implementation and math notices", + "url": "https://android.googlesource.com/platform/frameworks/support/+/8a05a22af450d589ef911d772a001a49dcb05b71/graphics/graphics-path/src/main/cpp/" +} diff --git a/scanner-host/third-party/licenses/Apache-2.0.json b/scanner-host/third-party/licenses/Apache-2.0.json new file mode 100644 index 0000000..2c14ce3 --- /dev/null +++ b/scanner-host/third-party/licenses/Apache-2.0.json @@ -0,0 +1,7 @@ +{ + "name": "Apache License 2.0", + "spdxId": "Apache-2.0", + "content": "\n Apache License\n Version 2.0, January 2004\n http://www.apache.org/licenses/\n\n TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n 1. Definitions.\n\n \"License\" shall mean the terms and conditions for use, reproduction,\n and distribution as defined by Sections 1 through 9 of this document.\n\n \"Licensor\" shall mean the copyright owner or entity authorized by\n the copyright owner that is granting the License.\n\n \"Legal Entity\" shall mean the union of the acting entity and all\n other entities that control, are controlled by, or are under common\n control with that entity. For the purposes of this definition,\n \"control\" means (i) the power, direct or indirect, to cause the\n direction or management of such entity, whether by contract or\n otherwise, or (ii) ownership of fifty percent (50%) or more of the\n outstanding shares, or (iii) beneficial ownership of such entity.\n\n \"You\" (or \"Your\") shall mean an individual or Legal Entity\n exercising permissions granted by this License.\n\n \"Source\" form shall mean the preferred form for making modifications,\n including but not limited to software source code, documentation\n source, and configuration files.\n\n \"Object\" form shall mean any form resulting from mechanical\n transformation or translation of a Source form, including but\n not limited to compiled object code, generated documentation,\n and conversions to other media types.\n\n \"Work\" shall mean the work of authorship, whether in Source or\n Object form, made available under the License, as indicated by a\n copyright notice that is included in or attached to the work\n (an example is provided in the Appendix below).\n\n \"Derivative Works\" shall mean any work, whether in Source or Object\n form, that is based on (or derived from) the Work and for which the\n editorial revisions, annotations, elaborations, or other modifications\n represent, as a whole, an original work of authorship. For the purposes\n of this License, Derivative Works shall not include works that remain\n separable from, or merely link (or bind by name) to the interfaces of,\n the Work and Derivative Works thereof.\n\n \"Contribution\" shall mean any work of authorship, including\n the original version of the Work and any modifications or additions\n to that Work or Derivative Works thereof, that is intentionally\n submitted to Licensor for inclusion in the Work by the copyright owner\n or by an individual or Legal Entity authorized to submit on behalf of\n the copyright owner. For the purposes of this definition, \"submitted\"\n means any form of electronic, verbal, or written communication sent\n to the Licensor or its representatives, including but not limited to\n communication on electronic mailing lists, source code control systems,\n and issue tracking systems that are managed by, or on behalf of, the\n Licensor for the purpose of discussing and improving the Work, but\n excluding communication that is conspicuously marked or otherwise\n designated in writing by the copyright owner as \"Not a Contribution.\"\n\n \"Contributor\" shall mean Licensor and any individual or Legal Entity\n on behalf of whom a Contribution has been received by Licensor and\n subsequently incorporated within the Work.\n\n 2. Grant of Copyright License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n copyright license to reproduce, prepare Derivative Works of,\n publicly display, publicly perform, sublicense, and distribute the\n Work and such Derivative Works in Source or Object form.\n\n 3. Grant of Patent License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n (except as stated in this section) patent license to make, have made,\n use, offer to sell, sell, import, and otherwise transfer the Work,\n where such license applies only to those patent claims licensable\n by such Contributor that are necessarily infringed by their\n Contribution(s) alone or by combination of their Contribution(s)\n with the Work to which such Contribution(s) was submitted. If You\n institute patent litigation against any entity (including a\n cross-claim or counterclaim in a lawsuit) alleging that the Work\n or a Contribution incorporated within the Work constitutes direct\n or contributory patent infringement, then any patent licenses\n granted to You under this License for that Work shall terminate\n as of the date such litigation is filed.\n\n 4. Redistribution. You may reproduce and distribute copies of the\n Work or Derivative Works thereof in any medium, with or without\n modifications, and in Source or Object form, provided that You\n meet the following conditions:\n\n (a) You must give any other recipients of the Work or\n Derivative Works a copy of this License; and\n\n (b) You must cause any modified files to carry prominent notices\n stating that You changed the files; and\n\n (c) You must retain, in the Source form of any Derivative Works\n that You distribute, all copyright, patent, trademark, and\n attribution notices from the Source form of the Work,\n excluding those notices that do not pertain to any part of\n the Derivative Works; and\n\n (d) If the Work includes a \"NOTICE\" text file as part of its\n distribution, then any Derivative Works that You distribute must\n include a readable copy of the attribution notices contained\n within such NOTICE file, excluding those notices that do not\n pertain to any part of the Derivative Works, in at least one\n of the following places: within a NOTICE text file distributed\n as part of the Derivative Works; within the Source form or\n documentation, if provided along with the Derivative Works; or,\n within a display generated by the Derivative Works, if and\n wherever such third-party notices normally appear. The contents\n of the NOTICE file are for informational purposes only and\n do not modify the License. You may add Your own attribution\n notices within Derivative Works that You distribute, alongside\n or as an addendum to the NOTICE text from the Work, provided\n that such additional attribution notices cannot be construed\n as modifying the License.\n\n You may add Your own copyright statement to Your modifications and\n may provide additional or different license terms and conditions\n for use, reproduction, or distribution of Your modifications, or\n for any such Derivative Works as a whole, provided Your use,\n reproduction, and distribution of the Work otherwise complies with\n the conditions stated in this License.\n\n 5. Submission of Contributions. Unless You explicitly state otherwise,\n any Contribution intentionally submitted for inclusion in the Work\n by You to the Licensor shall be under the terms and conditions of\n this License, without any additional terms or conditions.\n Notwithstanding the above, nothing herein shall supersede or modify\n the terms of any separate license agreement you may have executed\n with Licensor regarding such Contributions.\n\n 6. Trademarks. This License does not grant permission to use the trade\n names, trademarks, service marks, or product names of the Licensor,\n except as required for reasonable and customary use in describing the\n origin of the Work and reproducing the content of the NOTICE file.\n\n 7. Disclaimer of Warranty. Unless required by applicable law or\n agreed to in writing, Licensor provides the Work (and each\n Contributor provides its Contributions) on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n implied, including, without limitation, any warranties or conditions\n of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n PARTICULAR PURPOSE. You are solely responsible for determining the\n appropriateness of using or redistributing the Work and assume any\n risks associated with Your exercise of permissions under this License.\n\n 8. Limitation of Liability. In no event and under no legal theory,\n whether in tort (including negligence), contract, or otherwise,\n unless required by applicable law (such as deliberate and grossly\n negligent acts) or agreed to in writing, shall any Contributor be\n liable to You for damages, including any direct, indirect, special,\n incidental, or consequential damages of any character arising as a\n result of this License or out of the use or inability to use the\n Work (including but not limited to damages for loss of goodwill,\n work stoppage, computer failure or malfunction, or any and all\n other commercial damages or losses), even if such Contributor\n has been advised of the possibility of such damages.\n\n 9. Accepting Warranty or Additional Liability. While redistributing\n the Work or Derivative Works thereof, You may choose to offer,\n and charge a fee for, acceptance of support, warranty, indemnity,\n or other liability obligations and/or rights consistent with this\n License. However, in accepting such obligations, You may act only\n on Your own behalf and on Your sole responsibility, not on behalf\n of any other Contributor, and only if You agree to indemnify,\n defend, and hold each Contributor harmless for any liability\n incurred by, or claims asserted against, such Contributor by reason\n of your accepting any such warranty or additional liability.\n\n END OF TERMS AND CONDITIONS\n\n APPENDIX: How to apply the Apache License to your work.\n\n To apply the Apache License to your work, attach the following\n boilerplate notice, with the fields enclosed by brackets \"[]\"\n replaced with your own identifying information. (Don't include\n the brackets!) The text should be enclosed in the appropriate\n comment syntax for the file format. We also recommend that a\n file or class name and description of purpose be included on the\n same \"printed page\" as the copyright notice for easier\n identification within third-party archives.\n\n Copyright [yyyy] [name of copyright owner]\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.", + "url": "https://www.apache.org/licenses/LICENSE-2.0", + "hash": "Apache-2.0" +} diff --git a/scanner-host/third-party/licenses/Google-Material-Icons.json b/scanner-host/third-party/licenses/Google-Material-Icons.json new file mode 100644 index 0000000..151c825 --- /dev/null +++ b/scanner-host/third-party/licenses/Google-Material-Icons.json @@ -0,0 +1,7 @@ +{ + "name": "Google Material Design icons — attribution and Apache License 2.0", + "spdxId": "Apache-2.0", + "content": "Material Design icons by Google.\nSource revision d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b.\nQQQ Android modifications: Android resource names, dimensions, and fill/tint presentation. Drawing paths match the pinned source. See docs/material-icons-provenance.json in the source distribution for all 2,142 resource mappings and hashes.\n\n\n Apache License\n Version 2.0, January 2004\n http://www.apache.org/licenses/\n\n TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n 1. Definitions.\n\n \"License\" shall mean the terms and conditions for use, reproduction,\n and distribution as defined by Sections 1 through 9 of this document.\n\n \"Licensor\" shall mean the copyright owner or entity authorized by\n the copyright owner that is granting the License.\n\n \"Legal Entity\" shall mean the union of the acting entity and all\n other entities that control, are controlled by, or are under common\n control with that entity. For the purposes of this definition,\n \"control\" means (i) the power, direct or indirect, to cause the\n direction or management of such entity, whether by contract or\n otherwise, or (ii) ownership of fifty percent (50%) or more of the\n outstanding shares, or (iii) beneficial ownership of such entity.\n\n \"You\" (or \"Your\") shall mean an individual or Legal Entity\n exercising permissions granted by this License.\n\n \"Source\" form shall mean the preferred form for making modifications,\n including but not limited to software source code, documentation\n source, and configuration files.\n\n \"Object\" form shall mean any form resulting from mechanical\n transformation or translation of a Source form, including but\n not limited to compiled object code, generated documentation,\n and conversions to other media types.\n\n \"Work\" shall mean the work of authorship, whether in Source or\n Object form, made available under the License, as indicated by a\n copyright notice that is included in or attached to the work\n (an example is provided in the Appendix below).\n\n \"Derivative Works\" shall mean any work, whether in Source or Object\n form, that is based on (or derived from) the Work and for which the\n editorial revisions, annotations, elaborations, or other modifications\n represent, as a whole, an original work of authorship. For the purposes\n of this License, Derivative Works shall not include works that remain\n separable from, or merely link (or bind by name) to the interfaces of,\n the Work and Derivative Works thereof.\n\n \"Contribution\" shall mean any work of authorship, including\n the original version of the Work and any modifications or additions\n to that Work or Derivative Works thereof, that is intentionally\n submitted to Licensor for inclusion in the Work by the copyright owner\n or by an individual or Legal Entity authorized to submit on behalf of\n the copyright owner. For the purposes of this definition, \"submitted\"\n means any form of electronic, verbal, or written communication sent\n to the Licensor or its representatives, including but not limited to\n communication on electronic mailing lists, source code control systems,\n and issue tracking systems that are managed by, or on behalf of, the\n Licensor for the purpose of discussing and improving the Work, but\n excluding communication that is conspicuously marked or otherwise\n designated in writing by the copyright owner as \"Not a Contribution.\"\n\n \"Contributor\" shall mean Licensor and any individual or Legal Entity\n on behalf of whom a Contribution has been received by Licensor and\n subsequently incorporated within the Work.\n\n 2. Grant of Copyright License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n copyright license to reproduce, prepare Derivative Works of,\n publicly display, publicly perform, sublicense, and distribute the\n Work and such Derivative Works in Source or Object form.\n\n 3. Grant of Patent License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n (except as stated in this section) patent license to make, have made,\n use, offer to sell, sell, import, and otherwise transfer the Work,\n where such license applies only to those patent claims licensable\n by such Contributor that are necessarily infringed by their\n Contribution(s) alone or by combination of their Contribution(s)\n with the Work to which such Contribution(s) was submitted. If You\n institute patent litigation against any entity (including a\n cross-claim or counterclaim in a lawsuit) alleging that the Work\n or a Contribution incorporated within the Work constitutes direct\n or contributory patent infringement, then any patent licenses\n granted to You under this License for that Work shall terminate\n as of the date such litigation is filed.\n\n 4. Redistribution. You may reproduce and distribute copies of the\n Work or Derivative Works thereof in any medium, with or without\n modifications, and in Source or Object form, provided that You\n meet the following conditions:\n\n (a) You must give any other recipients of the Work or\n Derivative Works a copy of this License; and\n\n (b) You must cause any modified files to carry prominent notices\n stating that You changed the files; and\n\n (c) You must retain, in the Source form of any Derivative Works\n that You distribute, all copyright, patent, trademark, and\n attribution notices from the Source form of the Work,\n excluding those notices that do not pertain to any part of\n the Derivative Works; and\n\n (d) If the Work includes a \"NOTICE\" text file as part of its\n distribution, then any Derivative Works that You distribute must\n include a readable copy of the attribution notices contained\n within such NOTICE file, excluding those notices that do not\n pertain to any part of the Derivative Works, in at least one\n of the following places: within a NOTICE text file distributed\n as part of the Derivative Works; within the Source form or\n documentation, if provided along with the Derivative Works; or,\n within a display generated by the Derivative Works, if and\n wherever such third-party notices normally appear. The contents\n of the NOTICE file are for informational purposes only and\n do not modify the License. You may add Your own attribution\n notices within Derivative Works that You distribute, alongside\n or as an addendum to the NOTICE text from the Work, provided\n that such additional attribution notices cannot be construed\n as modifying the License.\n\n You may add Your own copyright statement to Your modifications and\n may provide additional or different license terms and conditions\n for use, reproduction, or distribution of Your modifications, or\n for any such Derivative Works as a whole, provided Your use,\n reproduction, and distribution of the Work otherwise complies with\n the conditions stated in this License.\n\n 5. Submission of Contributions. Unless You explicitly state otherwise,\n any Contribution intentionally submitted for inclusion in the Work\n by You to the Licensor shall be under the terms and conditions of\n this License, without any additional terms or conditions.\n Notwithstanding the above, nothing herein shall supersede or modify\n the terms of any separate license agreement you may have executed\n with Licensor regarding such Contributions.\n\n 6. Trademarks. This License does not grant permission to use the trade\n names, trademarks, service marks, or product names of the Licensor,\n except as required for reasonable and customary use in describing the\n origin of the Work and reproducing the content of the NOTICE file.\n\n 7. Disclaimer of Warranty. Unless required by applicable law or\n agreed to in writing, Licensor provides the Work (and each\n Contributor provides its Contributions) on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n implied, including, without limitation, any warranties or conditions\n of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n PARTICULAR PURPOSE. You are solely responsible for determining the\n appropriateness of using or redistributing the Work and assume any\n risks associated with Your exercise of permissions under this License.\n\n 8. Limitation of Liability. In no event and under no legal theory,\n whether in tort (including negligence), contract, or otherwise,\n unless required by applicable law (such as deliberate and grossly\n negligent acts) or agreed to in writing, shall any Contributor be\n liable to You for damages, including any direct, indirect, special,\n incidental, or consequential damages of any character arising as a\n result of this License or out of the use or inability to use the\n Work (including but not limited to damages for loss of goodwill,\n work stoppage, computer failure or malfunction, or any and all\n other commercial damages or losses), even if such Contributor\n has been advised of the possibility of such damages.\n\n 9. Accepting Warranty or Additional Liability. While redistributing\n the Work or Derivative Works thereof, You may choose to offer,\n and charge a fee for, acceptance of support, warranty, indemnity,\n or other liability obligations and/or rights consistent with this\n License. However, in accepting such obligations, You may act only\n on Your own behalf and on Your sole responsibility, not on behalf\n of any other Contributor, and only if You agree to indemnify,\n defend, and hold each Contributor harmless for any liability\n incurred by, or claims asserted against, such Contributor by reason\n of your accepting any such warranty or additional liability.\n\n END OF TERMS AND CONDITIONS\n\n APPENDIX: How to apply the Apache License to your work.\n\n To apply the Apache License to your work, attach the following\n boilerplate notice, with the fields enclosed by brackets \"[]\"\n replaced with your own identifying information. (Don't include\n the brackets!) The text should be enclosed in the appropriate\n comment syntax for the file format. We also recommend that a\n file or class name and description of purpose be included on the\n same \"printed page\" as the copyright notice for easier\n identification within third-party archives.\n\n Copyright [yyyy] [name of copyright owner]\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.", + "url": "https://github.com/google/material-design-icons/tree/d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b", + "hash": "Google-Material-Icons" +} diff --git a/scanner-host/third-party/licenses/MIT.json b/scanner-host/third-party/licenses/MIT.json new file mode 100644 index 0000000..69fbae5 --- /dev/null +++ b/scanner-host/third-party/licenses/MIT.json @@ -0,0 +1,7 @@ +{ + "name": "MIT License (Auth0)", + "spdxId": "MIT", + "content": "The MIT License (MIT)\n\nCopyright (c) 2021 Auth0\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n", + "url": "https://github.com/auth0/Auth0.Android/blob/dcf37dd3c06421275dcc6cb1e2fbe792354a8a38/LICENSE", + "hash": "MIT" +} diff --git a/scanner-host/third-party/licenses/MPL-2.0.json b/scanner-host/third-party/licenses/MPL-2.0.json new file mode 100644 index 0000000..a925dd5 --- /dev/null +++ b/scanner-host/third-party/licenses/MPL-2.0.json @@ -0,0 +1,7 @@ +{ + "name": "Mozilla Public License 2.0", + "spdxId": "MPL-2.0", + "content": "Public Suffix List data embedded by OkHttp. Source: https://publicsuffix.org/list/public_suffix_list.dat . This license applies to the embedded list, not to OkHttp as a whole.\n\nMozilla Public License Version 2.0\n==================================\n\n1. Definitions\n--------------\n\n1.1. \"Contributor\"\n means each individual or legal entity that creates, contributes to\n the creation of, or owns Covered Software.\n\n1.2. \"Contributor Version\"\n means the combination of the Contributions of others (if any) used\n by a Contributor and that particular Contributor's Contribution.\n\n1.3. \"Contribution\"\n means Covered Software of a particular Contributor.\n\n1.4. \"Covered Software\"\n means Source Code Form to which the initial Contributor has attached\n the notice in Exhibit A, the Executable Form of such Source Code\n Form, and Modifications of such Source Code Form, in each case\n including portions thereof.\n\n1.5. \"Incompatible With Secondary Licenses\"\n means\n\n (a) that the initial Contributor has attached the notice described\n in Exhibit B to the Covered Software; or\n\n (b) that the Covered Software was made available under the terms of\n version 1.1 or earlier of the License, but not also under the\n terms of a Secondary License.\n\n1.6. \"Executable Form\"\n means any form of the work other than Source Code Form.\n\n1.7. \"Larger Work\"\n means a work that combines Covered Software with other material, in \n a separate file or files, that is not Covered Software.\n\n1.8. \"License\"\n means this document.\n\n1.9. \"Licensable\"\n means having the right to grant, to the maximum extent possible,\n whether at the time of the initial grant or subsequently, any and\n all of the rights conveyed by this License.\n\n1.10. \"Modifications\"\n means any of the following:\n\n (a) any file in Source Code Form that results from an addition to,\n deletion from, or modification of the contents of Covered\n Software; or\n\n (b) any new file in Source Code Form that contains any Covered\n Software.\n\n1.11. \"Patent Claims\" of a Contributor\n means any patent claim(s), including without limitation, method,\n process, and apparatus claims, in any patent Licensable by such\n Contributor that would be infringed, but for the grant of the\n License, by the making, using, selling, offering for sale, having\n made, import, or transfer of either its Contributions or its\n Contributor Version.\n\n1.12. \"Secondary License\"\n means either the GNU General Public License, Version 2.0, the GNU\n Lesser General Public License, Version 2.1, the GNU Affero General\n Public License, Version 3.0, or any later versions of those\n licenses.\n\n1.13. \"Source Code Form\"\n means the form of the work preferred for making modifications.\n\n1.14. \"You\" (or \"Your\")\n means an individual or a legal entity exercising rights under this\n License. For legal entities, \"You\" includes any entity that\n controls, is controlled by, or is under common control with You. For\n purposes of this definition, \"control\" means (a) the power, direct\n or indirect, to cause the direction or management of such entity,\n whether by contract or otherwise, or (b) ownership of more than\n fifty percent (50%) of the outstanding shares or beneficial\n ownership of such entity.\n\n2. License Grants and Conditions\n--------------------------------\n\n2.1. Grants\n\nEach Contributor hereby grants You a world-wide, royalty-free,\nnon-exclusive license:\n\n(a) under intellectual property rights (other than patent or trademark)\n Licensable by such Contributor to use, reproduce, make available,\n modify, display, perform, distribute, and otherwise exploit its\n Contributions, either on an unmodified basis, with Modifications, or\n as part of a Larger Work; and\n\n(b) under Patent Claims of such Contributor to make, use, sell, offer\n for sale, have made, import, and otherwise transfer either its\n Contributions or its Contributor Version.\n\n2.2. Effective Date\n\nThe licenses granted in Section 2.1 with respect to any Contribution\nbecome effective for each Contribution on the date the Contributor first\ndistributes such Contribution.\n\n2.3. Limitations on Grant Scope\n\nThe licenses granted in this Section 2 are the only rights granted under\nthis License. No additional rights or licenses will be implied from the\ndistribution or licensing of Covered Software under this License.\nNotwithstanding Section 2.1(b) above, no patent license is granted by a\nContributor:\n\n(a) for any code that a Contributor has removed from Covered Software;\n or\n\n(b) for infringements caused by: (i) Your and any other third party's\n modifications of Covered Software, or (ii) the combination of its\n Contributions with other software (except as part of its Contributor\n Version); or\n\n(c) under Patent Claims infringed by Covered Software in the absence of\n its Contributions.\n\nThis License does not grant any rights in the trademarks, service marks,\nor logos of any Contributor (except as may be necessary to comply with\nthe notice requirements in Section 3.4).\n\n2.4. Subsequent Licenses\n\nNo Contributor makes additional grants as a result of Your choice to\ndistribute the Covered Software under a subsequent version of this\nLicense (see Section 10.2) or under the terms of a Secondary License (if\npermitted under the terms of Section 3.3).\n\n2.5. Representation\n\nEach Contributor represents that the Contributor believes its\nContributions are its original creation(s) or it has sufficient rights\nto grant the rights to its Contributions conveyed by this License.\n\n2.6. Fair Use\n\nThis License is not intended to limit any rights You have under\napplicable copyright doctrines of fair use, fair dealing, or other\nequivalents.\n\n2.7. Conditions\n\nSections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted\nin Section 2.1.\n\n3. Responsibilities\n-------------------\n\n3.1. Distribution of Source Form\n\nAll distribution of Covered Software in Source Code Form, including any\nModifications that You create or to which You contribute, must be under\nthe terms of this License. You must inform recipients that the Source\nCode Form of the Covered Software is governed by the terms of this\nLicense, and how they can obtain a copy of this License. You may not\nattempt to alter or restrict the recipients' rights in the Source Code\nForm.\n\n3.2. Distribution of Executable Form\n\nIf You distribute Covered Software in Executable Form then:\n\n(a) such Covered Software must also be made available in Source Code\n Form, as described in Section 3.1, and You must inform recipients of\n the Executable Form how they can obtain a copy of such Source Code\n Form by reasonable means in a timely manner, at a charge no more\n than the cost of distribution to the recipient; and\n\n(b) You may distribute such Executable Form under the terms of this\n License, or sublicense it under different terms, provided that the\n license for the Executable Form does not attempt to limit or alter\n the recipients' rights in the Source Code Form under this License.\n\n3.3. Distribution of a Larger Work\n\nYou may create and distribute a Larger Work under terms of Your choice,\nprovided that You also comply with the requirements of this License for\nthe Covered Software. If the Larger Work is a combination of Covered\nSoftware with a work governed by one or more Secondary Licenses, and the\nCovered Software is not Incompatible With Secondary Licenses, this\nLicense permits You to additionally distribute such Covered Software\nunder the terms of such Secondary License(s), so that the recipient of\nthe Larger Work may, at their option, further distribute the Covered\nSoftware under the terms of either this License or such Secondary\nLicense(s).\n\n3.4. Notices\n\nYou may not remove or alter the substance of any license notices\n(including copyright notices, patent notices, disclaimers of warranty,\nor limitations of liability) contained within the Source Code Form of\nthe Covered Software, except that You may alter any license notices to\nthe extent required to remedy known factual inaccuracies.\n\n3.5. Application of Additional Terms\n\nYou may choose to offer, and to charge a fee for, warranty, support,\nindemnity or liability obligations to one or more recipients of Covered\nSoftware. However, You may do so only on Your own behalf, and not on\nbehalf of any Contributor. You must make it absolutely clear that any\nsuch warranty, support, indemnity, or liability obligation is offered by\nYou alone, and You hereby agree to indemnify every Contributor for any\nliability incurred by such Contributor as a result of warranty, support,\nindemnity or liability terms You offer. You may include additional\ndisclaimers of warranty and limitations of liability specific to any\njurisdiction.\n\n4. Inability to Comply Due to Statute or Regulation\n---------------------------------------------------\n\nIf it is impossible for You to comply with any of the terms of this\nLicense with respect to some or all of the Covered Software due to\nstatute, judicial order, or regulation then You must: (a) comply with\nthe terms of this License to the maximum extent possible; and (b)\ndescribe the limitations and the code they affect. Such description must\nbe placed in a text file included with all distributions of the Covered\nSoftware under this License. Except to the extent prohibited by statute\nor regulation, such description must be sufficiently detailed for a\nrecipient of ordinary skill to be able to understand it.\n\n5. Termination\n--------------\n\n5.1. The rights granted under this License will terminate automatically\nif You fail to comply with any of its terms. However, if You become\ncompliant, then the rights granted under this License from a particular\nContributor are reinstated (a) provisionally, unless and until such\nContributor explicitly and finally terminates Your grants, and (b) on an\nongoing basis, if such Contributor fails to notify You of the\nnon-compliance by some reasonable means prior to 60 days after You have\ncome back into compliance. Moreover, Your grants from a particular\nContributor are reinstated on an ongoing basis if such Contributor\nnotifies You of the non-compliance by some reasonable means, this is the\nfirst time You have received notice of non-compliance with this License\nfrom such Contributor, and You become compliant prior to 30 days after\nYour receipt of the notice.\n\n5.2. If You initiate litigation against any entity by asserting a patent\ninfringement claim (excluding declaratory judgment actions,\ncounter-claims, and cross-claims) alleging that a Contributor Version\ndirectly or indirectly infringes any patent, then the rights granted to\nYou by any and all Contributors for the Covered Software under Section\n2.1 of this License shall terminate.\n\n5.3. In the event of termination under Sections 5.1 or 5.2 above, all\nend user license agreements (excluding distributors and resellers) which\nhave been validly granted by You or Your distributors under this License\nprior to termination shall survive termination.\n\n************************************************************************\n* *\n* 6. Disclaimer of Warranty *\n* ------------------------- *\n* *\n* Covered Software is provided under this License on an \"as is\" *\n* basis, without warranty of any kind, either expressed, implied, or *\n* statutory, including, without limitation, warranties that the *\n* Covered Software is free of defects, merchantable, fit for a *\n* particular purpose or non-infringing. The entire risk as to the *\n* quality and performance of the Covered Software is with You. *\n* Should any Covered Software prove defective in any respect, You *\n* (not any Contributor) assume the cost of any necessary servicing, *\n* repair, or correction. This disclaimer of warranty constitutes an *\n* essential part of this License. No use of any Covered Software is *\n* authorized under this License except under this disclaimer. *\n* *\n************************************************************************\n\n************************************************************************\n* *\n* 7. Limitation of Liability *\n* -------------------------- *\n* *\n* Under no circumstances and under no legal theory, whether tort *\n* (including negligence), contract, or otherwise, shall any *\n* Contributor, or anyone who distributes Covered Software as *\n* permitted above, be liable to You for any direct, indirect, *\n* special, incidental, or consequential damages of any character *\n* including, without limitation, damages for lost profits, loss of *\n* goodwill, work stoppage, computer failure or malfunction, or any *\n* and all other commercial damages or losses, even if such party *\n* shall have been informed of the possibility of such damages. This *\n* limitation of liability shall not apply to liability for death or *\n* personal injury resulting from such party's negligence to the *\n* extent applicable law prohibits such limitation. Some *\n* jurisdictions do not allow the exclusion or limitation of *\n* incidental or consequential damages, so this exclusion and *\n* limitation may not apply to You. *\n* *\n************************************************************************\n\n8. Litigation\n-------------\n\nAny litigation relating to this License may be brought only in the\ncourts of a jurisdiction where the defendant maintains its principal\nplace of business and such litigation shall be governed by laws of that\njurisdiction, without reference to its conflict-of-law provisions.\nNothing in this Section shall prevent a party's ability to bring\ncross-claims or counter-claims.\n\n9. Miscellaneous\n----------------\n\nThis License represents the complete agreement concerning the subject\nmatter hereof. If any provision of this License is held to be\nunenforceable, such provision shall be reformed only to the extent\nnecessary to make it enforceable. Any law or regulation which provides\nthat the language of a contract shall be construed against the drafter\nshall not be used to construe this License against a Contributor.\n\n10. Versions of the License\n---------------------------\n\n10.1. New Versions\n\nMozilla Foundation is the license steward. Except as provided in Section\n10.3, no one other than the license steward has the right to modify or\npublish new versions of this License. Each version will be given a\ndistinguishing version number.\n\n10.2. Effect of New Versions\n\nYou may distribute the Covered Software under the terms of the version\nof the License under which You originally received the Covered Software,\nor under the terms of any subsequent version published by the license\nsteward.\n\n10.3. Modified Versions\n\nIf you create software not governed by this License, and you want to\ncreate a new license for such software, you may create and use a\nmodified version of this License if you rename the license and remove\nany references to the name of the license steward (except to note that\nsuch modified license differs from this License).\n\n10.4. Distributing Source Code Form that is Incompatible With Secondary\nLicenses\n\nIf You choose to distribute Source Code Form that is Incompatible With\nSecondary Licenses under the terms of this version of the License, the\nnotice described in Exhibit B of this License must be attached.\n\nExhibit A - Source Code Form License Notice\n-------------------------------------------\n\n This Source Code Form is subject to the terms of the Mozilla Public\n License, v. 2.0. If a copy of the MPL was not distributed with this\n file, You can obtain one at https://mozilla.org/MPL/2.0/.\n\nIf it is not possible or desirable to put the notice in a particular\nfile, then You may include the notice in a location (such as a LICENSE\nfile in a relevant directory) where a recipient would be likely to look\nfor such a notice.\n\nYou may add additional accurate notices of copyright ownership.\n\nExhibit B - \"Incompatible With Secondary Licenses\" Notice\n---------------------------------------------------------\n\n This Source Code Form is \"Incompatible With Secondary Licenses\", as\n defined by the Mozilla Public License, v. 2.0.\n", + "url": "https://publicsuffix.org/", + "hash": "MPL-2.0" +} diff --git a/scanner-host/third-party/licenses/QQQ-Android.json b/scanner-host/third-party/licenses/QQQ-Android.json new file mode 100644 index 0000000..684df58 --- /dev/null +++ b/scanner-host/third-party/licenses/QQQ-Android.json @@ -0,0 +1,7 @@ +{ + "name": "QQQ Android — notices and Apache License 2.0", + "spdxId": "Apache-2.0", + "content": "QQQ Android\nCopyright 2022-2025 QRunIO, LLC\n\nThis product includes software developed at QRunIO, LLC (https://qrun.io/).\n\nLicensed under the Apache License, Version 2.0.\n\n================================================================================\n\nMaterial Design icons by Google\n\nThe 2,142 vector resources in qqq/android/mobileapp/src/main/res/drawable\nuse Material Design icon artwork from Google, licensed under Apache-2.0:\nhttps://github.com/google/material-design-icons\nPinned upstream revision: d7a78a2ad434d5d38e1b8708c9dd9847cc3ada9b\n\nQQQ Android integration modifications include Android resource names, dimensions,\nand fill/tint presentation. Each resource's drawing path data matches its pinned\nupstream source. The loading and unavailable-network illustrations use the\nupstream hourglass_empty and wifi_off icons, respectively.\n\nSee docs/material-icons-provenance.json for the complete resource-to-source\nmapping, SHA-256 hashes, and final styling. The upstream license is retained in\ndocs/third-party/material-design-icons-LICENSE.txt.\n\nProject copyright statements cover project integration/modifications and do not\nreplace Google's original artwork attribution. Dependency and embedded-data\nnotices are included in the application's Open-source licenses settings and its\nmatching generated distribution report. This repository notice supplements that\nreport; it is not a complete dependency inventory by itself.\n\n================================================================================\n\nTrademarks:\n\nQQQ, qBits, qRun, qStudio, and the QRunIO logo are trademarks of QRunIO, LLC.\nUse of these trademarks must comply with QRunIO's Trademark Guidelines.\n\n================================================================================\n\nQuery mascot artwork: QRun's existing Query puppy asset, sourced from marketing-website/assets/Puppy Mark/exports/PNG/qqq-puppy.png. Bundled for the About screen; the original artwork is unchanged.\n\n================================================================================\n\n Apache License\n Version 2.0, January 2004\n http://www.apache.org/licenses/\n\n TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n 1. Definitions.\n\n \"License\" shall mean the terms and conditions for use, reproduction,\n and distribution as defined by Sections 1 through 9 of this document.\n\n \"Licensor\" shall mean the copyright owner or entity authorized by\n the copyright owner that is granting the License.\n\n \"Legal Entity\" shall mean the union of the acting entity and all\n other entities that control, are controlled by, or are under common\n control with that entity. For the purposes of this definition,\n \"control\" means (i) the power, direct or indirect, to cause the\n direction or management of such entity, whether by contract or\n otherwise, or (ii) ownership of fifty percent (50%) or more of the\n outstanding shares, or (iii) beneficial ownership of such entity.\n\n \"You\" (or \"Your\") shall mean an individual or Legal Entity\n exercising permissions granted by this License.\n\n \"Source\" form shall mean the preferred form for making modifications,\n including but not limited to software source code, documentation\n source, and configuration files.\n\n \"Object\" form shall mean any form resulting from mechanical\n transformation or translation of a Source form, including but\n not limited to compiled object code, generated documentation,\n and conversions to other media types.\n\n \"Work\" shall mean the work of authorship, whether in Source or\n Object form, made available under the License, as indicated by a\n copyright notice that is included in or attached to the work\n (an example is provided in the Appendix below).\n\n \"Derivative Works\" shall mean any work, whether in Source or Object\n form, that is based on (or derived from) the Work and for which the\n editorial revisions, annotations, elaborations, or other modifications\n represent, as a whole, an original work of authorship. For the purposes\n of this License, Derivative Works shall not include works that remain\n separable from, or merely link (or bind by name) to the interfaces of,\n the Work and Derivative Works thereof.\n\n \"Contribution\" shall mean any work of authorship, including\n the original version of the Work and any modifications or additions\n to that Work or Derivative Works thereof, that is intentionally\n submitted to the Licensor for inclusion in the Work by the copyright\n owner or by an individual or Legal Entity authorized to submit on\n behalf of the copyright owner. For the purposes of this definition,\n \"submitted\" means any form of electronic, verbal, or written\n communication sent to the Licensor or its representatives, including\n but not limited to communication on electronic mailing lists, source\n code control systems, and issue tracking systems that are managed by,\n or on behalf of, the Licensor for the purpose of discussing and\n improving the Work, but excluding communication that is conspicuously\n marked or otherwise designated in writing by the copyright owner as\n \"Not a Contribution.\"\n\n \"Contributor\" shall mean Licensor and any individual or Legal Entity\n on behalf of whom a Contribution has been received by Licensor and\n subsequently incorporated within the Work.\n\n 2. Grant of Copyright License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n copyright license to reproduce, prepare Derivative Works of,\n publicly display, publicly perform, sublicense, and distribute the\n Work and such Derivative Works in Source or Object form.\n\n 3. Grant of Patent License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n (except as stated in this section) patent license to make, have made,\n use, offer to sell, sell, import, and otherwise transfer the Work,\n where such license applies only to those patent claims licensable\n by such Contributor that are necessarily infringed by their\n Contribution(s) alone or by combination of their Contribution(s)\n with the Work to which such Contribution(s) was submitted. If You\n institute patent litigation against any entity (including a\n cross-claim or counterclaim in a lawsuit) alleging that the Work\n or a Contribution incorporated within the Work constitutes direct\n or contributory patent infringement, then any patent licenses\n granted to You under this License for that Work shall terminate\n as of the date such litigation is filed.\n\n 4. Redistribution. You may reproduce and distribute copies of the\n Work or Derivative Works thereof in any medium, with or without\n modifications, and in Source or Object form, provided that You\n meet the following conditions:\n\n (a) You must give any other recipients of the Work or\n Derivative Works a copy of this License; and\n\n (b) You must cause any modified files to carry prominent notices\n stating that You changed the files; and\n\n (c) You must retain, in the Source form of any Derivative Works\n that You distribute, all copyright, patent, trademark, and\n attribution notices from the Source form of the Work,\n excluding those notices that do not pertain to any part of\n the Derivative Works; and\n\n (d) If the Work includes a \"NOTICE\" text file as part of its\n distribution, then any Derivative Works that You distribute must\n include a readable copy of the attribution notices contained\n within such NOTICE file, excluding those notices that do not\n pertain to any part of the Derivative Works, in at least one\n of the following places: within a NOTICE text file distributed\n as part of the Derivative Works; within the Source form or\n documentation, if provided along with the Derivative Works; or,\n within a display generated by the Derivative Works, if and\n wherever such third-party notices normally appear. The contents\n of the NOTICE file are for informational purposes only and\n do not modify the License. You may add Your own attribution\n notices within Derivative Works that You distribute, alongside\n or as an addendum to the NOTICE text from the Work, provided\n that such additional attribution notices cannot be construed\n as modifying the License.\n\n You may add Your own copyright statement to Your modifications and\n may provide additional or different license terms and conditions\n for use, reproduction, or distribution of Your modifications, or\n for any such Derivative Works as a whole, provided Your use,\n reproduction, and distribution of the Work otherwise complies with\n the conditions stated in this License.\n\n 5. Submission of Contributions. Unless You explicitly state otherwise,\n any Contribution intentionally submitted for inclusion in the Work\n by You to the Licensor shall be under the terms and conditions of\n this License, without any additional terms or conditions.\n Notwithstanding the above, nothing herein shall supersede or modify\n the terms of any separate license agreement you may have executed\n with Licensor regarding such Contributions.\n\n 6. Trademarks. This License does not grant permission to use the trade\n names, trademarks, service marks, or product names of the Licensor,\n except as required for reasonable and customary use in describing the\n origin of the Work and reproducing the content of the NOTICE file.\n\n 7. Disclaimer of Warranty. Unless required by applicable law or\n agreed to in writing, Licensor provides the Work (and each\n Contributor provides its Contributions) on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n implied, including, without limitation, any warranties or conditions\n of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n PARTICULAR PURPOSE. You are solely responsible for determining the\n appropriateness of using or redistributing the Work and assume any\n risks associated with Your exercise of permissions under this License.\n\n 8. Limitation of Liability. In no event and under no legal theory,\n whether in tort (including negligence), contract, or otherwise,\n unless required by applicable law (such as deliberate and grossly\n negligent acts) or agreed to in writing, shall any Contributor be\n liable to You for damages, including any direct, indirect, special,\n incidental, or consequential damages of any character arising as a\n result of this License or out of the use or inability to use the\n Work (including but not limited to damages for loss of goodwill,\n work stoppage, computer failure or malfunction, or any and all\n other commercial damages or losses), even if such Contributor\n has been advised of the possibility of such damages.\n\n 9. Accepting Warranty or Additional Liability. While redistributing\n the Work or Derivative Works thereof, You may choose to offer,\n and charge a fee for, acceptance of support, warranty, indemnity,\n or other liability obligations and/or rights consistent with this\n License. However, in accepting such obligations, You may act only\n on Your own behalf and on Your sole responsibility, not on behalf\n of any other Contributor, and only if You agree to indemnify,\n defend, and hold each Contributor harmless for any liability\n incurred by, or claims asserted against, such Contributor by reason\n of your accepting any such warranty or additional liability.\n\n END OF TERMS AND CONDITIONS\n\n APPENDIX: How to apply the Apache License to your work.\n\n To apply the Apache License to your work, attach the following\n boilerplate notice, with the fields enclosed by brackets \"[]\"\n replaced with your own identifying information. (Don't include\n the brackets!) The text should be enclosed in the appropriate\n comment syntax for the file format. We also recommend that a\n file or class name and description of purpose be included on the\n same \"printed page\" as the copyright notice for easier\n identification within third-party archives.\n\n Copyright 2022-2025 QRunIO, LLC\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n", + "url": "https://github.com/QRun-IO/qqq-android", + "hash": "QQQ-Android" +} diff --git a/scanner-security-probe/.gitignore b/scanner-security-probe/.gitignore new file mode 100644 index 0000000..796b96d --- /dev/null +++ b/scanner-security-probe/.gitignore @@ -0,0 +1 @@ +/build diff --git a/scanner-security-probe/README.md b/scanner-security-probe/README.md new file mode 100644 index 0000000..dbc8282 --- /dev/null +++ b/scanner-security-probe/README.md @@ -0,0 +1,29 @@ +# Disposable scan injection probe + +This test application has no network permission, target permissions, Activity, shared UID or external runtime dependency. Its exported control receiver creates new DataWedge-shaped intents under its own ordinary Android UID. It only accepts the disposable `.qa` and `.e2e` scanner package names and synthetic `probe-...` markers. It cannot target the normal scanner package. + +Accepted target requests select explicit compile-time package literals before any intent is constructed. The caller's package string is never forwarded to `setPackage`; every other target returns without sending. + +Build the QA target against the production factory, its test APK, and the probe: + +```text +gradlew --max-workers=2 --no-parallel -PscannerTestBuildType=qa :scanner-host:assembleQa :scanner-host:assembleQaAndroidTest :scanner-security-probe:assembleDebug +``` + +The ordinary debug key is used only to compile the probe. Before physical acceptance, the operator must re-sign a copy with a different **throwaway test-only key**. The native test rejects equal signing certificates and equal app UIDs. Do not change the normal scanner signing key, generate a release key for this test, or commit any private key/password. + +Root coordinates the serial build/device lane. The physical harness requires a private JSON file with `purpose: "scanner-injection-qa"`, an explicit disposable loopback `baseUrl`, and random `scannerPassword`/`adminPassword` values. It does not create or reconfigure the server. The fixture must contain the ordinary scanner demo metadata/processes and an empty dedicated database. + +```text +node scripts/ci/scanner-injection-device.mjs <TC22-serial> <private-fixture.json> <separately-signed-probe.apk> +``` + +The runner refuses existing QA/test/probe installations, installs only those three packages, adds one new non-rebinding reverse and removes only its own installations/reverse. It never installs, clears, targets or changes the normal scanner app or the operator's existing E2E visual demo. It does not wake/unlock the handheld or change scanner profiles, animation settings, USB debugging or Android keys. + +The native test requires the real scanner to report ready, keeps the Activity resumed/focused/unlocked, and saves one manual positive control through the real semantic API. A brief instrumentation-only observer proves the exact scan action and typed payload reached the QA package; it cannot submit a scan and is unregistered before the negative attempt. Eight forged intents must produce zero additional server records and zero additional native semantic process-step requests. No screenshots or customer barcodes are captured. + +Evidence is written under `scanner-host/build/native-device-qa-injection`: sanitized instrumentation, semantic operation audit and APK hashes. Without `expectedBarcode`, this is an injection-only proof and explicitly records `physicalTriggerVerified: false`. + +To add real hardware acceptance in the same signed-in session, add an `expectedBarcode` string to the private fixture JSON. Use a known non-sensitive printed barcode; leading zeroes and spaces are preserved exactly. The runner prints `hardware-initial-ready`, `hardware-recreated-ready`, and `hardware-resumed-ready` status lines. At each line, the operator has up to 120 seconds to aim at that barcode and press the physical trigger **once**. No fake hardware input is injected. The second phase uses Activity recreation; the third stops/resumes only the disposable QA Activity. This does not claim a global screen-orientation/MDM test or change any system setting. + +Each phase requires exactly one new `zebra-emdk` server record with the exact configured barcode, a new event UUID, the approved device/operator and the corresponding UI receipt. Full mode requires exactly four native process-step requests: one manual control and three real scans. `physicalTriggerVerified: true` is written only after all three phases and the server/API checks pass. The proof stores the expected barcode's SHA-256 instead of its raw text. Root remains responsible for preparing the non-sensitive target and operator prompts. diff --git a/scanner-security-probe/build.gradle.kts b/scanner-security-probe/build.gradle.kts new file mode 100644 index 0000000..6761083 --- /dev/null +++ b/scanner-security-probe/build.gradle.kts @@ -0,0 +1,23 @@ +/* Copyright (c) 2026 QRunIO. SPDX-License-Identifier: Apache-2.0 */ +plugins { + alias(libs.plugins.android.application) +} + +android { + namespace = "io.qrun.mobile.scanner.probe" + compileSdk = 35 + defaultConfig { + applicationId = "io.qrun.mobile.scanner.probe" + minSdk = 26 + targetSdk = 35 + versionCode = 1 + versionName = "1.0" + } + compileOptions { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 + } +} + +// Deliberately no runtime dependencies, network permission, shared UID, or target-app permissions. +// The physical harness requires a separately signed copy; it rejects the ordinary debug signer. diff --git a/scanner-security-probe/src/main/AndroidManifest.xml b/scanner-security-probe/src/main/AndroidManifest.xml new file mode 100644 index 0000000..a63be30 --- /dev/null +++ b/scanner-security-probe/src/main/AndroidManifest.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8"?> +<manifest xmlns:android="http://schemas.android.com/apk/res/android"> + <application android:label="QQQ scan injection probe" android:allowBackup="false" + android:fullBackupContent="false" android:usesCleartextTraffic="false"> + <receiver android:name=".ScanProbeReceiver" android:exported="true" /> + </application> +</manifest> diff --git a/scanner-security-probe/src/main/java/io/qrun/mobile/scanner/probe/ScanProbeReceiver.java b/scanner-security-probe/src/main/java/io/qrun/mobile/scanner/probe/ScanProbeReceiver.java new file mode 100644 index 0000000..78b98f0 --- /dev/null +++ b/scanner-security-probe/src/main/java/io/qrun/mobile/scanner/probe/ScanProbeReceiver.java @@ -0,0 +1,69 @@ +/* Copyright (c) 2026 QRunIO. SPDX-License-Identifier: Apache-2.0 */ +package io.qrun.mobile.scanner.probe; + +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.os.Bundle; +import android.os.Process; + +/******************************************************************************* + ** Headless adversarial sender: new intents originate under this ordinary + ** application's UID, independently of the production scanner service. + *******************************************************************************/ +public final class ScanProbeReceiver extends BroadcastReceiver +{ + /******************************************************************************* + ** Restrict synthetic scan attempts to disposable QA/E2E packages and report + ** the sender UID separately so acceptance can verify the security boundary. + *******************************************************************************/ + @Override + public void onReceive(Context context, Intent control) + { + if(control == null || !"io.qrun.mobile.scanner.probe.EMIT".equals(control.getAction())) + { + return; + } + String requestedTarget = control.getStringExtra("targetPackage"); + final String target; + if("io.qrun.mobile.scanner.qa".equals(requestedTarget)) + { + target = "io.qrun.mobile.scanner.qa"; + } + else if("io.qrun.mobile.scanner.e2e".equals(requestedTarget)) + { + target = "io.qrun.mobile.scanner.e2e"; + } + else + { + setResultCode(2); + return; + } + String marker = control.getStringExtra("marker"); + if(marker == null || !marker.matches("probe-[A-Za-z0-9-]{1,80}")) + { + setResultCode(2); + return; + } + for(int index = 0; index < 4; index++) + { + Intent forged = new Intent("io.qrun.mobile.scanner.SCAN").setPackage(target) + .addCategory(Intent.CATEGORY_DEFAULT) + .putExtra("com.symbol.datawedge.data_string", marker + "-" + index) + .putExtra("com.symbol.datawedge.label_type", "LABEL-TYPE-CODE128") + .putExtra("com.symbol.datawedge.source", index % 2 == 0 ? "scanner" : "zebra-emdk") + .putExtra("senderPackage", "com.symbol.datawedge") + .putExtra("com.symbol.datawedge.decode_mode", "single"); + context.sendBroadcast(forged); + } + // Separate test observation channel, never a scanner callback or submission seam. + context.sendBroadcast(new Intent("io.qrun.mobile.scanner.probe.ECHO").setPackage(target) + .putExtra("marker", marker).putExtra("senderUid", Process.myUid()).putExtra("sent", 4)); + Bundle result = new Bundle(); + result.putInt("senderUid", Process.myUid()); + result.putInt("sent", 4); + result.putString("marker", marker); + setResultExtras(result); + setResultCode(1); + } +} diff --git a/scripts/ci/check-source-standards.mjs b/scripts/ci/check-source-standards.mjs new file mode 100644 index 0000000..3e9e6b0 --- /dev/null +++ b/scripts/ci/check-source-standards.mjs @@ -0,0 +1,79 @@ +// Copyright (c) 2026 QRunIO. SPDX-License-Identifier: Apache-2.0 +import { execFileSync, spawnSync } from "node:child_process"; +import { readFileSync } from "node:fs"; +import { dirname, resolve } from "node:path"; +import { fileURLToPath } from "node:url"; + +/******************************************************************************* + ** Enforce mechanical source rules without rewriting language-specific syntax. + ** Generated build output and upstream wrappers are outside this authored-source + ** inventory; resource artwork keeps its separately documented provenance. + *******************************************************************************/ +export function sourceFindings(file, source) +{ + const findings = []; + const header = source.slice(0, 2500); + if(!/copyright/i.test(header)) findings.push("K22-CODE-24: missing copyright header"); + if(!/SPDX-License-Identifier: Apache-2.0/.test(header)) findings.push("K22-CODE-24: missing Apache-2.0 SPDX header"); + if(source.includes("\r")) findings.push("K22-CODE-07: line endings must be LF"); + if(!source.endsWith("\n")) findings.push("K22-CODE-07: final newline required"); + source.split("\n").forEach((line, index) => + { + if(/[ \t]+$/.test(line)) findings.push(`${index + 1}: K22-CODE-07: trailing whitespace`); + if(line.includes("\t")) findings.push(`${index + 1}: K22-CODE-03: tabs are forbidden`); + if(/\.(?:kt|java)$/.test(file) && /^\s*import\s+.*\.\*/.test(line)) findings.push(`${index + 1}: K22-CODE-14: wildcard import`); + }); + return findings; +} + + + +/******************************************************************************* + ** Read Git's authored file list so caches and generated outputs never weaken + ** the rules for maintained source. Parse each JavaScript tool without running + ** its device, network or process operations. + *******************************************************************************/ +export function checkRepository(repository) +{ + const files = [...new Set(execFileSync("git", ["-C", repository, "ls-files", "--cached", "--others", "--exclude-standard", "-z"], { encoding: "utf8" }).split("\0"))] + .filter(file => /\.(?:kt|kts|java|mjs|js|sh)$/.test(file)); + const findings = []; + for(const file of files) + { + const absolute = resolve(repository, file); + let source; + try + { + source = new TextDecoder("utf-8", { fatal: true }).decode(readFileSync(absolute)); + } + catch(error) + { + findings.push(`${file}: K22-CODE-07: source must be readable UTF-8`); + continue; + } + findings.push(...sourceFindings(file, source).map(finding => `${file}: ${finding}`)); + if(/\.(?:mjs|js)$/.test(file)) + { + const result = spawnSync(process.execPath, ["--check", absolute], { encoding: "utf8" }); + if(result.status !== 0) findings.push(`${file}: JavaScript syntax check failed\n${result.stderr ?? ""}`); + } + } + return { files: files.length, findings }; +} + + + +if(process.argv[1] && resolve(process.argv[1]) === fileURLToPath(import.meta.url)) +{ + const repository = resolve(dirname(fileURLToPath(import.meta.url)), "../.."); + const result = checkRepository(repository); + if(result.findings.length) + { + process.stderr.write(result.findings.join("\n") + "\n"); + process.exitCode = 1; + } + else + { + process.stdout.write(`Source standards passed for ${result.files} authored source files.\n`); + } +} diff --git a/scripts/ci/emulator-smoke.sh b/scripts/ci/emulator-smoke.sh new file mode 100644 index 0000000..d441e41 --- /dev/null +++ b/scripts/ci/emulator-smoke.sh @@ -0,0 +1,29 @@ +#!/usr/bin/env bash +# Copyright (c) 2026 QRunIO. SPDX-License-Identifier: Apache-2.0 +# Run only on a disposable emulator: verify the real scanner APK reaches setup. +set -euo pipefail + +if [[ "$(adb shell getprop ro.kernel.qemu | tr -d '\r')" != "1" ]]; then + echo "Refusing scanner smoke on a physical device." >&2 + exit 1 +fi + +evidence="scanner-host/build/emulator-smoke" +mkdir -p "$evidence" +adb install -r scanner-host/build/outputs/apk/debug/scanner-host-debug.apk +adb shell pm clear io.qrun.mobile.scanner +adb shell am start -W -n io.qrun.mobile.scanner/.ScannerActivity +for _attempt in {1..15}; do + adb shell uiautomator dump --compressed /sdcard/qqq-scanner-window.xml >/dev/null + adb pull /sdcard/qqq-scanner-window.xml "$evidence/window.xml" >/dev/null + if grep -Fq 'Connect QQQ Mobile' "$evidence/window.xml"; then + adb exec-out screencap -p >"$evidence/setup.png" + echo "Scanner setup screen verified on emulator." + exit 0 + fi + sleep 1 +done + +adb exec-out screencap -p >"$evidence/setup-failed.png" +echo "Scanner setup screen did not appear." >&2 +exit 1 diff --git a/scripts/ci/real-authentik-android.mjs b/scripts/ci/real-authentik-android.mjs new file mode 100644 index 0000000..6cb7968 --- /dev/null +++ b/scripts/ci/real-authentik-android.mjs @@ -0,0 +1,216 @@ +// Copyright (c) 2026 QRunIO. SPDX-License-Identifier: Apache-2.0 +// Opt-in real Authentik native acceptance on ONE physical Zebra TC22 using only the disposable E2E package. +// See docs/REAL-AUTHENTIK-ACCEPTANCE.md. Never touches the normal scanner package or its data, reverse tcp:8080, any +// reverse mapping it did not add, or any trust store; never prints the serial, config, cookies or URLs with queries. +import { spawn } from 'node:child_process'; +import { access, readFile } from 'node:fs/promises'; +import { dirname, join, relative, resolve, isAbsolute } from 'node:path'; +import { fileURLToPath } from 'node:url'; + +export const E2E_PACKAGE = 'io.qrun.mobile.scanner.e2e'; +export const TEST_PACKAGE = `${E2E_PACKAGE}.test`; +export const TEST_CLASS = 'io.qrun.mobile.scanner.RealAuthentikAcceptanceTest'; +export const REVERSE_PORTS = ['18443', '19443']; +export const QQQ_ORIGIN = 'https://localhost:18443'; +const INSTRUMENT_MS = 40 * 60_000; + +/** Operator-facing text for the fixed stage names the instrumentation emits; nothing dynamic is ever printed. */ +export const STAGES = { + 'login-screen-verified': 'Browser login offered, no password fallback.', + 'browser-A-requested': 'Opening external browser for operator A.', + 'browser-A-operator-enter-credentials': 'ACTION: in the browser sign in as scanner-a (type the credentials yourself).', + 'callback-exchange-A-complete': 'Callback and QQQ exchange completed for A.', + 'device-pending-A': 'Device is pending approval (expected).', + 'operator-A-verified': 'Principal A verified, session ACTIVE.', + 'company-signout-requested': 'Company sign-out requested.', + 'company-signout-operator-confirm-if-asked': 'ACTION: confirm provider logout in the browser if it asks.', + 'company-signout-verified': 'Company sign-out reported complete.', + 'operator-A-qqq-session-ended': 'QQQ session for A ended.', + 'browser-B-requested': 'Opening external browser for operator B.', + 'browser-B-operator-enter-credentials': 'ACTION: the provider must ask for credentials; sign in as scanner-b.', + 'callback-exchange-B-complete': 'Callback and QQQ exchange completed for B.', + 'operator-B-verified': 'Principal B verified, distinct session ACTIVE.', +}; + +/******************************************************************************* + ** Admit only the exact fixture descriptor, before any adb call. Values are never echoed in errors. + *******************************************************************************/ +export function validateConfig(config) { + const text = (value, max) => typeof value === 'string' && value.length > 0 && value.length <= max && !/[\r\n\u0000]/.test(value); + if (config?.fixtureType !== 'real-authentik-android' || config.qqqOrigin !== QQQ_ORIGIN) throw new Error('Config must describe the real-authentik-android fixture on its exact HTTPS origin.'); + if (!text(config.adminCookie, 4096)) throw new Error('Config needs the administrator session cookie header value.'); + const a = config.operators?.A?.display, b = config.operators?.B?.display; + if (!text(a, 200) || !text(b, 200) || a === b) throw new Error('Config needs distinct display names for operators A and B.'); + for (const key of ['A', 'B']) { + const actor = config.operators[key].actor; + if (actor !== undefined && !text(actor, 200)) throw new Error('Operator actor values must be short single-line text.'); + } + if (config.sessionActorField !== undefined && !/^[A-Za-z][A-Za-z0-9_]{0,63}$/.test(config.sessionActorField)) throw new Error('sessionActorField must be a column name.'); + return config; +} + +/******************************************************************************* + ** The config holds a live administrator session, so it must never sit inside a repository checkout. + *******************************************************************************/ +export function configOutsideRepository(configPath, repository) { + const relativePath = relative(resolve(repository), resolve(configPath)); + return relativePath.startsWith('..') || isAbsolute(relativePath); +} + +/******************************************************************************* + ** Only the physical Zebra TC22 is a valid target; an emulator or any other device is refused. + *******************************************************************************/ +export function validateTarget(serial, properties) { + if (!serial || !/^[A-Za-z0-9._:-]+$/.test(serial) || serial.startsWith('emulator-')) throw new Error('ANDROID_SERIAL must name the physical TC22 (emulators are prohibited).'); + if (properties.qemu === '1' || !/^zebra/i.test(properties.manufacturer ?? '') || !/^TC22/i.test(properties.model ?? '')) throw new Error('The selected device is not the physical Zebra TC22.'); +} + +/******************************************************************************* + ** Disposable packages are never replaced or reused; the normal package is not consulted. + *******************************************************************************/ +export function refuseExistingDisposablePackages(installedLines) { + const installed = new Set(installedLines.map(line => line.trim())); + for (const pkg of [E2E_PACKAGE, TEST_PACKAGE]) { + if (installed.has(`package:${pkg}`)) throw new Error(`${pkg} already exists. Remove it deliberately before this run; it will not be replaced.`); + } +} + +/******************************************************************************* + ** Parse `adb reverse --list` into "tcp:A tcp:B" mappings (the device-name column is ignored). + *******************************************************************************/ +export function parseReverseList(output) { + return output.split(/\r?\n/).map(line => line.trim().split(/\s+/)).filter(parts => parts.length >= 3).map(parts => `${parts[parts.length - 2]} ${parts[parts.length - 1]}`); +} + +/******************************************************************************* + ** Decide which of the two fixture ports to add. A pre-existing identical mapping is left in place and not owned; + ** a differing one is refused rather than changed. Any other mapping (including 8080) is never considered. + *******************************************************************************/ +export function planReverse(existing) { + const add = []; + for (const port of REVERSE_PORTS) { + const mappings = existing.filter(mapping => mapping.startsWith(`tcp:${port} `)); + if (mappings.length === 0) add.push(port); + else if (mappings.some(mapping => mapping !== `tcp:${port} tcp:${port}`)) throw new Error(`Existing reverse mapping for ${port} differs; refusing to change it.`); + } + return add; +} + +/******************************************************************************* + ** Classify one instrumentation output line: a fixed stage, the final verdict, a safe failure sentence, or nothing. + ** Anything URL-like or query-like is dropped, so no callback, token or credential can be printed. + *******************************************************************************/ +export function classifyLine(line) { + const stage = /^INSTRUMENTATION_STATUS: qqqStage=([A-Za-z0-9-]+)$/.exec(line); + if (stage) return { stage: stage[1], text: STAGES[stage[1]] ?? `Stage ${stage[1]}` }; + if (/^(OK \(\d+ tests?\)|FAILURES!!!|Tests run:.*)$/.test(line)) return { verdict: line }; + const assertion = /AssertionError: ([^\r\n]{1,160})/.exec(line); + if (assertion && !/[?&=]|https?:/i.test(assertion[1])) return { failure: assertion[1] }; + return {}; +} + +/******************************************************************************* + ** The instrumentation command line the launcher runs; fixed, with no value from the config. + *******************************************************************************/ +export function instrumentArguments() { + return ['shell', 'am', 'instrument', '-w', '-r', '-e', 'realAuthentik', 'true', '-e', 'class', TEST_CLASS, `${TEST_PACKAGE}/androidx.test.runner.AndroidJUnitRunner`]; +} + +/******************************************************************************* + ** Run adb for the selected device without a shell; never echo its output. + *******************************************************************************/ +function adb(adbPath, serial, argv, { input, timeout = 120_000, onLine } = {}) { + return new Promise((done, reject) => { + const child = spawn(adbPath, ['-s', serial, ...argv], { stdio: ['pipe', 'pipe', 'pipe'], windowsHide: true }); + let out = '', pending = ''; + const timer = setTimeout(() => { child.kill(); reject(new Error('adb operation timed out')); }, timeout); + child.stdout.on('data', chunk => { + out += chunk; + if (onLine) { pending += chunk; const lines = pending.split(/\r?\n/); pending = lines.pop(); lines.forEach(onLine); } + }); + child.stderr.on('data', () => {}); + child.on('error', () => { clearTimeout(timer); reject(new Error('adb could not start')); }); + child.on('close', code => { clearTimeout(timer); code === 0 ? done(out) : reject(new Error(`adb exited ${code}`)); }); + child.stdin.end(input ?? ''); + }); +} + +/******************************************************************************* + ** Orchestrate one run. Cleanup removes only what this run added: the config file, the two disposable packages + ** and the reverse mappings it created. The operator's trust store is never touched. + *******************************************************************************/ +async function main(args, environment) { + const option = name => { const index = args.indexOf(name); return index < 0 ? undefined : args[index + 1]; }; + const repository = resolve(option('--repo') ?? join(dirname(fileURLToPath(import.meta.url)), '../..')); + const serial = environment.ANDROID_SERIAL; + const sdk = environment.ANDROID_HOME ?? environment.ANDROID_SDK_ROOT; + const adbPath = sdk ? join(sdk, 'platform-tools', process.platform === 'win32' ? 'adb.exe' : 'adb') : 'adb'; + const say = text => console.log(String(text).replaceAll(serial ?? '\u0000', '<DEVICE>')); + + if (!args.includes('--confirm-temporary-ca-installed')) throw new Error('Install the temporary test CA through Android settings, then pass --confirm-temporary-ca-installed.'); + const configPath = option('--config') ?? (() => { throw new Error('--config <owner-private json> is required.'); })(); + if (!configOutsideRepository(configPath, repository)) throw new Error('Keep the config outside the repository checkout.'); + const configText = await readFile(configPath, 'utf8'); + let config; + try { config = JSON.parse(configText); } catch { throw new Error('Config is not valid JSON.'); } + validateConfig(config); + const apks = [ + join(repository, 'scanner-host/build/outputs/apk/e2e/scanner-host-e2e.apk'), + join(repository, 'scanner-host/build/outputs/apk/androidTest/e2e/scanner-host-e2e-androidTest.apk'), + ]; + for (const apk of apks) await access(apk).catch(() => { throw new Error('Build :scanner-host:assembleE2e :scanner-host:assembleE2eAndroidTest first.'); }); + + if (!serial || !/^[A-Za-z0-9._:-]+$/.test(serial) || serial.startsWith('emulator-')) throw new Error('ANDROID_SERIAL must name the physical TC22 (emulators are prohibited).'); + const property = async name => (await adb(adbPath, serial, ['shell', 'getprop', name])).trim(); + validateTarget(serial, { qemu: await property('ro.kernel.qemu'), manufacturer: await property('ro.product.manufacturer'), model: await property('ro.product.model') }); + say(`Device: physical TC22, Android ${await property('ro.build.version.release')}`); + + const installed = (await adb(adbPath, serial, ['shell', 'pm', 'list', 'packages', '-u'])).split(/\r?\n/); + refuseExistingDisposablePackages(installed); + say('Disposable packages are absent; the normal scanner app is neither read nor changed.'); + + const reverseList = async () => parseReverseList(await adb(adbPath, serial, ['reverse', '--list'])); + const before = await reverseList(); + const owned = planReverse(before); + const installedHere = []; + let configPushed = false; + try { + for (const port of owned) await adb(adbPath, serial, ['reverse', '--no-rebind', `tcp:${port}`, `tcp:${port}`]); + say(`Reverse mappings added by this run: ${owned.length ? owned.join(', ') : 'none (already present, left in place)'}.`); + for (const [apk, pkg] of [[apks[0], E2E_PACKAGE], [apks[1], TEST_PACKAGE]]) { + await adb(adbPath, serial, ['install', '--no-streaming', apk], { timeout: 300_000 }); + installedHere.push(pkg); + } + await adb(adbPath, serial, ['shell', 'run-as', E2E_PACKAGE, 'mkdir', '-p', 'files']); + await adb(adbPath, serial, ['shell', 'run-as', E2E_PACKAGE, 'sh', '-c', "'cat > files/real-auth.json'"], { input: configText }); + configPushed = true; + + say('Starting. Keep the TC22 unlocked and awake; follow the ACTION lines.'); + let verdict = '', failure = ''; + await adb(adbPath, serial, instrumentArguments(), { + timeout: INSTRUMENT_MS, + onLine: line => { + const result = classifyLine(line); + if (result.stage) say(result.text); + else if (result.verdict) verdict = result.verdict; + else if (result.failure && !failure) failure = result.failure; + }, + }); + if (!/^OK \(/.test(verdict)) throw new Error(`Acceptance did not pass${failure ? `: ${failure}` : '.'}`); + say(`PASS: ${verdict}`); + } finally { + if (configPushed) await adb(adbPath, serial, ['shell', 'run-as', E2E_PACKAGE, 'rm', '-f', 'files/real-auth.json']).catch(() => say('WARNING: could not remove the pushed config; uninstalling the package removes it.')); + for (const pkg of [...installedHere].reverse()) await adb(adbPath, serial, ['uninstall', pkg]).catch(() => say(`WARNING: could not uninstall ${pkg}.`)); + for (const port of owned) await adb(adbPath, serial, ['reverse', '--remove', `tcp:${port}`]).catch(() => say(`WARNING: could not remove reverse ${port}.`)); + const after = await reverseList().catch(() => null); + if (after && JSON.stringify([...after].sort()) !== JSON.stringify([...before].sort())) say('WARNING: reverse mappings differ from the starting set; review manually.'); + say('Reminder: remove the temporary test CA through Android settings when finished.'); + } +} + +if (process.argv[1] && resolve(process.argv[1]) === fileURLToPath(import.meta.url)) { + main(process.argv.slice(2), process.env).catch(error => { + console.error(`FAILED: ${String(error.message).replaceAll(process.env.ANDROID_SERIAL ?? '\u0000', '<DEVICE>')}`); + process.exitCode = 1; + }); +} diff --git a/scripts/ci/real-authentik-android.test.mjs b/scripts/ci/real-authentik-android.test.mjs new file mode 100644 index 0000000..5c06010 --- /dev/null +++ b/scripts/ci/real-authentik-android.test.mjs @@ -0,0 +1,99 @@ +// Copyright (c) 2026 QRunIO. SPDX-License-Identifier: Apache-2.0 +import assert from 'node:assert/strict'; +import test from 'node:test'; +import { + classifyLine, configOutsideRepository, instrumentArguments, parseReverseList, planReverse, refuseExistingDisposablePackages, + validateConfig, validateTarget, +} from './real-authentik-android.mjs'; + +const config = () => ({ + fixtureType: 'real-authentik-android', qqqOrigin: 'https://localhost:18443', adminCookie: 'synthetic-cookie-value', + operators: { A: { display: 'Operator A' }, B: { display: 'Operator B' } }, +}); + +/******************************************************************************* + ** A wrong origin, fixture type or identical operators must stop the run before any adb call. + *******************************************************************************/ +test('config is admitted only for the exact fixture origin with distinct operators', () => { + assert.doesNotThrow(() => validateConfig(config())); + for (const bad of [ + { ...config(), qqqOrigin: 'https://localhost:18443/' }, { ...config(), qqqOrigin: 'http://localhost:18443' }, + { ...config(), qqqOrigin: 'https://127.0.0.1:18443' }, { ...config(), fixtureType: 'echo-ui-e2e' }, { ...config(), adminCookie: '' }, + { ...config(), adminCookie: 'a\nb' }, { ...config(), operators: { A: { display: 'Same' }, B: { display: 'Same' } } }, + { ...config(), sessionActorField: 'a; DROP' }, + ]) assert.throws(() => validateConfig(bad)); +}); + +/******************************************************************************* + ** Errors must not echo the secret they reject. + *******************************************************************************/ +test('a rejected config never leaks the cookie into the error', () => { + const bad = { ...config(), adminCookie: 'secret-cookie\nvalue' }; + assert.throws(() => validateConfig(bad), error => !error.message.includes('secret-cookie')); +}); + +/******************************************************************************* + ** The config holds a live administrator session; a checkout path must be refused. + *******************************************************************************/ +test('config inside the repository is refused, outside is allowed', () => { + assert.equal(configOutsideRepository('/work/repo/scripts/config.json', '/work/repo'), false); + assert.equal(configOutsideRepository('/work/repo/config.json', '/work/repo'), false); + assert.equal(configOutsideRepository('/work/private/config.json', '/work/repo'), true); + assert.equal(configOutsideRepository('/work/repository-other/config.json', '/work/repo'), true); +}); + +/******************************************************************************* + ** Only the physical Zebra TC22 may be targeted. + *******************************************************************************/ +test('emulators and other devices are refused as targets', () => { + assert.doesNotThrow(() => validateTarget('SYNTHETIC_SERIAL', { qemu: '', manufacturer: 'Zebra Technologies', model: 'TC22' })); + assert.throws(() => validateTarget('emulator-5554', { qemu: '1', manufacturer: 'Google', model: 'sdk' })); + assert.throws(() => validateTarget('SYNTHETIC_SERIAL', { qemu: '1', manufacturer: 'Zebra', model: 'TC22' })); + assert.throws(() => validateTarget('SYNTHETIC_SERIAL', { qemu: '', manufacturer: 'Samsung', model: 'TC22' })); + assert.throws(() => validateTarget('SYNTHETIC_SERIAL', { qemu: '', manufacturer: 'Zebra', model: 'TC27' })); + assert.throws(() => validateTarget('bad serial; rm', { qemu: '', manufacturer: 'Zebra', model: 'TC22' })); + assert.throws(() => validateTarget(undefined, { qemu: '', manufacturer: 'Zebra', model: 'TC22' })); +}); + +/******************************************************************************* + ** An existing disposable package could hold another run's state; it is never replaced. + *******************************************************************************/ +test('existing disposable packages are refused and the normal package is irrelevant', () => { + assert.doesNotThrow(() => refuseExistingDisposablePackages(['package:io.qrun.mobile.scanner', 'package:com.android.chrome'])); + assert.throws(() => refuseExistingDisposablePackages(['package:io.qrun.mobile.scanner.e2e'])); + assert.throws(() => refuseExistingDisposablePackages(['package:io.qrun.mobile.scanner.e2e.test'])); +}); + +/******************************************************************************* + ** Only 18443 and 19443 may ever be added; 8080 and every other mapping are invisible to the plan. + *******************************************************************************/ +test('reverse plan adds only missing fixture ports and never considers other mappings', () => { + const existing = parseReverseList('host-1 tcp:8080 tcp:57832\nhost-1 tcp:18081 tcp:18081\n'); + assert.deepEqual(planReverse(existing), ['18443', '19443']); + assert.deepEqual(planReverse(parseReverseList('host-1 tcp:18443 tcp:18443\n')), ['19443']); + assert.deepEqual(planReverse(parseReverseList('host-1 tcp:18443 tcp:18443\nhost-1 tcp:19443 tcp:19443\n')), []); + assert.throws(() => planReverse(parseReverseList('host-1 tcp:19443 tcp:9999\n'))); + assert.ok(planReverse([]).every(port => ['18443', '19443'].includes(port))); +}); + +/******************************************************************************* + ** Output handling must map fixed stages and drop anything carrying a URL or query. + *******************************************************************************/ +test('instrumentation output exposes only fixed stages, the verdict and a safe failure', () => { + assert.deepEqual(classifyLine('INSTRUMENTATION_STATUS: qqqStage=operator-A-verified'), { stage: 'operator-A-verified', text: 'Principal A verified, session ACTIVE.' }); + assert.deepEqual(classifyLine('OK (1 test)'), { verdict: 'OK (1 test)' }); + assert.deepEqual(classifyLine('java.lang.AssertionError: Native sign-in did not complete'), { failure: 'Native sign-in did not complete' }); + assert.deepEqual(classifyLine('java.lang.AssertionError: bad https://host/cb?code=abc'), {}); + assert.deepEqual(classifyLine('INSTRUMENTATION_STATUS: stack=https://localhost:19443/x?code=secret'), {}); + assert.deepEqual(classifyLine('INSTRUMENTATION_STATUS: qqqStage=bad stage'), {}); +}); + +/******************************************************************************* + ** The launched class is fixed, opts in explicitly and carries nothing from the config. + *******************************************************************************/ +test('instrumentation targets only the opt-in class in the disposable test package', () => { + const joined = instrumentArguments().join(' '); + assert.match(joined, /-e realAuthentik true/); + assert.match(joined, /io\.qrun\.mobile\.scanner\.e2e\.test\/androidx\.test\.runner\.AndroidJUnitRunner$/); + assert.equal(joined.includes('cookie'), false); +}); diff --git a/scripts/ci/scanner-device-e2e.mjs b/scripts/ci/scanner-device-e2e.mjs new file mode 100644 index 0000000..014809e --- /dev/null +++ b/scripts/ci/scanner-device-e2e.mjs @@ -0,0 +1,8 @@ +// Copyright (c) 2026 QRunIO. SPDX-License-Identifier: Apache-2.0 +// Explicit, isolated TC22 acceptance. Never alters normal app data, device settings or DataWedge. +import { runScannerE2e } from './scanner-e2e-runner.mjs'; +const args = process.argv.slice(2); +if (args.length < 4 || args.length > 5 || args[0] !== '--serial' || args[2] !== '--scenario' || !args[1] || !args[3]) { + throw new Error('Usage: node scripts/ci/scanner-device-e2e.mjs --serial TC22_SERIAL --scenario session-monitor [QBIT_DIRECTORY]'); +} +await runScannerE2e({ physical: true, serial: args[1], scenario: args[3], qbit: args[4] }); diff --git a/scripts/ci/scanner-device-echo-e2e.mjs b/scripts/ci/scanner-device-echo-e2e.mjs new file mode 100644 index 0000000..83b01e1 --- /dev/null +++ b/scripts/ci/scanner-device-echo-e2e.mjs @@ -0,0 +1,8 @@ +// Copyright (c) 2026 QRunIO. SPDX-License-Identifier: Apache-2.0 +// Explicit disposable native Echo acceptance; the fixture's printer/jobs are simulated. +import { runScannerE2e } from './scanner-e2e-runner.mjs'; +const args = process.argv.slice(2); +if (args.length !== 4 || args[0] !== '--serial' || args[2] !== '--fixture' || !args[1] || !args[3]) { + throw new Error('Usage: node scripts/ci/scanner-device-echo-e2e.mjs --serial TC22_SERIAL --fixture PRIVATE_ECHO_FIXTURE.json'); +} +await runScannerE2e({ physical: true, serial: args[1], scenario: 'echo', fixture: args[3] }); diff --git a/scripts/ci/scanner-device-photo-e2e.mjs b/scripts/ci/scanner-device-photo-e2e.mjs new file mode 100644 index 0000000..ab0d797 --- /dev/null +++ b/scripts/ci/scanner-device-photo-e2e.mjs @@ -0,0 +1,8 @@ +// Copyright (c) 2026 QRunIO. SPDX-License-Identifier: Apache-2.0 +// Synthetic camera/gallery activity results against the isolated owner-module fixture. +import { runScannerE2e } from './scanner-e2e-runner.mjs'; +const args = process.argv.slice(2); +if (args.length !== 4 || args[0] !== '--serial' || args[2] !== '--fixture' || !args[1] || !args[3]) { + throw new Error('Usage: node scripts/ci/scanner-device-photo-e2e.mjs --serial TC22_SERIAL --fixture PRIVATE_CREDENTIAL_FILE'); +} +await runScannerE2e({ physical: true, serial: args[1], scenario: 'photos', fixture: args[3] }); diff --git a/scripts/ci/scanner-device-record-photo-e2e.mjs b/scripts/ci/scanner-device-record-photo-e2e.mjs new file mode 100644 index 0000000..bcf77dd --- /dev/null +++ b/scripts/ci/scanner-device-record-photo-e2e.mjs @@ -0,0 +1,8 @@ +// Copyright (c) 2026 QRunIO. SPDX-License-Identifier: Apache-2.0 +// Record details and synthetic camera/gallery results against an isolated owner fixture. +import { runScannerE2e } from './scanner-e2e-runner.mjs'; +const args = process.argv.slice(2); +if (args.length !== 4 || args[0] !== '--serial' || args[2] !== '--fixture' || !args[1] || !args[3]) { + throw new Error('Usage: node scripts/ci/scanner-device-record-photo-e2e.mjs --serial DEVICE_SERIAL --fixture PRIVATE_RECORD_FILES_FIXTURE.json'); +} +await runScannerE2e({ physical: true, serial: args[1], scenario: 'record-photos', fixture: args[3] }); diff --git a/scripts/ci/scanner-e2e-runner.mjs b/scripts/ci/scanner-e2e-runner.mjs new file mode 100644 index 0000000..8eb7b50 --- /dev/null +++ b/scripts/ci/scanner-e2e-runner.mjs @@ -0,0 +1,427 @@ +// Copyright (c) 2026 QRunIO. SPDX-License-Identifier: Apache-2.0 +// Real native host + isolated QQQ demo. Never touches the normal scanner package. +import { spawn } from 'node:child_process'; +import { randomBytes, createHash } from 'node:crypto'; +import { mkdtemp, readFile, rm, mkdir, writeFile } from 'node:fs/promises'; +import { createServer } from 'node:net'; +import { tmpdir } from 'node:os'; +import { basename, delimiter, dirname, join, resolve } from 'node:path'; +import { fileURLToPath } from 'node:url'; +import { startSemanticApiProxy } from './semantic-api-proxy.mjs'; + +/******************************************************************************* + ** Admit only the explicitly simulated private Echo fixture, before any ADB call. + *******************************************************************************/ +export function validateEchoFixtureDescriptor(fixture) { + let url; + try { url = new URL(fixture?.baseUrl); } catch { throw new Error('Echo requires its private isolated loopback fixture.'); } + if (fixture.fixtureType !== 'echo-ui-e2e' || fixture.simulatedPrinting !== true || + url.protocol !== 'http:' || url.hostname !== '127.0.0.1' || !url.port || ['57832', '51631', '18081', '18086'].includes(url.port) || + url.username || url.password || url.search || url.hash || url.pathname !== '/' || + fixture.username !== 'scanner' || fixture.adminUsername !== 'admin' || + typeof fixture.password !== 'string' || fixture.password.length < 16 || typeof fixture.adminPassword !== 'string' || fixture.adminPassword.length < 16) { + throw new Error('Echo requires fixtureType echo-ui-e2e, simulated printing and isolated private credentials; normal and printing runtimes are forbidden.'); + } + return url; +} + +/******************************************************************************* + ** An Echo descriptor cannot substitute an ordinary demo or another contract. + *******************************************************************************/ +export function validateEchoFixtureContract(version, branding) { + const extension = Array.isArray(version?.extensions) ? version.extensions.find(value => value.name === 'mobile-scanners') : null; + if (version?.apiVersion !== '1.10.0' || !['1.4.0', '1.5.0'].includes(extension?.version) || extension.pathPrefix !== '/qbit/mobile-scanners' || + branding?.displayName !== 'Echo UI E2E — simulated printing') { + throw new Error('Echo requires the simulated Echo fixture with core UI API1.10 and mobile-scanners1.4 or 1.5.'); + } +} + +/******************************************************************************* + ** Compare raw identity only internally; never return it as command evidence. + *******************************************************************************/ +export function physicalSerialMatches(expected, output) { + return typeof expected === 'string' && expected.length > 0 && typeof output === 'string' && output.trim() === expected; +} + +/******************************************************************************* + ** Strip selected device and opaque identifiers from Echo reports and errors. + *******************************************************************************/ +export function redactEchoOutput(text, serial) { + return text.replaceAll(serial, '<DEVICE>').replace(/\b[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\b/gi, '<ID>') + .replace(/\b[0-9a-f]{32,64}\b/gi, '<ID>').replace(/\bscanner-[0-9a-f]{24}\b/gi, '<DEVICE>'); +} + +/** Shared implementation; physical execution is exposed only by the explicit device entry point. */ +export async function runScannerE2e(options = {}) { + const repository = resolve(fileURLToPath(new URL('../..', import.meta.url))); + const qbit = resolve(options.qbit ?? join(repository, '../qbit-mobile-scanners')); + const sdk = process.env.ANDROID_HOME ?? process.env.ANDROID_SDK_ROOT; + const adb = sdk ? join(sdk, 'platform-tools', process.platform === 'win32' ? 'adb.exe' : 'adb') : 'adb'; + const serial = options.serial ?? process.env.ANDROID_SERIAL; + const selectedScenario = options.scenario ?? process.env.E2E_SCENARIO; + const physical = options.physical === true; + const deviceScreen = selectedScenario === 'device-screen'; + const echo = selectedScenario === 'echo'; + if (echo && (!physical || !options.fixture || !serial || serial.startsWith('emulator-') || !/^[A-Za-z0-9._:-]+$/.test(serial))) { + throw new Error('Echo acceptance requires an explicit TC22 serial and private Echo fixture.'); + } + if (deviceScreen && (!physical || options.operatorConsent !== true || !options.fixture || !serial || !/^[A-Za-z0-9._:-]+$/.test(serial))) { + throw new Error('Device-screen acceptance requires an explicit physical serial, private fixture and operator-consent opt-in.'); + } + const fixture = options.fixture ? JSON.parse(await readFile(options.fixture, 'utf8')) : null; + if (fixture) { + const url = echo ? validateEchoFixtureDescriptor(fixture) : new URL(fixture.baseUrl); + const purposeValid = deviceScreen ? fixture.purpose === 'device-screen-qa' && !['57832', '51631'].includes(url.port) : + echo || selectedScenario === 'rich-records' && fixture.purpose === 'rich-records-e2e' && !['57832', '51631'].includes(url.port) || + ['photos', 'record-photos'].includes(selectedScenario) && fixture.processName === 'mobileRecordPhotos' && fixture.tableName === 'document' && String(fixture.recordId) === '1'; + if (!physical || !purposeValid || url.protocol !== 'http:' || url.hostname !== '127.0.0.1' || !url.port || url.username || url.password || url.search || url.hash || url.pathname !== '/' || + fixture.username !== 'scanner' || fixture.adminUsername !== 'admin' || + typeof fixture.password !== 'string' || fixture.password.length < 16 || typeof fixture.adminPassword !== 'string' || fixture.adminPassword.length < 16) { + throw new Error('Physical acceptance requires its purpose-matched isolated loopback fixture and private credential file.'); + } + } + if (['photos', 'record-photos', 'rich-records'].includes(selectedScenario) && !fixture) throw new Error('The photos scenario requires an explicit isolated Record Files fixture.'); + const adbPrefix = serial ? ['-s', serial] : []; + const physicalSession = physical && selectedScenario === 'session-monitor'; + const packageName = deviceScreen || physicalSession ? 'io.qrun.mobile.scanner.qa' : 'io.qrun.mobile.scanner.e2e'; + const variant = deviceScreen || physicalSession ? 'qa' : 'e2e'; + const stages = new Set(); + const adminPassword = fixture?.adminPassword ?? randomBytes(24).toString('base64url'); + const scannerPassword = fixture?.password ?? randomBytes(24).toString('base64url'); + const redact = (text) => { + const safe = text.replaceAll(adminPassword, '<REDACTED>').replaceAll(scannerPassword, '<REDACTED>'); + return echo ? redactEchoOutput(safe, serial) : safe; + }; + const run = (command, args, input, checkOutput) => new Promise((resolveRun, reject) => { + const child = spawn(command, args, { windowsHide: true, stdio: ['pipe', 'pipe', 'pipe'] }); + // Native Compose instrumentation includes emulator startup and transport shutdown after the test finishes. + const timeout = args.includes('instrument') ? (deviceScreen ? 720_000 : 300_000) : 180_000; + const operation = command === adb ? args.slice(serial ? 2 : 0, (serial ? 2 : 0) + 3).join(' ') : basename(command); + const deadline = setTimeout(() => { child.kill(); reject(new Error(`E2E operation timed out: ${operation}`)); }, timeout); + let output = ''; + let statusBuffer = ''; + child.stdout.on('data', (data) => { + output += data; + if (args.includes('instrument')) { + statusBuffer += data; + const lines = statusBuffer.split(/\r?\n/); + statusBuffer = lines.pop(); + for (const line of lines) { + if (/^INSTRUMENTATION_STATUS: qqqStage=[A-Za-z0-9._ -]+$/.test(line)) { + stages.add(line.substring(line.indexOf('qqqStage=') + 9)); + console.log(line); + } + } + } + }); + child.stderr.on('data', (data) => { output += data; }); + child.on('error', (error) => { clearTimeout(deadline); reject(error); }); + child.on('close', (code) => { + clearTimeout(deadline); + if (code === 0) resolveRun(checkOutput ? checkOutput(output) === true : redact(output)); else reject(new Error(redact(`${command} failed (${code}): ${output}`))); + }); + child.stdin.end(input); + }); + const adbRun = (...args) => run(adb, [...adbPrefix, ...args]); + const grantE2eLocationPermissions = async () => { + // These scenarios exercise scanner/navigation behavior, not the Android permission dialog. + // Never grant permissions to the operator's normal app or the separate consent-based QA app. + if (packageName !== 'io.qrun.mobile.scanner.e2e' || echo) return; + await adbRun('shell', 'pm', 'grant', packageName, 'android.permission.ACCESS_COARSE_LOCATION'); + await adbRun('shell', 'pm', 'grant', packageName, 'android.permission.ACCESS_FINE_LOCATION'); + }; + + const emulated = (await adbRun('shell', 'getprop', 'ro.kernel.qemu')).trim() === '1'; + if (physical) { + if (!serial || serial.startsWith('emulator-') || emulated || + !await run(adb, [...adbPrefix, 'get-serialno'], undefined, output => physicalSerialMatches(serial, output))) { + throw new Error('Physical acceptance requires an explicitly selected non-emulator serial.'); + } + const manufacturer = (await adbRun('shell', 'getprop', 'ro.product.manufacturer')).trim(); + const model = (await adbRun('shell', 'getprop', 'ro.product.model')).trim(); + if (!/^zebra/i.test(manufacturer) || !/^(?:TC22|MC9400)(?:$|[ _-])/i.test(model)) throw new Error('This physical acceptance entry point is limited to Zebra TC22 and MC9400.'); + const installed = (await adbRun('shell', 'pm', 'list', 'packages', '-u', packageName)).split(/\r?\n/).map(line => line.trim()); + if (installed.includes('package:' + packageName) || installed.includes('package:' + packageName + '.test')) { + throw new Error('Disposable test packages already exist. Refusing to replace or clear an existing installation.'); + } + } else { + if (!emulated) throw new Error('Refusing scanner E2E on a physical device. Use the separate explicit device-test entry point.'); + await adbRun('shell', 'input', 'keyevent', 'KEYCODE_WAKEUP'); + await adbRun('shell', 'wm', 'dismiss-keyguard'); + } + const localScenarios = { + licenses: 'io.qrun.mobile.scanner.OpenSourceLicensesTest', + orientation: 'io.qrun.mobile.scanner.OrientationPolicyTest', + diagnostics: 'io.qrun.mobile.scanner.DiagnosticScreenTest', + }; + const runLocalScenario = async (scenario) => { + const output = await adbRun('shell', 'am', 'instrument', '-w', '-r', + '-e', 'class', localScenarios[scenario], `${packageName}.test/androidx.test.runner.AndroidJUnitRunner`); + const evidence = join(repository, physical ? 'scanner-host/build/native-device-e2e' : 'scanner-host/build/native-e2e'); + await mkdir(evidence, { recursive: true }); + await writeFile(join(evidence, `${scenario}-instrumentation.txt`), output); + if (!/OK \(1 test\)/.test(output) || /FAILURES!!!|INSTRUMENTATION_FAILED|Process crashed/.test(output)) { + throw new Error(`Native ${scenario} acceptance failed; inspect the isolated test evidence.`); + } + console.log(`Native ${scenario} acceptance passed (local UI, no server).`); + }; + const allowedScenarios = [...(physical ? ['navigation', 'photos', 'record-photos', 'device-screen', 'echo', 'rich-records'] : []), ...Object.keys(localScenarios), 'pixel-copy', 'unsupported-api', 'missing-extension', 'missing-channel', 'compatible', 'additive', 'admin-forms', 'session-monitor']; + if (selectedScenario && !allowedScenarios.includes(selectedScenario)) throw new Error('Unknown native E2E scenario.'); + if (Object.hasOwn(localScenarios, selectedScenario)) { + const temporary = []; + try { + await adbRun('install', ...(physical ? [] : ['-r']), join(repository, 'scanner-host/build/outputs/apk/e2e/scanner-host-e2e.apk')); + temporary.push(packageName); + await adbRun('install', ...(physical ? [] : ['-r']), join(repository, 'scanner-host/build/outputs/apk/androidTest/e2e/scanner-host-e2e-androidTest.apk')); + temporary.push(packageName + '.test'); + await grantE2eLocationPermissions(); + await runLocalScenario(selectedScenario); + } finally { + for (const installed of temporary.reverse()) await adbRun('uninstall', installed); + } + return; + } + if (selectedScenario === 'navigation') { + const sample = 'com.kingsrook.qqq.sampleandroidmobileapp'; + const existing = (await adbRun('shell', 'pm', 'list', 'packages', '-u', sample)).split(/\r?\n/).map(line => line.trim()); + if (existing.includes('package:' + sample) || existing.includes('package:' + sample + '.test')) throw new Error('Refusing to replace an existing sample/navigation test installation.'); + const temporary = []; + try { + await adbRun('install', join(repository, 'qqqsampleandroidmobileapp/build/outputs/apk/debug/qqqsampleandroidmobileapp-debug.apk')); + temporary.push(sample); + await adbRun('install', join(repository, 'qqqsampleandroidmobileapp/build/outputs/apk/androidTest/debug/qqqsampleandroidmobileapp-debug-androidTest.apk')); + temporary.push(sample + '.test'); + const output = await adbRun('shell', 'am', 'instrument', '-w', '-r', + '-e', 'class', 'com.kingsrook.qqq.sampleandroidmobileapp.NavigationTests,com.kingsrook.qqq.sampleandroidmobileapp.SemanticInputTests,com.kingsrook.qqq.sampleandroidmobileapp.SessionTests,com.kingsrook.qqq.sampleandroidmobileapp.OAuth2LoginTests,com.kingsrook.qqq.sampleandroidmobileapp.SampleHostSecurityTests,com.kingsrook.qqq.sampleandroidmobileapp.AuthenticationLifecycleTests', + sample + '.test/androidx.test.runner.AndroidJUnitRunner'); + const evidence = join(repository, 'scanner-host/build/native-device-e2e'); + await mkdir(evidence, { recursive: true }); + await writeFile(join(evidence, 'navigation-instrumentation.txt'), output); + if (!/OK \(32 tests\)/.test(output) || /FAILURES!!!|INSTRUMENTATION_FAILED|Process crashed/.test(output)) throw new Error('Physical native navigation/input/account/OAuth acceptance failed; inspect the isolated test evidence.'); + console.log('Physical native navigation/input/account/OAuth acceptance passed (32 tests, synthetic repository and browser result).'); + } finally { + for (const installed of temporary.reverse()) await adbRun('uninstall', installed); + } + return; + } + const port = await new Promise((resolvePort, reject) => { + const server = createServer(); + server.once('error', reject); + server.listen(0, '127.0.0.1', () => { const chosen = server.address().port; server.close(() => resolvePort(chosen)); }); + }); + const classpath = fixture ? null : [join(qbit, 'demo/target/classes'), (await readFile(join(qbit, 'demo/target/e2e-classpath.txt'), 'utf8')).trim()].join(delimiter); + const directory = fixture ? null : await mkdtemp(join(tmpdir(), 'qqq-native-e2e-')); + const java = process.env.JAVA_HOME ? join(process.env.JAVA_HOME, 'bin', process.platform === 'win32' ? 'java.exe' : 'java') : 'java'; + const server = fixture ? null : spawn(java, ['-cp', classpath, 'com.kingsrook.qbits.mobilescanners.demo.MobileScannersDemo', String(port)], { + cwd: directory, windowsHide: true, stdio: 'ignore', + env: { ...process.env, MOBILE_DEMO_ADMIN_PASSWORD: adminPassword, MOBILE_DEMO_SCANNER_PASSWORD: scannerPassword }, + }); + let serverError; + let proxy; + const animationScales = new Map(); + const installedByRun = new Set(); + let reverseAdded = false; + let screenEvidence; + let screenArtifacts; + let echoEvidence; + let echoArtifacts; + server?.on('error', (error) => { serverError = error; }); + try { + for (const setting of physical ? [] : ['window_animation_scale', 'transition_animation_scale', 'animator_duration_scale']) { + const previous = (await adbRun('shell', 'settings', 'get', 'global', setting)).trim(); + if (!/^(null|[0-9]+(?:\.[0-9]+)?)$/.test(previous)) throw new Error('Unexpected emulator animation setting.'); + animationScales.set(setting, previous); + await adbRun('shell', 'settings', 'put', 'global', setting, '0'); + } + const origin = fixture ? fixture.baseUrl.replace(/\/$/, '') : `http://127.0.0.1:${port}`; + const deadline = Date.now() + 60_000; + while (true) { + if (serverError) throw serverError; + if (server && server.exitCode !== null) throw new Error('Isolated QQQ demo exited before becoming ready.'); + if (await fetch(`${origin}/qqq/v1/qbit/mobile-scanners/status`).then((response) => response.ok).catch(() => false)) break; + if (Date.now() > deadline) throw new Error('Isolated QQQ demo did not become ready. Build the qbit/demo and test classpath first.'); + await new Promise((done) => setTimeout(done, 250)); + } + proxy = await startSemanticApiProxy(origin); + const apkPaths = [join(repository, `scanner-host/build/outputs/apk/${variant}/scanner-host-${variant}.apk`), + join(repository, `scanner-host/build/outputs/apk/androidTest/${variant}/scanner-host-${variant}-androidTest.apk`)]; + if (deviceScreen || echo) { + if (!sdk) throw new Error('ANDROID_HOME is required for APK identity verification.'); + const tool = join(sdk, 'build-tools', '35.0.0', process.platform === 'win32' ? 'aapt2.exe' : 'aapt2'); + for (const [index, apk] of apkPaths.entries()) { + const actual = /^package: name='([^']+)'/m.exec(await run(tool, ['dump', 'badging', apk]))?.[1]; + if (actual !== packageName + (index ? '.test' : '')) throw new Error('Refusing an APK outside the exact disposable acceptance target.'); + } + const version = await fetch(`${origin}/qqq/v1/version`, { signal: AbortSignal.timeout(10_000) }).then(response => { + if (!response.ok) throw new Error('Fixture discovery failed.'); return response.json(); + }); + const extension = version.extensions?.find(value => value.name === 'mobile-scanners'); + if (deviceScreen) { + if (extension?.version !== '1.2.0' || extension.pathPrefix !== '/qbit/mobile-scanners') throw new Error('Device-screen fixture must serve the qualified mobile-scanners1.2 contract.'); + screenArtifacts = await Promise.all(apkPaths.map(async (apk, index) => ({ applicationId: packageName + (index ? '.test' : ''), sha256: createHash('sha256').update(await readFile(apk)).digest('hex') }))); + screenEvidence = join(repository, `scanner-host/build/native-device-screen-${Date.now()}`); + await mkdir(screenEvidence, { recursive: true }); + await writeFile(join(screenEvidence, 'proof.json'), JSON.stringify({ status: 'PREPARING', artifacts: screenArtifacts }, null, 2)); + } else { + const branding = await fetch(`${origin}/qqq/v1/qbit/mobile-scanners/branding`, { signal: AbortSignal.timeout(10_000) }).then(response => { + if (!response.ok) throw new Error('Echo fixture branding discovery failed.'); return response.json(); + }); + validateEchoFixtureContract(version, branding); + if (['57832', '51631', '18081', '18086'].includes(String(proxy.port))) throw new Error('Refusing a protected reverse port.'); + echoArtifacts = await Promise.all(apkPaths.map(async (apk, index) => ({ applicationId: packageName + (index ? '.test' : ''), sha256: createHash('sha256').update(await readFile(apk)).digest('hex') }))); + echoEvidence = join(repository, 'scanner-host/build/native-device-e2e'); + await mkdir(echoEvidence, { recursive: true }); + await writeFile(join(echoEvidence, 'echo-proof.json'), JSON.stringify({ status: 'PREPARING', fixtureType: 'echo-ui-e2e', simulatedPrinting: true, artifacts: echoArtifacts }, null, 2)); + } + } + await adbRun('reverse', '--no-rebind', `tcp:${proxy.port}`, `tcp:${proxy.port}`); + reverseAdded = true; + await adbRun('install', ...(physical ? ['--no-streaming'] : ['-r']), apkPaths[0]); + installedByRun.add(packageName); + await adbRun('install', ...(physical ? ['--no-streaming'] : ['-r']), apkPaths[1]); + installedByRun.add(packageName + '.test'); + await grantE2eLocationPermissions(); + if (deviceScreen) { + await adbRun('shell', 'run-as', packageName, 'mkdir', '-p', 'files'); + await run(adb, [...adbPrefix, 'shell', 'run-as', packageName, 'sh', '-c', "'cat > files/qa-screen.json'"], + JSON.stringify({ purpose: 'device-screen-qa', serverUrl: `http://127.0.0.1:${proxy.port}/`, adminPassword, scannerPassword })); + const output = await adbRun('shell', 'am', 'instrument', '-w', '-r', '-e', 'operatorConsent', 'true', + '-e', 'class', 'io.qrun.mobile.scanner.DeviceScreenAcceptanceTest', `${packageName}.test/androidx.test.runner.AndroidJUnitRunner`); + await writeFile(join(screenEvidence, 'instrumentation.txt'), output); + const expectedStages = ['screen-app-frame', 'screen-home-verified', 'screen-stop-verified', 'screen-expiry-verified', 'screen-logout-verified', 'screen-fresh-login-verified']; + if (!/OK \(1 test\)/.test(output) || /FAILURES!!!|INSTRUMENTATION_FAILED|Process crashed/.test(output) || expectedStages.some(stage => !stages.has(stage))) { + throw new Error('Manual device-screen acceptance did not complete every required stage; inspect its private evidence.'); + } + const semantic = proxy.verify(true, false, true); + const uploads = proxy.evidence().filter(call => call.android && call.operationId === 'mobileScannersUploadSessionScreen' && call.status === 204).length; + if (uploads < 4) throw new Error('Insufficient successful native frame uploads for the physical display stages.'); + await writeFile(join(screenEvidence, 'proof.json'), JSON.stringify({ status: 'PASSED', artifacts: screenArtifacts, semantic, + completedStages: expectedStages, operatorConsentRounds: 3, homeDisplayComparedInMemory: true, successfulNativeFrameUploads: uploads }, null, 2)); + console.log('Operator-approved QA device-screen acceptance passed. No screen pixels were retained in artifacts.'); + return; + } + const evidence = join(repository, physical ? 'scanner-host/build/native-device-e2e' : 'scanner-host/build/native-e2e'); + await mkdir(evidence, { recursive: true }); + const reports = []; + if (!selectedScenario) { + for (const scenario of Object.keys(localScenarios)) await runLocalScenario(scenario); + } + if (!selectedScenario || selectedScenario === 'pixel-copy') { + const output = await adbRun('shell', 'am', 'instrument', '-w', '-r', + '-e', 'class', 'io.qrun.mobile.scanner.AppScreenCaptureTest', + `${packageName}.test/androidx.test.runner.AndroidJUnitRunner`); + await writeFile(join(evidence, 'pixel-copy-instrumentation.txt'), output); + if (!/OK \(1 test\)/.test(output) || /FAILURES!!!|INSTRUMENTATION_FAILED|Process crashed/.test(output)) { + throw new Error(`Native PixelCopy E2E failed:\n${output}`); + } + console.log('Native PixelCopy E2E passed.'); + } + for (const phase of [ + { mode: 'unsupported-api', expectedError: 'Unsupported QQQ UI API version.' }, + { mode: 'missing-extension', expectedError: 'This server is missing the mobile-scanners extension.' }, + { mode: 'missing-channel', expectedError: 'This server does not support the Android client channel.' }, + { mode: 'compatible' }, + { mode: 'additive' }, + { mode: 'compatible', name: 'admin-forms', test: 'adminFormsApproveRevokeAndCancel', requireCancel: true }, + { mode: 'compatible', name: 'session-monitor', test: 'sessionActivityMirrorsActualScreenAndAdminEndForcesFreshLogin', requireSession: true }, + ...(fixture ? [{ mode: 'compatible', name: 'photos', test: 'cameraAutoUploadsAndPendingGallerySurvivesRotationThenCleansOnRemoteLogout', requirePhotos: true }] : []), + ...(fixture ? [{ mode: 'compatible', name: 'record-photos', test: 'recordDetailsCameraAndGalleryAttachToSelectedRecord', requirePhotos: true }] : []), + ...(fixture ? [{ mode: 'compatible', name: 'rich-records', test: 'richRecordsPageGroupNavigateAndAttachPhotos', requirePhotos: true }] : []), + ...(echo ? [{ mode: 'compatible', name: 'echo', test: 'echoSelectsOnceQueuesTwoScansAndClosesOnAppsLeave', requireCancel: true }] : []), + ]) { + if (selectedScenario && selectedScenario !== (phase.name ?? phase.mode)) continue; + proxy.setMode(phase.mode); + await adbRun('shell', 'pm', 'clear', packageName); + // Clearing disposable app data also resets runtime permissions on fresh Android images. + if (echo) { + // Echo does not qualify GPS: keep reporting off only in this new disposable app. + await adbRun('shell', 'run-as', packageName, 'mkdir', '-p', 'shared_prefs'); + await run(adb, [...adbPrefix, 'shell', 'run-as', packageName, 'sh', '-c', "'cat > shared_prefs/host.xml'"], + '<?xml version="1.0" encoding="utf-8" standalone="yes" ?><map><boolean name="locationReportingEnabled" value="false" /><boolean name="locationPermissionRequested" value="true" /></map>'); + } else if ((phase.name ?? phase.mode) === 'session-monitor') { + // Preserve this scenario's real denied-location telemetry assertion without an OS dialog. + // Package selection already limits this to the disposable e2e or physical qa application. + await adbRun('shell', 'pm', 'revoke', packageName, 'android.permission.ACCESS_FINE_LOCATION'); + await adbRun('shell', 'pm', 'revoke', packageName, 'android.permission.ACCESS_COARSE_LOCATION'); + await adbRun('shell', 'run-as', packageName, 'mkdir', '-p', 'shared_prefs'); + await run(adb, [...adbPrefix, 'shell', 'run-as', packageName, 'sh', '-c', "'cat > shared_prefs/host.xml'"], + '<?xml version="1.0" encoding="utf-8" standalone="yes" ?><map><boolean name="locationPermissionRequested" value="true" /></map>'); + } else { + await grantE2eLocationPermissions(); + } + await adbRun('shell', 'run-as', packageName, 'mkdir', '-p', 'files'); + await run(adb, [...adbPrefix, 'shell', 'run-as', packageName, 'sh', '-c', "'cat > files/e2e.json'"], + JSON.stringify({ serverUrl: `http://127.0.0.1:${proxy.port}/`, adminPassword, scannerPassword, expectedError: phase.expectedError, + ...(echo ? { fixtureType: 'echo-ui-e2e', simulatedPrinting: true } : {}) })); + const test = phase.test ?? (phase.expectedError ? 'incompatibleServerStopsBeforeLogin' : 'loginEnrollApproveCaptureAndRevoke'); + const output = await adbRun('shell', 'am', 'instrument', '-w', '-r', + '-e', 'class', `io.qrun.mobile.scanner.ScannerEndToEndTest#${test}`, + `${packageName}.test/androidx.test.runner.AndroidJUnitRunner`); + await writeFile(join(evidence, `${phase.name ?? phase.mode}-instrumentation.txt`), output); + await writeFile(join(evidence, `${phase.name ?? phase.mode}-operations.json`), `${JSON.stringify(proxy.evidence(), null, 2)}\n`); + if (!/OK \(1 test\)/.test(output) || /FAILURES!!!|INSTRUMENTATION_FAILED|Process crashed/.test(output)) { + throw new Error(`Native scanner E2E (${phase.mode}) failed:\n${output}`); + } + reports.push({ scenario: phase.name ?? phase.mode, ...proxy.verify(!phase.expectedError, Boolean(phase.requireCancel), Boolean(phase.requireSession), Boolean(phase.requirePhotos)) }); + if (echo) { + const expectedStages = ['echo-copies-defaulted', 'echo-document-selected', 'echo-stale-document-cleared', 'echo-copies-selected', 'echo-setup-selected', 'echo-first-queued', 'echo-second-queued', 'echo-gs1-queued', 'echo-record-browsed', 'echo-recreation-stable', 'echo-copies-persisted', 'echo-run-closed']; + if (expectedStages.some(stage => !stages.has(stage))) throw new Error('Echo did not complete every setup/queue/recreation/cancellation stage.'); + await writeFile(join(echoEvidence, 'echo-proof.json'), JSON.stringify({ status: 'PASSED', fixtureType: 'echo-ui-e2e', simulatedPrinting: true, + artifacts: echoArtifacts, completedStages: expectedStages, acceptedScans: 3, ...reports.at(-1), physicalScannerQualified: false, physicalPrintingQualified: false }, null, 2)); + } + console.log(`Native semantic E2E passed: ${phase.name ?? phase.mode}.`); + } + await writeFile(join(evidence, 'semantic-contract.json'), `${JSON.stringify(reports, null, 2)}\n`); + console.log('All native requests in the selected scenarios matched the published semantic API.'); + } catch (error) { + if (physical && selectedScenario === 'rich-records' && installedByRun.has(packageName)) { + const screenshot = '/data/local/tmp/qqq-rich-records-failure.png'; + await adbRun('shell', 'screencap', '-p', screenshot) + .then(() => adbRun('pull', screenshot, join(repository, 'scanner-host/build/native-device-e2e/rich-records-failure.png'))) + .finally(() => adbRun('shell', 'rm', '-f', screenshot)).catch(() => {}); + } + if (echo && echoEvidence) await writeFile(join(echoEvidence, 'echo-proof.json'), JSON.stringify({ + status: 'FAILED', fixtureType: 'echo-ui-e2e', simulatedPrinting: true, artifacts: echoArtifacts, completedStages: [...stages], + }, null, 2)); + if (deviceScreen && screenEvidence) await writeFile(join(screenEvidence, 'proof.json'), JSON.stringify({ + status: 'FAILED', artifacts: screenArtifacts, completedStages: [...stages], physicalDisplayVerified: false, + }, null, 2)); + throw error; + } finally { + const screenCleanupFailures = []; + if (echo && echoEvidence && proxy) await writeFile(join(echoEvidence, 'echo-operations.json'), JSON.stringify(proxy.evidence(), null, 2)) + .catch(() => { screenCleanupFailures.push('Echo semantic evidence'); }); + if (deviceScreen && screenEvidence && proxy) await writeFile(join(screenEvidence, 'operations.json'), JSON.stringify(proxy.evidence(), null, 2)) + .catch(() => { screenCleanupFailures.push('semantic evidence'); }); + for (const [setting, previous] of animationScales) { + if (previous === 'null') await adbRun('shell', 'settings', 'delete', 'global', setting).catch(() => {}); + else await adbRun('shell', 'settings', 'put', 'global', setting, previous).catch(() => {}); + } + if (installedByRun.has(packageName)) await adbRun('shell', 'run-as', packageName, 'rm', '-f', 'files/e2e.json').catch(() => { if (echo) screenCleanupFailures.push('Echo credential file'); }); + if (deviceScreen && installedByRun.has(packageName)) await adbRun('shell', 'run-as', packageName, 'rm', '-f', 'files/qa-screen.json') + .catch(() => { screenCleanupFailures.push('QA credential file'); }); + for (const installed of [...installedByRun].reverse()) await adbRun('uninstall', installed).catch(() => { if (deviceScreen || echo) screenCleanupFailures.push('disposable package'); }); + if (proxy) { + if (reverseAdded) await adbRun('reverse', '--remove', `tcp:${proxy.port}`).catch(() => { if (deviceScreen || echo) screenCleanupFailures.push('owned reverse'); }); + await proxy.close(); + } + const stopped = new Promise((done) => { if (!server || server.exitCode !== null || serverError) done(); else server.once('exit', done); }); + server?.kill(); + await Promise.race([stopped, new Promise((_, reject) => { + const timer = setTimeout(() => reject(new Error('Isolated demo did not stop; its temporary database was retained.')), 5_000); + timer.unref(); + })]); + if (directory && (dirname(resolve(directory)) !== resolve(tmpdir()) || !basename(directory).startsWith('qqq-native-e2e-'))) { + throw new Error('Refusing cleanup outside the isolated demo temporary directory.'); + } + if (directory) await rm(directory, { recursive: true, force: true, maxRetries: 5, retryDelay: 200 }); + if (screenCleanupFailures.length) { + if (echo && echoEvidence) await writeFile(join(echoEvidence, 'echo-proof.json'), JSON.stringify({ + status: 'CLEANUP_FAILED', fixtureType: 'echo-ui-e2e', simulatedPrinting: true, artifacts: echoArtifacts, + completedStages: [...stages], cleanupFailures: screenCleanupFailures, + }, null, 2)); + throw new Error(`Disposable acceptance cleanup/evidence incomplete: ${screenCleanupFailures.join(', ')}`); + } + } + +} diff --git a/scripts/ci/scanner-e2e.mjs b/scripts/ci/scanner-e2e.mjs new file mode 100644 index 0000000..24faa5d --- /dev/null +++ b/scripts/ci/scanner-e2e.mjs @@ -0,0 +1,4 @@ +// Copyright (c) 2026 QRunIO. SPDX-License-Identifier: Apache-2.0 +// Emulator-only entry point. Physical devices always fail its preflight. +import { runScannerE2e } from './scanner-e2e-runner.mjs'; +await runScannerE2e({ qbit: process.argv[2] }); diff --git a/scripts/ci/scanner-echo-guards.test.mjs b/scripts/ci/scanner-echo-guards.test.mjs new file mode 100644 index 0000000..1e946c7 --- /dev/null +++ b/scripts/ci/scanner-echo-guards.test.mjs @@ -0,0 +1,94 @@ +// Copyright (c) 2026 QRunIO. SPDX-License-Identifier: Apache-2.0 +import assert from 'node:assert/strict'; +import test from 'node:test'; +import { runScannerE2e, validateEchoFixtureDescriptor, validateEchoFixtureContract, physicalSerialMatches, redactEchoOutput } from './scanner-e2e-runner.mjs'; + +const fixture = { + fixtureType: 'echo-ui-e2e', simulatedPrinting: true, baseUrl: 'http://127.0.0.1:49152/', + username: 'scanner', password: 'synthetic-scanner-password', adminUsername: 'admin', adminPassword: 'synthetic-admin-password', +}; +const version = { apiVersion: '1.10.0', extensions: [{ name: 'mobile-scanners', version: '1.4.0', pathPrefix: '/qbit/mobile-scanners' }] }; +const branding = { displayName: 'Echo UI E2E — simulated printing' }; + +/******************************************************************************* + ** Identity is checked before evidence redaction; only the comparison escapes. + *******************************************************************************/ +test('raw serial matches exactly and a different physical device is refused', () => { + const serial = 'SYNTHETIC_TC22_SERIAL'; + assert.equal(physicalSerialMatches(serial, `${serial}\r\n`), true); + assert.equal(physicalSerialMatches(serial, 'ANOTHER_DEVICE\r\n'), false); + assert.equal(physicalSerialMatches(serial, redactEchoOutput(`${serial}\r\n`, serial)), false); +}); + +/******************************************************************************* + ** Serial-bearing successful output and errors remain safe to persist as reports. + *******************************************************************************/ +test('Echo artifacts and error text contain no selected serial', () => { + const serial = 'SYNTHETIC_TC22_SERIAL'; + const artifact = JSON.stringify({ output: redactEchoOutput(`${serial}\nOK (1 test)`, serial), + error: redactEchoOutput(`Device ${serial} failed`, serial) }); + assert.equal(artifact.includes(serial), false); + assert.equal(artifact.includes('<DEVICE>'), true); +}); + +/******************************************************************************* + ** A valid descriptor is inspected without contacting a server or any device. + *******************************************************************************/ +test('explicit simulated Echo descriptor is accepted', () => { + assert.equal(validateEchoFixtureDescriptor(fixture).port, '49152'); + validateEchoFixtureContract(version, branding); + validateEchoFixtureContract({ ...version, extensions: [{ ...version.extensions[0], version: '1.5.0' }] }, branding); +}); + +/******************************************************************************* + ** Existing scanner and printing listeners can never become this test's target. + *******************************************************************************/ +test('all protected normal and printing ports are refused', () => { + for (const port of [57832, 51631, 18081, 18086]) { + assert.throws(() => validateEchoFixtureDescriptor({ ...fixture, baseUrl: `http://127.0.0.1:${port}/` })); + } +}); + +/******************************************************************************* + ** URL decoration cannot turn the private fixture into another host or route. + *******************************************************************************/ +test('non-private or decorated fixture origins are refused', () => { + for (const baseUrl of ['https://127.0.0.1:49152/', 'http://example.invalid:49152/', 'http://127.0.0.1/', + 'http://127.0.0.1:49152/path', 'http://127.0.0.1:49152/?value=1', 'http://127.0.0.1:49152/#fragment', + 'http://scanner:secret@127.0.0.1:49152/', 'not-a-url']) { + assert.throws(() => validateEchoFixtureDescriptor({ ...fixture, baseUrl })); + } +}); + +/******************************************************************************* + ** Purpose, simulation and private account declarations must all match exactly. + *******************************************************************************/ +test('wrong-purpose or incomplete credentials are refused', () => { + for (const changed of [{ fixtureType: 'device-screen-qa' }, { simulatedPrinting: false }, { simulatedPrinting: 'true' }, + { username: 'operator' }, { adminUsername: 'owner' }, { password: null }, { password: 'short' }, { adminPassword: 'short' }]) { + assert.throws(() => validateEchoFixtureDescriptor({ ...fixture, ...changed })); + } +}); + +/******************************************************************************* + ** Another real demo or an unqualified contract cannot masquerade as this fixture. + *******************************************************************************/ +test('contract and simulated branding must match the prepared cohort', () => { + assert.throws(() => validateEchoFixtureContract({ ...version, apiVersion: '1.9.0' }, branding)); + assert.throws(() => validateEchoFixtureContract({ ...version, extensions: [{ ...version.extensions[0], version: '1.3.0' }] }, branding)); + for (const unsupported of ['1.6.0', '1.5.1', '1.4.1', '2.0.0', '1.10.0', '1.5']) { + assert.throws(() => validateEchoFixtureContract({ ...version, extensions: [{ ...version.extensions[0], version: unsupported }] }, branding)); + } + assert.throws(() => validateEchoFixtureContract({ ...version, extensions: [{ ...version.extensions[0], version: '1.5.0', pathPrefix: '/other' }] }, branding)); + assert.throws(() => validateEchoFixtureContract(version, { displayName: 'QQQ Mobile' })); +}); + +/******************************************************************************* + ** These calls stop before reading a fixture or spawning ADB, even when selected + ** through the generic emulator entry or an incomplete physical invocation. + *******************************************************************************/ +test('Echo requires its explicit physical entry inputs before device operations', async () => { + await assert.rejects(runScannerE2e({ scenario: 'echo' }), /explicit TC22/); + await assert.rejects(runScannerE2e({ scenario: 'echo', physical: true, fixture: 'unused.json' }), /explicit TC22/); + await assert.rejects(runScannerE2e({ scenario: 'echo', physical: true, fixture: 'unused.json', serial: 'emulator-5554' }), /explicit TC22/); +}); diff --git a/scripts/ci/scanner-injection-device.mjs b/scripts/ci/scanner-injection-device.mjs new file mode 100644 index 0000000..d801459 --- /dev/null +++ b/scripts/ci/scanner-injection-device.mjs @@ -0,0 +1,155 @@ +// Copyright (c) 2026 QRunIO. SPDX-License-Identifier: Apache-2.0 +// Explicit physical-only security test. Never installs, clears, or targets the normal/E2E operator apps. +import { spawn } from 'node:child_process'; +import { createHash } from 'node:crypto'; +import { readFile, writeFile, mkdir } from 'node:fs/promises'; +import { join, resolve } from 'node:path'; +import { fileURLToPath } from 'node:url'; +import { startSemanticApiProxy } from './semantic-api-proxy.mjs'; + +const [serial, fixturePath, probePath] = process.argv.slice(2); +if (!serial || !/^[A-Za-z0-9._:-]+$/.test(serial) || serial.startsWith('emulator-') || !fixturePath || !probePath || process.argv.length !== 5) { + throw new Error('Usage: node scripts/ci/scanner-injection-device.mjs <explicit-TC22-serial> <private-qa-fixture.json> <separately-signed-probe.apk>'); +} +const repository = resolve(fileURLToPath(new URL('../..', import.meta.url))); +const config = JSON.parse(await readFile(resolve(fixturePath), 'utf8')); +const origin = new URL(config.baseUrl); +if (config.purpose !== 'scanner-injection-qa' || origin.protocol !== 'http:' || origin.hostname !== '127.0.0.1' || + !origin.port || origin.pathname !== '/' || origin.username || origin.password || origin.search || origin.hash || + typeof config.scannerPassword !== 'string' || config.scannerPassword.length < 16 || + typeof config.adminPassword !== 'string' || config.adminPassword.length < 16) { + throw new Error('Requires an explicitly designated disposable loopback QA fixture with private random scanner/admin credentials.'); +} +const physicalTriggers = Object.hasOwn(config, 'expectedBarcode'); +if (physicalTriggers && (typeof config.expectedBarcode !== 'string' || !/^[\x20-\x7e]{1,4096}$/.test(config.expectedBarcode))) { + throw new Error('Optional expectedBarcode must be a nonempty printable synthetic test value; it is never trimmed or coerced.'); +} +const sdk = process.env.ANDROID_HOME ?? process.env.ANDROID_SDK_ROOT; +if (!sdk) throw new Error('ANDROID_HOME is required; the harness never changes Android user home or device keys.'); +const adb = join(sdk, 'platform-tools', process.platform === 'win32' ? 'adb.exe' : 'adb'); +const target = 'io.qrun.mobile.scanner.qa'; +const probe = 'io.qrun.mobile.scanner.probe'; +const evidence = join(repository, 'scanner-host/build/native-device-qa-injection'); +await mkdir(evidence, { recursive: true }); +await writeFile(join(evidence, 'proof.json'), JSON.stringify({ status: 'PREPARING', physicalTriggerVerified: false }, null, 2) + '\n'); +const redact = value => value.replaceAll(config.scannerPassword, '<REDACTED>').replaceAll(config.adminPassword, '<REDACTED>'); +let proxy; +const stages = new Map(); +let stepIds = new Set(); +const nativeSteps = () => proxy.evidence().filter(call => call.android && call.method === 'POST' && stepIds.has(call.operationId)).length; +const run = (args, input) => new Promise((done, fail) => { + const child = spawn(adb, ['-s', serial, ...args], { windowsHide: true, stdio: ['pipe', 'pipe', 'pipe'] }); + let output = ''; + let lines = ''; + const timer = setTimeout(() => { child.kill(); fail(new Error(`Bounded QA adb operation timed out: ${args.slice(0, 3).join(' ')}`)); }, args.includes('instrument') ? (physicalTriggers ? 600_000 : 300_000) : 60_000); + child.stdout.on('data', data => { + output += data; + lines += data; + const complete = lines.split(/\r?\n/); + lines = complete.pop(); + for (const line of complete) { + const stage = /^INSTRUMENTATION_STATUS: qqqStage=(injection-baseline|injection-complete|hardware-(?:initial|recreated|resumed)-(?:ready|saved)|hardware-complete)$/.exec(line); + if (stage) { stages.set(stage[1], nativeSteps()); console.log(line); } + } + }); + child.stderr.on('data', data => { output += data; }); + child.on('error', error => { clearTimeout(timer); fail(error); }); + child.on('close', code => { clearTimeout(timer); code === 0 ? done(redact(output)) : fail(new Error(redact(`QA adb operation failed (${code}): ${output}`))); }); + child.stdin.end(input); +}); + +if ((await run(['get-serialno'])).trim() !== serial || (await run(['shell', 'getprop', 'ro.kernel.qemu'])).trim() === '1') { + throw new Error('Requires the explicitly selected physical device; no emulator is started.'); +} +if (!/^zebra/i.test((await run(['shell', 'getprop', 'ro.product.manufacturer'])).trim()) || + !/^TC22(?:$|[ _-])/i.test((await run(['shell', 'getprop', 'ro.product.model'])).trim())) { + throw new Error('This physical acceptance is limited to the approved Zebra TC22.'); +} +for (const name of [target, target + '.test', probe]) { + const installed = (await run(['shell', 'pm', 'list', 'packages', '-u', name])).split(/\r?\n/).map(line => line.trim()); + if (installed.includes('package:' + name)) throw new Error(`Refusing to replace or clear existing disposable package ${name}.`); +} +const apks = [ + [target, join(repository, 'scanner-host/build/outputs/apk/qa/scanner-host-qa.apk')], + [target + '.test', join(repository, 'scanner-host/build/outputs/apk/androidTest/qa/scanner-host-qa-androidTest.apk')], + [probe, resolve(probePath)], +]; +const buildTools = process.env.ANDROID_BUILD_TOOLS_VERSION ?? '35.0.0'; +if (!/^\d+\.\d+\.\d+$/.test(buildTools)) throw new Error('ANDROID_BUILD_TOOLS_VERSION must identify an installed stable SDK toolset.'); +const aapt2 = join(sdk, 'build-tools', buildTools, process.platform === 'win32' ? 'aapt2.exe' : 'aapt2'); +const packageName = apk => new Promise((done, fail) => { + const child = spawn(aapt2, ['dump', 'badging', apk], { windowsHide: true, stdio: ['ignore', 'pipe', 'ignore'] }); + let output = ''; + const timer = setTimeout(() => { child.kill(); fail(new Error('APK identity verification timed out.')); }, 30_000); + child.stdout.on('data', data => { output += data; }); + child.on('error', error => { clearTimeout(timer); fail(error); }); + child.on('close', code => { + clearTimeout(timer); + const identity = /^package: name='([^']+)'/m.exec(output)?.[1]; + if (code !== 0 || !identity) fail(new Error('Cannot verify APK package identity before installation.')); + else done(identity); + }); +}); +for (const [expected, apk] of apks) { + if (await packageName(apk) !== expected) throw new Error('APK application ID does not match its disposable allowlisted target.'); +} +const artifacts = await Promise.all(apks.map(async ([applicationId, path]) => ({ + applicationId, sha256: createHash('sha256').update(await readFile(path)).digest('hex'), +}))); +const installedByRun = []; +let reversed = false; +let output = ''; +await mkdir(evidence, { recursive: true }); +try { + const api = await fetch(new URL('qqq/v1/openapi.json', origin), { signal: AbortSignal.timeout(20_000) }); + if (!api.ok) throw new Error('Disposable fixture OpenAPI is unavailable.'); + const contract = await api.json(); + stepIds = new Set(Object.entries(contract.paths).filter(([path]) => /\/processes\/\{[^}]+\}\/\{[^}]+\}\/step\/\{[^}]+\}$/.test(path)) + .map(([, value]) => value.post?.operationId).filter(Boolean)); + if (stepIds.size !== 1) throw new Error('Expected exactly one documented semantic process-step operation.'); + proxy = await startSemanticApiProxy(origin.toString().replace(/\/$/, '')); + await run(['reverse', '--no-rebind', `tcp:${proxy.port}`, `tcp:${proxy.port}`]); + reversed = true; + for (const [applicationId, apk] of apks) { await run(['install', '--no-streaming', apk]); installedByRun.push(applicationId); } + await run(['shell', 'run-as', target, 'mkdir', '-p', 'files']); + await run(['shell', 'run-as', target, 'sh', '-c', "'cat > files/qa-injection.json'"], + JSON.stringify({ serverUrl: `http://127.0.0.1:${proxy.port}/`, scannerPassword: config.scannerPassword, adminPassword: config.adminPassword, + ...(physicalTriggers ? { expectedBarcode: config.expectedBarcode } : {}) })); + output = await run(['shell', 'am', 'instrument', '-w', '-r', '-e', 'class', + 'io.qrun.mobile.scanner.ScannerInjectionTest#unrelatedUidCannotSubmitAProductionScan', + `${target}.test/androidx.test.runner.AndroidJUnitRunner`]); + await writeFile(join(evidence, 'instrumentation.txt'), output); + if (!/OK \(1 test\)/.test(output) || /FAILURES!!!|INSTRUMENTATION_FAILED|Process crashed/.test(output)) throw new Error('Production-path scan injection acceptance failed.'); + const expectedSteps = physicalTriggers ? 4 : 1; + if (stages.get('injection-baseline') !== 1 || stages.get('injection-complete') !== 1 || nativeSteps() !== expectedSteps) { + throw new Error('Native process steps must equal the manual control plus configured operator scans; forged scans must add zero mutations.'); + } + if (physicalTriggers && (stages.get('hardware-initial-saved') !== 2 || stages.get('hardware-recreated-saved') !== 3 || + stages.get('hardware-resumed-saved') !== 4 || stages.get('hardware-complete') !== 4)) { + throw new Error('All three actual operator scans must have distinct verified receipts after initial start, recreation and resume.'); + } + const semantic = proxy.verify(true); + await writeFile(join(evidence, 'proof.json'), JSON.stringify({ status: 'PASSED', artifacts, semantic, nativeProcessSteps: nativeSteps(), + expectedNativeProcessSteps: expectedSteps, + manualPositiveControls: 1, forgedScanIntents: 8, extraNativeProcessSteps: 0, + targetVariant: 'qa-production-factory', source: 'ordinary-uid-separate-signer', + physicalTriggerVerified: physicalTriggers, + physicalTriggerCount: physicalTriggers ? 3 : 0, + ...(physicalTriggers ? { expectedBarcodeSha256: createHash('sha256').update(config.expectedBarcode).digest('hex'), + physicalLifecyclePhases: ['initial', 'activity-recreation', 'activity-stop-resume'] } : {}) }, null, 2) + '\n'); + console.log('QA injection proof passed: separate UID/signer, actual-action route control, foreground production path, zero forged scan mutations.'); + if (physicalTriggers) console.log('Actual TC22 trigger proof passed: three distinct acknowledged hardware scans across recreation and background/resume.'); +} catch (error) { + await writeFile(join(evidence, 'proof.json'), JSON.stringify({ status: 'FAILED', artifacts, physicalTriggerVerified: false }, null, 2) + '\n'); + throw error; +} finally { + const cleanupFailures = []; + if (proxy) await writeFile(join(evidence, 'operations.json'), JSON.stringify(proxy.evidence(), null, 2) + '\n') + .catch(() => { cleanupFailures.push('operation evidence'); }); + if (installedByRun.includes(target)) await run(['shell', 'run-as', target, 'rm', '-f', 'files/qa-injection.json']) + .catch(() => { cleanupFailures.push('QA credential file'); }); + for (const name of installedByRun.reverse()) await run(['uninstall', name]).catch(() => { cleanupFailures.push(name); }); + if (reversed) await run(['reverse', '--remove', `tcp:${proxy.port}`]).catch(() => { cleanupFailures.push('test reverse'); }); + if (proxy) await proxy.close().catch(() => { cleanupFailures.push('test proxy'); }); + if (cleanupFailures.length) throw new Error(`QA cleanup/recording incomplete: ${cleanupFailures.join(', ')}`); +} diff --git a/scripts/ci/scanner-screen-device.mjs b/scripts/ci/scanner-screen-device.mjs new file mode 100644 index 0000000..b4d67ae --- /dev/null +++ b/scripts/ci/scanner-screen-device.mjs @@ -0,0 +1,8 @@ +// Copyright (c) 2026 QRunIO. SPDX-License-Identifier: Apache-2.0 +// Manual-only system-consent acceptance. Never part of hosted/emulator defaults. +import { runScannerE2e } from './scanner-e2e-runner.mjs'; +const args = process.argv.slice(2); +if (args.length !== 5 || args[0] !== '--serial' || args[2] !== '--fixture' || args[4] !== '--operator-consent' || !args[1] || !args[3]) { + throw new Error('Usage: node scripts/ci/scanner-screen-device.mjs --serial TC22_SERIAL --fixture PRIVATE_QA_FIXTURE.json --operator-consent'); +} +await runScannerE2e({ physical: true, serial: args[1], scenario: 'device-screen', fixture: args[3], operatorConsent: true }); diff --git a/scripts/ci/semantic-api-proxy.mjs b/scripts/ci/semantic-api-proxy.mjs new file mode 100644 index 0000000..4abbb00 --- /dev/null +++ b/scripts/ci/semantic-api-proxy.mjs @@ -0,0 +1,114 @@ +// Copyright (c) 2026 QRunIO. SPDX-License-Identifier: Apache-2.0 +// Test-only wire audit. It forwards to the real demo and never records headers or bodies. +import { createServer, request } from 'node:http'; + +const methods = new Set(['get', 'post', 'put', 'patch', 'delete', 'head', 'options']); +const escape = (value) => value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); + +export async function startSemanticApiProxy(origin) { + const response = await fetch(`${origin}/qqq/v1/openapi.json`); + if (!response.ok) throw new Error('Cannot load the real server UI API document.'); + const document = await response.json(); + const operations = Object.entries(document.paths).flatMap(([path, item]) => + Object.entries(item).filter(([method]) => methods.has(method)).map(([method, operation]) => ({ + method: method.toUpperCase(), path, operationId: operation.operationId, + matcher: new RegExp(`^${path.split('/').map((part) => /^\{[^}]+\}$/.test(part) ? '[^/]+' : escape(part)).join('/')}$`), + }))); + let mode = 'compatible'; + let calls = []; + const proxy = createServer((incoming, outgoing) => { + const path = new URL(incoming.url, origin).pathname; + const operation = operations.find((candidate) => candidate.method === incoming.method && candidate.matcher.test(path)); + const call = { + method: incoming.method, + path: operation?.path ?? path, + operationId: operation?.operationId, + credentials: Boolean(incoming.headers.authorization || incoming.headers.cookie || incoming.headers['x-qqq-device-token']), + android: String(incoming.headers['x-qqq-client'] ?? '').startsWith('android/'), + }; + calls.push(call); + const started = Date.now(); + const upstream = request(new URL(incoming.url, origin), { method: incoming.method, headers: incoming.headers }, (result) => { + call.status = result.statusCode; + call.responseBytes = 0; + result.on('data', (chunk) => { call.responseBytes += chunk.length; }); + result.on('end', () => { call.elapsedMillis = Date.now() - started; call.completed = true; }); + if (path === '/qqq/v1/version' && mode !== 'compatible') { + const chunks = []; + result.on('data', (chunk) => chunks.push(chunk)); + result.on('end', () => { + try { + const version = JSON.parse(Buffer.concat(chunks).toString('utf8')); + if (mode === 'unsupported-api') version.apiVersion = '2.0.0'; + if (mode === 'missing-extension') version.extensions = (version.extensions ?? []).filter((extension) => extension.name !== 'mobile-scanners'); + if (mode === 'missing-channel') version.clientChannels = (version.clientChannels ?? []).filter((channel) => channel !== 'android'); + if (mode === 'additive') { + version.apiVersion = '1.99.0'; + version.futureOptionalProperty = { supportedByNewerClients: true }; + version.features = [...(version.features ?? []), 'futureOptionalFeature']; + version.extensions = [...(version.extensions ?? []), { name: 'future-extension', version: '1.0.0', pathPrefix: '/qbit/future-extension' }]; + } + const body = JSON.stringify(version); + const headers = { ...result.headers, 'content-length': Buffer.byteLength(body) }; + delete headers['transfer-encoding']; + outgoing.writeHead(result.statusCode, headers); + outgoing.end(body); + } catch { + outgoing.writeHead(502); + outgoing.end(); + } + }); + } else { + outgoing.writeHead(result.statusCode, result.headers); + result.pipe(outgoing); + } + }); + upstream.on('error', () => { outgoing.writeHead(502); outgoing.end(); }); + incoming.pipe(upstream); + }); + await new Promise((done, reject) => { proxy.once('error', reject); proxy.listen(0, '127.0.0.1', done); }); + return { + port: proxy.address().port, + setMode(value) { mode = value; calls = []; }, + evidence() { return calls.map(({ method, operationId, credentials, android, status, responseBytes, elapsedMillis, completed }) => ({ method, operationId, credentials, android, status, responseBytes, elapsedMillis, completed })); }, + verify(compatible, requireCancel = false, requireSession = false, requirePhotos = false) { + if (!calls.length || calls[0].path !== '/qqq/v1/version' || calls[0].credentials) throw new Error('Native startup must discover compatibility before sending credentials or other requests.'); + if (calls.some((call) => !call.operationId)) throw new Error('Native flow made a request outside the published semantic API contract.'); + if (!compatible && calls.some((call) => call.path !== '/qqq/v1/version' || call.credentials)) throw new Error('An incompatible server received requests beyond public version discovery.'); + if (compatible) { + for (const path of ['/qqq/v1/metaData/authentication', '/qqq/v1/metaData', '/qqq/v1/qbit/mobile-scanners/devices/enroll', '/qqq/v1/qbit/mobile-scanners/devices/current']) { + if (!calls.some((call) => call.path === path && call.android)) throw new Error(`Missing native semantic operation: ${path}`); + } + } + if (requireCancel && !calls.some((call) => call.android && call.method === 'POST' && call.path.endsWith('/cancel'))) { + throw new Error('Native process cancellation did not reach the semantic API.'); + } + if (requireSession) { + for (const path of ['/qqq/v1/qbit/mobile-scanners/sessions/heartbeat', '/qqq/v1/qbit/mobile-scanners/sessions/current/screen', '/qqq/v1/qbit/mobile-scanners/sessions/current/end']) { + if (!calls.some((call) => call.path === path && call.android)) throw new Error(`Missing native session operation: ${path}`); + } + } + if (requirePhotos) { + for (const [method, path] of [ + ['GET', '/qqq/v1/qbit/mobile-record-files/contract'], + ['GET', '/qqq/v1/qbit/record-files/capabilities'], + ['POST', '/qqq/v1/qbit/record-files/uploads'], + ['PUT', '/qqq/v1/qbit/record-files/uploads/{uploadId}/items/{itemId}/chunks/{chunkIndex}'], + ['POST', '/qqq/v1/qbit/record-files/uploads/{uploadId}/finalize'], + ]) { + if (!calls.some(call => call.method === method && call.path === path && call.android && call.status >= 200 && call.status < 300)) { + throw new Error(`Missing successful native photo operation: ${method} ${path}`); + } + } + if (calls.some(call => call.path === '/qqq/v1/qbit/mobile-record-files/contract' && call.credentials)) { + throw new Error('Photo vocabulary discovery must not carry credentials.'); + } + } + return { mode, requests: calls.length, operations: [...new Set(calls.map((call) => call.operationId))].sort(), documentedRequests: calls.length }; + }, + async close() { + proxy.closeAllConnections(); + await new Promise((done) => proxy.close(done)); + }, + }; +} diff --git a/scripts/ci/verify-fixture-provenance.mjs b/scripts/ci/verify-fixture-provenance.mjs new file mode 100644 index 0000000..6f9d166 --- /dev/null +++ b/scripts/ci/verify-fixture-provenance.mjs @@ -0,0 +1,64 @@ +// Copyright (c) 2026 QRunIO. SPDX-License-Identifier: Apache-2.0 +// Inspect Maven's resolved runtime closure; never resolve or substitute dependencies here. +import { createHash } from 'node:crypto'; +import { readFileSync, realpathSync, writeFileSync } from 'node:fs'; +import { delimiter, isAbsolute, join, relative, resolve, sep } from 'node:path'; +import { execFileSync } from 'node:child_process'; + +const [serverArgument, repositoryArgument, coreSha, serverSha] = process.argv.slice(2); +if (!serverArgument || !repositoryArgument || !/^[a-f0-9]{40}$/.test(coreSha ?? '') || + !/^[a-f0-9]{40}$/.test(serverSha ?? '')) { + throw new Error('Usage: verify-fixture-provenance.mjs server private-m2 core-sha server-sha'); +} +const server = resolve(serverArgument); +const repository = realpathSync(repositoryArgument); +const revision = `4.1.0-ci.${coreSha}`; +const requiredModules = new Set([ + 'qqq-backend-core', 'qqq-backend-module-rdbms', 'qqq-middleware-javalin', 'qqq-openapi', +]); +const seenModules = new Set(); +const seenClasses = new Map(); +const classpath = readFileSync(join(server, 'demo/target/e2e-classpath.txt'), 'utf8').trim().split(delimiter); +if (classpath.length === 0 || classpath.some(entry => !entry.endsWith('.jar'))) { + throw new Error('Runtime classpath must contain only resolved JARs'); +} +const artifacts = classpath.map(entry => { + const file = realpathSync(entry); + const relativePath = relative(repository, file); + if (isAbsolute(relativePath) || relativePath.startsWith(`..${sep}`) || relativePath === '..' || resolve(repository, relativePath) !== file) { + throw new Error('Runtime artifact is outside the private Maven repository'); + } + const coordinatePath = relativePath.split(sep).join('/'); + if (coordinatePath.startsWith('com/kingsrook/qqq/') && !coordinatePath.startsWith('com/kingsrook/qqq/qqq-frontend-next/')) { + const [, , , module, version] = coordinatePath.split('/'); + if (version !== revision || seenModules.has(module)) { + throw new Error(`Unexpected or repeated QQQ module: ${module}/${version}`); + } + seenModules.add(module); + } + // Inspect every QQQ-owned JAR, including the frontend and scanner, for shadowed backend classes. + if (coordinatePath.startsWith('com/kingsrook/')) { + const jar = process.env.JAVA_HOME ? join(process.env.JAVA_HOME, 'bin', process.platform === 'win32' ? 'jar.exe' : 'jar') : 'jar'; + const entries = execFileSync(jar, ['tf', file], { encoding: 'utf8', maxBuffer: 32 * 1024 * 1024 }); + for (const name of entries.split(/\r?\n/).filter(name => name.startsWith('com/kingsrook/') && name.endsWith('.class'))) { + if (seenClasses.has(name)) throw new Error(`Duplicate QQQ class: ${name}`); + seenClasses.set(name, coordinatePath); + } + } + return { path: coordinatePath, sha256: createHash('sha256').update(readFileSync(file)).digest('hex') }; +}); +for (const module of requiredModules) { + if (!seenModules.has(module)) throw new Error(`Required runtime module missing: ${module}`); +} +const h2Artifacts = artifacts.filter(artifact => artifact.path.startsWith('com/h2database/h2/')); +if (h2Artifacts.length !== 1 || h2Artifacts[0].path !== 'com/h2database/h2/2.2.224/h2-2.2.224.jar') { + throw new Error('Expected exactly the qualified runtime H2 2.2.224 artifact'); +} +const guavaArtifacts = artifacts.filter(artifact => artifact.path.startsWith('com/google/guava/guava/')); +if (guavaArtifacts.length !== 1 || guavaArtifacts[0].path !== 'com/google/guava/guava/33.7.2-jre/guava-33.7.2-jre.jar') { + throw new Error('Expected exactly the qualified runtime Guava 33.7.2-jre artifact'); +} +writeFileSync(join(server, 'demo/target/fixture-provenance.json'), `${JSON.stringify({ + coreSha, serverSha, revision, artifacts, qqqClassCount: seenClasses.size, duplicateQqqClasses: 0, +}, null, 2)}\n`); +console.log(`Verified ${artifacts.length} runtime JAR hashes and ${seenClasses.size} unique QQQ classes from the pinned source closure.`); diff --git a/settings.gradle.kts b/settings.gradle.kts new file mode 100644 index 0000000..10773f0 --- /dev/null +++ b/settings.gradle.kts @@ -0,0 +1,52 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2004-2026. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +pluginManagement { + repositories { + google { + content { + includeGroupByRegex("com\\.android.*") + includeGroupByRegex("com\\.google.*") + includeGroupByRegex("androidx.*") + } + } + mavenCentral() + gradlePluginPortal() + } +} +dependencyResolutionManagement { + repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) + repositories { + google() + mavenCentral() + exclusiveContent { + forRepository { maven { url = uri("https://zebratech.jfrog.io/artifactory/EMDK-Android/") } } + filter { includeModule("com.symbol", "emdk") } + } + } +} + +rootProject.name = "QQQ Android" +include(":qqq:android:core") +include(":qqq:android:mobileapp") +include(":qqqsampleandroidmobileapp") +include(":scanner-host") +include(":scanner-security-probe")